如何向多个大地址存储多值?汇编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
相关产品推荐
相关产品推荐

