如何减少使用FASM编译的x86 ASM的EXE大小?


14

作为练习,我使用x86汇编语言创建了一个简单的解决方案来应对这一挑战。我正在Windows上使用FASM运行它。这是我的源代码:

format PE console
entry start

include 'WIN32A.inc'

section '.text' code executable
start:
    push    char            ; Start at 'A'
    call    [printf]        ; Print the current letter 4 times
    call    [printf]
    call    [printf]
    call    [printf]
    inc     [char]          ; Increment the letter
    cmp     [char], 'Z'     ; Compare to 'Z'
    jle     start           ; char <= 'Z' --> goto start

section 'r.data' data readable writeable
    char    db  'A', 10, 0  ; Stores the current letter

section '.idata' data readable import
    library  msvcrt,   'msvcrt.dll'
    import   msvcrt, printf, 'printf'

当我编译它时,我得到的可执行文件比我预期的要大。这是一个十六进制转储:

https://pastebin.com/W5sUTvTe

我注意到代码部分与数据和库导入部分之间有很多空白,并且在代码中嵌入了一条消息:“此程序无法在DOS模式下运行”。如何将源代码汇编成一个适合Code Golf的小文件?

作为附带说明,欢迎提出更好的打印方法stdout而无需导入msvcrt和调用printf的建议。


@iBug很抱歉听到这个消息。您能给我一个更合适的地方吗?
vasilescur

12
@iBug提示在特定情况下,寻求高尔夫帮助的问题在这里绝对不是题外话。
AdmBorkBork


1
它必须是:开始:push char Lb:调用[printf]调用[printf]调用[printf]调用[printf] inc [char] cmp [char],'Z'jle Lb,因为如果没有,可能会消耗堆栈; 必须查看是否每次调用printf都必须添加调整esp的指令
RosLuP

1
代替了printf,你可以的WriteFile(标准输出),需要不超过KERNEL32等进口(这是目前在默认情况下,你只需要确定地址)
彼得·费利

Answers:


2

一般提示,但是

使用COM文件格式而不是PE EXE。

PE EXE有一些缺陷,导致该格式在代码高尔夫中几乎没有用。第一个是图像对齐(如果对齐不正确,Windows将不会运行EXE文件),第二个是标头大小。有一些因素并不重要(将可执行文件分为几部分)。

使用COM文件格式(几乎等效于平面二进制文件)的优点是:

  • 标头代码为零,文件未划分为多个部分
  • 没有图像对齐(因此图像大小可能无法严格定义为2的整数倍,但是它必须小于65K。不过,它不会有太大变化,因为如果提交的内容大于65K,则说明您在做有问题)。
  • 您不能使用外部库-实际上这是一个加号,因为毫无疑问,您还有其他执行I / O的方法。这就是BIOS中断派上用场的地方。
  • 您可以直接控制与系统链接的内存和设备,因此没有分页,没有访问冲突,没有内存保护,没有并发等等。这些功能使打高尔夫的创意程序变得更加容易。

我已经修改了您的代码,使其可以作为平面二进制文件使用。这很简单:

ORG 100H

MOV DX, P
MOV AH, 9

L:
    INT 21H
    INT 21H
    INT 21H
    INT 21H

    INC BYTE [P]
    CMP BYTE [P], 'Z'
    JLE L

MOV AX, 4C00h
INT 21h

P DB "A", 10, "$"

输出二进制文件只有32个字节大。我相信,有可能进一步减小尺寸,但这只是一个起点。

与组装nasm -fbin file.asm -o file.com。请注意,此示例是为NASM制作的,但是您可以将其免费转换为FASM,并且可以正常工作。


我不敢相信我已经回答了这个问题,然后从谷歌那里回到了它
Krzysztof Szewczyk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.