【发布时间】:2009-05-05 08:37:54
【问题描述】:
我正在 MIPS 中编写某些代码,我已经到了需要将结果临时存储在 HI 和 LO 特殊寄存器(均为 4 字节宽)中的地步。我可以随意使用这些说明:
divu s,t lo <-- s div t ; hi <-- s mod t
multu s,t hi / lo < -- s * t ;
所以,divu 将除法的结果存储在 LO 中,余数存储在 HI 中,而 multu 将乘法的结果存储在 LO(低 4 字节)和 HI(高 4 字节)中。
稍后,要从HI 和LO 寄存器中检索结果,我可以:
mfhi $v0
mflo $v1
我已经知道如何将计算结果存储在LO:
ori $v0,$0,1 # Store result from $a0 into LO
divu $a0,$v0
-
divu将除法的结果存储在 LO 中,因此我只需将结果除以 1 即可。
但是,存储在HI 中更复杂。一种方法是强制 multu 指令将值移动 32 位(4 字节):
multu $a0,0x80000000 # Shift $a0 by 32 bits and store into HI/LO
但是,结果是HI 中的值比它应该在的位置右 1 位(所以如果我的值是0100 1000,那么HI 将包含0010 0100)。
有人知道如何在HI 寄存器中存储一些东西吗?
【问题讨论】:
-
32 位(8 字节)。呃,32b 是 4 个字节,而不是 8 个。在 32 位 MIPS 上,HI 和 LO 都是 4 个字节。这是 8 个字节的对的 64 位串联(不适合任何单个寄存器)。
标签: assembly mips cpu-registers spim