ARM64架构下mov指令加载立即数报错的解决咨询
问题原因
AArch64架构的mov指令对立即数有严格编码限制,并非所有小于2^64的数值都能通过单条mov加载到寄存器。该指令仅支持形如imm16 << shift的立即数(其中shift只能是0、16、32或48)。你的数值2000000000(十六进制0x77359400)无法拆解为这种格式,因此报错,和配置无关。
解决方法
以下是几种可行的实现方式:
方法1:使用movz + movk组合指令
movz用于加载16位立即数并清零其他位,movk用于加载16位立即数并保留其他位,配合移位参数可拼接出完整64位数值:
.equ SIZE, 2000000000 .global _start _start: movz x1, 0x9400 // 加载低16位:0x9400 movk x1, 0x7735, lsl 16 // 加载高16位0x7735,左移16位后合并到x1
方法2:使用ldr指令从内存加载
通过ldr x1, =SIZE让汇编器自动将数值存入内存,再生成加载指令:
.equ SIZE, 2000000000 .global _start _start: ldr x1, =SIZE // 汇编器会自动处理数值的存储与加载逻辑
方法3:通过算术运算构造数值
如果数值可通过简单运算推导,也可以用mov配合运算指令实现(可读性较差,仅作补充):
.equ SIZE, 2000000000 .global _start _start: mov x1, 1 lsl x1, x1, 31 // 得到2^31=2147483648 sub x1, x1, 147483648 // 2147483648 - 147483648 = 2000000000
内容的提问来源于stack exchange,提问作者Jonathan Woollett-light
相关产品推荐
相关产品推荐

