有没有办法像这样对立即值进行位移:
MOV R0, #N, LSR #1
(不工作)
还是必须在两条指令中执行此操作?
MOV R0, #N
MOV R0, R0, LSR #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 2
与0x1 ROR 0
),请使用:
mov r0, #0x4, #2 @ rotates to the right by 2.
与带有寄存器操作数的mov
不同,mov
- 立即数不提供桶形移位器选项,如LSL,LSR,ROL,ROR。它始终是向右旋转的,并且对于ARM编码,计数必须是均匀的。
IIRC,Thumb允许任何计数,但立即位数较少。
有关详细信息,请参阅ARMv7 reference manual。