mul
不是伪指令。它不会修改所做的hi
orlo
寄存器mult
。它们是指令集中不同的真实指令。
一般来说,我们有a = b * c
由于将两个 32 位数字相乘会产生 64 位结果,因此在一般情况下,我们使用mult
,然后用 得到结果的低 32 位,用 得到结果mflo
的高 32 位mfhi
。这允许更高的准确性,但需要额外的指令 [或两条] 来获得结果。
如果我们只关心乘法结果的低 32 位(例如数组索引计算),我们可以使用mul
which 允许结果与参数位于不同的寄存器中(在单个指令中)
考虑一个简单的程序:
.text
.globl main
main:
mul $v0,$a0,$a1
mult $v1,$a2
mflo $v0
现在,如果我们使用 组装它mars
,我们会得到:
00400000: 70851002 mul $v0,$a0,$a1
00400004: 00660018 mult $v1,$a2
00400008: 00001012 mflo $v0
请注意,我们mflo
在第 3 行有一条真正的指令。如果 mul
是伪操作,mars
则 [必须]在and行mflo $v0
之间注入一个mul
mult
更新:
那很有意思。你是对的,它不是一个伪指令。(你会在组装时看到它,如果是的话。)但是当我使用 MARS 时,mul 和 mult 都会修改 hi 和 lo。也许这是一个火星错误?
可能。spim
也修饰 hi 和 lo。
经过进一步思考,考虑到原始 mips CPU 内核的时代(大约 1985 年)和他们拥有的 [极其] 有限数量的门,这似乎是合乎逻辑的。
但是,真正的 mips 内核今天仍然存在。该公司是“MIPS Technologies, Inc”,截至 2017 年仍然存在。
公司 [AFAICT] 的 ISA 参考手册在此处有副本:https ://s3-eu-west-1.amazonaws.com/downloads-mips/documents/MD00086-2B-MIPS32BIS-AFP-6.06.pdf
在该文档中,该mul
说明并未将更改 hi 或 lo 列为副作用。
在我看过的一些mult
文档中[我不记得是哪个],它指出[对于旧/真实硬件],您必须在 the和 an之间有一个干预指令mflo
(例如 a nop
)。模拟器不需要这个。
作为一种好的做法,我可能不会依赖 lo/hi 的有效期太久,mult
也不会完全依赖它们mul
,因此,对于课堂作业,这有点争议。
看看有什么作用会很有趣qemu
。spim
它比or [我更喜欢的] 更难使用mars
,但可能更接近实际硬件的功能。