据我所知,汇编程序分为两个代码2)数据。 现在,当我们编码时,比如说c \ c ++,代码被加载到内存中,然后CPU开始执行代码,一个指令,作为汇编程序。 我的问题是: 1.存储的c代码在哪里?我的意思是,当我在Visual Studio中运行程序时,是否将代码加载到其中一个程序中 - Heap,Stack ..? 2.所以内存实际上分为Stack,Heap和Date段,但是当CPU执行程序时,作为汇编程序,它们都是1个具有相同数据区的汇编程序,或者它们形成于to,比方说2或3个汇编程序从一个跳到另一个?
**让我补充一下这个问题,也许它会澄清我的意图: 当我启动C程序时,代码(机器指令)被加载到内存中。所以,这是一个装配程序。但记忆分裂是如何发生的?我的意思是,堆栈,数据段等不同的内存部分如何修改汇编程序?
答案 0 :(得分:5)
来自维基百科:
PC架构支持几个基本的读写内存区域 程序即:堆栈,数据和代码。堆是另一个区域 地址空间可用于程序,内存可以从中获取 由操作系统动态分配或释放以响应 系统调用,如malloc和free。
我建议您阅读full article
SO上也有这个问题: How are the different segments like heap, stack, text related to the physical memory?
另外,这些文章可能值得一读。特别是最后一个:
回答你的问题:
1。存储的c代码在哪里?
在代码段中。
2。因此,内存实际上分为堆栈,堆和日期段,
在实模式下,是的。在保护模式下......取决于。为了简化:程序存储器映射到物理存储器。每个程序都位于自己的地址空间中。
如果您想了解更多信息,我推荐这些文章:
3。但是当CPU执行程序时,作为汇编程序,它们都是1个具有相同数据区的汇编程序,或者它们是形成的,可以说2或3个汇编程序从一个程序跳到另一个程序? < / p>
没有。没有跳跃。处理器寄存器指向要执行的下一条指令。其他人则指向堆栈等。
答案 1 :(得分:3)
段或部分是对象和可执行文件中的连续分区,非常类似于书中的章节。堆栈和bss部分在文件中不存在,但是在运行时创建。
这些部分主要是将程序划分为操作系统可以以不同方式保护的区域。为了安排,这些部分必须从页面边界开始并且在内存中是连续的。
基本(&#34;重要的&#34;)部分是......
text 或 code - 操作系统将对此部分进行写保护,并且由于它是不可变的,因此它也可以在运行的多个进程或线程之间共享它相同的可执行文件
数据 - 操作系统将映射此r / w并直接赢得 1 分享
bss - 此部分包含零初始化数据。
堆栈 - 通常与程序分开,通常从较高地址向下增长
最后两个部分不在可执行文件中,因为它们不需要任何实现。
如果您正在询问它们是如何实现的,那么汇编器和链接器会创建一个目录,并在二进制文章中写出章节中的章节。然后操作系统单独读取它们并将它们放在地址空间的不同部分。
类Unix系统和Windows之间的细节和术语不同,但原理是相同的。
<小时/> 1。是的, copy-on-write 允许共享数据,类似。