【问题标题】:When to use temporary registers vs saved registers?何时使用临时寄存器与保存寄存器?
【发布时间】:2014-02-03 15:17:08
【问题描述】:

每当我将参数($a0$a1)传递给我使用 jal 到达的部分(标签)时,如果我使用临时寄存器(如 $t0)而不是保存的寄存器(如987654325@) 来保存或操纵该部分中的参数? 在该部分运行时使用一组而不是另一组有任何风险吗?

【问题讨论】:

  • 细分到底是什么意思?
  • @markgz 已更新到部分。类似于辅助函数的东西,最终将返回给主调用者。

标签: assembly mips mars-simulator


【解决方案1】:

如果“段”是指函数调用,则应遵循here 中描述的 MIPS 调用约定。函数可以更改 $t0,...,$t9 的值,而无需在返回之前恢复它们。调用函数的代码必须假定函数返回时 $t0,...,$t9 值已更改。

【讨论】:

  • 但是在被调用者运行时不会有任何并发​​实例,对吗?
  • 除非您在支持硬件多线程的 MIPS CPU(如 34k 系列)上运行,否则函数与其调用者之间不存在并发。
【解决方案2】:

如果您正在从支持调用约定的某个地方(调用您的 asm 代码的 C 程序)实现函数调用。不,只要假定这些内部被调用者在该上下文之外不可见,您就不必使所有自己的内部调用都符合要求。这意味着您不能从 C 调用它们,例如,因为您选择不符合该编译器和目标的 C 调用约定。只要您将从外部调用的入口点符合标准,那么您就可以为所欲为。

优点和缺点是不符合可以提高性能,但符合使注册管理和维护更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-31
    • 2021-03-25
    • 2020-01-14
    • 2012-07-22
    • 1970-01-01
    • 2012-03-23
    • 2011-09-14
    • 2015-03-27
    相关资源
    最近更新 更多