カピバラ父さんのプログラミング処方箋~ライブラリアン

図書館をイメージさせるライブラリアンというツールは、アセンブラが出力するオブジェクトファイルを複数まとめた、 ライブラリファイルを作成するツールプログラムです。

はじめは何のためのツールかわからないかもしれませんが、何度もプログラムを作るうちに、 過去に作りためたプログラムを再利用して、より大きなプログラムを効率的に開発する場面で威力を発揮します。

ライブラリアンの使い方

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 カピバラ父さん