MIPS 汇编/算术指令
指令
|
add | 类型
|
R 型 |
此指令将两个操作数相加,并将结果存储在目标寄存器中。负数使用 二进制补码表示法 自动处理,因此不需要使用不同的指令来处理有符号数和无符号数。
指令
|
sub | 类型
|
R 型 |
sub 指令从第一个源操作数中减去第二个源操作数,并将结果存储在目标操作数中。在伪代码中,操作执行以下操作
rd := rs - rt
add 和 sub 都会在发生溢出时产生陷阱。但是,某些编程系统(如 C)会忽略整数溢出,因此为了提高性能,“无符号”版本的指令不会在溢出时产生陷阱。
指令
|
addu | 类型
|
R 型 |
指令
|
subu | 类型
|
R 型 |
乘法和除法操作与其他操作略有不同。即使它们是 R 型操作,它们也只接受 2 个操作数。结果存储在一个特殊的 64 位结果寄存器中。我们将在本节之后讨论结果寄存器。
指令
|
mult | 类型
|
R 型 |
此操作将两个操作数相乘,并将结果存储在 rd 中。乘法操作必须区分有符号量和无符号量,因为二进制补码表示法的简单性在乘法中不适用。mult 指令将有符号数相乘并进行符号扩展。
将 2 个 32 位数相乘的结果是一个 64 位结果。我们将在下面讨论 64 位结果。
指令
|
multu | 类型
|
R 型 |
multu 指令将两个操作数相乘,并将结果存储在 rd 中。此指令仅用于无符号数,不会对负结果进行符号扩展。此操作也会产生 64 位结果。
指令
|
div | 类型
|
R 型 |
div 指令将第一个参数除以第二个参数。商存储在结果寄存器的最低 32 位中。余数存储在结果寄存器的最高 32 位中。与乘法一样,除法也需要区分有符号数和无符号数。此操作使用有符号数。
指令
|
divu | 类型
|
R 型 |
与 div 指令一样,此操作将第一个操作数除以第二个操作数。商存储在结果的最低 32 位中,余数存储在结果的最高 32 位中。此操作数将无符号数相除,不会对结果进行符号扩展。
64 位结果寄存器被分成两个 32 位段:HI 和 LO。我们可以分别使用 mfhi 和 mflo 操作与这些寄存器交互。
指令
|
mfhi | 类型
|
R 型 |
只接受 1 个操作数。此指令将结果寄存器的最高 32 位移动到目标寄存器中。
指令
|
mflo | 类型
|
R 型 |
也只接受 1 个操作数。将结果寄存器 LO 部分的值移动到指定的寄存器中。
如果乘积的最高(最显著)32 位对计算不重要,程序员可以跳过一步,使用丢弃最高 32 位的指令。
指令
|
mul | 类型
|
R 型 |
mul 指令没有无符号版本。mul 指令也可能会覆盖 HI 和 LO 中的现有值。
这些操作对它们的运算对象执行按位逻辑运算。
指令
|
and | 类型
|
R 型 |
对两个操作数执行按位 AND 运算,并将结果存储在 rd 中。
指令
|
or | 类型
|
R 型 |
对两个操作数执行按位 OR 运算,并将结果存储在 rd 中。
指令
|
nor | 类型
|
R 型 |
对两个操作数执行按位 NOR 运算,并将结果存储在 rd 中。
指令
|
xor | 类型
|
R 型 |
对两个操作数执行按位 XOR 运算,并将结果存储在 rd 中。
这些指令将 16 位立即数的值符号扩展到 32 位,并执行与不带尾随“i”的指令相同的操作。
指令
|
addi | 类型
|
I 型 |
指令
|
addiu | 类型
|
I 型 |
要减去,请使用负立即数。
所有逻辑函数都将立即数零扩展。
指令
|
andi | 类型
|
I 型 |
将 rs 与立即数的按位 AND 相结合,并将结果存储在 rt 中。
指令
|
ori | 类型
|
I 型 |
将 rs 与立即数的按位 OR 相结合,并将结果存储在 rt 中。
指令
|
xori | 类型
|
I 型 |
将 rs 与立即数的按位 XOR 相结合,并将结果存储在 rt 中。
指令
|
sll | 类型
|
R 型 |
逻辑左移:rd ← rt << shamt。从右边用零填充位。
指令
|
srl | 类型
|
R 型 |
逻辑右移:rd ← rt >> shamt。从左边用零填充位。
指令
|
sra | 类型
|
R 型 |
算术右移。如果 rt 为负数,则用 1 而不是 0 填充前导位:rd ← rt >> shamt。
由于并非所有移位量都是预先知道的,MIPS 定义了这些指令的版本,这些版本按 rs 寄存器中的量进行移位。行为在其他方面是相同的。
指令
|
sllv | 类型
|
R 型 |
指令
|
srlv | 类型
|
R 型 |
指令
|
srav | 类型
|
R 型 |