0%
MIPS 指令系统
MIPS指令中数据的表示
- 提供 32 个通用寄存器
- 大端存储
- 只能通过 Load / Store 指令访问存储器数据
MIPS 指令格式和寻址方式
指令格式
- 所有指令都是 32 位宽,需按字地址对齐,字地址为 4 的倍数
- R- Type(RR 型指令)
- 寻址方式:寄存器寻址
- 若是双目运算类指令,则 rs 和 rt
的内容分别作为第一和第二源操作数,结果送 rd;
- 若是移位指令,则对 rt 的内容进行移位,结果送 rd ,所移位数由 shamt
字段给出
- 指令格式如下:
操作码:000000(6 个
0)(31-26:6位) |
第一源操作数(25-21:5位) |
第二源操作数(20-16:5位) |
存储结果(15-11:5位) |
移位指令位移量(10-6:5位) |
操作类型(如 sub
add等)(5-0:6位) |
- I-Type(立即数型指令)
- 寻址方式:寄存器寻址、立即数寻址、相对寻址、基址寻址、变址寻址
- 若是双目运算类指令,则将 rs
的内容和立即数分别作为第一和第二源操作数,结果送 rt
- 若是 Load/Store 指令,则将 rs
的内容和立即数符号扩展后的内容相加作为内存单元地址,Load
指令将内存单元内容送 rt, Store 指令将 rt 内容送内存
- 若是条件转移(分支)指令,则对 rs 和 rt
内容进行指定运算,根据运算结果决定是否转到转移目标地址处执行。(转移目标地址通过相对寻址方式得到,即将
PC 的内容和立即数符号扩展后的内容相加得到)
- 指令格式如下
操作码(31-26:6位) |
第一源操作数(25-21:5
位) |
存储结果(20-16:5
位) |
第二源操作数(15-0:16位) |
- J-Type(无条件跳转指令)
- 寻址方式:变通的直接寻址
- 将当前 PC 的高 4 位拼上 26 位直接地址,最后添上两个 0 ,即得到 32
位的跳转目标地址
- 指令格式如下
操作码:000010 或
000011(31-26:6 位) |
(25-0:26 位) |
- 注: MIPS 中寻址方式由指令格式来确定,而指令格式由 op
来确定(6 位全 0 为 R 型;6 位 低三位为 010 或 011 为 J
型;剩余为 I 型)
MIPS 汇编语言
算数运算 |
add |
add s1, s2, s3 |
s1 = s2 + s3 |
|
subtract |
subtract s1, s2, s3 |
s1 = s2 - s3 |
存储访问 |
load word |
lw s1, 100( 2 ) |
s1 = Memory[s2 + 100] |
|
store word |
sw s1, 100( 2 ) |
Memory[s2 + 100] = s1 |
逻辑运算 |
and |
and s1, s2, s3 |
s1 = s2 & s3 |
|
or |
or s1, s2, s3 |
s1 = s2 \(|\) s3 |
|
nor |
nor s1, s2, s3 |
s1 = ~(s2 \(|\) s3) |
|
and immediate |
andi s1, s2, 100 |
s1 = s2 & 100 |
|
or immediate |
ori s1, s2, 100 |
s1 = s2 \(|\) 100 |
|
shift left logical |
sll s1, s2, 10 |
s1 = s2 << 10 |
|
shift right logical |
srl s1, s2, 10 |
s1 = s2 >> 10 |
条件分支 |
branch on equal |
beq s1, s2, L |
if(s1 == s2) goto L |
|
branch on not equal |
bne s1, s2, L |
if(s1 != s2) goto L |
|
set on less than |
slt s1, s2, s3 |
if(s2 < s3) s1 = 1; else s1 = 0 |
|
set on less than immediate |
slti s1, s2, 100 |
if(s2 < 100) s1 = 1; else s1 = 0 |
无条件跳转 |
jump |
j L |
goto L |
|
jump register |
j ra |
goto ra |
|
jump and link |
jal L |
ra = PC + 4; goto L(为什么加 4
因为每条指令 32 位【4 个字节】) |