8086をエミュレートする仮想PCでRalf Brown’s Interrupt List付属のINT.COMを使おうとしたらプログラムが暴走したので、原因を調べてみたら、80186で追加された命令が使われていた。ファイルのバイナリをASCIIで読んでみると、1988年のBorland Internationalの著作権表示が入っているから、Turbo C 2.0あたりでコンパイルされたと推測する。そのソースコードはあるので、フリーで入手できるTurbo C 2.01のコマンドライン版コンパイラー (TCC.EXE) を使ってオプションを付けずに再コンパイルしたら、80186命令を使わないバイナリーが生成された。

次にCコンパイラー、アセンブラーごとに命令セット指定オプションをリストした。

Compiler / Assembler File name 8086 80186 286
Lattice C 3.00 LC.EXE -k0 -k1 -k2
Microsoft C 5.10 CL.EXE /G0 /G1 /G2
Turbo C 2.01 TCC.EXE (default) (n/a) -1
MASM 5.10 MASM.EXE (default) .186 .286
NASM 2.15 NASM.EXE [CPU 8086] [CPU 186] [CPU 286]

Lattice CとTurbo C、MS-C (Visual C) は実行コマンドにスイッチを付けることで命令セットを指定できる。デフォルトではいずれも8086命令セットのみ使用する。MASMとNASMはソースファイルにディレクティブを記述することで命令セットを指定できる。NASMはデフォルトでは486、Pentiumまでを含む全ての命令を使うため、使用する命令セットを制限するにはソースファイルにディレクティブ [CPU 8086] を記述する必要がある。

次にCコンパイラーごとにメモリーモデル指定オプションをリストした。

Compiler File name Small Compact Medium Large
Lattice C 3.00 LC.EXE -m0 -m2 -m1 -m3
Microsoft C 5.10 CL.EXE /AS /AC /AM /AL
Turbo C 2.01 TCC.EXE -ms -mc -mm -ml

スイッチ省略時のデフォルトはスモールモデル。プログラム実行時のメモリーサイズが1セグメントに収まらない(64KBを超える)場合はコードセグメントとデータセグメントのサイズを考慮して適切なメモリーモデルを選ぶ必要がある。


※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい。コメントはスパム防止フィルターによる承認制のため、投稿してもすぐに反映されない場合があります。

管理人 : Akamaki (akm)

は、PCとVTuberに夢中になっている電気技術者です。

私はレトロコンピューティングの愛好家ですが、そのようなリグはもう収集していません。

私の活動はトップページで見ることができます。読んでくれてありがとう!