有人可以向我解释一下吗?问题是:
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的值?
答案 0 :(得分:1)
有时需要通过第三个寄存器提供的'变量'进行转换: sllv $ s1,$ s2,$ s3#s1 = s2&lt;&lt; S3 使用真正的MIPS指令实现新的sllv指令。
注意:移位金额必须介于0到31之间(含)。所以$ s3中的值必须以模32减少。这很容易通过'anding'以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它就像一个旋转)但他们的意思是采用模数。