ARM AArch64汇编:立即超出范围

时间:2016-03-02 19:36:47

标签: assembly arm arm64

我在AArch64汇编指令中使用立即值时遇到问题。我用谷歌搜索但找不到任何解决方案。我想简单地AND w注册,其立即值如下:

"and w9, w8, #0x5fffffff \n\t"

这给了我immediate out of range at operand 3错误。当我希望xor使用x寄存器立即生成值时,会发生同样的情况:

"eor x0, x0, #ffffffffffffffff"

有谁知道为什么?

1 个答案:

答案 0 :(得分:1)

A64指令集对可在指令中使用的类型的种类有非常奇怪的限制。基本限制相对简单,所有指令都是32位长,指令只能使用32位的小子集作为立即值。奇怪的部分是哪个立即值对于哪个指令是合法的。根据ARM编译器armasm参考指南,ANDEOR指令将立即值限制为:

  

这种立即数是32位或64位模式   被视为大小相同元素的向量 e = 2,4,8,16,32或64   位。每个元素包含相同的子模式:单次运行1到 e -1   非零位,旋转0到 e -1位。这种机制可以生成5,334   独特的64位模式(2,667对模式及其按位反转)。   因为无法以这种方式描述全0和全1值,所以   汇编程序生成错误消息。

对于第一条指令,您需要先将立即值加载到另一个寄存器中。类似的东西:

ldr w10, =0x5fffffff
and w9, w8, w10

对于第二条指令,您可以将其替换为MVN (bitwise NOT)指令:

mvn x0, x0

请注意,最后一条指令实际上是ORN (bitwise OR NOT)指令的别名:

orn x0, xzr, x0