我在学校编写编译器,最后一个里程碑是生成汇编代码。尝试学习NASM。从一开始开始,http://www.cs.lmu.edu/~ray/notes/nasmexamples/,尝试编译Hello World。
; ----------------------------------------------------------------------------
; helloworld.asm
;
; This is a Win32 console program that writes "Hello, World" on one line and
; then exits. It needs to be linked with a C library.
; ----------------------------------------------------------------------------
global _main
extern _printf
section .text
_main:
push message
call _printf
add esp, 4
ret
message:
db 'Hello, World', 10, 0
在Windows下,组装、链接并运行此程序的方法如下:
nasm -fwin32 helloworld.asm
gcc helloworld.obj
a
在Linux下,您需要从函数名中删除前导下划线,并执行以下操作:
nasm -felf helloworld.asm
gcc helloworld.o
./a.out
但是我使用的是OSX操作系统。找到了这个小资源:http://salahuddin66.blogspot.com/2009/08/nasm-in-mac-os-x.html。在Mac OS X中,我们应该使用macho格式...
nasm -f macho -o hello.o hello.asm
...对于链接器(我们需要指定入口点)...
ld -e main -o hello hello.o
但是当我这样做时......
Undefined symbols:
"printf", referenced from:
_main in hello.o
ld: symbol(s) not found for inferred architecture i386
抱歉,我知道这是一篇很长的阅读内容。而且我怀疑这里没有太多NASM编程人员,但还是值得一试对吧?我会非常感激任何帮助。