第3章 命令体系とアドレッシングモード
3.1 指令体系の概要
各命令は、オペコード フィールドとアドレス コード フィールドの 2 つの部分で構成されます。
命令内のオペランドのアドレスを決定するために使用されるメソッドは、アドレッシングモード。アドレス コード フィールドがオペランドを直接指定する場合、このアドレッシング モードが呼び出されます。すぐに住所を指定する; アドレス コード フィールドがオペランドが配置されているレジスタ番号を示している場合は、次の呼び出しを行います。レジスタのアドレス指定; オペランドがメモリに格納されている場合、アドレス コード フィールドは、と呼ばれるさまざまな方法でメモリ アドレスを与えます。メモリのアドレス指定。
3.2 8088/8086CPUのアドレッシングモード
3.2.1 データアドレッシングモード
オペランドと演算結果が格納される場所は、命令のアドレス コード フィールド、
レジスタ、
メモリのデータ セグメント、スタック セグメント、または追加データ セグメントの3 か所です。
対応する 3 つのオペランドは、即値オペランド、レジスタ オペランド、およびメモリ オペランドです。
これらのオペランドを見つけるための基本的なアドレッシング モードには、即値アドレッシング モード、レジスタ アドレッシング モード、メモリ アドレッシング モードの 3 つがあります
。
このうち、メモリのアドレッシングには複数のアドレッシングモードがあります。これらのアドレッシング モードについては以下で説明します。
1. イミディエイトアドレッシングモード イミディエイトアドレッシング
オペコードの数値式
(この数値式の値は、8 ビット整数または 16 ビット整数のいずれかです。)
例:
MOV AX、267
MOV AL、10010011B AND 0FEH
MOV AL、PORT1
(PORT1 は EQU で定義された変数名であり、定数です)
2. レジスタアドレッシングモード レジスタアドレッシング
オペコードレジスタ名
例:
MOV AX、BX
MOV AL、BL
3.メモリアドレス指定
1) ダイレクトアドレッシングモード ダイレクトアドレッシング
オペコード アドレス式 (または [アドレス式])
オペコード [数値式]
例:
MOV AX,[1000H]
このアドレッシング モードのデフォルトのセグメント レジスタは DS です。
2) レジスタ間接アドレッシングモード レジスタ間接アドレッシング
opcode [ベースレジスタ名またはインデックスレジスタ名]
BX、BPはベースアドレスレジスタと呼ばれ、SI、DIはインデックスレジスタと呼ばれます
例:
MOV AX、[BX]
3) 相対アドレッシングの登録 相対アドレッシングの登録
① オペレーションコード変数名 [ベースアドレスレジスタ名またはインデックスレジスタ名]
または オペコード [変数名 + ベースレジスタ名またはインデックスレジスタ名]
② オペレーションコードシンボル名 [ベースアドレスレジスタ名またはインデックスレジスタ名]
または オペコード [ベースレジスタ名またはインデックスレジスタ名+シンボル名]
③オペコード [ベースレジスタ名またはインデックスレジスタ名±デジタル表現]
例:
MOV AL,TABLE[SI]
MOV AL,[TABLE+SI]
4) ベースインデックスアドレッシング ベースインデックスアドレッシング
[ベースレジスタ名][インデックスレジスタ名]
または [ベースレジスタ名+インデックスレジスタ名]
例:
MOV AX,[BX] [SI]
MOV AX,[BX+SI]
5) 相対ベースのインデックスアドレッシング 相対ベースのインデックスアドレッシング
① 変数名 [ベースアドレスレジスタ名] [インデックスレジスタ名]
または 変数名 [ベースアドレスレジスタ名+インデックスレジスタ名]
または [変数名+ベースアドレスレジスタ名+インデックスレジスタ名]
② シンボル名 [ベースアドレスレジスタ名] [インデックスレジスタ名]
または シンボル名 [ベースレジスタ名+インデックスレジスタ名]
または [シンボル名+ベースレジスタ名+インデックスレジスタ名]
③ [ベースレジスタ名+インデックスレジスタ名±数値式]
例:
MOV AL,TABLE[BX][SI]
MOV AL,TABLE[BX+SI]
MOV AL,[TABLE+BX+SI]
3.3 8088/8086CPUの命令体系
3.3.1 データ転送手順
転送命令には、一般転送命令、アキュムレータ固有転送命令、アドレス転送命令、フラグ転送命令の4種類があります。
1. 一般的な転送指示
MOV の 7 つの注意事項:
① デスティネーション オペランドを即時アドレッシング モードにすることはできません。
② ソース オペランドとデスティネーション オペランドを同時にメモリ アドレッシング モードにすることはできません。つまり、2 つのメモリ ユニット間でデータを直接転送することはできません。
③ 即時データをセグメントレジスタに直接送信することはできません。つまり、セグメントレジスタはレジスタまたは記憶装置を介してのみデータを転送できます。
④ 2 つのセグメントレジスタ間で直接データを転送することはできません。
⑤ CS、IP、PSW の 3 つのレジスタへのデータ送信は許可されていません。つまり、ユーザーはこれら 3 つのレジスタの値を変更する権利を持ちません。
⑥ ソースオペランドとデスティネーションオペランドは同じ語長でなければなりません。
⑦MOV命令はフラグビットに影響を与えません。
2. アキュムレータ専用転送命令
1) IN入力コマンド
アセンブリ形式: IN AL、I/O ポート アドレス式
または IN AX、I/O ポート アドレス式
2) OUT出力コマンド
アセンブル形式:OUTアドレス式、AL
またはOUTアドレス式、AX
3) XLAT エスケープ コード命令
アセンブリ形式:XLAT または XLAT アドレスラベル
実行される演算:(AL)←((BX)+(AL))
3. アドレス転送コマンド
4. フラグ転送コマンドS
3.3.2 四則演算命令
1.加算命令
- ADD 加算命令
アセンブル形式:ADD デスティネーションオペランド、ソースオペランド
実行される演算:(デスティネーションオペランド) ← ソースオペランド + デスティネーションオペランド- キャリー付き ADC 加算命令
アセンブリ形式:ADC デスティネーション オペランド、ソース オペランド
実行される演算:(デスティネーション オペランド)←ソース オペランド+デスティネーション オペランド+CF- INCインクリメント命令
組立形式:INCオペランド
演算内容:(オペランド)←オペランド+1
PSW には 9 つのフラグ ビットがあり、その中で最も重要なものは ZF、SF、CF、および OF です。
ZF は結果が 0 かどうかを示し、
SF は結果の符号ビットを示し、
CF は最上位ビットに上位ビットへのキャリーがあるかどうかを示し、OF は結果がオーバーフローするかどうかを示します。
2. 減算命令
- SUB 減算命令
アセンブル形式:SUB デスティネーションオペランド、ソースオペランド
実行される演算:(デスティネーションオペランド) ← デスティネーションオペランド - ソースオペランド- ボロー命令による SBB 減算
アセンブル形式:SBB デスティネーションオペランド、ソースオペランド
実行される演算:(デスティネーションオペランド) ← デスティネーションオペランド - ソースオペランド - CF- DECデクリメント命令
アセンブル形式:DECオペランド
演算内容:(オペランド)←オペランド-1- NEG 補数命令
アセンブル形式:NEG オペランド
演算内容:(オペランド)←0-オペランド
補数演算の結果はオペランドが0の場合のみCF=0となり、それ以外の場合はオール1となり、オペランドが-128または-32 768の場合のみOF=1となり、その他の場合は、それはすべて0です。- CMP 比較命令
アセンブリ形式: CMP デスティネーション オペランド、ソース オペランド
実行される演算: デスティネーション オペランド - ソース オペランド。
3. 乗算命令
- MUL符号なし整数乗算命令
アセンブラ形式:MUL ソースオペランド
実行演算:バイト演算の場合 (AX)←(AL)×ソースオペランド
ワード演算(DX)の場合 (AX)←(AX)×ソースオペランド- IMUL 符号付き数値乗算命令
アセンブリ形式: IMUL ソース オペランド
動作: MUL と同じですが、MUL で処理されるデータは符号付き数値であるのに対し、MUL で処理されるデータは符号なし数値である点が異なります。
4. 分割命令
- DIV符号なし除算命令
アセンブル形式:DIVソースオペランド
実行演算:バイト演算の場合:(AL)←(AX)/ソースオペランドの商
(AH)←(AX)/ソースオペランドの余り
if ワード演算の場合:(AX)← (DX, AX)/ソースオペランドの商
(DX)←(DX,AX)/ソースオペランドの剰余 商、剰余
ともに符号なしの数値です。- IDIV 符号付き数値除算命令
アセンブリ形式: IDIV ソース オペランド
動作: DIV と同じですが、オペランドが符号付き数値であり、商と剰余が両方とも符号付き数値であり、剰余の符号が被除数の符号と同じである点が異なります。
5. 符号拡張命令
- CBW バイトをワード命令に変換します
。 アセンブリ形式:
CBW によって実行される演算: (AL) の符号を (AH) に拡張します。(AL) の最上位ビットが 0 の場合は (AH)=00H、(AL) の最上位ビットが 1 の場合は (AH)=0FFH となります。- CWD ワードをダブルワード命令に変換
アセンブリ形式:
CWD で実行される演算: (AX) の符号を (DX) に拡張します。(AX) の最上位ビットが 0 の場合は (DX)=00H、(AX) の最上位ビットが 1 の場合は (DX)=0FFH となります。
== これらの命令はどちらもフラグには影響しません。==
6. 小数調整コマンド
- 圧縮BCDコード調整命令
●DAA:加算用10進調整命令
アセンブリ形式:
DAAで行う演算:(AL)の2進BCDコードの和を調整します。調整方法は、
AF=1または(AL)の下位4ビットがAH~FHの間の場合は(AL)に06Hを加算し、自動的にAF=1とし、CF=1または下位4ビットの場合は以下となります。 (AL
) の AH~FH の場合、(AL)に 60H を加算し、自動的に CF=1 となります。
この命令を使用する前に、まず ADD または ADC 命令で 10 進数を加算し、その合計を AL に格納する必要があります。
DAS: 減算
アセンブリ用の小数調整命令 形式:
DAS によって実行される演算: 調整の差 (AL)。調整方法は、
AF=1の場合は(AL)マイナス06H、
CF=1の場合は(AL)マイナス60Hとなります。
説明:
① この命令は PSW の OF フラグを定義せず、他のすべてのフラグ ビットに影響を与えます。
② このコマンドを使用する前に、SUB または SBB コマンドで 10 進数の BCD コードを減算し、その差分を (AL) に格納する必要があります。
3.3.3 論理演算とシフト演算
1. 論理演算命令
2. シフト命令
1) 論理シフト命令
SHL論理左シフト命令
アセンブル形式:即値データ、セグメントレジスタ以外のSHLオペランド、シフト回数
実行演算:オペランドを指定回数だけ論理左シフト
SHR 論理右シフト命令 アセンブル
形式:即値データとレジスタを除く SHR オペランド、シフト数
実行演算:図 3.10(b)のようにオペランドを指定回数右に論理シフトします。
2) 算術シフト命令
SAL 算術左シフト命令
アセンブル形式:SAL イミディエイトデータ、セグメントレジスタ以外のオペランド、シフト数
実行演算:オペランドを指定回数算術左シフト
SAR算術右シフト命令
アセンブラ形式:イミディエイトレジスタ、セグメントレジスタ以外のSARオペランド、シフト回数
実行演算:アドレス指定されたオペランドを指定回数算術シフト
- 小巡回シフト命令
巡回シフトは、キャリービットCFと併せて巡回するか否かにより、小サイクル(自己サイクル)と大サイクル(CFも含む)の2種類に分けられます。
● ROL 左シフト命令
アセンブル形式:即値データとセグメントレジスタを除く ROL オペランド、シフト回数
実行演算:オペランドを指定回数左回転
● ROR サイクル右シフト
命令 アセンブル命令:ROR 除算即値データとセグメントレジスタ以外のオペランド、数実行される操作
: オペランドは指定された回数だけ右に回転されます。
- 大規模巡回シフト命令 キャリー
付き RCL 左シフト命令 RCL
アセンブリ形式:イミディエートおよびセグメント レジスタを除く RCL オペランド、シフト数
実行される演算:オペランドの指定回数の巡回左
シフト命令 キャリー付き RCR 右シフト命令
アセンブリ形式:RCR イミディエート以外のオペランドデータおよびセグメント レジスタ、シフト数
実行される演算: オペランドは指定された回数だけ右にローテートされます。
3.3.4 文字列操作命令
1. シリアル送信コマンド
各文字列転送命令はバイトまたはワードを転送できます。プレフィックス REP を付加すると繰り返し送信が可能となり、バイトブロックまたはワードブロックで送信します 具体的なフォーマットは
REP MOVS/LODS/STOSとなります。
- MOVS 命令
MOVS デスティネーション オペランド、ソース オペランド
- LODS 命令
LODS ソースオペランドメモリアドレッシングモード
実行演算:
(1) バイトの場合:AL←((DS):(SI))
ワードの場合:AX←((DS):(SI))
(2) バイトの場合:(SI) )←(SI)±1 (DF=0の場合は「+」を使用、それ以外の場合は「-」を使用)
ワード: (SI)←(SI)±2 (DF=0の場合は「+」を使用、それ以外の場合は「-」を使用)
- STOS 命令
STOS デスティネーションオペランド
動作:
(1) バイトの場合:((ES):(DI))←AL
ワードの場合:((ES):(DI))←AX
(2) バイトの場合:( DI)←(DI )±1 (DF=0 の場合は "+" を使用、それ以外の場合は "-" を使用)
ワードの場合: (DI)←(DI)±2 (DF=0 の場合は "+" を使用、それ以外の場合は "-" を使用)
2. 文字列比較命令
● REPE/REPZ
プレフィックスの意味は、等しいかゼロの場合に比較を繰り返すことです。
アセンブリ形式: REPE/REPZ CMPS/SCAS
- CMPS 命令
CMPS ソース オペランド メモリ アドレッシング モード、デスティネーション オペランド メモリ アドレッシング モードで実行される演算:
(1) ((DS):(SI))-((ES):(DI))
(2) バイトの場合 (SI の場合) )←(SI)±1、(DI)←(DI)±1の場合、方向フラグDF=0の場合は「+」、それ以外の場合は「-」を使用;ワードが(SI)←(SI)の場合± 2(DI)(DI)±2の場合、方向フラグDF=0の場合は「+」、それ以外の場合は「-」を使用します。
- SCAS 命令
SCAS デスティネーションオペランド
動作:
(1) バイトの場合: (AL) - ((ES): (DI))
ワードの場合: (AX) - ((ES): (DI))
3.3.5 コントロール転送命令
無条件転送命令と条件付き転送命令、サブルーチン
コール命令とリターン命令、
ループ制御命令、
割り込み命令と割り込み復帰命令の4種類の命令。
1. 無条件転送命令JMP
1)セグメント内直接振替
(1) セグメント内でのダイレクトショート転送。
アセンブリ形式:JMP SHORT ジャンプアドレスラベル
(2) セグメント内で直接ジャンプします。
アセンブリ形式 1: JMP NEAR PTR 転送アドレス ラベル
アセンブリ形式 2: JMP 数値オフセット アドレス
2) セグメント内での間接移転
アセンブル形式1:JMP 16ビットレジスタ名
機械命令形式:
実行演算:(IP)←16ビットレジスタの内容
機能:カレントセグメントの指定されたオフセットアドレスへ無条件に転送します。
3) セグメント間の直接転送
● アセンブル形式 1:JMP FAR PTR 転送アドレスラベル
実行動作:(IP)←転送アドレスラベルのオフセットアドレス
(CS)←転送アドレスラベルのセグメントアドレス
機 能:指定されたラベルアドレスに無条件にジャンプして実行します。
● アセンブル形式 2:JMP セグメントアドレス値:オフセットアドレス
実行演算:(IP)←オフセットアドレス値
(CS)←セグメントアドレス値
機 能:指定セグメントの指定オフセットアドレスへ無条件に転送しダウン実行します。
4) セグメント間の間接転送
アセンブリ形式:JMP DWORD PTR メモリアドレッシングモード
実行演算:(IP) ← アドレス指定された記憶装置の最初のワード
(CS) ← アドレス指定された記憶装置の 2 ワード目
機能: 指定されたアドレスの指定されたオフセットアドレスに無条件に転送セグメント。
2. 条件分岐命令
すべての条件付き転送命令のアドレッシング モードは、セグメント内のダイレクト ショート アドレッシング、8 ビット ディスプレースメントです。
(1)
(2)
(3)
(4) CX の値が 0 であると判定された場合に分岐する命令。
命令形式:JCXZアドレスラベル
機能:CXレジスタの内容が0の場合、指定されたアドレスラベルに転送します。
試験条件:(CX)=0
3. サブルーチンの呼び出しと復帰命令
1) CALL 呼び出しコマンド
(1) セグメント内で直接呼び出されます。
アセンブリ形式: CALL NEAR PTR サブルーチン名
(または CALL サブルーチン名)
(2) セグメント間直接呼び出し。
アセンブリ形式: CALL FAR PTR サブルーチン名
(3) セグメント内の間接呼び出し。
アセンブリ形式 1: CALL 16 ビット レジスタ名
アセンブリ形式 2: CALL WORD PTR メモリ アドレッシング モード
(4) セグメント間の間接的なコール。
アセンブリ形式: CALL DWORD PTR メモリ アドレッシング モード
2) RETリターンコマンド
(1) セグメント内リターン アセンブル形式:
RET
による演算:(IP)←((SP)+1、(SP))
(SP)←(SP)+2
(2) セグメント間リターン アセンブル形式:
RET
による演算:(IP)←((SP)+1、(SP))
(SP)←(SP)+2
(CS)←((SP)+1、 (SP))
(SP)←(SP)+2
(3) セグメント内即時復帰 アセンブル
形式:RET 式
実行演算:(IP)←((SP)+1,(SP)) (SP )
←(SP)+2
(SP)←(SP) +16 ビット式価値
(4) セグメント間即値リターン アセンブル
形式:RET式
実行演算:(IP)←((SP)+1,(SP)) (SP)
←(SP)+2
(CS)←((SP) +1,(SP))
(SP)←(SP)+2
(SP)←(SP)+16ビット表現値
4. ループ制御命令
ループ制御命令には、LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE の 3 つがあります。
アセンブリ形式: 命令名ループエントリアドレスラベル
5. 割り込み命令と割り込み復帰命令
3.3.6 プロセッサ制御命令
1. フラグ設定命令
2. その他のプロセッサ制御命令
- NOP 操作命令なし
アセンブリ形式: NOP
実行された操作: 操作は実行されません。
- HLT 停止命令
アセンブリ形式:
HLT によって実行される操作: CPU を「何もしない」一時停止状態にします。
- WAIT 待機コマンド
アセンブリの形式: WAIT
アクション: 常にピンをテストします。
- LOCK バスロックコマンド
LOCK バスロックコマンドはプレフィックスコマンドとも呼ばれ、コマンドの前に置くことができます。
アセンブリ形式:LOCK XXXX 命令
実行した動作:端子に Low レベル信号を出力させます。
- ESC ハンドオーバー命令
アセンブリ形式: ESC メモリ アドレッシング モード
実行されたオペレーション: プロセッサを支援するためのオペレーション コードを提供し、データ バスがストレージ ユニットの内容を送信し、コプロセッサ命令の実行を開始します。