在Arm中表达大量数字

3 assembly arm

我正在尝试将寄存器设置为12000.由于MOV在I图12000/2 ^ 8 = 375中不能设置大于255的值.但是375仍然太大而且不能被2整除.唯一剩下的就是将12000存储在内存中吗?效率低得多吗?

出于好奇,为什么它是255而不是256,因为它是未签名的?

Ste*_*non 5

您定位的ARM拱门是什么?在ARMv7上,有一个非常好的解决方案 - 该movw指令需要16位立即:

movw r0, #12000
Run Code Online (Sandbox Code Playgroud)

在ARMv7之前,您需要使用两个步骤:

mov  r0,     #0x00002e00
orr  r0, r0, #0x000000e0
Run Code Online (Sandbox Code Playgroud)

注意,可表达的立即不仅是八位宽; 它们被任意偶数偏移旋转8位.或者,您只需从内存中加载值而不是使用立即数.


old*_*mer 5

传统上arm允许8或9位和一个移位,所以12000 = 0x2EE0,正如斯蒂芬指出你可以这样做:

mov r0, #0x2E00
orr r0, #0x00E0
Run Code Online (Sandbox Code Playgroud)

另一种方式,快捷方式是:

ldr r0,=0x2EE0
Run Code Online (Sandbox Code Playgroud)

这意味着汇编程序会找到一个放置该值然后执行pc相对加载的地方,或者您可以自己执行此操作:

ldr r0,mynumber
...
mynumber: .word 12000
Run Code Online (Sandbox Code Playgroud)

指令集的较新扩展允许立即有更多位.我通常使用

ldr r0,=0x2EE0
Run Code Online (Sandbox Code Playgroud)

解决方案,并确保我有无条件分支,基本上是汇编程序放置变量的池.编译器通常做同样的事情,如果他们不能在一条指令中使用立即数,他们倾向于使用负载pc相对而不是多个立即指令.