2014-03-12 125 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