pts*_*pts 5 x86 assembly dos protected-mode
我想为 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, '$'
Run Code Online (Sandbox Code Playgroud)
由于我想在 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, '$'
Run Code Online (Sandbox Code Playgroud)
这两个可执行文件(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 完成这些功能的实现。
TL;DR编写 32 位 DOS 程序可实现的最小开销是 5800 .. 9800 字节。
我四处寻找 DOS 扩展程序,以下是我发现的:
有关我考虑过的每个 DOS 扩展器以及它们增加的开销的更多详细信息: