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

ARM64架构下如何加载立即数至寄存器?加载0x48f0d0至x0报错求助

ARM64架构下加载立即数的方法及常见错误解决

你遇到的错误是因为ARM64的mov指令对立即数有严格限制——它只能加载可通过16位立即数循环右移偶数位(0、2、4…62位)生成的数值。0x48f0d0是24位数值,无法通过这种方式构造,所以单条mov指令无法完成。

解决当前问题的两种方式

  1. 使用movz+movk组合指令
    把0x48f0d0拆分为低16位(0xf0d0)和高16位(0x48),分两步拼接:
movz x0, #0xf0d0          // 将0xf0d0加载到x0的低16位,其余位清零
movk x0, #0x48, lsl #16   // 将0x48加载到x0的16-31位,不改变已有位

执行后x0的值就是0x48f0d0。

  1. 使用ldr伪指令
    直接指定目标数值,汇编器会自动处理加载逻辑:
ldr x0, =0x48f0d0

这是伪指令,汇编时如果数值符合mov的格式,会直接转成mov;否则会把数值存入数据段,生成内存加载指令。

ARM64加载立即数的通用方法

  • 单条mov指令:仅支持符合格式的立即数,比如0x12340000(由0x1234右移16位生成)、0xff这类数值。
  • movz+movk组合:用于加载任意64位数值,通过分批次加载16位段拼接。movz负责加载16位并清零其他位,movk负责将16位加载到指定偏移位置(通过lsl #16/lsl #32/lsl #48指定),不影响已有位。
  • ldr伪指令:最简便的方式,无需关心数值格式,汇编器自动选择最优实现。

内容的提问来源于stack exchange,提问作者sahara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:01:56