进入main之前的四个执行步骤是什么?
What are the four execution steps before entering main?
以我的以下 5 行文件为例:
#include <stdio.h>
int main() {
printf("Hello");
return 0;
}
对应以下程序集:
`main:
0x100000f60 <+0>: pushq %rbp
0x100000f61 <+1>: movq %rsp, %rbp
0x100000f64 <+4>: subq [=11=]x10, %rsp
0x100000f68 <+8>: movl [=11=]x0, -0x4(%rbp)
-> 0x100000f6f <+15>: leaq 0x34(%rip), %rdi ; "Hello"
我们可以注意到 main 中打印 "Hello" 的第一行对应于第五条指令。前四个指令是什么:它们的作用是什么?
0x100000f60 <+0>: pushq %rbp
压入调用者的基址指针。
0x100000f61 <+1>: movq %rsp, %rbp
将堆栈指针复制到基指针中(设置此函数的堆栈帧)
0x100000f64 <+4>: subq [=12=]x10, %rsp
保留堆栈 space(大概是 return 值——您可能没有在启用任何优化的情况下编译此程序)
0x100000f68 <+8>: movl [=13=]x0, -0x4(%rbp)
将 return 值(零)放入堆栈。
-> 0x100000f6f <+15>: leaq 0x34(%rip), %rdi ; "Hello"
将指向 "Hello" 字符串文字的指针加载到 rdi
寄存器中。
以我的以下 5 行文件为例:
#include <stdio.h>
int main() {
printf("Hello");
return 0;
}
对应以下程序集:
`main:
0x100000f60 <+0>: pushq %rbp
0x100000f61 <+1>: movq %rsp, %rbp
0x100000f64 <+4>: subq [=11=]x10, %rsp
0x100000f68 <+8>: movl [=11=]x0, -0x4(%rbp)
-> 0x100000f6f <+15>: leaq 0x34(%rip), %rdi ; "Hello"
我们可以注意到 main 中打印 "Hello" 的第一行对应于第五条指令。前四个指令是什么:它们的作用是什么?
0x100000f60 <+0>: pushq %rbp
压入调用者的基址指针。
0x100000f61 <+1>: movq %rsp, %rbp
将堆栈指针复制到基指针中(设置此函数的堆栈帧)
0x100000f64 <+4>: subq [=12=]x10, %rsp
保留堆栈 space(大概是 return 值——您可能没有在启用任何优化的情况下编译此程序)
0x100000f68 <+8>: movl [=13=]x0, -0x4(%rbp)
将 return 值(零)放入堆栈。
-> 0x100000f6f <+15>: leaq 0x34(%rip), %rdi ; "Hello"
将指向 "Hello" 字符串文字的指针加载到 rdi
寄存器中。