C语言与64位汇编对应关系

导读:本篇文章讲解 C语言与64位汇编对应关系,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

#include <stdio.h>

int global;
int func_op(void) { return 0; }

void func(void)
{
unsigned long long val64 = 0;

val64 = 0xffffeeeeddddcccc; // 7
global = 0x5555; // 8
}
#define MAX_WORD 16

int main(void)
{
unsigned int i = 0;
char words[MAX_WORD] = “Hello World”;
char word;

int (*func_pointer)(void) = &func_op;

i = 0xabcd; // 1

if (i != 0x1234) // 2
i = 0; // 3

while (i == 0) // 4
{
i++; // 5
}

func(); // 6
i = func_pointer(); // 9

for (i = 0; i < MAX_WORD – 1; i++) // 10
word = words[i]; // 11

return 0; // 12
}

$ gcc -Wall -o0 assemble.c -o assemble

assemble.c: In function ‘func’:
assemble.c:8:21: warning: variable ‘val64’ set but not used [-Wunused-but-set-variable]
8 | unsigned long long val64 = 0;
| ^~~~~
assemble.c: In function ‘main’:
assemble.c:19:7: warning: variable ‘word’ set but not used [-Wunused-but-set-variable]
19 | char word;
| ^~~~

C语言与64位汇编对应关系_i++

$ objdump -d –no-show-raw-insn assemble
–no-show-raw-insn 使其不输出机器语言

assemble: file format elf64-x86-64

Disassembly of section .init:

0000000000001130 :
1130: push %rbp
1131: mov %rsp,%rbp
1134: movq $0x0,-0x8(%rbp)
113c: movabs $0xffffeeeeddddcccc,%rax # val64 = 0xffffeeeeddddcccc; // 7
1146: mov %rax,-0x8(%rbp)
114a: movl $0x5555,0x2ed8(%rip) # 402c global = 0x5555; // 8
1154: nop
1155: pop %rbp
1156: ret

0000000000001157 :
1157: push %rbp
1158: mov %rsp,%rbp # 初始化栈,对应()
115b: sub $0x30,%rsp
115f: movl $0x0,-0x4(%rbp)
1166: movabs $0x6f57206f6c6c6548,%rax
1170: mov $0x646c72,%edx
1175: mov %rax,-0x30(%rbp)
1179: mov %rdx,-0x28(%rbp)
117d: lea -0x5f(%rip),%rax # 1125 <func_op>
1184: mov %rax,-0x10(%rbp)
# 设置变量的值
1188: movl $0xabcd,-0x4(%rbp) # i = 0xabcd; // 1

# if比较
118f:       cmpl   $0x1234,-0x4(%rbp)  # if (i != 0x1234)  // 2
1196:       je     11a5 <main+0x4e>  # 如果相等
1198:       movl   $0x0,-0x4(%rbp)  # i = 0;  // 3
119f:       jmp    11a5 <main+0x4e>  # 跳转  // 2

# while
11a1:       addl   $0x1,-0x4(%rbp)  # i++;  // 5
11a5:       cmpl   $0x0,-0x4(%rbp)
11a9:       je     11a1 <main+0x4a>

# 函数调用call
11ab:       call   1130 <func>  # func();  // 6
11b0:       mov    -0x10(%rbp),%rax
# 函数指针调用
11b4:       call   *%rax  # i = func_pointer();  // 9
11b6:       mov    %eax,-0x4(%rbp)

# for
11b9:       movl   $0x0,-0x4(%rbp)  # word = words[i];  // 11
11c0:       jmp    11d1 <main+0x7a>
11c2:       mov    -0x4(%rbp),%eax
# 数组操作:movzbl
11c5:       movzbl -0x30(%rbp,%rax,1),%eax
11ca:       mov    %al,-0x11(%rbp)
11cd:       addl   $0x1,-0x4(%rbp)
11d1:       cmpl   $0xe,-0x4(%rbp)

11d5:       jbe    11c2 <main+0x6b>
# 返回值设置,返回值放到eax
11d7:       mov    $0x0,%eax  # return 0;  // 12
11dc:       leave  
11dd:       ret    
11de:       xchg   %ax,%ax

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/77634.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!