在学校写一个编译器,最后一个里程碑是生成汇编代码。尝试学习 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 编码器,但值得一试,对吗?我很感激我能得到的任何帮助。
最佳答案
功能 printf
在某些 C 库中定义(在 Linux 上,例如 /lib/libc.so.6
或 /lib/x86_64-linux-gnu/libc.so.6
),因此您需要链接到该库(我不知道它在 MacOSX 上是什么)
你可以直接做system calls即 syscalls (我不知道 MacOSX 的详细信息,也不知道它们是否公开可用)。在 Linux 上,Linux Assembly Howto给出细节。您需要为您的操作系统找到等效的详细信息。
(顺便说一句,对于此类任务,使用完全免费的软件肯定更容易,因为它们的规范和源代码是可用的;对于像 MacOSX 这样的专有软件,您需要从软件提供商那里获取,有时非常昂贵)
关于macos - 在 Mac OSX 上编译 NASM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8451939/