2014-03-12 110 views
4

有人可以向我解释这个吗?问题是:MIPS - 将数值移入寄存器值

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

+3

你从哪里找到该代码?在“SLL”指令中只有5位用于编码移位量。所以只能移动0..31的数量。除非你的汇编程序把它作为一个伪指令处理,并将它转换成一个“SLLV”(在这种情况下,只有低5位的移位量寄存器才会被使用)。使用MIPS64架构上的'DSLL32',您可以使用44的移位量(移位量仍然是5位,但偏移了32位)。 – Michael

+0

@迈克尔:这是我的教科书。我发现它很困惑,因为44. SLLV如何工作(“只有移位量寄存器的低5位将被使用”)? – user3025403

+0

看教材是否提到了64位模式。 –

回答

1

有时,有必要通过第三寄存器提供的 '可变' 量进行换档: sllv $ S1,$ s2中,$ S3#S1 = S2 < < S3 使用实现新sllv指令真实MIPS说明。

注意:移位量必须介于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位的机器,你需要采取移(36移位的模32可以像4换挡解释如果你认为它像一个旋转),但他们的意思是采取模。

+0

谢谢。这是我会想到的。 – user3025403