• ベストアンサー

PC-9801 MS-DOSでの実行ファイル形式、COMかEXEか、線引き・基準は?

PC-9801実機上で、NASMやDJGPP(GCC v4.3.2)を使用しプログラミングを しています。ハードウェア・ソフトウェア(DOS関連)資料も40冊ほど 買い込み、実機も7台揃えて80286/V30~Pentium初代まで互換をもたせるよう がんばっています。 念のためフリーでダウンロードしたBorlandのTurbo C(英語版パッチ済み)と TASM(BCC5.5に同梱)はありますが、まだ入れてません。 箱物の日本語版 PC-98用MASMや日本語版 PC-98用Turbo Cが欲しいんですが、 オクでもめったにないので…(not MASM32。 あれ[MASM32]はライセンス的にヤバいと聞きました)。 さて、質問ですが、標題の件。MS-DOSでは実行ファイル形式として、 COMとEXEがあり、 1)COMはセグメントを気にせずコーディングできる反面、64KBまでの制約があり、 大型のプログラミングには向かない。フルアセンブルのコードが当たり前。 速度重視(極論ですが)。I/Oポートやデバイスを直に叩く、ことが多い。 2)EXE型プログラムは、セグメントを意識しなければならないが、 64KB以上の実行ファイルを生成可能であり、Cとアセンブラオブジェクトとの 連携が可能。Cでのインラインアセンブルも活用できる。構造化。可読性。 可搬性。AVRマイコンのライタなどでもEXEのものがある。 実際にDOSディレクトリ以下を見ますと、いったい何を基準に COMとEXEを使い分けたのか、いまいちつかみかねています。 所有バージョンは日電版 DOS3.3C/3.3D/5.0A/6.2、EPSON版 DOS3.3/6.2ですが、 具体的には日電版 DOS6.2では 1)DISKCOPY.EXE サイズ: 63.1KB 2)ATTRIB.EXE サイズ: 11.2KB 3)MORE.COM サイズ: 2.76KB 4)MEM.EXE サイズ: 32.3KB 5)EDLIN.EXE サイズ: 13.9KB 6)MOVE.EXE サイズ: 18.9KB 7)UNFORMAT.COM サイズ: 24.1KB などです。 C + インラインアセンブラ(もしくはアセンブラオブジェクトと Cオブジェクトとのリンク)ではなく、フルアセンブルであればなおさら 上記実行ファイルは全部.COMにして差し支えないように思えるのですが、 所望の結果がセグメントをまたぐ・またがないに関わることで基準があるのでしょうか (セグメントの概念にいま取り掛かったばかりのヒヨッコですが)。 しかしそれだと、DISKCOPY.COMとか、FreeDOSなどでは.EXEではなく、 .COMになっていたり、その逆もあるので説明がつかないような気もしますが…。 詳しい方、ご教示ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • kent85
  • ベストアンサー率52% (38/73)
回答No.2

1) HOGE.COMの、メモリモデルは tiny です。  64KBの制限は tiny からきます。( 逆だったかな? )   ・C / ASM は、メモリモデルとポインタを意識すれば(セグメント)  C = ミデアムと ASMモジュール : far扱い  C = ラージと  ASMモジュール : hugeでなければ普通  C = ヒュージと ASMモジュール : 理解してれば問題なし  使えますよ。スモールは忘れました… COMを作るときには「tinyでつくるぞ」としないとだめなんです。 だからほとんど、最初の段階で決まってしまいます。 COM/EXEで、なんで? → つくった人に聞くしか無い場合もあります。  → 深く追求する意味は、あまりないですよ。 メインメモリ640KBの空間なので、効率的にしないと 必要な機能を実装することが出来ません。 HOGE.COMは64Kですしメモリを食いません。 HOGE.COM 内部で HOGEBODY.EXE を呼び出すことも可能です。 また FOO.COM は、メモリに常駐することも可能です。 # デバドラのSYSではなく # ADDDEV/ADDRV は、確かあとになって出てきた代物です。 COMの常駐は、割り込みベクターテーブル / int21 のソフトウェア割り込み近辺 速度重視は ・必要な機能がDOSファンクションコールでは不十分だった ・BIOSコールでも不十分 ・お手製デバイスなので、全部作るしかない ・かつかつタイミング制御 ・機器内のレジスタR/W とか、そんな感じです。

dedrolpan
質問者

お礼

回答ありがとうございます。疑問が氷解するようなご説明で助かりました。 キーワードをもとに、自力で調べて、実践してみます。 でも、COMかEXEか決定するのは最終的にはほぼプログラム作成者の 意向に委ねられていて、深い意味がない場合もある、というのはかなり以外でした。

その他の回答 (3)

  • kent85
  • ベストアンサー率52% (38/73)
回答No.4

COMの短い例をあげますね。 RESET.COM : 9Bytes これなら、逆アセンブルしても追えるでしょう。

参考URL:
http://kan-chan.stbbs.net/download/dos/main.html
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

今さら確認するつもりはありません (というか実機が手元にないから確認できない) が, COM か EXE かってのは「ファイルを実際に見ないとわからない」はずです. 実行可能かどうかはファイル名で決まりますが, メモリにロードして実行するときにはファイル名は無関係だったと思う.

dedrolpan
質問者

お礼

ご回答ありがとうございます。 確かに、EMM386.EXEやLEMM.EXE、VEM486.EXE、SMARTDRV.EXE (INSTALL=\DOS62\SMARTDRV.EXE /Xなど)もCONFIG.SYS内で ロードできちゃいますから、その点では「COMは常駐」とは必要十分条件ではないのですね。

回答No.1
dedrolpan
質問者

補足

回答ありがとうございます。概要は理解できましたが、なぜ例示した ファイルでCOMとEXEの別があるのか、その必然性が理解できません。 また、FreeDOSではDISKCOPY.COMとかFORMAT.COMとかFDISK.COMとかが 存在しますが、それがなぜ日電版やEPSON版のDOSでは、EXEなんでしょうか? (元はといえばMSのOEMでしょうが…)