【问题标题】:What are the details of .com file format?.com 文件格式的详细信息是什么?
【发布时间】:2022-01-23 15:54:22
【问题描述】:

我被分配为8086 制作一个 2 遍汇编程序。我希望保持简单,现在只组装小程序。我发现.COM 格式很简单。但是我找不到文件格式的细节。

我还读到执行总是从100h 开始。那么如果MS-DOS(在我的情况下实际上是DOSBOX)那里已经存在系统程序,这不是问题吗?我是否需要在0h-100h 部分提供一些默认存根代码?

我只是想知道如何编写一个可在DOSBOX 上运行的.COM 文件。

【问题讨论】:

  • com 文件的字节 0 被加载到 0x100。操作系统在它之前填充 0-0x100(例如,使用命令行参数和一些信息和系统结构)。阅读 x86 实模式下的分段。
  • 请注意,.COM 文件必须小于 64 KiB 才能正常工作。如果您的文件不是,则 DOS 版本之间的行为会有所不同,有些人会拒绝加载文件,而其他人可能会无论如何都加载它。

标签: assembly dos x86-16


【解决方案1】:

.COM 格式没有结构,它是一个平面二进制文件。

程序(整个文件)被加载到某个段中的地址100h。在此之下,您会找到适用于您的程序的 PSP。段中的最后一个可用字(通常在偏移量fffeh)将被0000h 和指向它的堆栈指针覆盖。这允许您使用ret 指令退出程序。

DOS 的程序加载器将所有CSDSESSS 设置为您的程序段。然后,DOS 内核跳转到地址0100h(即程序的开头)来运行它。 (从技术上讲,程序加载器不会设置cs,直到它对cs:100h 做了一个很远的jmpiret;如果它之前设置了CS,任何IP 值都将在新的程序的内存,而不是 DOS 内核。)

这就是它的全部内容。您的程序根本不必关心分段,只要“微型”内存模型的平坦 64K 足以满足从文件加载的所有静态代码+数据、顶部的堆栈以及介于两者之间的任何内存作为 BSS 或“堆”。任何段基的工作方式都是一样的,例如 [bx][bp] 寻址相同的线性地址,即使 bp 暗示 ss:bx 暗示 ds:

请注意,由于 DOS 内核会为您的程序选择一个段,它不会与任何已加载的程序或 DOS 内核发生冲突。它会按预期工作。

至于编写 COM 程序,我建议使用像 NASM 这样的汇编程序,输出格式为“二进制”(即无输出格式)。通用模板是这样的:

        org     100h            # Tell NASM that the binary is loaded to 100h

start:  ...                     # the program starts here.  This must
                                # be the first thing in the file.

        # place any variables or constants after the code

然后组装

nasm -f binary -o program.com program.asm

如需更多信息,this resource 可能对您有所帮助。

【讨论】:

  • @MahekShamsukha 操作系统会为您做到这一点。如果您不打算访问这些 64 kB 之外的内存,则可以完全忽略段寄存器。
  • @MahekShamsukha 是的,DOS / 从 DOS 2 开始,在此之前,COMMAND.COM 处理了这个)能够自行加载程序。只需将它们放在文件扩展名为 .COM.EXE 的文件中即可。
  • @MahekShamsukha 结束文件。段中剩余的内存不会被触及,所以它会被之前程序的随机数据填充。
  • @MahekShamsukha:.com 文件可能很小;回到早期的 DOS 时代,使用小型软盘,如果 .com 文件必须大约 64kiB 才能在文件中包含 64k 段的每个字节的字节,那将是一场灾难。
  • ……DOS 会理解 COM 扩展……吗?”,从技术上讲,这与扩展无关。无论扩展名是 EXE 还是 COM,DOS 总是查看文件的前两个字节。如果它们与魔术签名值“MZ”(4D 5A)匹配,则文件将像 EXE 一样被解析(如果不符合文件格式则无法加载)。否则,它将作为平面二进制 COM 文件加载。但是每个人都保持扩展名一致,所以请使用 .COM 扩展名;试图太聪明只会让你的老师生气。
猜你喜欢
  • 2010-10-13
  • 2012-10-07
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多