我现在正在学习MIPS汇编语言,但我仍然不太了解以下寄存器之间的区别: $ at,$ a,$ t,$ s,$ v。 更具体地说,我什么时候应该使用什么
答案 0 :(得分:1)
寄存器用于硬件或软件约定。
某些寄存器在指令集体系结构中具有硬连接的含义。例如,使用jal
调用函数会将返回地址存储在寄存器r31
(又名$ra
)中。以类似的方式r0
(又名$zero
)具有特殊含义,并且始终返回0。如果不修改硬件,就无法更改这些寄存器的行为。
为确保不同软件工具(编译器,asm,链接器,加载器,OS等)的一致行为,软件约定精确定义了某些寄存器的作用。这些寄存器在硬件方面完全相似,但是软件赋予它们特定的作用。这些约定可以在不进行硬件修改的情况下进行更改,但是这样做需要在软件链中进行许多更改。
我仍然不太了解以下寄存器之间的区别:$ at,$ a,$ t,$ s,$ v。
$at
是“临时汇编程序”。汇编程序使用它来扩展多指令宏,并且不应该用于存储长期值,因为这些信息可以随时通过宏调用销毁。
$a0-3
用于传递函数的第一个参数(以下参数在堆栈中)。
$v0-1
用于返回函数的计算结果
$t0-9
和$s0-7
是通用寄存器,可以在程序中自由使用。区别在于它们在函数调用之间的保存。
$t0-9
是临时易失性寄存器。它们应该永远不会保存长期信息,并且被调用方功能可以在没有防范的情况下使用它们。如果调用者想保留其中的一些,则有责任在函数调用之前保存它们,并在函数返回后恢复它们的值。它们也称为“保存呼叫者”的寄存器。
$v0-7
是临时的非易失性寄存器。它们应该保存长期信息,并且被调用者不得在不将其值保存在堆栈中并在函数返回之前将其恢复之前使用它们中的任何一个。它们也称为“保存被调用者的”寄存器。
如果您正在编写汇编函数以学习MIPS,请不要使用$ at,但是对于其他寄存器,您可以执行所需的操作。但是在使用编译器,链接器等时,遵守这些软件约定至关重要。否则您的代码可能无法正常工作。