Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

assembly language in os x

Tags:

macos

assembly

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.

like image 604
yaami Avatar asked Aug 09 '11 02:08

yaami


People also ask

What assembly language does macOS use?

MacOS uses LLVM by default whereas Linux uses GNU GCC.

How do I run an assembly language program on a Mac?

To be able to run an assembly program we need first to create an executable. This is a two step process. First you compile your source code by using the as command line tool, this will produce an intermediate object code that would need to be linked via the ld tool in the second step.

What is assembly language in operating system?

Assembly language is the closest computer language to communicate with computers. It is the machine language (1s and 0s) that a CPU uses to operate in an easy to remember and understand format. Only assembly language can take the full advantages of the processor architecture, and it is hardware dependent.

What assembly language does Mac M1 use?

The Apple M1 only supports ARM64 (also known as aarch64) assembly which is quite different from 32 bit ARM assembly. While you might be able to assemble 32 bit ARM programs with a suitable toolchain, you will not be able to run them.


2 Answers

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
like image 121
karlphillip Avatar answered Sep 28 '22 21:09

karlphillip


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.

like image 21
Tyler Avatar answered Sep 28 '22 19:09

Tyler