gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:33:05 25 4
gpt4 key购买 nike

MS-DOS 采取哪些步骤将 COM 或 EXE 文件加载到内存中?网上还有关于这是如何发生的引用吗?我能想到的最好的可能是引用 dosbox 源代码。

最佳答案

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

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

当中断 21h 被调用时(这对我来说是模糊的):

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

对于exe:

对于com:

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

程序现在应该正在执行。

<小时/>

注释:

在微软的知识库文档“Order of Precedence in Locating Executable Files”中,提到了使用“MS-DOS EXEC函数(中断21h服务4Bh)”来执行.com和.exe文件 http://support.microsoft.com/kb/35284

所以我们可以看看 Ralph Brown 在 Int 21/AH=4Bh 上的中断列表

以及使用示例:

以及 dos exe header 格式:

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

关于executable - DOS如何将程序加载到内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3715618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com