函数调用后寄存器的状态是什么

What is the state of the registers after a function call?

本文关键字:状态 是什么 寄存器 函数调用      更新时间:2023-10-16

我对汇编的知识有限,但我至少可以通读它,并与相应的C或C++代码相匹配。我可以看到,函数参数是通过将它们推送到堆栈或寄存器来传递的,函数体使用一些寄存器来进行操作。但它似乎也使用了与调用者中使用的寄存器相同的寄存器。这是否意味着调用者不能保证在函数调用后寄存器的状态是相同的?如果在编译过程中函数的整个主体是未知的,该怎么办?编译器是如何处理这个问题的?

编译器生成的汇编程序代码遵循一些调用约定。呼叫约定通常指定

  • 参数是如何传递给函数的
  • 如何将返回值从被调用函数传递给调用者
  • 哪些寄存器应该保存在函数调用中,哪些可以修改

如果所有被调用的函数都遵循相同的调用约定,那么使用相同的寄存器就不会出现问题。

正如评论所暗示的那样,事实上这并没有标准。它完全留给您正在使用的特定c++编译器的实现者。

一个更明确的问题是:"当使用编译器选项B在编译器A的版本N上编译时,使用ABI E为目标CPU D调用C的函数签名,相对于寄存器保存,有什么保证?"

在这种情况下,特定工具集的专家(或手册)可以回答。

正如你可能推断的那样,对于任何一种工业实力项目,这都是错误的问题,因为随着编译器的发展,答案会发生变化,你不希望这个事实影响你程序的可靠性。

这是一个很好的问题,因为很高兴知道编译器在幕后做什么——这有助于学习。

但总的来说,黄金法则是向程序中的编译器表达清晰而简单的逻辑,并允许编译器处理将该逻辑转换为优化的机器代码的细节,现代编译器在这方面非常出色。