You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:01:07