在 MIPS 中使用不同的寄存器
Using different registers in MIPS
我一直在交替使用一些寄存器(尤其是 $t0 和 $s0),这似乎不是什么大问题,可能是因为我目前正在编写一些非常简单的程序。
在MIPS中使用不同的寄存器有什么规则吗?
我们什么时候应该使用 $t0-$t9 或 $s0-$s7 或 $a0-$a3 或 $v0-$v1 ?
MIPS 是有意设计的,因此没有寄存器 "special"。只要您同意您的代码必须与之交互的任何其他软件功能(调用约定/ABI),您就可以做任何最有效的事情。
并且有多种选择同样有效,因为通用寄存器是真正通用的;堆栈指针只是一种软件约定;没有 push
隐式使用它的指令。使用 $t0
而不是 $t3
作为临时值并没有更快或更好或其他任何东西。
此规则至少有一个例外:jal
将 return 地址隐式写入 </code>(link 寄存器)。 (<a href="http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html" rel="nofollow noreferrer">http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html</a>)。使用 5 位对目标寄存器进行编码会使这 5 位远离直接分支目标。</p>
<p>当然,平台的调用约定是围绕指令集中任何隐式寄存器使用而设计的,因此当然被调用的函数期望它们在 <code>
中的 return 地址,按照惯例称为$ra
(return 地址)基于 MIPS。
我一直在交替使用一些寄存器(尤其是 $t0 和 $s0),这似乎不是什么大问题,可能是因为我目前正在编写一些非常简单的程序。
在MIPS中使用不同的寄存器有什么规则吗?
我们什么时候应该使用 $t0-$t9 或 $s0-$s7 或 $a0-$a3 或 $v0-$v1 ?
MIPS 是有意设计的,因此没有寄存器 "special"。只要您同意您的代码必须与之交互的任何其他软件功能(调用约定/ABI),您就可以做任何最有效的事情。
并且有多种选择同样有效,因为通用寄存器是真正通用的;堆栈指针只是一种软件约定;没有 push
隐式使用它的指令。使用 $t0
而不是 $t3
作为临时值并没有更快或更好或其他任何东西。
此规则至少有一个例外:jal
将 return 地址隐式写入 </code>(link 寄存器)。 (<a href="http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html" rel="nofollow noreferrer">http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html</a>)。使用 5 位对目标寄存器进行编码会使这 5 位远离直接分支目标。</p>
<p>当然,平台的调用约定是围绕指令集中任何隐式寄存器使用而设计的,因此当然被调用的函数期望它们在 <code>
中的 return 地址,按照惯例称为$ra
(return 地址)基于 MIPS。