2014-02-25 27 views
0

這是一個作業問題,但我被徹底難倒了。這些問題應該有一個直接的解決方案,我想知道老師是否可能錯誤地這樣做了這個問題。但確切的文字如下:MIPS彙編代碼 - 使用內存中的8位移位計數向左移動

「根據存儲器位置0x10010012中存儲的8位移位計數,編寫一個名爲LSHIFT的程序,將邏輯上移動存儲單元0x10010010和0x10010011的16位內容。

這是我的問題。爲了邏輯移位,MIPS只有兩條指令:sll,它取一個立即數(因此我不能使用它,對吧?)和sllv,它們將一個值存儲在一個寄存器中,但只使用5位。這意味着使用sllv,我只能將位移到最多32個位置(2^5),但問題是我需要編寫一個程序,最多可移動256個位置(8位移位計數爲2^8)。我只能想到兩個方法解決此問題:

1)用乘法來算,而不是

2)突破了8位數字爲8個和運行8個單獨的指令(例如,如果移位數爲256,左移32次,8次)。

我也想仔細檢查 - 位可以移入其他內存位置,更正嗎?還是被限制在32位,%4內存地址?例如,計數11111的5位移位與計數11111111的8位移位的作用相同,因爲位限制在相同的32位存儲空間中?

糾正我,如果我錯了什麼,因爲就像我說的,應該有一個簡單的解決方案。

+0

你怎麼知道,如果寄存器已被移位超過16位? (以及你打算如何使用乘法?)對我來說,這聽起來像名字下降。 –

+0

這是我的問題的一部分。我問是否有差別,即如果你能說出(在比內存空間大小更大或更小的位移之間)。從你的評論我假設你不能告訴,我可以使用sllv指令。 另外,對於它的價值,我正在考慮用乘法替換移位 - 每次移位乘以2。 – Bobazonski

回答

1

sllv使用5位來選擇32個寄存器中的一個。從那裏你不限於該寄存器的5位。

看看這個:

.text 
main: 

    addi $t0 $zero 1 
    addi $t1 $zero 30 
    sllv $a0 $t0 $t1 

    li $v0 1 
    syscall 

    jr $ra 

輸出1073741824或2^30。