MIPS遵循的调用约定是O32。
编 号 |
别 名 |
描 述 |
---|---|---|
$0 |
$ZERO |
总是为零。给这个寄存器赋值到操作相当于NOP |
$1 |
$AT |
汇编宏和伪指令使用到临时寄存器 |
$2~$3 |
$V0~$V1 |
用于传递函数返回值 |
$4~$7 |
$A0~$A3 |
用于传递函数的参数 |
$8~$15 |
$T0~$T7 |
可供临时数据使用 |
$16~$23 |
$S0~$S7 |
可供临时数据使用,被调用方函数必须保全 |
$24~$25 |
$T8~$T9 |
可供临时数据使用 |
$26~$27 |
$K0~$K1 |
OS Kernel保留 |
$28 |
$GP |
全局指针/Global Pointer,被调用方函数必须保全PIC code以外的值 |
$29 |
$SP |
栈指针/Stack Pointer |
$30 |
$FP |
帧指针/Frame Pointer |
$31 |
$RA |
返回地址/Return Address |
n/a |
PC |
PC |
n/a |
HI |
专门存储商或积的高32位,可通过MFHI访问 |
n/a |
LO |
专门存储商或积的低32位,可通过MFLO访问 |
名 称 |
描 述 |
---|---|
$F0~$F1 |
函数返回值 |
$F2~$F3 |
未被使用 |
$F4~$F11 |
用于临时数据 |
$F12~$F15 |
函数的前两个参数 |
$F16~$F19 |
用于临时数据 |
$F20~$F31 |
用于临时数据,被调用方函数必须保全 |
MIPS的指令分为以下3类:
R-Type,Register/寄存器类指令。此类指令操作3个寄存器,具有以下形式:
指令目标寄存器,源寄存器1,源寄存器2
当前两个操作数相同时,IDA可能会以以下形式进行显示:
指令目标寄存器/源寄存器1,源寄存器2
这种显示风格与x86汇编语言的Intel语体十分相似。
I-Type,Immediate/立即数类指令。涉及2个寄存器和1个立即数。
J-Type,Jump/转移指令。在MIPS转移指令的opcode里,共有26位空间可存储偏移量的信息。
实现转移功能的指令可分为B开头的指令(BEQ,B等)和J开头的指令(JAL,JALR等)。这两种跳转指令的区别在哪里?
B-类转移指令属于I-type的指令。也就是说,B-指令的opcode里封装有16位立即数(偏移量)。而J和JAL属于J-type指令,它们的opocde里存有26位立即数。
简单地说,B开头的转移指令可以把转移条件(cc)封装到opcode里(B指令是“BEQ $ZERO, $ZERO, Label”的伪指令)。但是J开头的转移指令无法在opcode里封装转移条件表达式。