NASM( http://www.web-sites.co.uk/nasm/ ) は
The Netwide Assemblerという名の 8086アセンブラです。
NASMは基本的には、DOSのMASMとほぼ同じ文法のアセンブラであり、UNIX、
Windows、 DOS Extenderで走行します。
しかも、16bitモードのコードも32bitモードのコードもアセンブルできます。
なぜにここで、8086 16bitのアセンブラかというと、FreeBSDでもブートセレク
タなどを開発する場合には8086の16bit用の開発環境があったほうが便利です。
実は、筆者のまわりでOSのブートセレクタを開発することになったのですが…
NASMはMASMとほぼコンパチブルな文法をもっていますが、マクロ機能はMASMと は異なります。
NASMは非常によくできており、
とくに、1)と3)、4)は非常に便利です。
特徴1)について
NASMはいわゆる「アブソリュート・アセンブラ」の機能をもっ
ており、実行イメージの先頭番地を指定したソースファイルを、いきなり実行可
能なバイナリ・ファイルとして出力できます。
ブートセレクタのような小さなプログラムの開発には、リンカが必要ないアブソ
リュート・アセンブラが便利でしょう。
また、FreeBSDで動作するMS Linkerとコンパチブルなリンカは見つかっていな
いので、すべての開発をFreeBSDで行うためには、NASMで直接バイナリを吐き出
すしかありません。
(NASMのドキュメントには、VAL, djlinkなどのリンカが紹介されていますが、
どちらもUNIX用ではありません)
特徴の3)、4)も便利です。
FreeBSDで使用可能な
NASMはFreeBSDのための
http://www.web-sites.co.uk/nasm/
から「
それを展開します。
% tar xvzf nasm-0.97.tar.gz新しく
% 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
この他に、
# mkdir -p /usr/local/lib/nasm # cp misc/exebin.mac /usr/local/lib/nasm
NASMには非常に詳しいドキュメントがテキスト、HTML、info、PSの各形式で付
属しています。
文法、アセンブル方法などはすべてドキュメントに詳説されているので、ここ
では、よく使われると思われる使用法を述べます。
comファイルを生成させるには、
% nasm -f bin -o test.com test.asm
DOS環境で実行する場合、通常ORG 0x100とします。
ブートセレクタなどを開発する場合も、このcomファイル形式で生成させると、
余分なヘッダー情報などが付かず、便利です。
16bitモードのソース・ファイルにはその先頭部分で「
exeファイルを生成させるには、独特なヘッダーファイルをインクルードし、同
時に
% nasm -fbin binexe.asm -o binexe.exe -iヘッダーファイルのディレクトリ
今回は、
% nasm -fbin test.asm -o test.exe -i/usr/local/lib/nasm/とします。
ソース・ファイルの先頭では
%include "exebin.mac"と記述し、
EXE_beginと記述します。
実は、この
そのおかげで、NASMは何も意識せずに、EXE形式の実行ファイルができています。
FreeBSDで使用できる
% nasm -f aout test.asmとします。
このオブジェクトは file(FreeBSD2.2.2)コマンドで確かめると、
% file test.o test.o: Linux/i386 impure executable (OMAGIC)と出力されLinuxのa.outのようです。
蛇足ながら、FreeBSDで使用するサブルーチンなら、32bitモードで記述するの
が普通でしょう。
その場合、ソース・ファイルの先頭部分に「
シェアード・ライブラリ・ファイルを生成するには、まず、
その後、ldによって、シェアード・ライブラリ形式に変換させます。
具体的には
% nasm -f aoutb test.asm % ld -Bshareable -o test.so test.oとします。
シェアード・ライブラリはPIC(Position Independent Code=位置独立コード)で
なければならないので、ソースコード中に絶対番地に依存した記述があってはい
けません。
また、これも通常は32bitコードであるべきでしょう。