assembly - 如何为 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。
我需要的功能:
- 如果有 DPMI 主机(例如 Windows 中的 DOS 窗口或运行 HDPMI32.EXE),它必须工作,如果 XMS 可用(但没有 v8086),它必须工作。我不关心其他环境,例如 EMM386、VCPI、INT15。
- 分配几个 MiB 的内存。
- 程序退出后,释放分配的内存。
- 按名称打开一个 DOS 文件,读取它,写入它,关闭它。如果我必须在低内存地址(<1 MiB,由 DOS 使用)和我分配的大缓冲区之间手动复制数据,那也没关系。
我正在寻找代码示例的链接或使用 XMS(虚幻模式?)和使用 DPMI API 完成这些功能的实现。
解决方案
推荐阅读
- java - Java Swing在图标内对齐文本
- firebase - 准备 Firestore 成员的年龄明智报告
- amazon-web-services - 如何使用包 AWSS3.jl 连接到在 EC2 实例上运行的 S3 存储桶?
- python - 在另一个 NamedTuple 中创建一个 NamedTuple 并将其设置为该 Tuple 中条目的默认值
- r - 如何使用 rvest 提取此节点内容
- sql - Poweshell 检索 sql 查询结果
- python - Python pytube 模块内部解释。单个赋值语句如何将其他字段分配给自身?
- sql - 包含和排除的 Where 子句
- shell - 同时读取行和打印行号
- python - ValueError:无法挤压 dim[1],预期维度为 1,在 tensorflow model.fit 中得到 500