我通过逐步学习汇编语言来学习Linux上的汇编语言编程。最近,我购买了一台Mac,在其中int 0x80
似乎无法正常工作(非法指令)。
所以我想知道是否有一个好的参考资料(书籍/网页),可以介绍标准Unix汇编和Darwin汇编之间的区别。
为了实际应用,本答案展示了在OSX上使用nasm编译“hello world”应用程序的方法。
这段代码可以直接编译成适用于Linux的格式,但是编译命令可能会有所不同:
section .text
global mystart ; make the main function externally visible
mystart:
; 1 print "hello, world"
; 1a prepare the arguments for the system call to write
push dword mylen ; message length
push dword mymsg ; message to write
push dword 1 ; file descriptor value
; 1b make the system call to write
mov eax, 0x4 ; system call number for write
sub esp, 4 ; OS X (and BSD) system calls needs "extra space" on stack
int 0x80 ; make the actual system call
; 1c clean up the stack
add esp, 16 ; 3 args * 4 bytes/arg + 4 bytes extra space = 16 bytes
; 2 exit the program
; 2a prepare the argument for the sys call to exit
push dword 0 ; exit status returned to the operating system
; 2b make the call to sys call to exit
mov eax, 0x1 ; system call number for exit
sub esp, 4 ; OS X (and BSD) system calls needs "extra space" on stack
int 0x80 ; make the system call
; 2c no need to clean up the stack because no code here would executed: already exited
section .data
mymsg db "hello, world", 0xa ; string with a carriage-return
mylen equ $-mymsg ; string length in bytes
将源代码(hello.nasm)组装成目标文件:
nasm -f macho hello.nasm
生成可执行文件的链接:
ld -o hello -e mystart hello.o
你能发布你的代码和编译方式吗?(有很多方法可以引发非法指令错误)
OSX采用了传递参数的BSD风格,这就是为什么你必须稍微不同地处理事情。
我一段时间前收藏了这个链接:http://www.freebsd.org/doc/en/books/developers-handbook/book.html#X86-SYSTEM-CALLS