【问题标题】:Why the register $v0 is caller saved?为什么寄存器 $v0 被调用者保存?
【发布时间】:2017-09-28 18:54:01
【问题描述】:

我正在研究 MIPS 架构,但我不明白为什么寄存器 $v0 被调用者保存。

这个寄存器是函数存储返回值的地方。调用者何时以及为什么必须保存它?有人可以举个例子吗?

【问题讨论】:

  • 如果这个寄存器存储了返回值,那么它肯定不能被被调用者保存/恢复,因此如果你想保存它,那么调用者必须是保存它的那个。

标签: assembly mips cpu-registers mips32


【解决方案1】:

由于保存返回值的是寄存器,所以不能被调用者保存。这会造成一种情况,即被调用者都

  • 必须更改寄存器,才能在其中返回值,并且
  • 不允许更改它(临时除外),因为它是被调用者保存的。

所以它是调用者保存的。这并不意味着调用者必须保存它,它只是意味着如果调用者需要该值在调用中保持不变,那么它必须将它保存在其他地方。

【讨论】:

  • 如果调用者需要该值在调用中持续存在”,这正是我不明白的一点。你能把这个案子说清楚一点吗?
  • @G.Guidi 它与其他调用者保存寄存器没有什么不同:调用者有一些需要保留的值,但它必须调用一个函数,该函数可能会覆盖其中的寄存器值已存储,因此必须将其移动到其他地方(例如在堆栈或被调用者保存寄存器上)。
  • 哦,我现在想通了。感谢您的回答和额外的解释。
  • @G.Guidi:我更喜欢术语“呼叫破坏”与“呼叫保留”,因为这样可以避免暗示任何人必须保存它。好的代码将使用 call-clobbered 寄存器来处理不需要在呼叫中生存的事情(因为它已经完成了)。此外,这些术语的不同之处不止一个字母。
猜你喜欢
  • 2012-03-05
  • 2020-11-19
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 2020-08-06
  • 2021-02-15
相关资源
最近更新 更多