MIPS架构的寻址模式有寄存器寻址、立即数寻址、寄存器相对寻址和PC相对寻址4种其中寄存器相对寻址、PC相对寻址介绍如下:
1.1、寄存器相对寻址
这种寻址模式主要被加载/存储指令使用,其对一个16位的立即数进行符号扩展然后与指定通用寄存器的值相加,从而得到有效地址
这种寻址模式主要被轉移指令使用。在转移指令中有一个16位的立即数将其左移2位并进行符号扩展,然后与程序计数器PC的值相加可得到有效地址。
- MIPS固定4字节指令长度
- 内存中的数据访问(load/store)必须严格对齐(至少4字节对齐)。
- 跳转指令只有26位目标地址加上2位对齐位,可寻址28位寻址空间即256MB。
- 条件分支指令只有16位跳转地址加上2位对齐位,共18位寻址空间即256KB。
- MIPS默认不把子函数的返回地址(就是调用函数的受害指令地址)存放到栈Φ而是存放到$31($ra)寄存器中,这对那些叶子函数(在函数中不再调用其他函数的函数)有利如果遇到嵌套函数,有其他机制处理
- 流水線效应。MIPS采用了高度的流水线其中一个最重要的效应就是分支延迟效应。在分支跳转语句后面的那条语句叫做分支延迟槽实际上,在程序执行到分支语句时当它刚把要跳转到的地址填充好(填充到代码计数器里),还没有完成本条指令时分支语句后面的那个指令就巳经执行了,其原因就是流水线效应 ---- 几条指令同时执行只是处于不同的阶段。
在执行第2行跳转分支时第3行的move指令已经执行完了。洇此在上面指令序列中,strrchr函数的参数来自第3行的$s0,而不是第1行的$s2
从流水线效应中可以看出,是否正确理解MIPS指令的这些特点会直接影響我们对MIPS程序逆向分析的结果因此,我们需要熟悉把握这些特点
所有MIPS指令的长度相同,都是32位为了让指令的格式刚好合适,设計者做了折中:将所有指令定长但是不同的指令有不同的格式。在MIPS架构中指令的最高6位均为Opcode码,剩下的26位可以将指令分为3种类型分別为R型、I型和J型。
- R型指令用连续3个5位二进制码表示3个寄存器的地址然后用1个5位二进制码表示移位的位数(如果未使用移位操作,则全为0)最后是6位的Function码(它与Opcode码共同决定R型指令的具体操作方式)。
- I型指令则用连续2个5位二进制码表示2个寄存器的地址然后是由1个16位二进制碼表示1个立即数二进制码。
- J型指令用26位二进制码表示跳转目标的指令地址(实际的指令地址应为32位其中最低2位为“00”,最高4位由PC当前地址决定)
- Opcode: 指令基本操作,称为操作码
- Rs: 第一个源操作数寄存器。
- Rt: 第二个源操作数寄存器
- Rd: 存放操作结果的目的操作数。
- Funct: 函数这个字段選择Opcode操作某个特定变体。
注意:$Rd表示目的寄存器 $Rs表示源寄存器,$Rt表示作为中间缓存的寄存器"imm"表示立即数,“MEM[]“表示RAM中的一段内存“offset"表示偏移量。
以"l"开头的都是加载指令以"s"开头的都是存储指令,这些指令用于从存储器中读取数据或者将数据保存在存储器中。
3.1.3、LW(Load Word) 指令用于从一个指定的地址加载一个word类型的值到一个寄存器中
3.1.5、MOVE指令用于寄存器之间值的传递。
MIPS汇编指令的算术运算特点如下:
- 算术运算指令的所有操作数都是寄存器不能直接使用RAM地址或间接寻址。