我一步步使用匯編語言來學習linux上的彙編語言編程。我最近有一臺Mac,其上的int 0x80
似乎不起作用(非法指令)。os中的彙編語言x
所以只是想知道是否有一個很好的參考(書/網頁),它給出了標準的unix程序集和達爾文程序集的區別。
我一步步使用匯編語言來學習linux上的彙編語言編程。我最近有一臺Mac,其上的int 0x80
似乎不起作用(非法指令)。os中的彙編語言x
所以只是想知道是否有一個很好的參考(書/網頁),它給出了標準的unix程序集和達爾文程序集的區別。
出於實用目的,此答案顯示how to compile a hello world application using nasm on OSX。
此代碼可以被編譯爲Linux原樣,但CMD-line命令來編譯它可能會有所不同:
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
這個問題將有可能幫助:List of and documentation for system calls for XNU kernel in OSX。
不幸的是,它看起來像提到的書是唯一的方法來找出答案。至於int 0x80,我懷疑它會起作用,因爲它是一個非常適合內核的特定於Linux的API。
我在一個陌生的操作系統上工作時做出的妥協就是使用libc調用,但是我可以理解,即使您只是在學習,也可能會過高。
但系統調用機制與Linux相同嗎?我知道Solaris的不同。 –
從一個編譯器到另一個編譯器的語法可能會發生很大變化,並且包含不同的指令格式和調用約定。 – karlphillip
真正的區別在於您需要在32位的二進制文件中提供額外的4個字節。它來自bsd遺產。查看我的回覆鏈接 –