assembly language in os x

后端 未结 3 1042
轮回少年
轮回少年 2021-01-05 09:06

I used assembly language step by step to learn assembly language programming on linux. I recently got a Mac, on which int 0x80 doesn\'t seem to work (illegal in

相关标签:
3条回答
  • 2021-01-05 09:25

    For practical purposes, this answer shows how to compile a hello world application using nasm on OSX.

    This code can be compiled for linux as is, but the cmd-line command to compile it would probably differ:

    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
    

    Assemble the source (hello.nasm) to an object file:

    nasm -f macho hello.nasm
    

    Link to produce the executable:

    ld -o hello -e mystart hello.o
    
    0 讨论(0)
  • 2021-01-05 09:25

    can you post your code and how you compiled? (There are many ways to elicit illegal instruction errors)

    OSX picked up bsd style of passing arguments, which is why you have to do thing slightly differently.

    I bookmarked this a while ago: http://www.freebsd.org/doc/en/books/developers-handbook/book.html#X86-SYSTEM-CALLS

    0 讨论(0)
  • 2021-01-05 09:49

    This question will likely help: List of and documentation for system calls for XNU kernel in OSX.

    Unfortunately, it looks like the book mentioned there is the only way to find out. As for int 0x80, I doubt it will work because it is a pretty Linux specific API that is built right into the kernel.

    The compromise I make when working on an unfamiliar OS is to just use libc calls, but I can understand that even that may be too high level if you're just looking to learn.

    0 讨论(0)
提交回复
热议问题