关于ARM汇编中全局变量与字面量池的存储疑惑
关于ARM程序内存布局中字面量池与全局变量的疑问解答
核心结论:两种说法不矛盾,是对不同机制的描述
1. 全局变量的本质存储位置:全局数据段
全局变量的实际数据值确实存储在global data segment(全局数据段,细分为已初始化的.data段和未初始化的.bss段),这是ARM程序内存布局的基础规则——代码、常量、全局数据会被划分到不同的内存段,从存储载体的角度明确了全局变量的归属。
2. 字面量池的作用:存储访问全局变量的地址常量
字面量池(literal pool)是text segment(代码段)内的一块专用区域,用于存放程序运行时需要的固定常量值,其中就包括全局变量的内存地址。这是因为ARM指令集的寻址范围有限,多数指令无法直接访问大地址空间的全局变量,编译器会自动把全局变量的地址存入字面量池,再通过LDR这类指令加载该地址,间接完成对全局变量的访问。
举个ARM汇编的直观例子:
.global g_var @ 全局变量,实际存储在.data段 g_var: .word 0x1234 @ 全局变量的初始值 .text main: LDR R0, =g_var @ 编译器会将g_var的地址写入代码段的字面量池 LDR R1, [R0] @ 通过加载的地址,间接读取全局变量的值
这里g_var本身在全局数据段,而它的地址作为访问所需的常量,被放在代码段的字面量池里,两者分工明确,不存在冲突。
3. 理解误区的根源
你混淆了两个不同层面的概念:
- 全局变量自身的数据存储在全局数据段;
- 访问全局变量时所需的地址常量,作为程序运行依赖的固定值,被存放在字面量池中。
内容的提问来源于stack exchange,提问作者user394334
相关产品推荐
相关产品推荐

