我的理解是,ARMv8 A64 汇编中的立即参数可以是 12 位长。如果是这样的话,为什么这行汇编代码是:
AND X12, X10, 0xFEF
产生此错误(使用 gcc 编译时)
Error: immediate out of range at operand 3 -- `AND X12, X10, 0xFEF'
有趣的是,这行汇编代码编译得很好:
ADD X12, X10, 0xFEF
我正在使用 aarch64-linux-gnu-gcc (Linaro GCC 2014.11) 4.9.3 (预发布)
与 A32 的“灵活的第二操作数”不同,A64 中没有通用的立即数格式。对于立即操作数数据处理指令(忽略像移位这样无聊而简单的指令),
- 算术指令(
add{s}
, sub{s}
, cmp
, cmn
) 采用带有可选 12 位左移的 12 位无符号立即数。
- 移动指令(
movz
, movn
, movk
) 将 16 位立即数选择性地移位到寄存器内的任何 16 位对齐位置。
- 地址计算(
adr
, adrp
)采用 21 位有符号立即数,尽管没有实际的语法来直接指定它 - 为此,您必须诉诸汇编器表达式技巧来生成适当的“标签”。
- 逻辑指令(
and{s}
, orr
, eor
, tst
)采取“立即位掩码”,我不确定我什至可以解释,所以我只是引用复杂得令人难以置信的定义 http://infocenter.arm.com/help/topic/com.arm.doc.dui0802b/AND_log_imm.html:
这种立即数是一个 32 位或 64 位模式,被视为大小为 e = 2、4、8、16、32 或 64 位的相同元素的向量。每个元素都包含相同的子模式:1 到 e-1 个非零位的单次运行,按 0 到 e-1 位循环。该机制可以生成 5,334 个独特的 64 位模式(作为 2,667 对模式及其按位逆)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)