ARM下的ASM - 指令mov

时间:2015-07-23 16:43:59

标签: assembly arm mov

我是ASM语言的重要人物,我想知道如何将值-1894025488设置为寄存器r0

如果值是" 10",那么它是正确的

mov r0, #10

HEX - > 0A00A0E3

但是,如果该值大于" 1024" as" -1894025488",然后我无法转换为hexa

mov r0, #-1894025488

HEX - >我无法转换为Hexa

你能帮助我吗?

1 个答案:

答案 0 :(得分:0)

你需要阅读arm文档中的arm指令,这应该是显而易见的。

首先,如果您有一台计算机,您可以将该数字转换为十六进制,但不一定需要。

有三个主要的手臂指令集,手臂,拇指和手臂的拇指2延伸(具有mov的手指)。每个都有立即值的不同规则。如果你考虑一下,你想要将0x8F1B76f0加载到一个寄存器中,这显然是一个32位数,大多数不是1或零。臂指令是32位,拇指是16或16 + 16(32)。不可能把32位立即加上一些操作码位称为这是一个mov和什么寄存器并且都适合32位,不能将32 + N位压缩成32位,所以就像MIPS你要做的一样别的。手臂解决方案是利用桶形移位器,因此您有大约8个有效位,可以将它们移动到不同的位置。例如,使用arm指令可以做到

mov r0,#0x86000000

因为非零位在可以转换的8(10000110 ....)组内。虽然我不认为它的工作原理但不确定。

有一个快捷方式

ldr r0,=0x8F1B76f0

这显然是为了让汇编程序从标签名称填写地址,但你可以作弊并在其中放置一个值。

但所有这一切都是让汇编程序生成pc相对负载

ldr r0,temp
...
temp : .word 0x8F1B76f0

这是始终能够加载任何常量的正确方法,并且所有三个指令集都支持pc相对字大小的加载。