8086 系アセンブラでは、ラベルやオペランドのタイプ(型)が重要な役割を持っており、タイプによって生成されるコードが変化します。
データ参照のタイプ
たとえば、メモリに直接数値を書き込む mov 命令には、1 バイト、2 バイト、および 4 バイト(386 以上)を書き込む命令があります。アセンブラでこれらを区別するには、タイプを使用します。
mov byte ptr [di], 10h ; 1 バイトを書き込む mov word ptr [di], 10h ; 2 バイトを書き込む mov dword ptr [di], 10h ; 4 バイトを書き込む
上の「byte」や「word」がタイプです。このように PTR 演算子を使ってオペランドに直接タイプを指定できますが、ラベル参照オペランドではタイプを省略できます。その場合は、ラベルのタイプが使用されます。
lb label byte lw label word dw ? mov [lb], 10h ; 1 バイトを書き込む mov [lw], 10h ; 2 バイトを書き込む
ラベルのタイプに従って、最初の mov 命令では 1 バイト、次の mov 命令では(同じアドレスに)2 バイトを代入するコードが生成されます。
オペランドに直接指定したタイプは、ラベルのタイプよりも優先されます。
mov word ptr [lb], 10h ; 2 バイトを書き込む mov byte ptr [lw], 10h ; 1 バイトを書き込む
2 つのオペランドのタイプが一致しないと、警告が発生します。
mov ax, [lb] ; 警告発生 mov ax, word ptr [lb] ; 警告されない
なお、データ領域を定義するときは、データ定義文を使用するのが一般的です。データ定義文でもラベルが定義されます。
vb db 10 ; vb は BYTE 型 vb2 db 10,11 ; vb2 も BYTE 型 vw dw 10 ; vw は WORD 型
コード参照のタイプ
次はコードの例です。
ln label near lf label far jmp ln ; 自己相対ジャンプ jmp lf ; 絶対ジャンプ jmp far ptr ln ; 絶対ジャンプ ln2: ; コロンは NEAR ラベルを定義する
タイプが NEAR ならば短い自己相対ジャンプ、FAR ならば長い絶対ジャンプが生成されます。
変数のタイプ
PROC 文の引数や PROC 内 LOCAL 変数を定義するときは、指定したタイプにより、確保されるデータ領域のサイズが決まります。
次が基本的なタイプです。
タイプ | 意味 |
BYTE | 1 バイトデータ |
WORD | 2 バイトデータ |
DWORD | 4 バイトデータ |
FWORD | 6 バイトデータ |
QWORD | 8 バイトデータ |
TBYTE | 10 バイトデータ |
NEAR | 相対オフセットで参照されるコード |
FAR | セグメント+オフセットで参照されるコード |
符号付きの基本タイプ
符号付きタイプもありますが、通常、符号付きかどうかは意味を持ちません。たとえば、BYTE と SBYTE のどちらを使用しても、多くの場合は同じ結果になります。
ただし、.IF などの構造化ブロック記述文のパラメータについては、タイプの符号の有無によって異なるコードが生成されます。
タイプ | 意味 |
SBYTE | 1 バイト符号付きデータ |
SWORD | 2 バイト符号付きデータ |
SDWORD | 4 バイト符号付きデータ |
オフセットサイズを明示する基本タイプ
.386 以上を指定した場合は、次のタイプを使ってオフセットのサイズを明示できます。
タイプ | 意味 |
NEAR16 | 16 ビットの相対オフセット(.386 以上で) |
NEAR32 | 32 ビットの相対オフセット(.386 以上で) |
FAR16 | セグメント+16 ビットオフセット(.386 以上で) |
FAR32 | セグメント+32 ビットオフセット(.386 以上で) |
このタイプは、メモリモデルに従って NEAR または FAR を表します。メモリモデルについては、.MODEL 文の説明を参照してください。
STRUC 文および RECORD 文で定義した構造体およびレコードの型名(タグ)も、基本タイプと同じように使用できます(PTR 演算子を除く)。
構造体型名とレコード型名をタイプとして使用した場合は、その構造体またはレコードのサイズが意味を持ちます。たとえば、全体で 2 バイトの構造体型は、WORD タイプと同じように扱われます。
例 stag struc ; サイズは 2 バイト f1 db ? f2 db ? stag ends rtag record rf1:2, rf2:6 ; サイズは 1 バイト L1 label stag L2 label rtag mov [L1], 10 ; 2 バイト代入コードが生成される mov [L2], 10 ; 1 バイト代入コードが生成される
TYPEDEF 文を使用して、独自のタイプを定義できます。