有人可以向我解释一下吗?问题是:
sll $t2, $t0, 44
目标是求出运算后$t2的值。初始值为:
$t2 = 0x12345678
$t0 = 0xAAAAAAAA
我理解“sll $t2, $t0, 44”的伪代码翻译是:
t2 = t0 << 44
t0 和 t2 的二进制表示为:
t2 = 10010001101000101011001111000
t0 = 10101010101010101010101010101010
但是如何移位 44 位呢?我以为一个值一开始就只有 32 位。如何通过将 $t0 移位 44 位来找到 $t2 的值?
最佳答案
有时需要通过第三个寄存器提供的“变量”量来执行移位: sllv $s1,$s2,$s3 #s1 = s2 << s3 使用真正的 MIPS 指令实现新的 sllv 指令。
注意:移位量必须在 0 到 31 之间(含)。因此 $s3 中的值必须以 32 为模减少。这可以通过与 000…0011111 = 0x1F 进行“与”轻松完成。此操作处理 $s3 为正数或负数的两种情况。
sllv $s1,$s2,$s3 # s1 = s2 << s3
add $s1, $s2, $0 # s1 <- s2
add $t0, $s3, $0 # t0 <- s3 (s3 must be preserved)
andi $t0, $t0, 0x1F # take mod 32
beq $t0, $0, EXIT # if t0 == 0, do nothing
addi $t1, $0, 0 # set i == 0 (start from 0)
LOOP:
sll $s1, $s1, 1
addi $t1, $t1, 1 # i=i+1
bne $t1, $t0, LOOP # LOOP while i is still not equal to t0
EXIT:
给你,这就是他们在教科书上的意思,对于 32 位机器,你需要对移位取模 32(如果你想到的话,移位 36 可以解释为移位 4它就像旋转)但他们的意思是取模。
关于assembly - MIPS - 按数值移位寄存器值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22359763/