2011-08-09 69 views
6

我一步步使用匯編語言來學習linux上的彙編語言編程。我最近有一臺Mac,其上的int 0x80似乎不起作用(非法指令)。os中的彙編語言x

所以只是想知道是否有一個很好的參考(書/網頁),它給出了標準的unix程序集和達爾文程序集的區別。

回答

3

出於實用目的,此答案顯示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 
+0

但系統調用機制與Linux相同嗎?我知道Solaris的不同。 –

+0

從一個編譯器到另一個編譯器的語法可能會發生很大變化,並且包含不同的指令格式和調用約定。 – karlphillip

+0

真正的區別在於您需要在32位的二進制文件中提供額外的4個字節。它來自bsd遺產。查看我的回覆鏈接 –

1

這個問題將有可能幫助:List of and documentation for system calls for XNU kernel in OSX

不幸的是,它看起來像提到的書是唯一的方法來找出答案。至於int 0x80,我懷疑它會起作用,因爲它是一個非常適合內核的特定於Linux的API。

我在一個陌生的操作系統上工作時做出的妥協就是使用libc調用,但是我可以理解,即使您只是在學習,也可能會過高。