32 ビットプログラムの作成

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 ビット ポインタ

[目次]