Assembly 臂AArch64组件:立即超出范围

Assembly 臂AArch64组件:立即超出范围,assembly,arm,arm64,Assembly,Arm,Arm64,我在AArch64汇编指令中使用即时值时遇到问题。我在谷歌上搜索过,但找不到任何解决方案。我只想注册一个立即值,如下所示: “和w9,w8,#0x5fffffff\n\t” 这使我在操作数3处立即出现超出范围的错误。当我想用x寄存器xor立即数时,也会出现同样的情况: “eor x0,x0,#ffffffffffffff” 有人知道为什么吗?A64指令集对指令中可以使用的立即数有着非常奇怪的限制。基本限制相对简单,所有指令都是32位长,指令只能使用其中的一小部分作为立即数。奇怪的是哪些直接值对于

我在AArch64汇编指令中使用即时值时遇到问题。我在谷歌上搜索过,但找不到任何解决方案。我只想注册一个立即值,如下所示:

“和w9,w8,#0x5fffffff\n\t”

这使我在操作数3处立即出现
超出范围的错误。当我想用
x
寄存器
xor
立即数时,也会出现同样的情况:

“eor x0,x0,#ffffffffffffff”


有人知道为什么吗?

A64指令集对指令中可以使用的立即数有着非常奇怪的限制。基本限制相对简单,所有指令都是32位长,指令只能使用其中的一小部分作为立即数。奇怪的是哪些直接值对于哪个指令是合法的。根据ARM编译器armasm参考指南,和指令将立即值限制为:

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

对于第一条指令,您需要首先将立即数值加载到另一个寄存器中。比如:

ldr w10, =0x5fffffff
and w9, w8, w10
对于第二条指令,您可以将其替换为以下指令:

mvn x0, x0
orn x0, xzr, x0
请注意,最后一条指令实际上是该指令的别名:

mvn x0, x0
orn x0, xzr, x0

因为立即数超出范围?只能使用有限的集合。首先将其加载到寄存器中。我想第二个应该行得通。@Jester Non他们中的一个行得通,但是先把它装入另一个寄存器,让它行得通!谢谢