80386 以上の CPU を使用する場合、SEGMENT 文の USE 属性を「USE32」または「FLAT」とすることにより、32 ビットモードのコードを生成できます。
32 ビットモード用のコードを実行するには、CPU が 32 ビットモードになっていなければなりません。MS-DOS や Windows V3.1 は 16 ビットモードで動作しているので、特別に CPU モードを切り替えない限り、32 ビットモードのコードは実行できません。これに対して、Windows NT や Windows 95/98 は 32 ビットモードで動作しています。
なお、アセンブラやリンカ自体の 32 ビット版については、「32 ビット版について」を参照してください。
以下では、ラベル参照コードがセグメント USE 属性から受ける影響について記します。
(1) データ作成文
セグメントの USE 属性の違いによって、アドレスを指定したデータ作成文の生成コードは以下のように異なります。
(データ作成文の場所) | USE16 セグメント内 | USE32 セグメント内 |
DW <ラベル> | 16 ビット オフセット | (エラー) |
DD <ラベル> | 16:16 ビット ポインタ | 32 ビット オフセット |
DF <ラベル> | 16:32 ビット ポインタ | 16:32 ビット ポインタ |
DQ <ラベル> | 16:16 ビット ポインタ | 32 ビット オフセット |
DW OFFSET <ラベル> | 16 ビット オフセット | (エラー) |
DD OFFSET <ラベル> | 16 ビット オフセット | 32 ビット オフセット |
DF OFFSET <ラベル> | 16 ビット オフセット | 32 ビット オフセット |
DQ OFFSET <ラベル> | 16 ビット オフセット | 32 ビット オフセット |
DB LOW <ラベル> | 8 ビット オフセット | 8 ビット オフセット |
DW LOWWORD <ラベル> | 16 ビット オフセット | 16 ビット オフセット |
(2) 分岐命令
分岐命令におけるオフセットのサイズは、分岐先のラベルが定義されているセグメントの USE 属性によって影響を受けます。データ作成文のようにラベルを参照する場所における USE 属性が影響するわけではないことに注意してください。
(分岐先ラベルの場所) | USE16 セグメント内 | USE32 セグメント内 |
JMP NEAR PTR <ラベル> | 16 ビット オフセット | 32 ビット オフセット |
JMP FAR PTR <ラベル> | 16:16 ビット ポインタ | 16:32 ビット ポインタ |
(3) 分岐命令におけるオフセットサイズの強制
分岐命令におけるオフセットのサイズを、分岐先のラベルが定義されているセグメントの USE 属性にかかわりなく決定したい場合は、「NEAR16」「NEAR32」「FAR16」「FAR32」のいずれかのタイプを PTR 演算子で指定します。
(分岐先ラベルの場所) | USE16 セグメント内 | USE32 セグメント内 |
JMP NEAR16 PTR <ラベル> | 16 ビット オフセット | 16 ビット オフセット |
JMP NEAR32 PTR <ラベル> | 32 ビット オフセット | 32 ビット オフセット |
JMP FAR16 PTR <ラベル> | 16:16 ビット ポインタ | 16:16 ビット ポインタ |
JMP FAR32 PTR <ラベル> | 16:32 ビット ポインタ | 16:32 ビット ポインタ |