- ベストアンサー
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になっていたり、その逆もあるので説明がつかないような気もしますが…。 詳しい方、ご教示ください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
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 とか、そんな感じです。
その他の回答 (3)
- kent85
- ベストアンサー率52% (38/73)
COMの短い例をあげますね。 RESET.COM : 9Bytes これなら、逆アセンブルしても追えるでしょう。
- Tacosan
- ベストアンサー率23% (3656/15482)
今さら確認するつもりはありません (というか実機が手元にないから確認できない) が, COM か EXE かってのは「ファイルを実際に見ないとわからない」はずです. 実行可能かどうかはファイル名で決まりますが, メモリにロードして実行するときにはファイル名は無関係だったと思う.
お礼
ご回答ありがとうございます。 確かに、EMM386.EXEやLEMM.EXE、VEM486.EXE、SMARTDRV.EXE (INSTALL=\DOS62\SMARTDRV.EXE /Xなど)もCONFIG.SYS内で ロードできちゃいますから、その点では「COMは常駐」とは必要十分条件ではないのですね。
- 中京区 桑原町(@l4330)
- ベストアンサー率22% (4373/19606)
これを読めば理解できますか? http://ja.wikipedia.org/wiki/COM%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88 EXEはこちら http://ja.wikipedia.org/wiki/EXE%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88
補足
回答ありがとうございます。概要は理解できましたが、なぜ例示した ファイルでCOMとEXEの別があるのか、その必然性が理解できません。 また、FreeDOSではDISKCOPY.COMとかFORMAT.COMとかFDISK.COMとかが 存在しますが、それがなぜ日電版やEPSON版のDOSでは、EXEなんでしょうか? (元はといえばMSのOEMでしょうが…)
お礼
回答ありがとうございます。疑問が氷解するようなご説明で助かりました。 キーワードをもとに、自力で調べて、実践してみます。 でも、COMかEXEか決定するのは最終的にはほぼプログラム作成者の 意向に委ねられていて、深い意味がない場合もある、というのはかなり以外でした。