【固件分析】MIPS 指令集与汇编

参考链接:

MIPS 是流行的 RISC 指令集。下面的内容都是针对 32 位的情况。

一、寄存器

MIPS 有 32 个通用寄存器,每个寄存器 4 字节。

Untitled

二、指令

由于 MIPS 是 RISC,指令格式固定,长度为 4 字节。MIPS 的指令格式分为三种。

R 型指令

与寄存器操作相关的指令。

Untitled

  • op:指令的基本操作,opcode

  • rs: 第一个源操作数寄存器

  • rt: 第二个源操作数寄存器

  • rd: 用于存放操作结果的目的寄存器

  • shamt:位移量,用于 sll, srl 等指令

  • funct: 功能码。用于和op搭配使用,指示操作

例:add $8, $9, $10 按照上面的表述为 (0, 9, 10, 8, 0, 32) ,即 $8 为目的寄存器,$9 和 $10 为两个源操作数寄存器,结果为 $8 = $9 + $10 。

I 型指令

和立即数相关的指令。

Untitled

例:addi $21,$22,$-50

J 型指令

和跳转有关的指令。opcode 6bit,target address 26bit。

Untitled

target address 长度为 26 位。一个合法指令地址的最后 2 bit 都是 00。因为指令是 4 字节对齐的。所以最后两位 00 可以省去。此时还需要 32 - 2 = 30 bit。最高 4 bit 默认为 0000,即使用内存的低 256MB。此时 26 bit 就足够了。如果真的跨越了 256MB 的边界,可以将地址保存到寄存器中,使用 jr 指令跳转。


三、汇编语言

Untitled

基本上查表即可。有几个点需要注意:

  1. 偏移寻址

    对于指令 lw $t0, 32($s3) ,是以 s3 寄存器的值作为基地址,偏移 32 个字节寻址,取一个字 (word),保存到 t0 寄存器中。也就是说偏移量 32 表示的是字节

  2. 关于 ll 指令和 sc 指令

    看表我完全没理解是什么意思,所以就查了一下。

    参考链接:https://www.csdn.net/tags/OtTaggysOTgzOTAtYmxvZwO0O0OO0O0O.html
    其中ll 和 sc 分别对应着链接取数和条件存数 这两个指令,$s1 中存放着我们的锁单元,对应着我们一种资源,当 $t1 从锁单元中取出来值,如果有任何处理器插入改变了锁单元的值,指令都会将 $t0 变为 0(诸位莫忘了 $t0 是一个临时存储器,如果发生了别的处理器的操作,临时寄存器会被瞬间归零),那么这段指令就会重新执行。直到完全完成原子交换,$s1 所指向的锁单元中的值与 $s4 完成 值的交换。