汇编函数调用是否会将所有寄存器压入堆栈?

Cli*_*com 2 c++ assembly function-calls

我感兴趣的是在执行call编译Visual C++的汇编代码的指令时会发生什么.我认为发生的是调用指令本身将所有上下文压入堆栈(寄存器内容,PC,...)并更新PC.但话说回来,我想知道是否所有背景都被推动了.在许多情况下,并非所有寄存器都在被调用的函数中使用.编译器是否检测到这一点并且仅推送由该函数修改的上下文,或者是否在硬件级别推送所有上下文实现的所有上下文始终如一?

Mar*_*ata 5

这完全取决于ABI(应用程序二进制接口),它指示调用者或被调用者是否将事物推入堆栈.由于您没有指定平台(尽管Visual Studio类似于x86),答案取决于.

通常,调用者无法知道被调用函数会做什么,因此编译器无法根据函数内部的信息进行优化.

通常,将上下文推送到堆栈不会在任何平台上自动执行,但是多个平台具有宏和优化指令以快速执行.通常,从堆栈中自动推送和弹出的唯一东西是PC.

编辑:对于x86,有几个ABI.您应该查看此Wiki参考以查看它们(cdecl,stdcall等).每个都有关于调用者或被调用者是否保存上下文的不同规则.