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コマンドでも同じ構造で、プログラムの先頭に用意されます。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-