我已经在Gas,NASM和YASM中使用了多平台的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