此问题已经在这里有了答案:
带上我下面的5行文件:
#include <stdio.h>
int main() {
printf("Hello");
return 0;
}
它对应于以下程序集:
`main:
0x100000f60 <+0>: pushq %rbp
0x100000f61 <+1>: movq %rsp, %rbp
0x100000f64 <+4>: subq $0x10, %rsp
0x100000f68 <+8>: movl $0x0, -0x4(%rbp)
-> 0x100000f6f <+15>: leaq 0x34(%rip), %rdi ; "Hello"
我们可以注意到main的第一行显示“ Hello”对应于第五条指令。前面的四个指示是什么:它们做什么?
0x100000f60 <+0>: pushq %rbp
推入呼叫者的基本指针。
0x100000f61 <+1>: movq %rsp, %rbp
将堆栈指针复制到基本指针(设置此函数的堆栈框架)
0x100000f64 <+4>: subq $0x10, %rsp
保留堆栈空间(大概是返回值-您可能没有启用任何优化的情况下编译了该程序)
0x100000f68 <+8>: movl $0x0, -0x4(%rbp)
将返回值(零)放入堆栈。
-> 0x100000f6f <+15>: leaq 0x34(%rip), %rdi ; "Hello"
将指向“ Hello”字符串文字的指针加载到rdi
寄存器中。