我在AArch64汇编指令中使用立即值时遇到问题。我用谷歌搜索但找不到任何解决方案。我想简单地AND
w
注册,其立即值如下:
"and w9, w8, #0x5fffffff \n\t"
这给了我immediate out of range at operand 3
错误。当我希望xor
使用x
寄存器立即生成值时,会发生同样的情况:
"eor x0, x0, #ffffffffffffffff"
有谁知道为什么?
答案 0 :(得分:1)
A64指令集对可在指令中使用的类型的种类有非常奇怪的限制。基本限制相对简单,所有指令都是32位长,指令只能使用32位的小子集作为立即值。奇怪的部分是哪个立即值对于哪个指令是合法的。根据ARM编译器armasm参考指南,AND和EOR指令将立即值限制为:
这种立即数是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