タイプ

タイプの役割

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 以上で)

PROC タイプ

このタイプは、メモリモデルに従って 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 文によるユーザー定義タイプ

TYPEDEF 文を使用して、独自のタイプを定義できます。

参照 ラベルデータPTR

[目次]