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を超える)場合はコードセグメントとデータセグメントのサイズを考慮して適切なメモリーモデルを選ぶ必要がある。