MIPS寄存器说明

寄存器分为2部分:内部32个通用寄存器和8个专用寄存器。可以直接在GDB中输入info registers就能得到32个通用寄存器和8个专用寄存器的值了,参见下表:

(gdb) info registers
zeroatv0v1a0a1a2a3
R000000000 00000001 0000000f 0000000f 00000000 0000000f 0000000e 00000071
t0t1t2t3t4t5t6t7
R800000072 00000001 00000203 80003cb1 80003cb0 0000007f 00000080 00000008
s0s1s2s3s4s5s6s7
R1600000001 80003bb0 00000000 00000000 00000000 00000000 00000000 00000000
t8t9k0k1gpsps8ra
R240000101a 0000000d 00000000 00000000 8000bbd0 807fffb8 00000000 80000830
srlohibadcausepc
00000000 00000000 00000007 00000000 00000000 80000830
fsrfir
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
【MIPS寄存器说明】暂时的(或随便用的)
$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位,它们
标识除了引起异常的原因,具体数值代表的异常类型如下所示:

0: Interrupt,中断; 1: TLB Modified,试图修改 TLB 中映射为只读的内存地址; 2: TLB Miss Load,试图读取一个没有在 TLB 中映射到物理地址的虚拟地址; 3: TLB Miss Store,试图向一个没有在 TLB 中映射到物理地址的虚拟地址存入数据; 4: Address Error Load,试图从一个非对齐的地址读取信息; 5: Address Error Store,试图向一个非对齐的地址写入信息; 6: Instruction Bus Error,一般是指令 Cache 出错; 7: Data Bus Error,一般是数据 Cache 出错; 8: Syscall,由 syscall 指令产生。操作系统下,通用的由用户态进入内核态的方法。可以类比 IA32 的 “ 调 用门 ” 理解; 9: Break Point,由 break 指令产生。最常见的 bp 指令,是由编译器产生的,在除法运算时插入一个 break point 指令,以达到在除 0 时抛出错误信息的目的。因此,如果在定位问题时发现了一个 Break Point 异常,且它的异常分代码为 07,应当考虑是出现了除 0 的情形; 10: RI,保留指令。在 CPU 执行到一条没有定义的指令时,进入此异常; 11: Co-processor Unavilible,协处理器不可用。这个异常是由于试图对不存在的协处理器进行操作引起的。特别的,在没有浮点协处理器的处理器上执行这条命令,会导致这个异常。随之,操作系统会调用 模拟浮点的 lib 库,来实现软件的浮点运算; 12: Overflow,算术溢出。只有带符号的运算会引起这个异常; 13: Trap,这个异常来源于 trap 指令。和 syscall 指令类似地,trap 指令也会引起一个异常,但 trap 指令 可以附带一些条件,这样可以用于调试程序用。 14: VCEI,指令高速缓存中的虚地址一致性错误。(没明白怎么回事,还有待高手补充) 15: Float Point Exception,浮点异常; 16: Co-processor 2 Exception,协处理器 2 的异常; 17~22,留作将来的扩展; 23: Watch,内存断点异常。当设定了 WatchLo/WatchHi 两个寄存器时起作用。当 load/store 的虚拟地址 和 WatchLo/WatchHi 中匹配时,会引发这样一个异常; 24~30,留作将来的扩展



2.3 EPC寄存器
这个寄存器的作用很简单,就是 保存异常发生时的指令地址。从这个地方可以找到异常发生的指令,再结合BadVAddr, sp, ra等寄存器,就可以推倒出
异常时的程序调用关系,从而定位问题的原因。

    推荐阅读