如何对立即值进行位移

时间:2016-05-15 10:17:57

标签: assembly arm

有没有办法像这样对立即值进行位移:

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

还是必须在两条指令中执行此操作?

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

1 个答案:

答案 0 :(得分:1)

让汇编程序担心使用桶形移位器将immediates编码为机器码。

正如Michael所说,汇编程序支持汇编时常量的表达式,所以你应该能够编写

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 - 立即数不提供桶形移位器选项,如LSL,LSR,ROL,ROR。它始终是向右旋转的,并且对于ARM编码,计数必须是均匀的。

IIRC,Thumb允许任何计数,但立即位数较少。

有关详细信息,请参阅ARMv7 reference manual