gpt4 book ai didi

macos - 在 Mac OSX 上编译 NASM

转载 作者:行者123 更新时间:2023-12-01 11:03:30 24 4
gpt4 key购买 nike

在学校写一个编译器,最后一个里程碑是生成汇编代码。尝试学习 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 callssyscalls (我不知道 MacOSX 的详细信息,也不知道它们是否公开可用)。在 Linux 上,Linux Assembly Howto给出细节。您需要为您的操作系统找到等效的详细信息。

(顺便说一句,对于此类任务,使用完全免费的软件肯定更容易,因为它们的规范和源代码是可用的;对于像 MacOSX 这样的专有软件,您需要从软件提供商那里获取,有时非常昂贵)

关于macos - 在 Mac OSX 上编译 NASM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8451939/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com