如何为 DOS 创建微小的 32 位 (i386) 可执行文件?



我想为 DOS 创建微小的 32 位 (i386( 可执行文件。

作为参考,以下是我的 DOS 微型 16 位 (8086( 可执行文件的 NASM 程序集源代码:

; $ nasm -o hi16.com hi16.nasm  # 26 bytes.
bits 16
org 0x100
mov dx, msg  ; 16-bit pointer to string.
mov ah, 9  ; Print message.
int 0x21
ret  ; exit(0).
msg: db 'Hello, World!', 13, 10, '$'

由于我想在 32 位 DOS 可执行文件中使用超过 1 MiB 的内存,因此很可能我需要一个 DOS 扩展器。在查看了多个DOS扩展器后,我决定尝试WDOSX,它似乎具有最小的存根(用于设置保护模式的.exe前缀(:WDOSX。DX(请参阅此处如何获取(仅为 9720 字节。我的(想要的(微小的32位DOS可执行文件的源代码是:

; $ nasm -o hi32.exe hi32.nasm  # 37+9720 bytes.
bits 32
wdosx_dx_start:
incbin "WDOSX.DX"  ; ~9720 bytes.   
org wdosx_dx_start-$
mov ax, 0x901
int 0x31  ; Enable virtual interrupts.
mov edx, msg  ; 32-bit pointer to string.
mov ah, 9  ; Print message.
int 0x21
mov ax, 0x4c00  ; exit(0).
int 0x21
msg: db 'Hello, World!', 13, 10, '$'

这两个可执行文件(hi16.com 和 hi32.exe(都可以在 DOSBox 中开箱即用。通过使用DPMI功能0x0501我的32位DOS程序将能够分配大于1 MiB的内存块,从而实现了我的目标。

我的问题:是否有比 WDOSX 小的存根。DX(9720 字节(我可以使用吗?WDOSX提供了DPMI 0.9主机的许多功能,我不需要其中的大多数功能,例如,我不需要支持许多二进制格式(例如LE,PE(,VCPI,INT15,32位DOS API(所有功能(,鼠标API,大多数DPMI API。

我需要的功能:

  • 如果有DPMI主机(例如Windows中的DOS窗口或正在运行HDPMI32.EXE(,它必须工作,如果XMS可用(但没有v8086(,它必须工作。我不关心其他环境,例如EMM386,VCPI,INT15。
  • 分配几 MiB 的内存。
  • 程序退出后,释放分配的内存。
  • 按名称打开DOS文件,读取,写入,关闭。如果我必须在低内存地址(<1 MiB,DOS 使用(和我分配的大缓冲区之间手动复制数据,也可以。

我正在寻找代码示例的链接,或者使用XMS(虚幻模式?(并使用DPMI API完成这些功能的实现。

TL;DR编写 32 位 DOS 程序的最小可实现开销开销为 5800 ..9800 字节。

我四处寻找DOS扩展器,这是我发现的:

可以在
  • PMODE 3.07 源代码上构建解决方案,在程序中提供 <7500 字节的 DOS 扩展器开销,如果压缩,则为 5800 字节(,但它需要大量的工作,因为手动设置和重新定位。提供 TASM 源代码。
  • D3X dx3lite.exe 可以开箱即用,压缩 8200 字节。提供 TASM 源代码。目前只有专门为Adam+ relocation二进制格式修改的FASM汇编器可用于开发,但应该可以使用NASM生成目标文件(ELF,OMF或COFF(并手动转换。
  • 压缩 9720 字节的 WDOSX 0.97 是一个方便的选项,因为它不需要任何标头,并且无需重新定位即可工作。
  • 其他则不完整或至少增加 10000 字节的开销。

有关我考虑过的每个DOS扩展器的更多详细信息以及它们增加的开销:

  • Xi 开发系统 1997-08-15: 4303 字节; 不支持 VCPI,不执行重定位,没有文件 I/O
  • SYSTEM 64 v1.210:6392 字节,由于 NUL 块,实际程序长 16408 字节;大多数 DOS 文件 I/O 功能缺失
  • PMODE 3.07:7048字节,实际程序长424字节,因为DOS.exe标头中的NUL块
  • RAW32 r3:7270字节,实际程序因为NUL块长了4186字节,实际程序使DOSBox崩溃
  • PMODE 2.05:7937字节,由于NUL块,实际程序长5867字节
  • D3X d3xlite.exe 2022-06-13 by CandyMan:压缩 8200 字节
  • WDOSX 0.97:压缩 9720 字节
  • PMODE/W 1.22:10286 字节
  • E.O.S 3.0.5 eoslite.obj:使用 WWPACK 压缩时为 10800 字节,默认为未压缩
  • D3XX d3x.exe 2022-08-01:10908 字节
  • Pro32版本17以及与Pass32 2.5汇编程序一起分发的版本:11273字节,创建的.exe程序使DOSBox崩溃
  • D3X 0.90 2004-10-09:11880,由于 NUL 块,实际程序长 4800 字节
  • PMODE/W 1.33:11783字节
  • ZRDX:12400 字节
  • E.O.S 3.0.5 weoslite.exe:使用 WWPACK 压缩时为 13078 字节,默认压缩
  • DOS/
  • 4GW、DOS/32A、PMODE/W、PMODE/DJ 等甚至增加了超过 14000 字节。
  • DOSX 随赛门铁克一起提供 C++ 6.1 21549 字节

最新更新