我知道$v0, $v1是$v0为32位,$v1为64位的函数结果寄存器。
我还了解到$ao-$a3是保存整型变量的函数参数寄存器。
我知道这两个函数都不会在函数调用中保留,但是我不明白的是,MIPS中有文字上的用法吗?在什么情况下我们需要使用这些寄存器?
发布于 2013-08-13 19:21:11
如果您计划调用其他使用MIPS ABI (应用程序二进制接口)的函数,则需要使用它们。这是一种让不同的代码模块就彼此接口的公共方式达成一致的方法。想象一下,如果每个程序员或编译器选择自己的一组寄存器来传递参数和返回值,会有多混乱。
让我们来看看C编译器为一小段代码生成了什么:
int multwoplusone(int arg)
{
return arg*2 + 1;
}
int main()
{
int i = 5;
i = multwoplus1(i);
return 0;
}如果我们编译这段代码(并且只查看生成的程序集的相关部分),我们会得到:
multwoplusone:
sll $2,$4,1 # $2 is $v0, $4 is $a0
j $31 # $31 is $ra
addiu $2,$2,1
...
main:
...
li $4,5 # 0x5
lw $25,%call16(multwoplus1)($28)
.reloc 1f,R_MIPS_JALR,multwoplus1
1: jalr $25
nop如您所见,当main调用multwoplusone时,它首先将参数(5)放在$a0 ($4)中。然后,multwoplusone将该值左移一位(即将其乘以2),将结果保存在$v0 ($2)中,然后在返回给调用方时将延迟分支槽中的值加1。然后,调用者(在本例中为main)可以假定返回值为$v0,并根据需要对该值执行某些操作。
https://stackoverflow.com/questions/18206905
复制相似问题