COMファイルの構造

ここで、COMファイルの詳細を調べておきます。

 MS-DOSで実行可能な COMファイル は、
 64Kバイトまでのメモリしか使えないが、単純で
 セグメントを意識せずにプログラムが作れます。

 特徴としては、

  • 100hからロードされ、実行される。
  • 先頭部分に PSP*1 と呼ばれる領域がある。
  • セグメントはすべて同じ値。(これは当然ですね)
  • IPは 100h、SPは FFFEh で開始される。
  • スタックの最初(FFFEh,FFFFh)には0hが入っている。(RETすると0番地へ飛ぶ。)

完全に MS-DOS互換を目指すなら、
この PSP の中身をOSがセットしてあげないといけないって事です。

00、01h: INT20hのコード     CDh、20h
        (プログラムの終了処理。)
02,03h: 最大メモリセグメント  使えるメモリが7_FFFFhなら 8000hが入る。
   04h: 固定値 00h?
05〜09h: MSDOS.sysへのFAR CALL CP/Mとの互換のためのもの(使っていない?)

0A〜0Dh: プログラム終了アドレス。 (セグメント、オフセットの順)INT22のコピー 
0E〜11h: プログラム中断アドレス。   INT 23hのコピー。
12〜15h: 致命的エラーの処理アドレス。 INT 24hのコピー。

   16h〜   空き

2C、2Dh: 環境設定?(Path=文字等)へのセグメントアドレス。

   2Eh〜   空き

50,51h: INT21hのコード     CDh、21h
   52h: RETFのコード       CBh    
 プログラムから call 50h でも ファンクションコールができるようにしている。
 でも、ここも使っているプログラムはほとんど無いような気がする・・・

   53h〜   空き

5C〜6Bh: 第1FCB(16バイト) FCB*2は本来32バイト必要?のはず。
6C〜7Fh: 第2FCB(20バイト?) COMコマンドのパラメータ1,2のFCBがセットされる。

    80h: COMコマンドのパラメータの文字数
81h〜FFh: パラメータ文字列(0Dhで終端)

この PSPは EXEコマンドでも同じ構造で、プログラムの先頭に用意されます。

                                                                                                                  • -

*1:Program Segment Prefix: コマンドのパラメータをここを通じて渡している

*2:FCB:ファイル・コントロール・ブロック