5

谁可以给我解释一下这个?问题是:

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 的值?

4

1 回答 1

1

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

于 2014-03-13T16:33:07.517 回答