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

如何向多个大地址存储多值?汇编ld指令报错排查与解决

报错原因与解决方案

报错原因

  • 指令解析异常:ARM64的ld基址+偏移格式要求偏移量在指令可编码的范围内,你多次使用ORG伪指令打乱了地址连续性,导致汇编器无法正确解析c(x0)的语法格式,误报参数数量错误。
  • 数据定义不匹配:你用DD(32位数据伪指令)存储64位地址和数值,会导致数据截断,虽然不是本次直接报错原因,但会引发后续加载异常。

替代实现方案

方案1:简化地址访问,无需指定固定存储地址

直接通过标签定义数据,用ldr =<label>语法加载绝对地址,再读取数值:

; 定义64位数据
data1:  DQ      0x2222333344445555
data2:  DQ      0x1111222233334444

; 加载data1的地址到x6,再读取数值
ldr     x6, =data1
ld      x6, [x6]

; 加载data2的地址到x7,再读取数值
ldr     x7, =data2
ld      x7, [x7]

; 执行计算操作
add     x28, x6, x7      ; 求和结果存x28
sub     x29, x6, x7      ; 求差结果存x29
orr     x30, x6, x7      ; 按位或结果存x30
eor     x31, x6, x7      ; 按位异或结果存x31

方案2:强制指定固定存储地址,用填充替代多次ORG

先用ORG跳转到第一个目标地址,定义数据后用SPACE填充到第二个目标地址,保证地址连续性:

; 跳转到第一个数据地址
ORG     0x1000100010001000
data1:  DQ      0x2222333344445555

; 填充到第二个数据地址(0x1100 - 0x1000 - 8 = 0xF8字节)
SPACE   0xF8

data2:  DQ      0x1111222233334444

; 跳回代码执行地址
ORG     0x1000100010001108

; 加载数据并计算
ldr     x6, =data1
ld      x6, [x6]

ldr     x7, =data2
ld      x7, [x7]

add     x28, x6, x7
sub     x29, x6, x7
orr     x30, x6, x7
eor     x31, x6, x7

方案3:保留原有结构,修复地址加载方式

通过临时寄存器加载标签地址,避免直接在ld指令中使用跨ORG的标签:

a:  DQ      b           
ORG     0x1000100010001000          
b:  DQ      0x2222333344445555           

c:  DQ      d           
ORG     0x1000100010001100      
d:  DQ      0x1111222233334444

; 加载a的地址到临时寄存器,再获取b的地址
ldr     x9, =a
ld      x6, [x9]
ld      x6, [x6]

; 加载c的地址到临时寄存器,再获取d的地址
ldr     x10, =c
ld      x7, [x10]
ld      x7, [x7]

; 执行计算
add     x28, x6, x7
sub     x29, x6, x7
orr     x30, x6, x7
eor     x31, x6, x7

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:25:25