在 Mac OSX 上编译 NASM
在学校编写编译器时,最后一个里程碑是生成汇编代码。尝试学习 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
But I'm on 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 编码器,但值得一试,对吗?如果我能得到任何帮助,我将不胜感激。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

发布评论
评论(2)
过潦 2024-12-27 06:32:23
函数 printf
在某些 C 库中定义(在 Linux 上,例如 /lib/libc.so.6
或 /lib/x86_64-linux- gnu/libc.so.6
),所以你需要链接到该库(我不知道它在MacOSX上是什么)
你可以直接"="">系统调用即系统调用(我不了解 MacOSX 的详细信息,但我不知道它们是否公开)。在 Linux 上,Linux Assembly Howto 提供了详细信息。您需要找到适用于您的操作系统的等效详细信息。
(顺便说一句,使用完全免费的软件对于此类任务来说肯定更容易,因为它们的规范和源代码是可用的;对于像 MacOSX 这样的专有软件,您需要从软件提供商处获取,有时它非常昂贵)
~没有更多了~
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
您的示例中的程序是 32 位 Windows 程序。如今,编写 64 位程序可能会更好。
要将其转换为 64 位 macOS 程序,您应该确保您拥有最新版本的 nasm,并安装了 gcc。
程序现在应该如下所示:
您将注意到一些差异:
puts
之前压入rbx
可以使堆栈重新对齐。rel
。The program in your example is a 32-bit Windows program. These days, it's probably better to write a 64-bit program.
To covert this to 64-bit macOS program, you should make sure you have a recent version of nasm, and have gcc installed.
The program should now look like this:
You'll note a few differences:
rbx
before callingputs
serves to get the stack realigned.rel
.