寄存器分为2部分:内部32个通用寄存器和8个专用寄存器。可以直接在GDB中输入info registers就能得到32个通用寄存器和8个专用寄存器的值了,参见下表:
(gdb) info registers zero at v0 v1 a0 a1 a2 a3 R0 00000000 00000001 0000000f 0000000f 00000000 0000000f 0000000e 00000071 t0 t1 t2 t3 t4 t5 t6 t7 R8 00000072 00000001 00000203 80003cb1 80003cb0 0000007f 00000080 00000008 s0 s1 s2 s3 s4 s5 s6 s7 R16 00000001 80003bb0 00000000 00000000 00000000 00000000 00000000 00000000 t8 t9 k0 k1 gp sp s8 ra R24 0000101a 0000000d 00000000 00000000 8000bbd0 807fffb8 00000000 80000830 sr lo hi bad cause pc 00000000 00000000 00000007 00000000 00000000 80000830 fsr fir 00000000 00000000 |
其中32个通用寄存器还有别名,其别名(汇编名)和作用如下:
REGISTER |
NAME |
USAGE |
$0 |
$zero |
常量0(constant value 0) |
$1 |
$at |
保留给汇编器(Reserved for assembler) |
$2-$3 |
$v0-$v1 |
函数调用返回值(values for results and expression evaluation) |
$4-$7 |
$a0-$a3 |
函数调用参数(arguments) |
$8-$15 |
$t0-$t7 |
暂时的(或随便用的) |
$16-$23 |
$s0-$s7 |
保存的(或如果用,需要SAVE/RESTORE的)(saved) |
$24-$25 |
$t8-$t9 |
暂时的(或随便用的) |
$28 |
$gp |
全局指针(Global Pointer) |
$29 |
$sp |
堆栈指针(Stack Pointer) |
$30 |
$fp |
帧指针(Frame Pointer) |
$31 |
$ra |
返回地址(return address) |
二、除了32个通用寄存器之外,还有8个专用寄存器,其含义如下:
sr ( 全称Status ,CP0 Reg12) Processor status and control; interrupt control; and shadow set control
lo ( 全称WatchLo , CP0 Reg18) Low-order watchpoint address
hi ( 全称WatchHi, CP0 Reg19) High-order watchpoint address
bad ( 全称BadVAddr, CP0 Reg8) Reports the address for the most recent address-related exception
cause (CP0 Reg13) Cause of last exception
pc 很明显这个是程序计数寄存器,奇怪的是在32个通用寄存器以及CP0的32个寄存器中都没有找到他,最接近的一个是CP0Reg14 EPC (Program counter at last exception.)
fsr 浮点相关寄存器,具体用途不明
fir浮点相关寄存器,具体用途不明
下面将重点描述其中几个比较重要的专用寄存器内容和功能:
2.1 STATUS寄存器
这个寄存器标识了处理的状态。其中,中断控制的8个IM(Interrupt Mask)位和设定处理器大小端的 RE(Reverse Endianess)位。
2.2 CAUSE寄存器
在处理器异常发生时,这个寄存器标识除了异常的原因,其中,最重要的是Bit2到Bit6这5个bit所表示的Exception Code位,它们
标识除了引起异常的原因,具体数值代表的异常类型如下所示:
2.3 EPC寄存器
这个寄存器的作用很简单,就是 保存异常发生时的指令地址。从这个地方可以找到异常发生的指令,再结合BadVAddr, sp, ra等寄存器,就可以推倒出
异常时的程序调用关系,从而定位问题的原因。