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

 

とすることで晴れてプログラムが実行され

 

Hello World!

 

と表示されるはずなのだが、

今回の環境では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&#39;t link assembly file in Mac OS X using ld - Stack Overflow