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

时间:2010-09-15 07:46:53

标签: executable dos

MS-DOS将COM或EXE文件加载到内存中的步骤是什么?网上是否还有关于这是如何发生的参考?我能想到的最好的可能是指dosbox来源。

1 个答案:

答案 0 :(得分:19)

当要求command.com执行.com或.exe文件时,它将调用中断服务21h / AH = 4B,EXEC服务。调用程序取决于:

  • 构建DOS EXEC参数块(参见http://www.delorie.com/djgpp/doc/rbinter/it/90/15.html) (包括有关环境变量,命令行参数,FCB和返回时的寄存器值的信息)
  • 释放调用程序未使用的所有内存
  • 设置调用参数寄存器
    • 啊= 4Bh('EXEC'服务类型)
    • al = 00h('加载并执行'功能)
    • ds:dx - >节目名称
    • es:bx - > ptr to exec parameter block
  • 呼叫中断21h
  • on返回重置堆栈指针并测试错误。

当中断21h被调用时(这里是我朦胧的地方):

  • 分配了页面对齐的内存块
  • 忽略文件扩展名,而DOS将检查前两个字节 签名文件“MZ”或“ZM”如果是EXE,而没有COM的签名。

for exe:

for 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上的中断列表

以及使用示例:

和dos exe头格式:

(这是基于一些谷歌搜索,所以请随意添加建议)