Theme Preview

MIPS32寄存器名与其编号对应关系

由 李晓岚 在 2013年01月09日发表

MIPS32有32个寄存器,并使用两种方式来对其命名。

  1. 数字编号命名,即$0, $1, ..., $31。
  2. 便于汇编程序到助记符。

通常使用如下到助记符名称:

  • $zero 由其名字就可以看出其值永远为0,而不管你进行什么操作。
  • $at 为汇编器保留的寄存器。
  • $v0, $v1 返回值(value)寄存器。函数的返回值通过这两个寄存器返回给调用者,根据返回值的bit数,优先使用$v0。
  • $a0, $a1, $a2, $a3 用于函数调用时传递部分参数(argument,名字中的a即来源于此),其它参数则位于栈上。
  • $t0, $t1, ..., $t9 十个临时(temporary)寄存器。函数调用过程中,被调用函数不需要保护的寄存器。
  • $s0, $s1, ..., $7 八个需要保护(saved)的寄存器。函数调用过程中,如果想使用这八个寄存器,则必须保存寄存器中的内容,使用完毕后,函数返回前必须恢复到使用前的值。
  • $k0, $k1 为操作系统保留。
  • $sp 栈指针(stack pointer),指向栈顶,且栈顶包含有效数据。栈向低地址增长。
  • $fp 栈帧指针(frame pointer),指向函数栈帧
  • $gp 全局指针(global pointer),通常指向GOT。
  • $ra 返回地址(return address)寄存器。jal指令自动将其后一条指令的地址保存至$ra,然后转到被调用函数执行。

助记符名称与编号对应关系

名字 编号 用途 函数调用过程中是否需要保护
$zero 0 常数0 规则对此不适用
$at 1 为汇编器保留
$v0, $v1 2, 3 函数返回值
$a0-$a3 4-7 函数参数
$t0-$t7 8-15 临时变量
$s0-$s7 16-23 保存函数调用前后需要维持不变的变量
$t8-$t9 24, 25 临时变量
$k0, $k1 26, 27 为OS保留 规则对此不适用
$gp 28 全局指针
$sp 29 栈指针
$fp 30 栈帧指针
$ra 31 返回地址 规则对此不适用

实际应用中,不需要记住寄存器名字和编号之间的关系,编写汇编代码使用助记符名字即可。上述内容均为O32调用约定,适用于MIPS32,与N32和N64有一定区别,但与O64差别甚微。

标签:MIPS

comments powered by Disqus