構文 <フレーム>:<アドレス式>
セグメントオーバーライド演算子は、<アドレス式>のフレームを<フレーム>に設定します。
<フレーム>はセグメントレジスタ、セグメント名、演算子 SEG による式、グループ名のいずれかです。
アドレス式には、必ず「フレーム」が想定されています。アドレスはなんらかのセグメントアドレスからのオフセットとしてコード化されますが、そのセグメントアドレスをフレームと呼びます。
アドレス式の使用の方法は 2 つあります。そのままメモリペランドになるか、OFFSET 演算子(後述)の引数になるかです。セグメントオーバーライド演算子によって明示的にフレームが与えられない場合はデフォルトのフレームが使用されますが、このデフォルトのフレームの決定方法は少々複雑です。
デフォルトのフレームの決定方法
(1) メモリオペランドの場合
アドレス式にラベルが含まれている場合は、そのラベルのあるセグメントまたはグループのうち、ASSUME 文により連結されているセグメントレジスタのあるものになります。
アドレス式にラベルが含まれていない場合は、セグメントレジスタには DS レジスタが使用されます。ただし例外的に、アドレス式にベースレジスタ BP が含まれているときは、セグメントレジスタには SS レジスタが使用されます。
(2)OFFSET 演算子の引数になるアドレス式の場合
アドレス式中のラベル(ラベルは必ず存在しなければなりません)のあるセグメントです。
フレーム決定の例
フレーム決定の方法は少々複雑ですので、次に MOV 命令での例をいくつか示します。
MOV AX,STR
ラベル STR の所属するセグメントまたはグループに DS レジスタが連結されていれば、そのセグメントまたはグループをフレームとします。DS レジスタがそのどちらにも連結されていないならば、ES,SS,CS の各レジスタについて同じように調査します。それでもフレームを決定できないときは警告します。
MOV AX,ES:STR
ES レジスタの連結するセグメントまたはグループをフレームにします。ES レジスタの連結先が存在しないときは警告します。
MOV AX,FRM:STR
セグメントまたはグループである FRM をフレームとし、FRM に連結するセグメントレジスタを使用します。そのようなセグメントレジスタが存在しないときは警告します。
MOV AX,[SI]
セグメントレジスタとして DS レジスタを使用します。
MOV AX,[BP]
セグメントレジスタとして SS レジスタを使用します。
MOV AX,ES:[SI]
セグメントレジスタとして ES レジスタを使用します。
MOV AX,OFFSET STR
ラベル STR の所属するセグメントをフレームにします。
MOV AX,OFFSET FRM:STR
セグメントまたはグループである FRM をフレームにします。ラベル STR は FRM に所属していなければなりません。
MOV AX,OFFSET DS:STR
DS レジスタの連結するセグメントまたはグループをフレームにします。DS レジスタの連結先が存在しないときは警告します。
定数値メモリオペランド
セグメントオーバーライド演算子は、ラベルもインデクス/ベースレジスタも持たないメモリオペランドを、イミディエイトオペランドから区別するために使用されることがあります。次に例を示します。
MOV AX, DS:10h ; メモリオペランド MOV AX, 10h ; イミディエイトオペランド
適用可能な式
セグメントオーバーライド演算子の左項は、セグメントレジスタ、セグメント名、演算子 SEG による式、グループ名のいずれかです。右項はアドレス式でなければなりません。