LA32R汇编编程简介
寄存器使用约定
LA32R最常用的ILP32 ABI,其寄存器使用约定与LA64所用的LP64 ABI是一致的,具体如下所示:
| 寄存器号 | ABI别名 | 用途 | 调用者保存 | 被调用者保存 |
|---|---|---|---|---|
| $r0 | $zero | 常值零 | ||
| $r1 | $ra | 函数返回地址 | × | |
| $r2 | $tp | 指向线程私有存储区(TLS)的指针 | ||
| $r3 | $sp | 栈指针 | × | |
| $r4 - $r11 | $a0 - $a7 | 函数传入的参数 | × | |
| $r4 - $r5 | $v0 - $v1 | 函数返回值 | × | |
| $r12 - $r20 | $t0 - $t8 | 暂存寄存器 | × | |
| $r21 | - | Reserved | ||
| $r22 | $fp | 栈帧指针 | × | |
| $r23 - $r31 | $s0 - $s8 | 保存的寄存器 | × |
上表中调用者保存还是被调用保存,是配合着调用函数后哪些寄存器值保持不变的约定而来的。
以$s0 ~ $s8这些寄存器为例,当发生函数调用时,如果被调用者需要修改其中某些寄存器的值,那么被调用者在修改前需要将相关寄存器旧值存放在自己的栈帧上,等到返回前再从栈中恢复出来。这样从调用者的视角来看,$s0 ~ $s8这些寄存器在函数调用过程中值是保持不变的。
与之相反的,如$t0 ~ $t8这些寄存器,并未强制要求被调用者保存它们,那就意味着,如果调用者希望在调用执行函数前后它们的值保持不变,则需要调用者自己在调用执行其它函数前,将$t0 ~ $t8这些寄存器中需要保持不变的值存放到调用者自己的栈帧上,等到函数调用执行结束返回后,再从调用者自己的栈帧上恢复出来。$a0 ~ $a7以及$ra与之同理。