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

ARM汇编中.equ数值常量使用问题:ldr伪指令报错排查

问题描述

使用arm-none-eabi-gcc编译树莓派Pico的ARM汇编代码时遇到语法错误:

可正常运行的代码:

ldr r0, =RESET_BASE + 0x2000

.data
.align 4
.equ RESET_BASE,    0x4000c000

触发语法错误的代码:

ldr r0, =RESET_BASE + ATOMIC_SET

.data
.align 4
.equ ATOMIC_SET,    0x2000
.equ RESET_BASE,    0x4000c000

GAS报错信息:

arm-none-eabi-gcc -c -mcpu=cortex-m0plus -mthumb -std=gnu11 -Wall -O0  -o bs2_default_padded_checksummed.o bs2_default_padded_checksummed.S
arm-none-eabi-gcc -c -mcpu=cortex-m0plus -mthumb -std=gnu11 -Wall -O0  -o assembly.o assembly.s
assembly.s: Assembler messages:
assembly.s:105: Error: syntax error -- `ldr r0,=RESET_BASE+ATOMIC_SET'
原因分析

GNU汇编器(GAS)的ldr r0, =<expr>伪指令仅支持单个符号加立即数的表达式格式,无法直接解析两个.equ定义的符号相加的表达式。该伪指令的底层逻辑是将表达式结果放入常量池,汇编器默认不会对两个符号的加法做预计算,因此会判定为语法错误。

解决方法

推荐以下两种可靠的解决方式:

方式一:预定义组合后的符号

在.equ定义部分提前计算并定义新的符号,之后直接使用该符号:

ldr r0, =RESET_ATOMIC_SET

.data
.align 4
.equ ATOMIC_SET,    0x2000
.equ RESET_BASE,    0x4000c000
.equ RESET_ATOMIC_SET, RESET_BASE + ATOMIC_SET  # 提前计算组合值

方式二:手动计算表达式结果

如果符号值固定,也可以直接写入计算后的最终地址(但可读性较差,不推荐用于需要维护的代码):

ldr r0, =0x4000e000  # 0x4000c000 + 0x2000的计算结果

.data
.align 4
.equ ATOMIC_SET,    0x2000
.equ RESET_BASE,    0x4000c000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 08:54:25