【问题标题】:what determines the memory model?什么决定了内存模型?
【发布时间】:2012-04-04 10:12:55
【问题描述】:

具体来说,这个问题是关于实模式下的平面和分段模型。我正在阅读一本关于汇编的书,其中提到在 DOS 上,COM 文件使用平面内存模型,而 EXE 文件使用分段内存模型。但是我不明白是什么告诉 DOS 使用哪种内存模型。我问这个问题是因为我正在阅读有关引导加载程序的信息。

【问题讨论】:

    标签: operating-system computer-architecture


    【解决方案1】:

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

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

    现在很多 EXE 代码或多或少地再次忽略了段寄存器; 32 位或 64 位寄存器无需添加到段寄存器即可生成可用地址。

    【讨论】:

    • 请问是什么让DOS在COM文件的情况下设置段寄存器而在EXE文件的情况下保留它们?
    • 是什么让 DOS 做到了?这正是 DOS 代码所做的。我不知道如何回答你的问题:编写 DOS 的程序员告诉它这样做。
    • DOS EXE 格式没有任何规定可以设置除 CS:IP 和 SS:SP 以外的寄存器。如果有,程序员将不得不以某种特殊方式标记 DS 和 ES 的段,而汇编器、编译器和链接器将需要以特殊方式支持这种特殊标记的段。也许,决定不值得。毕竟,正式地,您的分段程序不必有任何数据段。最低限度是代码和堆栈段。
    • 其实我想问的是DOS如何决定是否必须设置段寄存器。通过查看文件扩展名或标题?
    • DOS 非常重视文件名。仅三个字母的扩展名就决定了文件是 COM 程序、EXE 程序还是某种数据。 EXE 格式包含一个“幻数”,但我很确定 DOS 甚至没有看到它。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      COM 和 EXE 可执行文件在文件头中有它们的内存要求:EXE headerCOM (MS-DOS) header。如果程序需要 64KB,使用分段内存。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-29
        • 2023-04-05
        • 2021-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-03
        相关资源
        最近更新 更多