MIPS:寄存器之间的区别

问题描述 投票:0回答:1

我现在正在学习MIPS汇编语言,我仍然不太了解以下寄存器之间的区别:$ at,$ a,$ t,$ s,$ v。更具体地说,我何时应该使用什么

assembly mips cpu-registers
1个回答
1
投票

寄存器用于硬件或软件约定。

一些寄存器在指令集架构中具有硬连线的含义。例如,使用jal调用函数将在寄存器r31(aka $ra)中存储返回地址。以类似的方式,r0(aka $zero)具有特殊含义并始终返回0.如果没有修改硬件,则无法更改这些寄存器的行为。

为了确保不同软件工具(编译器,asm,链接器,加载器,操作系统......)的连贯行为,软件约定确定了某些寄存器的作用。这些寄存器在硬件方面完全相似,但软件赋予它们特定的作用。这些约定可以在没有硬件修改的情况下进行更改,但这样做需要对软件链进行许多更改。

我仍然不太明白以下寄存器之间的区别:$ at,$ a,$ t,$ s,$ v。

$at是“临时装配工”。汇编程序使用它来扩展多指令宏,并且不应该用于存储长项值,因为宏调用可以随时销毁这些信息。

$a0-3用于传递函数的第一个参数(以下参数在堆栈中)。

$v0-1用于返回函数的计算结果

$t0-9$s0-7是通用寄存器,可以在程序中自由使用。差异涉及它们在函数调用中的保留。

$t0-9是临时易变的寄存器。它们应该永远不会保存长期信息,被调用函数可以在没有预防的情况下使用它们。如果调用者想要保留其中的一些,则有责任在函数调用之前保存它们并在函数返回后恢复它们的值。它们也被称为“调用者保存”寄存器。

$v0-7是临时非易失性寄存器。它们应该保存长期信息,并且不允许callees使用它们中的任何一个而不将其值保存在堆栈中并在函数返回之前恢复它。它们也被称为“被调用者保存”寄存器。

如果您正在编写汇编函数来学习MIPS,请不要使用$ at,但对于其他寄存器,您可以执行您想要的操作。但是,在使用编译器,链接器等时,尊重这些软件约定是必不可少的;否则你的代码可能无法正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.