如何消除汇编程序可执行文件的膨胀?

mca*_*dre 5 optimization assembly filesize

我已经在GasNASMYASM中工作了多平台 Hello World 代码,我想将它们相应的可执行文件从 76KB 缩小到对于 Hello World 汇编程序更合理的大小,因为基本的 Hello World C 程序会导致80KB 的可执行文件和程序集应该小得多。我相信大部分可执行文件都充满了链接器选项中的垃圾。

痕迹:

LIBS=c:/strawberry/c/i686-w64-mingw32/lib/crt2.o -Lc:/strawberry/c/i686-w64-mingw32/lib -lmingw32 -lmingwex -lmsvcrt

ld ld -o $(EXECUTABLE) hello.o $(LIBS)

hello.exe
Hello World!
Run Code Online (Sandbox Code Playgroud)

代码:

.data

msg: .ascii "Hello World!\0"

.text

.global _main

_main:

pushl $msg
call _puts

leave
movl $0, %eax
ret
Run Code Online (Sandbox Code Playgroud)

如果我删除 LIBS 中的任何选项,则链接过程会失败,或者生成的可执行文件在运行时会引发 Windows 错误。因此,合乎逻辑的做法是将调用替换puts为更简单的内容,例如 sys_write,但我不知道如何执行此 multiplatform。网上的小文档说使用它int 0x80来执行对内核的调用,但这仅适用于 Linux,不适用于 Windows,而且我希望我的汇编代码是多平台的。

Gre*_*ill 1

对于Windows,您可以调用本机Win32 API函数,例如GetStdHandle()WriteFile()直接写入stdout。

对于类 Unix 系统,您可以使用write()文件描述符 1 来调用标准输出的系统调用。

具体如何执行这些操作的详细信息将取决于您使用的汇编器和操作系统。