我如何知道在 MIPS 程序中使用哪些寄存器

asp*_*e29 1 assembly mips

我一直在尝试学习 MIPS 汇编语言,但我很难知道在不同情况下使用哪些寄存器。就像我什么时候使用 $v0 、 $a0 或 $t1 ...

Mar*_*oom 6

当您不使用其他人编写的任何代码(包括系统调用)时,您可以根据需要使用寄存器,前提是该寄存器$at是为汇编器保留的并且$rajal/隐式使用jalr

\n\n

您不太可能不使用任何系统调用或其他人编写的任何代码。
\n为了让编译器和人类在不查看代码的情况下使用例程,专家之间建立了一个约定。
\n它被称为应用程序二进制接口(ABI),MIPS 也有一个

\n\n

ABI 规定了寄存器的使用方式。
\n无论何时,您都必须尊重 ABI:

\n\n
    \n
  1. 您已经使用了尊重 ABI 的代码。\n在这种情况下,ABI 主要提供信息,它告诉您函数在哪里需要参数以及它使用什么寄存器。
  2. \n
  3. 当您想要与需要 ABI 的代码或工具兼容时。
    \n当您编写一个稍后将提供给同事的函数时,最好遵循 ABI 来编写它。这样他们就已经习惯了这种约定,并且会发现使用它很自然。
    \n如果您使用编译器,它肯定会编译符合 ABI 的源代码,因此它会期望任何人类生成的程序集都会这样做。
  4. \n
\n\n

引用 MIPS32 ABI 这些是寄存器的使用:

\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\n

31 美元 ($ra)退货地址。返回地址是函数应返回控制权的位置。[通过设置jal/ jalr]

\n
\n