函数调用后寄存器的状态是什么
What is the state of the registers after a function call?
我对汇编的知识有限,但我至少可以通读它,并与相应的C或C++代码相匹配。我可以看到,函数参数是通过将它们推送到堆栈或寄存器来传递的,函数体使用一些寄存器来进行操作。但它似乎也使用了与调用者中使用的寄存器相同的寄存器。这是否意味着调用者不能保证在函数调用后寄存器的状态是相同的?如果在编译过程中函数的整个主体是未知的,该怎么办?编译器是如何处理这个问题的?
编译器生成的汇编程序代码遵循一些调用约定。呼叫约定通常指定
- 参数是如何传递给函数的
- 如何将返回值从被调用函数传递给调用者
- 哪些寄存器应该保存在函数调用中,哪些可以修改
如果所有被调用的函数都遵循相同的调用约定,那么使用相同的寄存器就不会出现问题。
正如评论所暗示的那样,事实上这并没有标准。它完全留给您正在使用的特定c++编译器的实现者。
一个更明确的问题是:"当使用编译器选项B在编译器A的版本N上编译时,使用ABI E为目标CPU D调用C的函数签名,相对于寄存器保存,有什么保证?"
在这种情况下,特定工具集的专家(或手册)可以回答。
正如你可能推断的那样,对于任何一种工业实力项目,这都是错误的问题,因为随着编译器的发展,答案会发生变化,你不希望这个事实影响你程序的可靠性。
这是一个很好的问题,因为很高兴知道编译器在幕后做什么——这有助于学习。
但总的来说,黄金法则是向程序中的编译器表达清晰而简单的逻辑,并允许编译器处理将该逻辑转换为优化的机器代码的细节,现代编译器在这方面非常出色。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 在 c++ 中从执行的 shell 命令获取返回状态的安全方法是什么?
- 是什么给了 std::future 一些共享状态
- 在某些范围更新后获取整数数组的最终状态的有效算法是什么?
- 动态数组的状态是什么
- 在c++中,检查给定用户配置文件是否处于活动状态或已删除的最佳方法是什么?
- c++中BDD的当前状态是什么?
- 编写自定义纯虚拟处理程序:调用堆栈和寄存器时的状态是什么
- 函数调用后寄存器的状态是什么
- 在C++中实现有限状态机的最佳方法是什么