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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:48:24