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

时间:2013-01-29 18:57:58

标签: c++

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

2 个答案:

答案 0 :(得分:3)

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

正如Carl Norum所提到的,哪个CPU核心注册表是来电者保存& callee-save由调用约定(历史记录很少,历史编译器特定)或ABI(应用程序二进制接口)定义。

虽然它的信息明确是x86特定的,但Agner Fog的以下文档在描述调用约定方面做得非常好。调用者保存/被调用者保存寄存器:

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

答案 1 :(得分:2)

物理上,调用者保存的寄存器和被调用者保存的寄存器之间没有区别。区别仅由过程调用标准(调用约定)或ABI进行。如果你需要分析一段代码,你可以编译它(但不能组装)或反汇编二进制文件,并按功能和指令说明,使用ABI或调用约定手册作为参考。