図書館をイメージさせるライブラリアンというツールは、アセンブラが出力するオブジェクトファイルを複数まとめた、 ライブラリファイルを作成するツールプログラムです。
はじめは何のためのツールかわからないかもしれませんが、何度もプログラムを作るうちに、 過去に作りためたプログラムを再利用して、より大きなプログラムを効率的に開発する場面で威力を発揮します。
lib.xは、既存のライブラリファイルを管理する使い方もできますが、私の開発スタイルの場合、 自作ライブラリの作成用途にしか使いません。
そのため、アセンブラを通して生成されたオブジェクトファイルを、自作ライブラリに追加または上書き更新する
という使い方を紹介します。
A> lib mylib.lib object1.o
こんな具合に、自作ライブラリmylib.libにオブジェクトファイルを継ぎ足していきます。
この作業も、毎回コマンドラインでは面倒なので、バッチファイル化しています。
【l.bat】
echo off as %1.S /O %1.O /w 3 if errorlevel 1 goto error lib mylib.lib %1.O if errorlevel 1 goto error del %1.O > NUL goto end :error echo エラーが発生しました :end詳細は、リンカーの説明を読み返してください。
ライブラリファイルを作れるようになりましたから、使い方も紹介します。
リンカーで実行ファイルを作るとき、オブジェクトファイルと一緒に並べることができます。
A> lk main.o mylib.lib
こうすると、main.oから外部参照しているシンボルを、mylib.libに含まれるオブジェクトファイルの中から 探して、main.oと結合した実行ファイルが作成されます。
ちなみに、ライブラリファイルは複数指定することができます。
もし、mylib.libから取り出したオブジェクトも外部参照していたら、改めてライブラリを探しに行きます。
そんなわけで、すべての未解決シンボルが解決できれば実行ファイルの作成に成功です。
足りない場合には、そのシンボル名がエラー表示されるので、リンカーのコマンドラインを見直します。
このようにライブラリファイルは、動作確認できたプログラムの部品を保管するために使います。
なお、プログラム部品は汎用性と独立性が高いものが重宝しますので、普段からそういう実装を心がけることが上達への近道になります。
話を戻しますが、次のようなソースコードを書き、実際に動作させて良好な結果がえられたとします。
【main.s】
.include DOSCALL.MAC
.text
start:
bsr sub1
DOS _EXIT
sub1:
* 何かまとまった処理
rts
すると、sub1のサブルーチンは、何か大きな仕様変更がない限り、修正しないと思います。
とすると、以後の開発で修正のないソースコードを再アセンブルするのは無駄ですので、
sub1の部分を別のソースコードに分割し、アセンブラを通したsub1.oをライブラリに保管します。
A> as sub1
A> lib mylib.lib sub1.o
【sub1.s】
.xdef sub1
.include DOSCALL.MAC
.text
sub1:
* 何かまとまった処理
rts
.xdef sub1という書き方がポイントです。 これにより、sub1というシンボルが、ここで定義されていることを宣言します。
この結果、残ったmain.sは以下のようになります。
【main.s】
.include DOSCALL.MAC
.text
start:
bsr sub1
DOS _EXIT
このmain.sをアセンブラにかけると、sub1が見つからないというエラーが出ます。 これを防ぐには、main.sの冒頭に、
.xref sub1
を書いても良いですが、数が増えると管理しにくくなります。
そこで、main.sをアセンブルするコマンドラインに、/uオプションをつけて、
未定義シンボルを自動的に外部参照にします。
A> as /u main.s
あとは、通常どおりmain.oとmylib.libをリンクすれば良いです。
A> lk main.o mylib.lib
これで、main.xが生成されます。
出力ファイル名がmain.xじゃ嫌だというのであれば、-o オプションで指定します。
A> lk -o myapp.x main.o mylib.lib
私のサイトで公開しているゲームのプログラムも、最初はmain.sに書き始め、 テストが済んだところから別ファイルに切り出して、ライブラリ化するという作業の 積み重ねで制作しています。
分割したソースをlibというフォルダに保存し、
そのフォルダの中身を一式、再アセンブルしてライブラリを再構築するとき、
次のようなバッチファイルを使います。
【lall.bat】
echo off del MYLIB.LIB > NUL for %%E IN (lib\*.s) DO as lib\%%E || if errorlevel 1 goto :skip for %%F IN (*.o) DO LIB /m 2000 MYLIB.LIB %%F :skip del *.o /Y > NUL
このバッチファイルは、最初に古いライブラリを削除し、
libフォルダ内の拡張子.sファイルすべてを順次アセンブルします。
動作確認済みですので、基本的にエラーになることはありません。
次に、生成したオブジェクトファイルをライブラリファイルに一気に詰め込みます。 詰め込んだら、オブジェクトファイルは邪魔なので削除しています。
数が増えてくると時間がかかりますが、エミュレータの高速モードを使えば それほど待たされませんし、コーヒーブレークにしてもいい感じです。
待つのが耐えられないという場合には、上に書いたl.batを応用して、 更新ファイルだけ処理しても良いと思います。
Copyright©2026 カピバラ父さん