こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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になっていたり、その逆もあるので説明がつかないような気もしますが…。
詳しい方、ご教示ください。

投稿日時 - 2009-02-26 22:00:57

QNo.4752001

困ってます

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

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
とか、そんな感じです。

投稿日時 - 2009-02-26 22:59:01

お礼

回答ありがとうございます。疑問が氷解するようなご説明で助かりました。
キーワードをもとに、自力で調べて、実践してみます。

でも、COMかEXEか決定するのは最終的にはほぼプログラム作成者の
意向に委ねられていて、深い意味がない場合もある、というのはかなり以外でした。

投稿日時 - 2009-02-26 23:26:18

ANo.2

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

COMの短い例をあげますね。
RESET.COM : 9Bytes

これなら、逆アセンブルしても追えるでしょう。

参考URL:http://kan-chan.stbbs.net/download/dos/main.html

投稿日時 - 2009-02-27 00:09:28

ANo.3

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

投稿日時 - 2009-02-26 23:29:39

お礼

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

投稿日時 - 2009-02-26 23:35:09

ANo.1

補足

回答ありがとうございます。概要は理解できましたが、なぜ例示した
ファイルでCOMとEXEの別があるのか、その必然性が理解できません。

また、FreeDOSではDISKCOPY.COMとかFORMAT.COMとかFDISK.COMとかが
存在しますが、それがなぜ日電版やEPSON版のDOSでは、EXEなんでしょうか?
(元はといえばMSのOEMでしょうが…)

投稿日時 - 2009-02-26 22:20:23

あなたにオススメの質問