【固件分析】MIPS 指令集与汇编
参考链接:
MIPS 是流行的 RISC 指令集。下面的内容都是针对 32 位的情况。
一、寄存器
MIPS 有 32 个通用寄存器,每个寄存器 4 字节。
二、指令
由于 MIPS 是 RISC,指令格式固定,长度为 4 字节。MIPS 的指令格式分为三种。
R 型指令
与寄存器操作相关的指令。
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 型指令
和立即数相关的指令。
例:addi $21,$22,$-50
J 型指令
和跳转有关的指令。opcode 6bit,target address 26bit。
target address 长度为 26 位。一个合法指令地址的最后 2 bit 都是 00。因为指令是 4 字节对齐的。所以最后两位 00 可以省去。此时还需要 32 - 2 = 30 bit。最高 4 bit 默认为 0000,即使用内存的低 256MB。此时 26 bit 就足够了。如果真的跨越了 256MB 的边界,可以将地址保存到寄存器中,使用 jr 指令跳转。
三、汇编语言
基本上查表即可。有几个点需要注意:
偏移寻址
对于指令
lw $t0, 32($s3)
,是以 s3 寄存器的值作为基地址,偏移 32 个字节寻址,取一个字 (word),保存到 t0 寄存器中。也就是说偏移量 32 表示的是字节。关于 ll 指令和 sc 指令
看表我完全没理解是什么意思,所以就查了一下。
参考链接:https://www.csdn.net/tags/OtTaggysOTgzOTAtYmxvZwO0O0OO0O0O.html
其中ll 和 sc 分别对应着链接取数和条件存数 这两个指令,$s1 中存放着我们的锁单元,对应着我们一种资源,当 $t1 从锁单元中取出来值,如果有任何处理器插入改变了锁单元的值,指令都会将 $t0 变为 0(诸位莫忘了 $t0 是一个临时存储器,如果发生了别的处理器的操作,临时寄存器会被瞬间归零),那么这段指令就会重新执行。直到完全完成原子交换,$s1 所指向的锁单元中的值与 $s4 完成 值的交换。