Cortex-M3:为什么文字池默认放在段末尾?什么时候需要手动插入 .ltorg?

发布时间:2026/7/28 11:21:36

Cortex-M3:为什么文字池默认放在段末尾?什么时候需要手动插入 .ltorg? 难度:★★★本文首发于我的嵌入式技术号「OneChan」,未经授权禁止转载。上一篇文章我们讲到,当LDR r0, =symbol无法用 MOV 实现时,汇编器会把常数值藏在代码附近的“文字池”里。但这个文字池到底藏在哪?答案是:默认在段末尾。为什么是末尾?放中间不行吗?什么时候必须手动把它提前?今天这篇文章,就来回答这三个问题。它的核心,是一款 ARM 指令集中最容易被忽略的物理限制——PC 相对寻址的 ±4KB 范围。一、先重温:文字池的加载指令怎么工作的?当我们写:LDR R0, =0x20001000汇编器如果判断 MOV 装不下,就会生成一条 PC 相对加载指令:LDR R0, [PC, #offset]这条指令的真实含义是:R0 = *(PC + offset)也就是从当前指令的 PC 值出发,向前或向后偏移offset个字节,去读一个 32 位数。这条指令不是直接跳转,但它依赖 PC 和目标的距离。

相关新闻