プロセッサ命令のオペランドは 3 種類のアドレッシングモードに分類されます。次にそのアドレッシングモードを示します。
(1) レジスタオペランドレジスタを意味するオペランド
(2) メモリオペランド メモリアドレスを意味するオペランド
(3) イミディエイトオペランド定数値を意味するオペランド
次にそれぞれの例を順じ示します。第 2 オペランドに注目してください。
例 MOV AX, BX ; レジスタ AX にレジスタ BX の値を代入します MOV AX, [SI+2] ; レジスタ AX に DS 相対オフセットアドレス ;「SI+2」のメモリの値を代入します MOV AX, 10 ; レジスタ AX に値 10 を代入します レジスタオペランド
レジスタオペランドとは、その名のとおりレジスタを意味するオペランドです。この型のオペランドに使用できるレジスタは次のとおりです。
16 ビットレジスタ AX,BX,CX,DX,SI,DI,BP,SP
8 ビットレジスタ AL,BL,CL,DL,AH,BH,CH,DH
セグメントレジスタDS,ES,SS,CS
次の例のオペランドはすべてレジスタオペランドです。
例 MOV AX, BX MOV AX, DS MOV AL, CH メモリオペランド
メモリオペランドとは、メモリ上のデータを対象とするオペランドです。メモリのアドレスを指定するには、ラベル、インデクス/ベースレジスタ、定数オフセットを用います。
メモリアドレス一般に「ラベル+インデクス/ベースレジスタ+定数」で表されます。この 3 項のうち 2 つまでは存在しないこともあります。インデクス/ベースレジスタは必ず「[ ]」で囲まなければなりません。
インデクス/ベースレジスタとして使用できるレジスタは SI、DI(以上インデクスレジスタ)、BX、BP(以上ベースレジスタ)の 4 つのみです。インデクス/ベースレジスタは同時に 2 つまで加えることができますが、「SI+DI」と「BX+BP」の 2 種類の組み合せは許されません。
メモリオペランドでは、セグメントオーバーライド演算子によってフレームを指定
したり、PTR 演算子によってタイプを指定することができます。フレームやタイプの違いによって生成される機械語コードが異なる場合もあるので注意してください。フレーム、タイプについては、セグメントオーバーライド演算子と PTR 演算子の説明をご覧ください。
定数部分のみから成るメモリオペランドは、イミディエイトオペランドと区別するためにセグメントオーバーライド演算子を使用してフレームを指定する必要があります。たとえば、「MOV AX,100h」ではイミディエイトオペランドになってしまうので、「MOVAX,DS:100h」のようにしてください。
次の例では、第 2 オペランドはすべてメモリオペランドです。
例 MOV AX, BUF MOV AX, [BUF] ; 前行と同じ意味 MOV AX, BUF+6 MOV AX, BUF[6] ; 前行と同じ意味 MOV AX, BUF[BP] MOV AX, [BUF+BX+SI+6] MOV AX, ES:[BUF] MOV AX, WORD PTR ES:[BUF] MOV AX, DS:[100h] MOV AX, DS:100h ; 前行と同じ意味
なお、80386 以上のプロセッサではメモリオペランドの形式に拡張がなされていますので、その拡張部分については「80186/80286 追加命令」をご覧ください。
イミディエイトオペランド
イミディエイトオペランドとは、その値を直接対象にするオペランドです。この型のオペランドは、値の代入先には使用できません。
次の例では、第 2 オペランドはすべてイミディエイトオペランドです。
例 MOV AX, 10 ; 10 MOV AX, DSEG ; セグメント DSEG のセグメントアドレス MOV AX, OFFSET STR ; ラベル STR のオフセット値 MOV AX, SEG STR ; ラベル STR のセグメントアドレス