我一直在尝试学习MIPS汇编语言,但我很难知道在不同情况下使用哪些寄存器。喜欢我何时使用$ v0,$ a0或$ t1 ......
答案 0 :(得分:3)
当您不使用其他人编写的任何代码(包括系统调用)时,您可以根据需要使用寄存器,前提是$at
是为汇编程序保留的$ra
{1}} jal
隐式使用{1}}。
非常不太可能不会使用任何系统调用或其他人编写的任何代码。
为了让编译器和人类在不查看代码的情况下使用例程,专家们之间建立了一个惯例
它被称为应用程序二进制接口(ABI)和MIPS got one too。
ABI要求如何使用寄存器 你必须尊重ABI:
引用MIPS32 ABI这些是使用寄存器:
$ 0($ zero)的值始终为0。
$ at($ AT)临时通常由汇编程序使用。 [从未使用过]
$ 2 .. $ 3($ v0- $ v1)用于表达式评估并保存整数 和指针类型函数返回值。 [$ v0是整数函数放置其返回值的地方]
$ 4 .. $ 7($ a0- $ a3)用于将参数传递给函数;价值观不是 保留跨函数调用。其他论点 如下所述,在堆栈上传递。 [这是争论的地方]
$ 8- $ 15($ t0- $ t7)用于表达评估的临时寄存器;值 不会在函数调用中保留。
$ 16- $ 23($ s0- $ s7)保存的寄存器;值跨函数保留 调用。 [如果您在功能中使用这些功能,请保存并恢复它们]
$ 24 .. $ 25($ t8- $ t9)用于表达评估的临时寄存器; 函数调用不保留值。什么时候 呼叫位置独立功能$ 25必须包含 被调用函数的地址。
$ 26- $ 27($ kt0- $ kt1)仅供操作系统使用。
$ 28($ gp)全局指针和上下文指针。 [由编译器使用]
$ 29($ sp) sp堆栈指针。 [将此用于堆栈]
$ 30($ s8)已保存的寄存器(如s0-s7)。 [在修改后的功能中保存并恢复此功能]
$ 31($ ra)返回地址。返回地址是的位置 哪个函数应该返回控件。 [由
jalr
/jal
设置]