如何在GNU ARM汇编语法中使用移位操作数?
GNU ARM汇编中等价于UAL移位MOV的写法
你遇到的问题是因为GNU汇编器(gas)的语法和ARM官方的统一汇编语言(UAL)在移位操作的格式上有差异:UAL允许用逗号分隔第三个操作数来指定移位,而GAS不支持这种写法,需要把移位操作直接附加在源寄存器后面,作为源操作数的一部分。
正确的直接写法
针对你使用的ARMv8 32位寄存器,正确的GNU语法应该是:
mov w0, w1 lsl 2
部分场景下也兼容带立即数前缀#的写法:
mov w0, w1 lsl #2
分步替代写法
如果需要更明确的分步逻辑,也可以先对源寄存器执行移位,再将结果赋值给目标寄存器:
lsl w1, w1, 2 mov w0, w1
不过这种写法会多一条指令,效率不如直接在mov中嵌入移位操作。
内容的提问来源于stack exchange,提问作者imahmadrezas
相关产品推荐
相关产品推荐

