具体地说,这个问题是关于实模式下的平面和分段模型。我正在读一本关于汇编的书,书中提到在DOS上COM文件使用扁平内存模型,而EXE文件使用分段内存模型。然而,我不明白是什么告诉DOS使用哪种内存模型。我之所以问这个问题,是因为我正在阅读有关bootloaders的文章。
发布于 2012-03-20 05:53:08
COM文件使用了一种“平面内存模型”,当程序加载指向同一段时,段寄存器都是由DOS设置的,按照惯例,所有代码和指针都是相对于段寄存器中的那个值的。
另一方面,EXE文件格式允许以不同的偏移量加载段。DOS不会将段寄存器设置为默认值;这取决于代码本身。16位EXE代码要复杂得多,因为代码必须管理段寄存器。
如今,许多EXE代码或多或少又忽略了段寄存器;不需要将32位或64位寄存器添加到段寄存器中即可生成可用的地址。
发布于 2012-03-20 05:48:53
COM和EXE可执行文件在文件头中有各自的内存要求:EXE header和COM (MS-DOS) header。如果程序需要< 64KB,请使用平面空间;如果> 64KB,请使用分段内存。
发布于 2012-03-20 05:54:43
DOS中没有任何东西可以阻止COM文件使用分段内存模型,因为DOS没有在其应用程序上强制实施内存管理策略。
你可以阅读维基百科关于COM files的词条,它让你对这些古老的问题有了深入的了解。
https://stackoverflow.com/questions/9778425
复制相似问题