2012-03-19 72 views
4

具体而言,这个问题是关于实模式下的平坦和分段模型。我正在阅读关于程序集的一本书,其中提到在DOS下COM文件使用平面内存模型,而EXE文件使用分段内存模型。不过,我不明白什么告诉DOS哪个内存模型使用。我在问这个问题,因为我正在阅读关于引导程序的信息。什么决定了内存模型?

回答

4

COM文件使用“平面内存模型”,意思是当程序加载指向同一个段时,段寄存器全部由DOS设置,并且所有代码和指针按照惯例相对于段中的一个值被注册。

另一方面,EXE文件格式允许以不同的偏移量加载段。 DOS不会将段寄存器设置为默认值;这是由代码本身决定的。 16位EXE代码更复杂,因为代码必须管理段寄存器。

现在很多EXE代码或多或少都忽略了段寄存器; 32位或64位寄存器不需要添加到段寄存器来生成可用地址。

+0

您能否告诉我们是什么让DOS在COM文件的情况下设置了段寄存器并在EXE文件的情况下保留它们? – vjain27 2012-03-19 22:06:32

+0

什么让DOS做到了?这正是DOS代码所做的。我不确定如何回答你的问题:编程DOS的程序员告诉它这样做。 – 2012-03-19 23:37:45

+0

DOS EXE格式没有任何设置CS:IP和SS:SP以外的寄存器的设置。如果有的话,程序员不得不以某种特殊的方式为DS和ES标记段,汇编器,编译器和链接器需要以特殊的方式支持这些特殊标记的段。也许,它被认为是不值得的。毕竟,正式的,你的分段程序不需要有任何数据段。最低限度是代码和堆栈段。 – 2012-03-19 23:38:29

1

COM和EXE可执行文件在文件头中有其内存要求:EXE headerCOM (MS-DOS) header。如果程序需要64KB的<,请使用平面空间,如果大于64KB,则使用分段内存。

1

在DOS中没有任何东西可以阻止使用分段内存模型的COM文件,因为DOS没有对其应用程序执行内存管理策略。

您可以阅读有关COM files的维基百科条目,了解这些旧事物。

相关问题