【问题标题】:ARM AArch64 Assembly: immediate out of rangeARM AArch64 程序集:立即超出范围
【发布时间】:2016-06-15 20:32:01
【问题描述】:

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

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

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

"eor x0, x0, #ffffffffffffffff"

有人知道为什么吗?

【问题讨论】:

  • 因为立即数超出范围?您只能使用有限的集合。首先将其加载到寄存器中。我认为第二个应该可以工作。
  • @Jester 没有一个工作,但先加载到另一个寄存器,让它工作!谢谢

标签: assembly arm arm64


【解决方案1】:

A64 指令集对指令中可以使用的立即数种类有非常奇怪的限制。基本限制相对简单,所有指令都是 32 位长,指令只能使用这 32 位中的一小部分作为立即数。奇怪的部分是哪个立即值对于哪个指令是合法的。根据 ARM Compiler armasm Reference Guide,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 (bitwise NOT) 指令:

mvn x0, x0

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

orn x0, xzr, x0

【讨论】:

    猜你喜欢
    • 2019-10-27
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    相关资源
    最近更新 更多