我一直在尝试学习 MIPS 汇编语言,但我很难知道在不同情况下使用哪些寄存器。就像我什么时候使用 $v0 、 $a0 或 $t1 ...
当您不使用其他人编写的任何代码(包括系统调用)时,您可以根据需要使用寄存器,前提是该寄存器$at是为汇编器保留的并且$ra由jal/隐式使用jalr。
您不太可能不使用任何系统调用或其他人编写的任何代码。
\n为了让编译器和人类在不查看代码的情况下使用例程,专家之间建立了一个约定。
\n它被称为应用程序二进制接口(ABI),MIPS 也有一个。
ABI 规定了寄存器的使用方式。
\n无论何时,您都必须尊重 ABI:
引用 MIPS32 ABI 这些是寄存器的使用:
\n\n\n\n$0 ($zero) 的值始终为 0。
\n\n$at ($AT)暂时由汇编器使用。 [永远不要使用它]
\n\n$2..$3 ($v0\xe2\x80\x93$v1)用于表达式求值并保存整数\n和指针类型函数返回值。[$v0 是整数函数放置其返回值的地方]
\n\n$4..$7 ($a0\xe2\x80\x93$a3)用于向函数传递参数;函数调用之间不会保留值。其他参数在堆栈上传递,如下所述。【这就是争论的地方】
\n\n$8-$15 ($t0\xe2\x80\x93$t7)用于表达式求值的临时寄存器;值\n 不会在函数调用之间保留。
\n\n$16-$23 ($s0\xe2\x80\x93$s7)保存的寄存器;值在函数调用之间保留。[如果您在函数内使用它们,请保存并恢复它们]
\n\n$24..$25 ($t8\xe2\x80\x93$t9)用于表达式求值的临时寄存器;\n 函数调用之间不保留值。当调用与位置无关的函数时,$25 必须包含被调用函数的地址。
\n\n$26-$27 ($kt0\xe2\x80\x93$kt1)仅由操作系统使用。
\n\n$28 ($gp)全局指针和上下文指针。[由编译器使用]
\n\n$29 ($sp) sp 堆栈指针。[将其用于堆栈]
\n\n$30 ($s8)保存寄存器(如 s0-s7)。[如果修改的话,在函数中保存和恢复]
\n\n31 美元 ($ra)退货地址。返回地址是函数应返回控制权的位置。[通过设置
\njal/jalr]