Macでアセンブリ言語のhello worldを実行する方法

Macでアセンブリのhello worldを実行する方法を、アセンブリ初心者向けにわかりやすく解説していきます。

今回は、コードの意味を追うのではなく、どのような手順でアセンブリのプログラミングをやっていけばプログラムを実行できるか、をメインに説明していきます。

一応、対象読者は、C言語(GCC)のgcc -o main main.c -lDxLibのコマンドの意味がわかる方を対象にしていきます。

1, nasmをインストールする

まずは、nasmをhomebrewでインストールします。nasmとはアセンブリコードをオブジェクトファイルに書き換えてくれるアセンブラのことで、C言語でいうコンパイラ(GCC)の役割をしてくれます。

homebrew install nasm

1、アセンブリをオブジェクトファイルに変換する

nasmをインストールしたら、早速アセンブリコードをオブジェクトファイルにしてみましょう。

まずは、以下のソースコードを用意します。(ファイル名は、hello.asm)

; hello.asm

          global    _main

          global    start

          section   .text
start:    mov       rax, 0x02000004         ; system call for write
          mov       rdi, 1                  ; file handle 1 is stdout
          mov       rsi, message            ; address of string to output
          mov       rdx, 13                 ; number of bytes
          syscall                           ; invoke operating system to do the write
          mov       rax, 0x02000001         ; system call for exit
          xor       rdi, rdi                ; exit code 0
          syscall                           ; invoke operating system to exit

          section   .data
message:  db        "Hello, World", 10   

そして、以下のコマンドを実行。

 nasm -f macho64 hello.asm

基本的にアセンブリは、nasm hello.asmというコマンドを実行することで、hello.oというオブジェクトファイルを作成してくれます。

しかし、Macでは64bitのアセンブリしか実行できないので、-f macho64とすることで、「このアセンブリは64bitに対応しているよ」とnasmに伝える必要があるのです。

ちなみに、-fは出力フォーマット(64bitなのか32bitなのか等)を指定するオプションのことで、macho64とはMach-O-64bitを意味する単語。machはMachカーネルを使ったUnixのことで、Oはオブジェクトの意味です。

-f macho64の他にも、-f macho32-f machoとすることで、「このアセンブリは32bitだよ」とnasmに伝えることができます。

3, 機械語を作る

nasmでオブジェクトファイルを作成したら、以下のコマンドを実行して機械語に直しましょう。

ld -macosx_version_min 10.7.0 -lSystem -o hello hello.o

ldはLinuxやMacにあるコマンドの1つで、オブジェクトファイルを機械語に直してくれるものです。

ldコマンドの使い方: UNIX/Linuxの部屋

Macでアセンブリをするためには、-macosx_version_min 10.7.0としてバージョンを伝える必要があります。(-macosx_version_min 10.7.0を入れないと、Warningが発生します。)

そして、-lSystemは、C言語でもライブラリを使う時に-lDxLibみたいなことをやりますが、それと同じ意味ですね。今回は、標準出力を行うために-lSystemを使っています。

4,  プログラムを実行する

うまくいけば実行ファイルが完成するので、./helloと実行しましょう。hello worldと表示されれば成功です。