.com 文件格式的详细信息是什么?

What are the details of .com file format?

我接到一项任务,要为 8086 完成 2 遍 assembler。我希望保持简单,现在只使用 assemble 个小程序。我发现 .COM 格式非常简单。但是我找不到文件格式的细节。

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

我只是想知道如何编写可在 DOSBOX.

上运行的 .COM 文件

.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 程序,我建议使用 assembler,如 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

然后assemble和

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

有关详细信息,this resource 可能对您有所帮助。