进入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 寄存器中。