我在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,但我不知道如何执行这个 multiplatform。网上的小文档说用于int 0x80
执行对内核的调用,但这仅适用于 Linux,不适用于 Windows,我希望我的汇编代码是多平台的。