附录C MIPS

C.1 寄存器

MIPS遵循的调用约定是O32。

C.1.1 通用寄存器GPR

编  号

别  名

描  述

$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访问

C.1.2 浮点寄存器FPR

名  称

描  述

$F0~$F1

函数返回值

$F2~$F3

未被使用

$F4~$F11

用于临时数据

$F12~$F15

函数的前两个参数

$F16~$F19

用于临时数据

$F20~$F31

用于临时数据,被调用方函数必须保全

C.2 指令

MIPS的指令分为以下3类:

指令目标寄存器,源寄存器1,源寄存器2

当前两个操作数相同时,IDA可能会以以下形式进行显示:

指令目标寄存器/源寄存器1,源寄存器2

这种显示风格与x86汇编语言的Intel语体十分相似。

转移指令

实现转移功能的指令可分为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里封装转移条件表达式。