ARM64架构下如何加载立即数至寄存器?加载0x48f0d0至x0报错求助
ARM64架构下加载立即数的方法及常见错误解决
你遇到的错误是因为ARM64的mov指令对立即数有严格限制——它只能加载可通过16位立即数循环右移偶数位(0、2、4…62位)生成的数值。0x48f0d0是24位数值,无法通过这种方式构造,所以单条mov指令无法完成。
解决当前问题的两种方式
- 使用
movz+movk组合指令
把0x48f0d0拆分为低16位(0xf0d0)和高16位(0x48),分两步拼接:
movz x0, #0xf0d0 // 将0xf0d0加载到x0的低16位,其余位清零 movk x0, #0x48, lsl #16 // 将0x48加载到x0的16-31位,不改变已有位
执行后x0的值就是0x48f0d0。
- 使用
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
相关产品推荐
相关产品推荐

