2016-05-15 62 views
0

有沒有辦法來位移這樣一個立即值:如何位移位立即值

MOV R0, #N, LSR #1(不工作)

或做我必須做這兩個指令?

MOV R0, #N MOV R0, R0, LSR #1

+0

你爲什麼要這麼做? –

+0

我想在R0中的N/2的值 – DBLouis

+0

那麼就使用一個立即值即N/2! –

回答

1

讓有關使用滾筒式移位器編碼的立即成機器代碼彙編擔心。

正如邁克爾說,裝配支持組裝時間常數的表達式,所以你應該能夠編寫

MOV R0, #(N >> 1) 

只要在可以使用即時位數量有限編碼值結果並旋轉計數。

如果你不知道它會永遠組裝,並確定與留的選擇到組裝,使用僞指令獲取一個常到寄存器以任何方式最有效:

ldr r0, =(N >> 1)  @ I think I have the right syntax here 

這會組裝成mov-immediate或來自附近常數的PC相對負載,或者可能是另一種選擇。


如果你關心哪個編碼用於mov r0, #value(如0x4 ROR 20x1 ROR 0),然後使用:

mov r0, #0x4, #2  @ rotates to the right by 2. 

不像mov帶寄存器操作數,mov -immediate不提供LSL,LSR,ROL,ROR等桶形移位器選擇。它總是向右旋轉,並且計數必須是對於ARM編碼。

IIRC,Thumb允許任何計數,但是立即數比較少。

查看ARMv7 reference manual瞭解更多信息。

+1

明確的即時編碼的語法是'#imm8,#rot',例如。 'mov r0,#4,#2'代表一個非標準的'mov r0,#1'(旋轉是在右邊,而不是在左邊)。 – Notlikethat