2016-05-15 57 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