我知道这是32 位、64 位$v0, $v1
的函数结果寄存器。$v0
$v1
我也知道这$ao-$a3
是保存整数类型变量的函数参数寄存器。
我知道这些都没有在函数调用中保留,但是我不明白 MIPS 中有文字用途吗?在什么情况下我们需要使用这些寄存器?
如果您计划调用使用 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
在这种情况下)可以假设返回值将是 in $v0
,并根据需要对该值执行某些操作。