Skip to content

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与之同理。