随分昔のことです。IBM JXを手に入れた頃、アセンブラでプログラミング に挑戦しました。8086アセンブラを理解するには、経験値が少なくて、無謀 な挑戦でした。8086マクロアセンブラーやDOSの内部構造やプログラムインタ ーフェイスの資料など、いろいろと集めていたようで、手元に残ってます。 今回はよい機会と思い、アセンブラプログラミングに再挑戦しました。
目標をDOSのファンクションコールを使ったプログラムの作成をサポート するライブラリーを作ることとしました。生でファンクションコールを使お うとすると、マニュアルを参照しながらレジスタに値を設定し"INT 21H"を 実行することになりますが、もう少し見通しのよいやり方を模索してみまし た。結果、マクロとファンクションコールのライブラリーを作り込みました。
アプリケーションからファンクションコールを使うには、マクロ呼び出し を使い、ファンクションコールライブラリーをリンク時にリンクする事にし ました。今回は、FCBを使ったファイルの操作や代替のある古いファンクショ ンコールなど、割愛した機能があります。
まずは、サンプルプログラム"xchdir"から抜き出したコードをご覧くださ い。@DosCurDisk、@DosChdir、@DosDispString、@DosExitが今回作成したマ クロの呼び出しです。これらのマクロに引数を渡すことにより、高級言語っ ぽくコードを書く事ができます。
main PROC MOV AX, SEG myData ; setup DS MOV DS, AX @getArgc argc CMP argc, 1 JE main1 @DosDispString errMsg1 JMP main0 main1: @getArgv argc directory MOV SI, OFFSET directory CMP BYTE PTR [SI+1], ':' JNE main2 MOV AL, BYTE PTR [SI] MOV drive, AL @DosCurDisk drive JNC main2 @DosDispString errMsg2 JMP main0 main2: @DosChdir directory JNC main0 @DosDispString errMsg3 main0: MOV rc, 00H @DosExit rc main ENDP
マクロの引数は、アドレス渡しで統一されていますので冗長になってし まう部分がありますし、また、ライブラリーを呼び出すオーバーヘッドが生じ ますが、プログラムの見通しを良くする手段として妥当であると判断しました。
作成したファンクションコールライブラリーは、 DOSCALLS.ZIPです。 サンプルプログラムは、 SAMPLES.ZIPです。ご参照下さい。
ファイルの操作に関しては、もう一枚、ラップする必要がありますね。 少なくとも、入出力エラーを含めることと、一文字単位の入出力や行単位の 入出力は欲しいところです。実際、"typeout.asm"では、不完全ですがこれら のルーチンを作成しています。
セコメントをする