AArch64架构下lsls指令不被识别,需带标志位的左移功能
ARM64下解决
lsls/lsrs指令不识别及带标志位移位问题 ARM64指令集和ARM32存在差异,没有lsls/lsrs这类带s后缀的移位指令,这是你用Apple as汇编器报错的核心原因。针对你的两个需求(移位设标志、128位跨寄存器移位),给出具体解决方案:
单个寄存器移位并设置标志位
ARM64中单纯的lsl/lsr指令仅完成移位操作,不会更新标志寄存器。要同时实现移位和标志位更新,需将移位操作作为带s后缀的数据处理指令的操作数:
- 若要移位后修改寄存器值并设标志:
; 左移x0一位,等价于x0 *= 2,同时更新进位、零等标志 adds x0, x0, x0, lsl #1 - 若仅需移位结果设置标志,不修改寄存器值:
; 比较x0与左移后的x0,根据结果更新标志位,x0原值保留 cmp x0, x0, lsl #1
128位成对寄存器跨寄存器移位
ARM64提供专门的成对移位指令,用于处理两个寄存器组成的128位整数,移位时自动将溢出位传入另一寄存器,同时更新标志位:
- 左移128位值(x0=低64位,x1=高64位):
; x0左移1位,溢出的最高位进入x1最低位;x1同步左移1位,原x1最高位存入进位标志C lslp x1, x0, #1 - 右移128位值(x1=高64位,x0=低64位):
; x1右移1位,溢出的最低位进入x0最高位;x0同步右移1位,原x0最低位存入进位标志C lsrp x0, x1, #1
替换示例
你原代码中的lsls x0, x0, #1,如果是单个寄存器移位设标志,替换为adds x0, x0, x0, lsl #1;如果是128位移位场景,使用lslp指令配合成对寄存器即可。
内容的提问来源于stack exchange,提问作者Matt Chuckle
相关产品推荐
相关产品推荐

