MIPS寄存器说明

        寄存器分为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位,它们

标识除了引起异常的原因,具体数值代表的异常类型如下所示:

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等寄存器,就可以推倒出

异常时的程序调用关系,从而定位问题的原因。

猜你喜欢

转载自blog.csdn.net/jackixzj/article/details/54923904