How to write an assembly ‘hello world’ on macOS

I started with this gist, creating this file:

global start
section .text
start:
  mov rax, 0x2000004 ; write
  mov rdi, 1 ; stdout
  mov rsi, msg
  mov rdx, msg.len
  syscall
  mov rax, 0x2000001 ; exit
  mov rdi, 0
  syscall
section .data
msg:    db      "Hello, world!", 10
.len:   equ     $ - msg

This is “assembly”, but this term is vague. Getting specific, this file:

To compile it, we need tools which understand all of these. One of these is nasm, the “Netwide Assembler”. It seems to be the most popular assembler. I ran the program with:

$ brew install nasm
$ nasm -version
NASM version 2.12.02 compiled on Sep 14 2016
$ nasm -f macho64 hello.s
$ ld -macosx_version_min 10.7.0 -lSystem -o hello hello.o
$ ./hello
Hello, world!

There are lots of unknown bits in here. I’ll cover them in future posts ...

Tagged #assembly, #macos, #hello-world, #nasm, #system-calls, #x86-64, #programming.
👋 I'm Jim, a full-stack product engineer. Want to build an amazing product and a profitable business? Read more about me or Get in touch!

More by Jim

This page copyright James Fisher 2017. Content is not associated with my employer. Found an error? Edit this page.