我想为DOS创建微型32位(i386)可执行文件。
作为参考,下面是我的tiny 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 extender。在查看了多种DOS扩展程序后,我决定尝试WDOSX,它似乎具有最小的存根(.exe前缀用于设置保护模式):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 function 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(虚幻模式?)和使用API。
1条答案
按热度按时间blpfk2vs1#
TL;DR写入32位DOS程序可达到的最小开销是5800.. 9800字节。
我四处寻找DOS扩展器,以下是我的发现:
关于我考虑过的每个DOS扩展器及其增加的开销的更多细节: