MIPS32寄存器详解
通用寄存器
MIPS32包含32个通用寄存器,硬件没有强制性的指定寄存器的使用规则,但是在实际使用中,这些寄存器的用法都遵循一系列的约定。
$0 不管写入什么值,读该寄存器永远返回零;
$31 永远存在正常函数调用指令(JAL/JR)的返回地址;
$v0, $v1 用来存放一个子程序(函数)的非浮点运算的结果或者返回值,如果这两个寄存器不够存放需要返回的值,则通过内存完成;
$a0~a3 用来传递子函数调用时前4个非浮点参数,从左到右,超过4个参数使用任务栈传递;
$t0~t9 函数执行过程中存放临时变量,当调用子函数时,这些寄存器中的值可以被随意更改,无需保存;
$s0~s8 子函数必须保证当函数返回时,这些寄存器的内容必须回复到函数调用之前的值,一般是在函数入口将s0~s8压栈,函数返回时,退栈;
$k0, $k1 异常或者中断处理程序使用,可以随意使用,ISR结束不需要恢复寄存器值;
$gp 全局指针,指向运行时君顶的静态数据(static data)区域的一个位置,将gp指针作为基地址,前后32KB的数据存取,只需要一条指令即可实现;
$sp 栈顶指针,MIPS是大端模式,栈的增长方向是从高地址向低地址增长;
协处理器0寄存器
MIPS协处理器0是系统控制协处理器,主要实现CPU配置、高速缓存控制、异常和中断控制、定时器、事件计数器、奇偶校验、错误检测等功能。
MIPS协处理器1是浮点协处理器,是浮点运算单元。
MIPS协处理器2偶尔用于定制的ISA扩展或者在几个SoC应用中提供专用的寄存器。
MIPS协处理器3是浮点指令处理器,主要处理浮点运算指令,即浮点运算的控制单元。
协处理器0操作指令
1、写CP0协处理器寄存器
mtc0 s, <n> #把CPU通用寄存器s的值写入CP0寄存器n中
当MIPS刚问世时,最多可以支持32个CP0寄存器,但是后续的MIPS32/64最多可以支持256个CP0寄存器。为了保持指令向前兼容,通过在CP0寄存器号(实际上是指令中以前编码为0的域)后附加3位的select域来实现。这样就出现了CP0 12.1这种写法的寄存器,访问方式如下:
mtc0 s, $12, 1 #把CPU通用寄存器s的值写入CP0寄存器12.1中
2、读CP0协处理器寄存器
mfc0 d, <n> #从CP0寄存器n取值写入CPU通用寄存器d中