有时需要执行通过第三个寄存器提供的“可变”量的移位: 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,如果你认为它像旋转)但他们的意思是取模。