我已经在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!


码:

.data

msg: .ascii "Hello World!\0"

.text

.global _main

_main:

pushl $msg
call _puts

leave
movl $0, %eax
ret


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

最佳答案

您的程序膨胀主要来自C运行时库。在Windows中,如果您编写自己的“微型” CRT,则简单的hello world程序的大小可能小于5K。这是一个项目的链接,其中解释了有关如何将EXE缩小到最小尺寸的所有详细信息:

http://www.codeproject.com/Articles/15156/Tiny-C-Runtime-Library

07-24 09:50
查看更多