.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 的程序加载器将所有 CS
、DS
、ES
和 SS
设置为您的程序段。然后,DOS 内核跳转到地址 0100h
(即你程序的开始)到 运行。 (从技术上讲,程序加载器不会设置 cs
直到它对 cs:100h
执行远 jmp
或 iret
;如果它早些时候设置了 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 可能对您有所帮助。
我接到一项任务,要为 8086
完成 2 遍 assembler。我希望保持简单,现在只使用 assemble 个小程序。我发现 .COM
格式非常简单。但是我找不到文件格式的细节。
我还读到执行总是从 100h
开始。那么,如果 MS-DOS
(在我的情况下实际上是 DOSBOX
)系统程序已经存在,那不会有问题吗?我是否需要在 0h
-100h
部分提供一些默认存根代码?
我只是想知道如何编写可在 DOSBOX
.
.COM
文件
.COM
格式没有结构,它是一个平面二进制文件。
程序(整个文件)被加载到某个段中的地址 100h
。在其下方,您会找到程序的 PSP。段中的最后一个可用字(通常在偏移 fffeh
处)将被 0000h
覆盖,堆栈指针指向它。这允许您使用 ret
指令退出程序。
DOS 的程序加载器将所有 CS
、DS
、ES
和 SS
设置为您的程序段。然后,DOS 内核跳转到地址 0100h
(即你程序的开始)到 运行。 (从技术上讲,程序加载器不会设置 cs
直到它对 cs:100h
执行远 jmp
或 iret
;如果它早些时候设置了 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 可能对您有所帮助。