为什么在每个ASM函数的开头都有pushl%ebp和movl%esp,%ebp?

Hen*_*old 1 c assembly function instructions

我正在大学学习计算机体系结构和汇编编程课程.前段时间我们学会了如何在ASM中编写函数并用C语言调用它们.有一点我不明白 - 在每个ASM函数的开头,讲师总是做两个指令;

pushl   %ebp
movl    %esp, %ebp
Run Code Online (Sandbox Code Playgroud)

我不明白为什么他这样做,以及它在调用时对函数有什么影响.在我的Intel Mac上,在为IA32编写程序集时,无论是否包含这些指令或者只是跳过它,似乎都没有任何区别.

有人可以告诉我在调用这些指令时实际发生了什么,以及为什么总是在ASM函数的开头调用它们?最好是在GNU ASM中,虽然Intel ASM也没问题.

amd*_*mdn 5

这是正确堆栈展开所必需的约定的一部分.%ebp基指针指向调用者的堆栈帧.调用约定是通过将​​其推入堆栈来保存调用者的基指针.请参阅Agner Fog全面的"呼叫约定"文档中的第9章异常处理和堆栈展开

http://www.agner.org/optimize/calling_conventions.pdf.

如果您想使用调试器,例如gdb调试程序,并希望它向您显示backtrace,那么您需要遵循该调用约定.

http://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_node/gdb_42.html

回溯是对程序如何到达的总结.对于许多帧,它显示每帧一行,从当前正在执行的帧(帧0)开始,然后是其调用者(帧1),并在堆栈上.