我正在尝试将寄存器设置为12000.由于MOV在I图12000/2 ^ 8 = 375中不能设置大于255的值.但是375仍然太大而且不能被2整除.唯一剩下的就是将12000存储在内存中吗?效率低得多吗?
出于好奇,为什么它是255而不是256,因为它是未签名的?
您定位的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位.或者,您只需从内存中加载值而不是使用立即数.
传统上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相对而不是多个立即指令.
| 归档时间: |
|
| 查看次数: |
4071 次 |
| 最近记录: |