通用寄存器
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中
