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つで、オブジェクトファイルを機械語に直してくれるものです。
Macでアセンブリをするためには、-macosx_version_min 10.7.0
としてバージョンを伝える必要があります。(-macosx_version_min 10.7.0
を入れないと、Warningが発生します。)
そして、-lSystem
は、C言語でもライブラリを使う時に-lDxLib
みたいなことをやりますが、それと同じ意味ですね。今回は、標準出力を行うために-lSystem
を使っています。
4, プログラムを実行する
うまくいけば実行ファイルが完成するので、./hello
と実行しましょう。hello worldと表示されれば成功です。