Mac OS X Lion(Intel Core i5)環境でのアセンブリ言語開発
ふと思い立って、大してコンピュータの知識も持っていないくせにアセンブリ言語が書きたくなった。
それで調べてみたものの、出てくるのはWindows環境やLinux環境のものばかり。
人に聞いてヒントを貰って、頑張って苦手な英語のページを読んで、ようやく警告が1つ出たものの、Hello Worldプログラムを実行することができた。
以下その手順。
1. NASMのインストール
どうやらMac OS X環境ではNASMというアセンブラを使うのが楽らしいのだが、実はMac OS Xに標準でインストールされているNASMは非常に古いバージョンのもので、使いものにならない(NASMのバージョンを確認するにはターミナルで「$ nasm -v」と打てばいい)。
そこで、NASMのWebページの「Latest version」から最新版のNASM(nasm-O.O.O.tar.bz2)をダウンロード・解凍し、インストールする。(現在の最新版は2.10.01)
インストールにはターミナルを立ち上げ、解凍してできたディレクトリ「nasm-O.O.O」のあるディレクトリに移動し、以下のコマンドを実行すればいい。
$ ./configure
$ make
$ sudo make install
$ nasm -v
と打って、ダウンロードしたバージョンになっていれば、成功。
なってなかったら、知らない。
2. helloWorld.asm ファイルを作成
なにか適当にアセンブリファイルを作ればいいのだが、これがまた厄介で、「mov」とかのよく見かけるアセンブリコード以外にOSとやり取りするためのコードも書いてやらないといけないらしい。
結局今回はここのサイトの「Armed with this information, here’s the final x86_64 Mach-o “Hello World”」と書かれているところの下のコードをコピーして、テキストエディタmiに貼り付けて「helloWorld.asm」という名前で保存した。
3. NASMでアセンブル
ここまで来たら、後はアセンブルするだけ。ターミナルを開いて先ほど作成した「helloWorld.asm」のあるディレクトリに移動し、以下のコマンドを実行する。
$ nasm -f macho64 helloWorld.asm
何も出なければ成功。
「-f macho64」は64ビットMac OS Xのオブジェクトファイルとして生成することを表すオプションで、1. のバージョン更新ができていないと、「unrecognised output format 'macho64'」とか言われる。
成功したら次に、以下のコマンドを実行する。
$ ld helloWorld.o
これでリンクが上手く処理できれば何も出ず、
$ ./a.out
とすることで晴れてプログラムが実行され
と表示されるはずなのだが、
今回の環境ではld実行時に
ld: warning: -macosx_version_min not specificed, assuming 10.7
と表示されてしまった。
まあ実行できたから、いいか。
以上、全然理解していないので、この操作がほんとうに正しいかはさておき、とりあえずMac OS X環境でNASMを使ってアセンブリ言語プログラミングを行う方法でした。
<参考サイト>
・NASMインストール方法 - Compiling and Installing NASM on Mac OS X | Neural Advance
・アセンブル方法 - Mac OS X 64 bit Assembly Hello World | TheXploit | Security Blog
・NASMでのアセンブル時のフォーマットについて - osx - Can't link assembly file in Mac OS X using ld - Stack Overflow