OFFSET 演算子

構文    OFFSET  <アドレス式>
    OFFSET  {<セグメント名>|<SEG 式>}

ラベルにこの演算子を付加することにより、ラベルのオフセットをイミディエイトオペランドとして参照できます。

例    MOV    AX, STR    ; 間接参照
    MOV    AX, [STR]    ; 間接参照
    MOV    AX, OFFSET STR    ; 即値(イミディエイト)

OFFSET 演算子の機能は、パラメータにアドレス式を指定するか、セグメント(セグメント名または演算子 SEG による式)を指定するかで違います。

アドレス式を指定した場合、OFFSET 演算子は、そのアドレスのセグメント先頭からのオフセットを返します。セグメントオーバーライド演算子によってアドレス式にフレームを指定しておけば、オフセットはそのフレームから計算されます。そうでなければ、オフセットはそのアドレスの所属するセグメントの先頭から計算されます。

セグメントを指定した場合、OFFSET 演算子は、このファイル内でそのセグメントに対してこれまで生成されたコードとデータの総バイト数を返します。

メモ 簡略化セグメントディレクティブを使用して定義したセグメントについては、そのセグメントがグループに所属しているならば、オフセットの計算はそのグループから行います(セグメントの先頭からではありません)。ただしフレームが明示的に指定されている場合は、オフセットの計算は指定のフレームを基準とします。

適用可能な式

OFFSET 演算子は、アドレス式、セグメント名、演算子 SEG による式に適用できます。

例    MOV    AX, OFFSET STR
    MOV    AX, OFFSET (STR+10h)    ; = (OFFSET STR) + 10h
    MOV    AX, OFFSET DGROUP:STR    ; フレームを指定しています
    MOV    AX, OFFSET CSEG
    MOV    AX, OFFSET (SEG STR)

[目次]