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

Apple ARM架构下LDR指令立即数范围疑问及Clang汇编器疑似Bug

ARM64 LDR指令SP偏移报错原因解析

这是ARM64指令编码的硬件限制导致的,核心在于ldr针对栈指针(SP)的立即数偏移必须符合特定对齐规则,具体分两种合法格式:

1. SP专用的16字节对齐偏移

当偏移量是16的整数倍时,汇编器会使用ARM64专为栈操作设计的指令编码:

  • 指令格式:ldr Xt, [SP, #imm12],其中imm12是12位无符号数,最终偏移为imm12 × 16,覆盖范围0~65520
  • 你的代码中#320 = 16 × 20,完全符合该规则,因此编译通过

2. 8字节对齐的带左移偏移

因为你加载的是64位寄存器(X0),每次操作8字节,所以当偏移量是8的整数倍,且偏移量除以8的结果在[-256, 255]范围内时,汇编器会自动转换为带左移的指令格式:

  • 指令格式:ldr Xt, [SP, #imm8, lsl #3],其中imm8是8位有符号数,左移3位(等价于×8)得到最终偏移
  • 你的代码中#360 = 8 × 45,45在[-256,255]范围内,符合规则,因此编译通过

3. #332编译失败的核心原因

#332既不是16的整数倍(332 ÷ 16 = 20.75),也不是8的整数倍(332 ÷ 8 = 41.5),无法匹配上述任何一种合法的指令编码格式。汇编器尝试使用带左移的格式时,发现无法将332拆解为imm8 × 8的形式,因此抛出错误(错误信息里的[-256,255]指的是imm8的合法范围)

解决办法

如果必须访问SP+332的地址,可以通过临时寄存器中转:

mov x1, sp
ldr x0, [x1, #332]

或者调整栈布局,让目标地址的偏移量满足8或16字节的对齐要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:19:53