AFAIK,有两种类型的全局变量,初始化和非初始化.它们是如何存储的?它们都存储在可执行文件中吗?我可以想到初始化的全局变量的初始值存储在可执行文件中.但是对于未初始化的人需要存储什么?
我目前的理解是这样的:
可执行文件被组织为多个部分,例如.text,.data和.bss.代码存储在.text部分中,初始化的全局或静态数据存储在.data部分中,未初始化的全局或静态数据存储在.bss部分中.
感谢您抽出宝贵时间查看我的问题.
我在这里找到一个很好的参考:
汇编语言源中的段 - 使用.text,.data和.bss指令构建文本和数据段
@迈克尔
我在汇编代码中定义了一个100字节的未初始化数据区域,这个100字节没有存储在我的可执行文件中,因为它未初始化.
谁将在RAM中分配100字节的未初始化内存空间?该程序加载器?
假设我得到以下代码:
int global[100];
void main(void)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
全局[100]未初始化.如何在我的可执行文件中重新编码全局[100]?谁会在什么时候分配它?如果它被初始化怎么办?
初始化变量值存储在.data
可执行文件的段中.未初始化的不必存储.它们最终.bss
位于RAM 中的段中,但在可执行文件中段的大小为零,只需要在段描述符中存储所需的内存量.该.text
部分中的代码通过偏移访问这些段.运行时链接器加载器将这些引用修补为实际的虚拟地址.例如,请参阅可执行文件和可链接格式,该格式在大多数类Unix操作系统上使用.
未初始化的变量只是机器级别的指针。它们的空间是在运行时分配的,程序将在稍后的某个时间填充它。
例如,如果在汇编程序中创建一个全局变量global BYTE 100
,它将保留global
为指向 100 字节区域的指针。然后程序就可以访问该区域以满足其需要。
编辑:我在汇编器书中查找,看起来未初始化的全局变量在 .data 部分中定义,就像初始化变量一样。根据我的理解,空间是在 exe 中分配的(如上所述 100 字节),但会有未定义的内容。在运行 Windows 的 Intel 机器上,它将是垃圾;该程序负责初始化它。希望这可以帮助!