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
相关产品推荐
相关产品推荐

