MARS帮助文档整理_扩展指令
// 在之前记录的基础指令上进行组合与扩展 → 编译时可以看到是哪些组合
// 主要是指令可以直接执行与立即数 / 地址(包括标签)/ 寄存器地址与立即数加和 / 寄存器地址与立即数与label加和的操作,取代基本操作中大量出现的$t3
,也即不用分解成u、i等描述了,当然,使用也是合法的,后面不列出来了
-
add $t1, $t2, -100
以及add $t1, $t2, 100000
直接用add指令进行与16bit和32bit立即数的加和
-
and $t1, 100
以及and $t1, $t2, 100
直接用and指令进行与立即数的与运算
-
b label
直接无条件跳转
-
beq
等条件跳转指令可以直接把用于比较运算的$t2
换成立即数了 -
基础指令中二目操作的
alu' $t1, $t2
都可以换成alu' $t1, $t2, $t3
了,即将$t2
与$t3
运算的结果存到$t1
中 -
mul
的$t3
同理更换mulo $t1, $t2, $t3
将$t1
设置为$t2
和$t3
的乘积的低 32 位(考虑溢出)→ 同理$t3可更换 -
neg $t1, $t2
置$t1
为$t2
的取反 -
not $t1, $t2
置$t1
为$t2
的按位取反 -
rem $t1, $t2, $t3
置$t1
为$t2
/$t3
的余数 (Remainder) -
rol $t1, $t2, $t3
将$t1
置为$t2
按$t3
中指定的位数向左移动的值 (Rotation Left)ror
同理
-
基础指令中的“小于则置”
slt
可以扩展成其他关系了,如seq
、sge
、sgt
、sle
、sne
等 -
基础指令中的
sdc1
可以分解成sd
了:将$t1
和下一个寄存器的内容存储到从有效内存字地址开始的64位 -
基础指令中默认对齐,当未对齐时,可以使用unaligned load做符号扩展或零扩展
ulh $t1, ($t2)
或ulhu $t1, ($t2)
:未对齐加载半字,将$t1
设置为从有效内存字节地址$t2
开始做符号扩展或零扩展得到的16位值ulw
同理存储也同理:
ush
、usw
等 -
LOAD系列
-
la $t1, ($t2)
置$t1
为地址$t2
中存储的内容[同理]
la, $t1, -100
、la $t1, 100
、la $t1, 100($t2)
、la $t1, label($t2)
、la $t1, label + 100000($t2)
等等 -
lb $t1, ($t2)
、lb $t1, 100
等等lb
换成lh
、lw
、lwl
、lwr
、ll
等都同理(后一个操作数的更换) -
ld $t1, ($t2)
Load Doubleword:将
$t1
和下一个寄存器设置为从有效内存字地址$t2
开始的 64 位值(因为一个默认只能放32bit嘛)-
ld $t1, -100($t2)
有效内存字节地址是
$t2
与有符号立即数的加和[同理]替换成
100000($t2)
、label($t2)
、label + 100000($t2)
等等 -
ldc1 $f2, ($t2)
置CP1寄存器$f2
和$f3
为从有效内存字地址$t2
开始的 64 位值把
$t2
换成那老几样都同理lw
也有lwc1
操作
-
-