【问题标题】:Program Memory Allocation程序内存分配
【发布时间】:2026-01-09 07:35:01
【问题描述】:

我正试图围绕程序内存在运行时分配的方式以及程序的不同部分或“段”(如果这是正确的话)。我快到了,但不完全是,需要一点帮助。

我知道该程序包含一个 .data 部分,其中包含用于初始化全局变量的只读和读写内存。我知道 .bss 部分用于未初始化的全局和静态变量,并且是可读写的。我了解堆和堆栈。

以下问题说明了我的困惑:

  1. 什么是 .rodata 部分,它存在于哪里?
  2. .data 如何处理? MASM 中的部分与 .data 部分不同?
  3. 是否每个程序都必须有标准的 .data、.bss、.code 部分, 还是这些约定只是指南?
  4. 什么决定了哪些部分是可读、可写和可执行的?

任何帮助将不胜感激。

【问题讨论】:

    标签: memory assembly


    【解决方案1】:
    1. .rodata 用于 只读 数据,即常量和文字,请参阅 this

    2. 根据this.data?是未初始化数据,又名.bss截面数据,.data是初始化数据。

    3. 根据Windows PE format,您永远不能假设某些部分存在并且它们的顺序(因为它们声明它是编译器定义的)。然而,.data.code 是相当标准的,但您仍然应该始终检查 PE,这就是它存在的原因。

    4. 1234563部分描述符(同样,这仅适用于 Windows,您需要为您选择的操作系统使用 PE 布局)。

    【讨论】: