什么决定了内存模型?

4

这个问题特别涉及到实模式下的平面和分段模型。我正在阅读一本关于汇编语言的书,提到在DOS上,COM文件使用平面内存模型,而EXE文件使用分段内存模型。然而,我不明白是什么告诉DOS要使用哪种内存模型。我之所以问这个问题,是因为我正在阅读关于引导程序的内容。

3个回答

4
COM文件使用“平面内存模型”,这意味着当程序加载时,DOS设置的段寄存器都指向同一个段,所有代码和指针都相对于段寄存器中的一个值。相比之下,EXE文件格式允许在不同的偏移量处加载段。DOS不会将段寄存器设置为默认值,这由代码本身决定。16位EXE代码更加复杂,因为代码必须管理段寄存器。现在很多EXE代码基本上再次忽略段寄存器;32位或64位寄存器不需要添加到段寄存器以生成可用地址。

请问在COM文件的情况下,DOS为什么要设置段寄存器并将其保留,而在EXE文件的情况下则不进行设置? - vjain27
是什么让DOS这样做的?那就是DOS代码所做的。我不确定如何回答你的问题:编写DOS的程序员告诉它要这样做。 - Ernest Friedman-Hill
DOS EXE 格式没有设置寄存器的方法,除了 CS:IP 和 SS:SP。如果有这种方法,程序员也必须以某种特殊方式标记 DS 和 ES 段,并且汇编器、编译器和链接器需要以特殊的方式支持这些特殊标记的段。也许,当时决定不值得这么做。毕竟,在正式上,您的分段程序不必具有任何数据段。最基本的是代码和堆栈段。 - Alexey Frunze
其实我的意思是问DOS是如何决定是否要设置段寄存器的,是通过查看文件扩展名还是文件头? - vjain27
2
DOS非常重视文件名。仅凭三个字母的扩展名就可以确定一个文件是COM程序、EXE程序还是某种数据。EXE格式包括一个“魔数”,但我相信DOS甚至都没有看它。 - Ernest Friedman-Hill
EXE文件头包含DOS在执行文件之前设置的CS:IP和SS:SP值。然后,EXE中的代码将根据需要设置DS和ES。 - Alexey Frunze

1

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


1

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

您可以阅读维基百科关于COM文件的条目,它可以让您深入了解这些旧事。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接