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

jv4diomz  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(113)

我想为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。

blpfk2vs

blpfk2vs1#

TL;DR写入32位DOS程序可达到的最小开销是5800.. 9800字节。

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

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

关于我考虑过的每个DOS扩展器及其增加的开销的更多细节:

  • Xi开发系统1997年8月15日:4303个字节;不支持VCPI,不执行位置调整,没有文件I/O
  • 系统64版本1.210:6392字节,实际程序因NUL块而长16408字节;缺少大多数DOS文件I/O函数
  • PMODE3.07:7048字节,实际程序长424字节,因为DOS.exe头中有NUL块
  • RAW 32 r3:7270字节,实际程序长了4186字节因为NUL块,实际程序使DOSBox崩溃
  • PMODE 2.05:7937字节,由于NUL块,实际程序长5867字节
  • D3 X d3xlite.exe 2022年6月13日由糖果人:压缩8200字节
  • WDOSX 0.97:9720字节已压缩
  • 电源模式/W 1.22:10286个字节
  • E.O.S 3.0.5硬砂岩目标:使用WWPACK压缩时为10800字节,默认值为未压缩
  • D3 XX d3x.exe 2022年8月1日:10908个字节
  • Pro32版本17以及随Pass 32 2.5汇编程序分发的版本:11273字节,创建的.exe程序使DOSBox崩溃
  • D3 X 0.90 2004年10月9日:11880,由于NUL块,实际程序长4800字节
  • 电源模式/W 1.33:11783个字节
  • ZRDX:12400字节
  • E.O.S 3.0.5,可执行文件:使用WWPACK压缩时为13078字节,默认为已压缩
  • DOS/4GW、DOS/32A、PMODE/W、PMODE/DJ等增加的字节甚至超过14000个。
  • DOSX随Symantec C++ 6.1提供,21549字节

相关问题