调用者和被调用者保存的寄存器有什么区别?

Bob*_*ohn 1 c++

特别是,您如何知道在调用者保存的寄存器与被调用者保存的寄存器中的一段代码中对变量执行的保存/恢复操作的次数?

pho*_*ger 5

调用者保存的寄存器,也称为易失性寄存器,是调用函数必须保存的任何 CPU 内核寄存器(通常保存到运行时堆栈),如果调用函数需要寄存器中的值;即如果值是“活的”。被调用者保存的寄存器,也称为非易失性寄存器,是包含函数必须承诺不会破坏的值的任何 CPU 核心寄存器。如果被调用者(被调用函数)需要使用那些寄存器,它必须首先将这些值保存在那些寄存器中(一般在运行时堆栈中),然后在返回给调用者之前恢复它们。

正如 Carl Norum 所提到的,哪些 CPU 核心 regs 是调用者保存的,哪些是被调用者保存的,是由调用约定定义的(历史上记录不足,并且历史上是特定于编译器的),或者由 ABI(应用程序二进制接口)定义。

尽管它的信息绝对是特定于 x86 的,但 Agner Fog 的以下文档在描述调用约定和 caller-save/callee-save 寄存器方面做得非常好:

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

下面介绍 PowerPC EABI,包括其调用约定。但是在这个文档中,搜索“volatile”和“nonvolatile”(分别是caller-save和callee-save):

http://www.freescale.com/files/32bit/doc/app_note/PPCEABI.pdf