DOS如何将程序加载到内存中?

17

MS-DOS加载COM或EXE文件到内存的步骤是什么?是否仍有关于此过程的在线参考资料?我所能想到的最好的可能是参考dosbox源代码。


请联系 DOS 的原作者 Paterson:http://dosmandrivel.blogspot.com/ - vulkanino
1个回答

29
当command.com被要求执行一个.com或.exe文件时,它会调用中断服务21h/AH=4B,即EXEC服务。调用程序需要做以下工作:
- 构建DOS EXEC参数块(参见http://www.delorie.com/djgpp/doc/rbinter/it/90/15.html)(包括环境变量、命令行参数、FCB和返回时的寄存器值等信息) - 释放调用程序未使用的所有内存 - 设置调用参数寄存器 - ah = 4Bh('EXEC'服务类型) - al = 00h('加载和执行'函数) - ds:dx -> 程序名称 - es:bx -> 指向exec参数块的指针 - 调用中断21h - 返回后重置堆栈指针并检查错误。
当调用中断21h时(这里对我来说有点模糊):
  • 分配一个页面对齐的内存块
  • 忽略文件扩展名,而是DOS会检查文件的前两个字节来判断是否为EXE文件,如果是则检查签名"MZ"或"ZM",COM文件没有签名。

对于EXE文件:

对于COM文件:

  • 将整个.com文件复制到内存中
  • 设置寄存器的值
    • AL,AH驱动器字母状态
    • CS,DS,ES,SS -> PSP段
    • SP = 第一个64k段中最后一个可用字的偏移量
  • 跳转到IP=100h

程序现在应该正在执行。


注意:

在微软的KB文档“定位可执行文件的优先顺序”中,提到了使用“MS-DOS EXEC函数(中断21h服务4Bh)”来执行.com和.exe文件http://support.microsoft.com/kb/35284

因此,我们可以查看Ralph Brown的中断列表,其中包括Int 21/AH=4Bh

以及一个使用示例:

汇编艺术 / 19.1.1.1 载入和执行 https://web.archive.org/web/20170722062613/https://www.plantation-productions.com/Webster/www.artofasm.com/DOS/ch19/CH19-1.html#HEADING1-10 以及 DOS 可执行文件头格式: (这是根据一些谷歌搜索的结果,所以请随意提出建议)

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