yaami
yaami

Reputation: 573

assembly language in os x

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 instruction).

So just wanted to know if there is a good reference (book/webpage) which gives the differences b/w the standard unix assembly and darwin assembly.

Upvotes: 7

Views: 2380

Answers (3)

Tyler
Tyler

Reputation: 1837

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.

Upvotes: 1

karlphillip
karlphillip

Reputation: 93468

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

Upvotes: 4

Foo Bah
Foo Bah

Reputation: 26281

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

Upvotes: 0

Related Questions