ARM64中ADD指令首选操作码疑问:GAS为何选择移位寄存器版本?
ARM64
add X0, X1, X2 汇编选择的原因分析 首先明确两种匹配的指令类型:
- add (extended register):属于寄存器扩展类指令,当扩展类型为
UXTX且扩展量为0时,语法可简化为add Rd, Rn, Rm。 - add (shifted register):属于寄存器移位类指令,当移位类型为
LSL且移位量为0时,语法也对应add Rd, Rn, Rm。
GAS选择将该指令汇编为add (shifted register)的原因如下:
- 汇编器内置优先级规则:ARM官方文档虽未明确规定汇编阶段的优先级,但GAS等主流汇编器会优先选择通用核心指令类的编码。移位寄存器类指令是ARM64通用算术运算的基础子集,而扩展寄存器类更多是为配合零扩展、符号扩展等特殊操作设计的,因此当语法重合时,汇编器默认优先匹配核心指令类型。
- 硬件执行无性能差异:当移位/扩展量为0时,两种指令的硬件执行路径完全等价,不存在执行速度的区别。
- 与反汇编规则对齐:ARM官方规定的首选反汇编规则中,这类无移位/扩展的指令会被显示为shifted register形式(如
add X0, X1, X2),汇编器为保持汇编-反汇编的一致性,会优先生成对应编码。
内容的提问来源于stack exchange,提问作者alexisrdt
相关产品推荐
相关产品推荐

