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

时间:2016-12-21 22:43:39

标签: assembly mips

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

1 个答案:

答案 0 :(得分:3)

当您不使用其他人编写的任何代码(包括系统调用)时,您可以根据需要使用寄存器,前提是$at是为汇编程序保留的$ra {1}} jal隐式使用{1}}。

非常不太可能不会使用任何系统调用或其他人编写的任何代码。
为了让编译器和人类在不查看代码的情况下使用例程,专家们之间建立了一个惯例 它被称为应用程序二进制接口(ABI)和MIPS got one too

ABI要求如何使用寄存器 你必须尊重ABI:

  1. 您使用的代码已经过了ABI。 在这种情况下,ABI主要提供信息,它告诉您函数期望参数的位置以及它使用的寄存器。
  2. 当您想要与期望ABI的代码或工具兼容时 当你编写一个函数,你稍后会给同事时,很高兴写一个关于ABI的函数。这样他们已经习惯了惯例,他们会发现使用它很自然 如果您使用编译器,它肯定会编译关于ABI的源代码,因此它会期望任何人工生成的程序集都这样做。
  3. 引用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设置]