首先我们来看这样一个函数int test(int i) { return i; }它生成的汇编代码是这样的test(int): push rbp mov rbp, rsp mov DWORD PTR [rbp-4], edi mov eax, DWORD PTR [rbp-4] pop rbp ret首先解释几个寄存器的定义rbp 和 rsp 寄存器分别是栈帧基址指针(Base Pointer)和栈指针(Stack Pointer), 就是当前栈帧底的基地址,以及当前栈顶的地址。edi 保存函数参数的寄存器eax 保存函数返回值的寄存器我们来逐行看一下这段汇编代码push rbp: 将当前栈帧基指针 rbp 压入栈中,用于保存上一个函数的栈帧。mov rbp, rsp: 将当前栈顶指针 rsp 赋值给 rbp,以建立当前函数的新栈帧。rsp现在是上一个栈帧的顶地址,让它作为当前栈帧的基地址。mov DWORD PTR [rbp-4], edi:
lelele