首页 > 解决方案 > 如何为 DOS 创建微小的 32 位 (i386) 可执行文件?

问题描述

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

作为参考,这里是我的微型 16 位 (8086) DOS 可执行文件的 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。

我需要的功能:

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

标签: assemblydosi386

解决方案


推荐阅读