STM32F103 ARM汇编内存布局出现未定义额外数据问题
问题原因
你看到的D0 02 00 08不是异常错误数据,是Keil ARM汇编器自动生成的**LDR伪指令文字池(Literal Pool)**内容,属于程序的正常组成部分,和代码逻辑、硬件、工程配置错误无关。
核心原理
- STM32F103搭载的Cortex-M3内核仅支持Thumb指令集,原生Thumb指令无法直接编码32位长度的立即数(比如你代码中需要加载的
OUR_FIXED_DATA的32位Flash绝对地址)。 - 你代码中使用的
LDR R2, =OUR_FIXED_DATA是汇编提供的伪指令,并非硬件原生支持的指令:汇编器会把等号后的32位常量存放在当前代码段的安全位置(通常选择无条件跳转之后、段末尾这类不会被CPU当成指令执行的区域),再把这条伪指令替换为一条PC相对偏移的LDR加载指令,从该位置读取32位常量,这个专门存放32位常量的区域就是文字池。
内存值对应关系
- 你手动定义的
OUR_FIXED_DATA总长度为20字节:8字节DCB数据、8字节两个DCD数据、4字节两个DCW数据,刚好对应你看到的前20字节自定义内容。 - 后续的
D0 02 00 08是小端格式存储的32位值0x080002D0,这个值就是OUR_FIXED_DATA的实际Flash映射地址,也就是LDR R2, =OUR_FIXED_DATA需要加载到R2寄存器的目标值。 - 由于你没有通过
LTORG伪指令手动指定文字池的存放位置,汇编器默认将文字池放在当前只读代码段的最末尾,也就是你所有自定义数据的后方,因此刚好出现在20字节自定义数据之后。
教材结果差异说明
教材提供的内存截图仅截取了自定义数据覆盖的范围,没有显示后方的文字池区域,Flash擦除后的默认值为0xFF,因此教材截图中对应位置显示为全FF,和你实际运行的结果不存在本质冲突。
验证与调整方法
- 验证:调试时单步执行完
LDR R2, =OUR_FIXED_DATA指令后,查看内核寄存器R2的数值,会发现R2的值恰好为0x080002D0,和那4个字节拼成的32位数值完全一致。 - 调整:如果需要自定义文字池位置,只需要在代码中合适的位置(比如死循环
HERE B HERE之后、OUR_FIXED_DATA标签之前)插入LTORG伪指令,文字池就会被安排到你指定的位置,不会出现在自定义数据的后方。
内容的提问来源于stack exchange,提问作者vipnoob
相关产品推荐
相关产品推荐

