繁体   English   中英

ARM AArch64组装:立即超出范围

[英]ARM AArch64 Assembly: immediate out of range

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

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

这使我immediate out of range at operand 3错误immediate out of range at operand 3 当我想用x寄存器对立即数进行xor时,会发生相同的情况:

"eor x0, x0, #ffffffffffffffff"

有人知道为什么吗?

A64指令集对可在指令中使用的立即数种类有非常怪异的限制。 基本限制是相对简单的,所有指令的长度均为32位,并且指令只能将这32位的一小部分用作立即值。 奇怪的是,哪个立即值对于哪个指令是合法的。 根据《 ARM Compiler armasm参考指南》, ANDEOR指令将立即值限制为:

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

对于第一条指令,您需要先将立即数加载到另一个寄存器中。 就像是:

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

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

mvn x0, x0

请注意,最后一条指令实际上是ORN(按位或非)指令的别名:

orn x0, xzr, x0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM