2013-06-24 38 views
0

我现在在阅读Jeff Duntemann的“Assembly Language step by step”。我对图片描述了受保护的平面模型的内存组织感到有些沮丧。它显示了一块4GB大小的内存。在那里,指令区域接近底部(低地址),然后是上面的数据区域,堆栈靠近顶部。与此同时,如果我理解正确,在平坦模式下CS寄存器不会影响指令或数据的起始地址(在这些4GB内)。受保护的平面模式下的数据和指令的起始地址

我的问题是:

谁,那么,分配代码和数据区域(下面的代码,上面的数据),在那些4GB?谁决定指令在哪个地址开始以及在哪个地址开始数据? 这本书中有一些汇编程序,但看起来程序员不会选择指令内存位置&数据(在他自己的'4GB内)。他只是在某处说明数据部分,并在说明中输入数据。另一方面,* .lst文件已经有指令和数据块的地址。汇编程序是如何决定地址的?

+0

“谁决定指令在哪个地址开始”:操作系统做出这些决定,因为它是知道如何组织所有内容以及在exe加载时哪些内存位置可用的操作系统 – ady

+0

感谢Ady。但是......汇编程序列表文件实际上可以在程序实际执行之前显示指令和数据地址(相对于程序的“自己的”4GB)。我不怀疑操作系统知道在物理内存中放置这些4GB块的位置,甚至可以将它分割成块,而不是由代码编写器看到。但是我询问地址,或者,如果您想要,在这个4GB区域内部偏移 - 代码在底部,上面的数据,然后堆叠在顶部。看起来它是在OS知道程序的任何内容之前定义的。 – Bob

回答

0

它实际上是决定代码和数据段落的链接器。它会根据不同的链接器和默认值而有所不同,但很多时候它们允许您指定自己的地址(例如,ld链接器脚本)。然而,这只适用于少数情况,所以你最好让链接器自己选择地址。