堆,堆栈和数据段在同一个汇编程序中吗?

据我所知,一个汇编程序分为两个 - 1)代码2)数据。 现在,当我们编写代码时,在c c ++上说,代码被加载到内存中,然后CPU开始执行代码,一个接一个地执行代码,作为汇编程序。 我的问题是:1.存储的C代码在哪里? 我的意思是,当我在Visual Studio中运行一个程序时,是将代码加载到其中的一个 - 堆,堆栈..? 2.因此内存被虚拟地分为堆栈,堆和日期段,但是当CPU执行程序时,作为汇编程序,它们都是1个汇编程序,它们具有相同的数据区还是它们被形成为,可以说2或者3个从一个跳到另一个的程序?

**让我添加这个问题,也许它会澄清我的意图:当我启动一个C程序时,代码(机器指令)被加载到内存中。 所以,这是一个汇编程序。 但是记忆分裂是如何发生的? 我的意思是,不同的存储器部分(如堆栈,数据段等)如何修改汇编程序?


段或段在对象和可执行文件中是连续的部分,很像书中的章节。 堆栈和bss部分不存在于文件中,而是在运行时创建。

这些部分的重点主要是将程序划分成操作系统可以用不同方式保护的区域。 为了安排这一点,这些部分必须从页面边界开始并在内存中连续。

基本(“重要”)部分是......

文本或代码 - 操作系统将对此部分进行写保护,由于它是不可变的,因此它可以在运行相同可执行文件的多个进程或线程之间共享它

数据 - 操作系统将映射这个r / w并且不会直接分享它

bss - 此部分由零初始化数据组成。

堆栈 - 通常与程序分离,它通常从较高地址向下增长

最后两节不在可执行文件中,因为它们不需要任何初始化。

如果你在问他们是如何实现的,那么汇编器和链接器就会创建一个目录表,并用书中的章节将二进制文件写出来。 OS然后分别读取它们,并将它们放在地址空间的不同部分。

Unix类系统和Windows之间的细节和术语是不同的,但是原理是相同的。


1.是的,写入时复制允许共享数据。


从维基百科:

PC架构支持程序中的几个基本读写存储区域,即堆栈,数据和代码。 堆是程序可用的另一个地址空间区域,操作系统可响应系统调用(如malloc和free)动态分配或释放内存。

我建议你阅读完整的文章

SO上也存在这样的问题:堆栈,堆栈,文本与物理内存相关的不同段如何?

另外,这些文章可能值得一读。 特别是最后一个:

  • 什么是堆栈段?
  • C51:创建固定堆栈段
  • 8086中的堆栈段和额外段
  • 回答你的问题:

    1. C代码在哪里存储?

    在代码段中。

    2.所以内存实际上被分为堆栈,堆和日期段,

    在实模式中,是的。 在保护模式下...取决于。 为了简化:程序存储器映射到物理内存。 每个程序都存在于自己的地址空间中。

    如果你想知道更多,我推荐这些文章:

  • 实模式
  • 保护模式
  • 实模式和保护模式的区别
  • 3.但是当CPU执行程序时,作为一个汇编程序,它们都是具有相同数据区的1个汇编程序,或者它们是以2个或3个组合程序从一个跳转到另一个?

    不,没有跳跃。 处理器寄存器指向要执行的下一条指令。 其他人正指向堆栈等。

    链接地址: http://www.djcxy.com/p/2329.html

    上一篇: Are the Heap, the Stack and the Data segment on the same assembly program?

    下一篇: How to debug heap corruption errors?