我正在阅读一本书,其中所有的汇编代码示例都是针对32位Linux环境编写的,而我使用的是64位Mac。我将
我尝试过:
并且。
_start
更改为start
后,成功地使用NASM编译了以下程序。然而,当我运行可执行文件时,它没有像我预期的那样打印出hello world
。有没有什么选项可以传递给NASM以便以在64位Mac上运行的方式编译这个程序?我尝试过:
nasm -f macho32 helloworld.asm
并且。
nasm -f macho helloworld.asm
接着:
ld helloworld.o -o helloworld
我的代码是:
section .data ; data segment
msg db "Hello, world!", 0x0a ; the string and newline char
section .text ; text segment
global start ; Default entry point for ELF linking
start:
; SYSCALL: write(1, msg, 14)
mov eax, 4 ; put 4 into eax, since write is syscall #4
mov ebx, 1 ; put 1 into ebx, since stdout is 1
mov ecx, msg ; put the address of the string into ecx
mov edx, 14 ; put 14 into edx, since our string is 14 bytes
int 0x80 ; Call the kernel to make the system call happen
; SYSCALL: exit(0)
mov eax, 1 ; put 1 into eax, since exit is syscall #1
mov ebx, 0 ; exit with success
int 0x80 ; do the syscall
int 0x80
与Linux上的不同(系统调用不同)。使用Linux代码作为起点是不明智的。你真的需要一个32位Mac OS/X汇编语言教程。一个合理的起点在这里:https://filippo.io/making-system-calls-from-assembly-in-mac-os-x/ - Michael Petchint 0x80
并开始使用syscall
指令。这与int 0x80
不同。调用约定不同,并且系统调用号与32位OS/X代码不匹配。你需要找到一个针对64位OS/X代码的教程。你还需要在NASM中使用-f macho64
。 - Michael Petch