跳转到内容

MIPS 汇编/算术指令

来自维基教科书,开放的书籍,开放的世界

寄存器算术指令

[编辑 | 编辑源代码]
指令
add
类型
R 型

此指令将两个操作数相加,并将结果存储在目标寄存器中。负数使用 二进制补码表示法 自动处理,因此不需要使用不同的指令来处理有符号数和无符号数。

指令
sub
类型
R 型

sub 指令从第一个源操作数中减去第二个源操作数,并将结果存储在目标操作数中。在伪代码中,操作执行以下操作

rd := rs - rt

addsub 都会在发生溢出时产生陷阱。但是,某些编程系统(如 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 位结果

[编辑 | 编辑源代码]

64 位结果寄存器被分成两个 32 位段:HILO。我们可以分别使用 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 型
华夏公益教科书