NASM under BSD

X86 クロス・アセンブラ under BSD

竹岡 尚三 ((株)アックス)

はじめに

NASM( http://www.web-sites.co.uk/nasm/ ) は

The Netwide Assembler
という名の 8086アセンブラです。
NASMはケンブリッジ大学のSimon Tatham氏(anakin@pobox.com)によって主なコー ディングが行われ、ワーウィック(Warwick)大学のJulian Hall氏 (jules@earthcorp.com)が非常に多くのユーザの疑問に答えることによってでき あがっています。

NASMは基本的には、DOSのMASMとほぼ同じ文法のアセンブラであり、UNIX、 Windows、 DOS Extenderで走行します。
しかも、16bitモードのコードも32bitモードのコードもアセンブルできます。

なぜにここで、8086 16bitのアセンブラかというと、FreeBSDでもブートセレク タなどを開発する場合には8086の16bit用の開発環境があったほうが便利です。
実は、筆者のまわりでOSのブートセレクタを開発することになったのですが…

そこで今回は、NASMというごく普通の16bit 8086用アセンブラをFreeBSDのため に探してきました。


NASMの特徴

NASMはMASMとほぼコンパチブルな文法をもっていますが、マクロ機能はMASMと は異なります。

NASMは非常によくできており、

  1. NASM単独で*.com, *.exeを生成できる
  2. MS Linkerのための*.objを生成できる
  3. FreeBSD,Linuxの*.oを生成できる
  4. FreeBSD,Linuxの*.soを生成できる
  5. defineを使用してマクロを定義できる
  6. includeによってファイルのインクルードができる
  7. CyrixのMMX命令もサポート
などの特徴があります。

とくに、1)と3)、4)は非常に便利です。
特徴1)について
NASMはいわゆる「アブソリュート・アセンブラ」の機能をもっ ており、実行イメージの先頭番地を指定したソースファイルを、いきなり実行可 能なバイナリ・ファイルとして出力できます。
ブートセレクタのような小さなプログラムの開発には、リンカが必要ないアブソ リュート・アセンブラが便利でしょう。
また、FreeBSDで動作するMS Linkerとコンパチブルなリンカは見つかっていな いので、すべての開発をFreeBSDで行うためには、NASMで直接バイナリを吐き出 すしかありません。
(NASMのドキュメントには、VAL, djlinkなどのリンカが紹介されていますが、 どちらもUNIX用ではありません)

特徴の3)、4)も便利です。
FreeBSDで使用可能な*.oがNASMで開発できるので、 gasの独特な文法 を使用する必要がありません。NASMはIntelが規定した8086のアセンブリ言語文 法やMASM に慣れた人には、非常に使い易いアセンブラでしょう。

NASMはFreeBSDのための*.so(シェアード・ライブラリ)も生成できます。 8086ニーモニックの小規模な開発は、NASM一本ですべて解決でしょう。


NASMのインストール

http://www.web-sites.co.uk/nasm/ から「latest version」をクリックし、そのページから nasm-*.tar.gzをゲットします。今回は、nasm-0.97.tar.gz が得られました。

それを展開します。

	% tar xvzf nasm-0.97.tar.gz
 
新しくnasm-0.97というディレクトリができます。
	% cd nasm-0.97
	% make -f Makefile.unx
 
とすると、nasmとndisasmという2つの実行ファイルができます。 nasmはアセンブラ、ndisasmはディスアセンブラです。

install-shなどというshellスクリプトも存在しますが、単にコピーするだけで 十分でしょう。

	# cp nasm /usr/local/bin
	# cp ndisasm /usr/local/bin
	# cp nasm.1 /usr/local/man/man1
	# cp ndisasm.1 /usr/local/man/man1
 

この他に、*.exeを作成するために大事なマクロがありますから、それを /usr/local/lib/nasm/にコピーすることにします。

	# mkdir -p /usr/local/lib/nasm
	# cp misc/exebin.mac /usr/local/lib/nasm
 

NASMの使用方法

NASMには非常に詳しいドキュメントがテキスト、HTML、info、PSの各形式で付 属しています。
文法、アセンブル方法などはすべてドキュメントに詳説されているので、ここ では、よく使われると思われる使用法を述べます。

1) comファイルの生成

comファイルを生成させるには、-f binを指定します。

  % nasm -f bin -o test.com test.asm
 
test.asm中には、プログラム・コードの前にorg宣言をつけ て、プログラムの開始番地を指定します。
これで、アブソリュート・アセンブラとして機能し、リンカなしで、いきなり COM実行形式が得られます。

DOS環境で実行する場合、通常ORG 0x100とします。

ブートセレクタなどを開発する場合も、このcomファイル形式で生成させると、 余分なヘッダー情報などが付かず、便利です。

16bitモードのソース・ファイルにはその先頭部分で「BITS 16」とい う宣言を行います。



2) exeファイルの生成

exeファイルを生成させるには、独特なヘッダーファイルをインクルードし、同 時に-f binを指定します。

  % nasm -fbin binexe.asm -o binexe.exe -iヘッダーファイルのディレクトリ
 

-iには、ヘッダーファイルを置いたディレクトリを指定します。Cコ ンパイラの -Iオプションに相当します。
今回は、/usr/local/lib/nasm/にヘッダーファイルを置いたので、

  % nasm -fbin test.asm -o test.exe -i/usr/local/lib/nasm/
 
とします。

ソース・ファイルの先頭では

	%include "exebin.mac"
 
と記述し、exebin.macをインクルードします。 そして、プログラムの最初の行に
	EXE_begin
 
と記述します。

実は、このexebin.macがEXEファイルのヘッダーを作ってくれていま す。
そのおかげで、NASMは何も意識せずに、EXE形式の実行ファイルができています。




3) .o(オブジェクト)ファイルの生成

FreeBSDで使用できる.oファイルは-f aoutを指定し、

  % nasm -f aout test.asm
 
とします。
こうすると、通常のアセンブラらしくtest.oができます。

このオブジェクトは file(FreeBSD2.2.2)コマンドで確かめると、

 % file test.o
 test.o:   Linux/i386 impure executable (OMAGIC)
 
と出力されLinuxのa.outのようです。
しかし、ちゃんとFreeBSDでもリンク可能なオブジェクトです。

蛇足ながら、FreeBSDで使用するサブルーチンなら、32bitモードで記述するの が普通でしょう。
その場合、ソース・ファイルの先頭部分に「BITS 32」という宣言を 入れなければなりません。




4) .so(シェアード・ライブラリ)ファイルの生成

シェアード・ライブラリ・ファイルを生成するには、まず、-faoutb をつけてアセンブルします。
その後、ldによって、シェアード・ライブラリ形式に変換させます。
具体的には

	% nasm -f aoutb test.asm
	% ld -Bshareable -o test.so test.o
 
とします。

シェアード・ライブラリはPIC(Position Independent Code=位置独立コード)で なければならないので、ソースコード中に絶対番地に依存した記述があってはい けません。
また、これも通常は32bitコードであるべきでしょう。

以上で、NASMがいかに便利かがおわかり頂けたかと思います。

NASM公式ホームページへ



フリーソフトウェア・インデックスに戻る