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

关于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:18:19