戻る

i8086

Intel 8086
Data 16bit / Address Bus 20bit
Cycle 5.0MHz〜10.0MHz
(1978)

基本的なアーキテクチャは「i8080」からの拡張である。
(ただし、直接の互換性はない)

データバスを16bitにし、アドレス変換用「セグメントレジスタ」により20bit(1MB)のアドレス空間を得た。
「セグメント」は、互換性とソフトウェア開発期間の短期化が図れた一方、「64KBの壁」が立ちはだかることとなり、その存在は功罪ともにある。
互換品としてNEC「V30」などがある。

姉妹型:「i8088」
1979年にリリースされた、外部データバスを8bitにした廉価版。
互換品としてNEC「V20」などがある。

後継型:「i80286」
1984年にリリースされた、性能強化版。
6MHz〜12MHzで駆動し、「パイプライン」処理に対応。
組込用に周辺ICをオンダイ(On Die:Dieは半導体チップのことであり、チップ上にあるという意味)に組み込んだ「i80186」もある。
これの外部データバス8bit版が「i80188」である。

後継型:「i386」(参考)
「i80286」で追加された「プロテクトモード」「リアルモード」がリセットなしで変更可能になった。
「プロテクトモード」では「仮想86モード」という複数の「i8086」を仮想動作させるモードが追加された。
汎用レジスタは完全32bitとなる。
その結果アドレス空間は4GB、セグメントも同様に最大4GBとなった。

後継型:「i486」(参考)
新たに設計が見直され、登場した後継プロセッサ。
内部での実行を一部を除いて「ワイヤードロジック」に変更し、高速化を図っている。

後継型:「Pentium」(参考)
本来は「i586」だが、数字のみだと商標登録が不可であった問題があった(386や486に「SX」などが付いている理由はそれである)
そこで、ギリシャ語で「5」を表す「Penta」とラテン語の「要素」を意味する「ium」から名付けられた。
「スーパースケーラ」を採用している。
この後のシリーズでもこの名前は長く使われていった。

●8086のピン配列

Vss1 40Vcc
AD142 39AD15
AD133 38A16/S3
AD124 37A17/S4
AD115 36A18/S5
AD106 35A19/S6
AD97 34BHE/S7
AD88 33MN/MX
AD79 32RD
AD610 31Hold
AD511 30HLDA
AD412 29WR
AD313 28M/IQ
AD214 27DT/R
AD115 26DEN
AD016 25ALE
NMI17 24INTA
DNTR18 23TEST
CLK19 22READY
Vss20 21RESET

●8086の特徴

レジスタセットは以下の構成となっている。
レジスタを連結して使う場合は「R1:R2」と表す。

16bit8bit8bit備考
AXALAH汎用レジスタ
BXBLBH汎用レジスタ
CXCLCH汎用レジスタ
DXDLCH汎用レジスタ
SI汎用レジスタ(インデックスレジスタとして使用可能)
DI汎用レジスタ(インデックスレジスタとして使用可能)
BP汎用レジスタ:ベースポインタ
SP汎用レジスタ:スタックポインタ
CSセグメントレジスタ:コードセグメント
DSセグメントレジスタ:データセグメント
ESセグメントレジスタ:エクストラセグメント
SSセグメントレジスタ:スタックセグメント
IP命令ポインタ
FLAGSステータスフラグ

「FLAGS」で示されるフラグの内容は以下の構成となっている。

bit略号フラグセットされるケース
11OFオーバーフローMSB(Most Significant Bit:最上位bit)への桁の繰り上がり(Overflow)もしくは桁の繰り下がり(Borrow)発生時
10DFディスティネーションSTD命令実行(DF=1のとき、文字列操作はインデックスレジスタがデクリメントされる)
9IF割込許可外部(ハードウェア)割込許可時
8TFトラップシングルステップモード指定時
7SFサインMSB=1の場合(負数)
6ZFゼロ結果が0の場合
4AF補助(AUX)キャリー算術演算のbit3/4間(Half)でOverflowもしくはBorrow発生時
2PFパリティフラグ下位8bitの「1」が偶数個の場合
0CFキャリーMSBからのOverflowもしくはBorrow発生時

●8086の命令

  ニーモニック [DEST[,SRC]]

データの流れは「DEST」←「SRC」となる。

オペランドは0〜2個。
オペランドに指定可能なものは以下の通りである。
(特定の即値で指定される場合もある)

略号意味
R汎用レジスタ
A汎用レジスタ「AX」または「AL」
RW16bit汎用レジスタ
Mメモリ
MWメモリ(WORD:16bit)
MLメモリ(LONG WORD:32bit)
RMレジスタまたはメモリ
I即値(イミディエイト値)
IB8bit即値(イミディエイト値)
SRセグメントレジスタ
LSラベル(SHORT)
LNラベル(NEAR)
LFラベル(FAR)
コール、ジャンプ命令で使用
SHORTSHORT値
Lラベル
ストリング命令と80x86拡張命令で使用
SRCソースメモリオペランド(セグメントレジスタのオーバーライドが使用可能)
DSTデスティネーションメモリオペランド(セグメントレジスタは「ES」に固定)

命令(ニーモニック)は以下の構成となっている。

●一般命令

ニーモニックOP1OP2動作
MOVA/M,
R/RM,
R/RM,
SR
M/A
RM/R
I
RM
OP2をOP1に格納
XCHGAX/RW,
R,
RW/AX
RM
OP1とOP2を入替
LEARW,MMをRWにロード(読込)
LDSRW,MLMLの上位を「DS」、下位をOP1にロード
LESRW,MLMLの上位を「ES」、下位をOP1にロード
LAHF--「FLAGS」下位8bitを「AH」にロード
SAHF--「FLAGS」下位8bitに「AH」からロード
ADDR/RM,
A/RM,
RM/R
I
OP1とOP2を加算し、OP1に格納
ADCR/RM,
A/RM,
RM/R
I
OP1とOP2とCFを加算し、OP1に格納
SUBR/RM,
A/RM,
RM/R
I
OP1からOP2を減算し、OP1に格納
SBBR/RM,
A/RM,
RM/R
I
OP1からOP2とCFを減算し、OP1に格納
MULRM-OP1:通常→「AX」にOP1を符号なし乗算し、「DX:AX」に格納
OP1:8bit→「AL」にOP1を符号なし乗算し、「AX」に格納
IMULRM-OP1:通常→「AX」にOP1を符号付き乗算し、「DX:AX」に格納
OP1:8bit→「AL」にOP1を符号付き乗算し、「AX」に格納
DIVRM-OP1:通常→「DX:AX」をOP1で符号なし除算し、商を「AX」、余りを「DX」に格納
OP1:8bit→「AX」をOP1で符号なし除算し、商を「AL」、余りを「AH」に格納
IDIVRM-OP1:通常→「DX:AX」をOP1で符号付き除算し、商を「AX」、余りを「DX」に格納
OP1:8bit→「AX」をOP1で符号付き除算し、商を「AL」、余りを「AH」に格納
INCRW
RM
-
-
OP1をインクリメント(+1)
DECRW
RM
-
-
OP1をデクリメント(-1)
ANDR/RM,
A/RM,
RM/R
I
OP1とOP2の論理積をOP1に格納
ORR/RM,
A/RM,
RM/R
I
OP1とOP2の論理和をOP1に格納
XORR/RM,
A/RM,
RM/R
I
OP1とOP2の排他的論理和をOP1に格納
TESTR/RM,
A/RM,
RM/R
I
OP1とOP2の論理積を行う(OP1には格納しない=テスト)
NEGRM-OP1の2の補数を得る(符号反転)
NOTRM-OP1の1の補数を得る(bit反転)
CMPR/RM,
A/RM,
RM/R
I
OP1からOP2を減算(OP1には格納しない=比較)
ROLRM,1/CLOP1を左ローテート(OP2はカウント)
RORRM,1/CLOP1を右ローテート(OP2はカウント)
RCLRM,1/CLOP1をCarry付きで左ローテート(OP2はカウント)
RCRRM,1/CLOP1をCarry付きで右ローテート(OP2はカウント)
SHLRM,1/CLOP1を左bitシフト(OP2はカウント)
SHRRM,1/CLOP1を右bitシフト(OP2はカウント)
SALRM,1/CLOP1をMSBは保存した状態で左bitシフト(OP2はカウント)
SARRM,1/CLOP1をMSBは保存した状態で右bitシフト(OP2はカウント)
AAA--加算結果の「AL」をUnpack BCD補正(Carry時は「AH」をインクリメント)
AAS--減算結果の「AL」をUnpack BCD補正(Borrow時は「AH」をデクリメント)
AAM--乗算結果の「AL」をUnpack BCD補正し、結果を「AX」に格納
DAA--加算結果の「AL」をPack BCD補正し、結果を「AX」に格納
DAS--減算結果の「AL」をPack BCD補正し、結果を「AX」に格納
AAD--「AX」を2進数補正
CWD--「AL」のMSBを「AH」の全bitにコピー(符号拡張)
CBW--「AX」のMSBを「DX」の全bitにコピー(符号拡張)
XLAT-/M-「BX」+「AL」を「AL」に格納(テーブル変換)、「SR」使用時はダミーOPとしてMを使用
CLC--CFをクリア(0にセット)
CLD--DFをクリア
CLI--IFをクリア
STC--CFをセット(1にセット)
STD--DFをセット
STI--IFをセット
CMI--CFを反転
PUSHRW/M/SR-「SP」→-2、「SS;[SP]」にOP1を格納(スタックのプッシュ)
PUSHF--フラグレジスタをスタックへプッシュ
POPRW/M/SR-「SP」→+2、「SS;[SP]」をOP1へ格納(スタックのポップ)
POPF--フラグレジスタへスタックをポップ
INA,IB/DXI/Oポートから「AL/AX」に入力
OUTIB/DX,AI/Oポートに「AL/AX」を出力
ESCI,RM数値演算コプロセッサ命令の簡略形(OP1はコプロ命令を表す6bit値)

●ストリング命令

ニーモニック>OP1OP2動作
LODSSRC-「AX(AL)」に「[SI]」をロード
「SI」を更新
LODSBSRC-LODSのbyte版
LODSWSRC-LODSのword版
STOSDEST-「AX(AL)」を「ES:[DI]」をストア
「DI」を更新
STOSBDEST-STOSのbyte版
STOSWDEST-STOSのword版
MOVSDEST,SRC「[SI]」を「ES:[DI] 」に転送
「SI」「DI」を更新
MOVSBDEST,SRCMOVSのbyte版
MOVSWDEST,SRCMOVSのword版
CMPSSRC,DEST「SI」と「ES:[DI]」を比較
「SI」「DI」を更新
CMPSBSRC,DESTCMPSのbyte版
CMPSWSRC,DESTCMPSのword版
SCASDEST-「AX(AL)」と「ES:[DI] 」を比較
「DI」を更新
SCASBDEST-SCASのbyte版
SCASWDEST-SCASのword版

●プリフィックス命令

ニーモニックOP1OP2動作
LOCK--次命令の実行時にバスロック信号を発生(マルチプロセッサ対応)
REP--「CX」≠0の時、「CX」をデクリメントし後続のストリング命令を実行
「CX」≠0 かつZF=1の時、「CX」=0になるまで繰り返す(「CX」=0の時は実行されない)
REPE--REPと同じ
REPZ--REPと同じ
REPNE--REPの「ZF=0」条件違い
REPNZ--REPNEと同じ

●ジャンプ命令

ニーモニックOP1OP2動作
JMPSHORT
L
LN
LF
RW
MW
ML
-
-
-
-
-
-
-
8bit自己相対ジャンプ
16bit/32bit絶対間接ジャンプ
16bit自己相対ジャンプ
32bit絶対ジャンプ
16bit/32bitレジスタ間接ジャンプ
16bitメモリ間接ジャンプ
32bitメモリ間接ジャンプ
JASHORT-「CF」「ZF」の論理和が0のとき分岐(>:Unsigned)
JNBEL-「CF」「ZF」の論理和が0のとき分岐(>:Unsigned)
JAESHORT-「CF」が0のとき分岐(≧:Unsigned)
JNBL-「CF」が0のとき分岐(≧:Unsigned)
JBSHORT-「CF」が1のとき分岐(<:Unsigned)
JNAEL-「CF」が1のとき分岐(<:Unsigned)
JCXZSHORT/L-「CX」が0のとき分岐
JGSHORT-「SF」「OF」の排他的論理和と「ZF」の論理和が0のとき分岐(>:Signed)
JNLEL-「SF」「OF」の排他的論理和と「ZF」の論理和が0のとき分岐(>:Signed)
JGESHORT-「SF」「OF」の排他的論理和が0のとき分岐(≧:Signed)
JNLL-「SF」「OF」の排他的論理和が0のとき分岐(≧:Signed)
JLSHORT-「SF」「OF」の排他的論理和が1のとき分岐(<:Signed)
JNGEL-「SF」「OF」の排他的論理和が1のとき分岐(<:Signed)
JLESHORT-「SF」「OF」の排他的論理和と「ZF」の論理和が1のとき分岐(≦:Signed)
JNGL-「SF」「OF」の排他的論理和と「ZF」の論理和が1のとき分岐(≦:Signed)
JNOSHORT/L-「OF」が0のとき分岐
JOSHORT/L-「OF」が1のとき分岐
JNSSHORT/L-「SF」が0のとき分岐(正数)
JSSHORT/L-「SF」が1のとき分岐(負数)
JESHORT-「ZF」が1のとき分岐(=0)
JZL-「ZF」が1のとき分岐(=0)
JNESHORT-「ZF」が0のとき分岐(≠0)
JNZL-「ZF」が0のとき分岐(≠0)
JNPSHORT-「PF」が0のとき分岐
JPOL-「PF」が0のとき分岐
JPSHORT-「PF」が1のとき分岐
JPEL-「PF」が1のとき分岐
LOOPSHORT/L-「CX」をデクリメントし、「CX」≠0なら分岐
LOOPESHORT-「CX」をデクリメントし、「CX」≠0かつ「ZF」≠0なら分岐
LOOPZL-「CX」をデクリメントし、「CX」≠0かつ「ZF」≠0なら分岐
LOOPNESHORT-「CX」をデクリメントし、「CX」≠0かつ「ZF」=0なら分岐
LOOPNZL-「CX」をデクリメントし、「CX」≠0かつ「ZF」=0なら分岐

●コール・リターン命令

ニーモニックOP1OP2動作
CALLLN
LF
RW
MW
ML
-
-
-
-
-
16bit自己相対コール
32bit絶対コール
16bit/32bitレジスタ間接コール
16bitメモリ間接コール
32bitメモリ間接コール
RET-/I-サブルーチンからのリターン
RETN-/I-NEARサブルーチンからのリターン
RETF-/I-FARサブルーチンからのリターン
IRET--割込先からのリターン(フラグレジスタを復元)

●その他命令

ニーモニックOP1OP2動作
NOP--何もしない
WAIT--WAIT状態にする
HLT--HALT状態にする
INT3/IB-ソフトウェア割込
INTO--OFセット時にソフトウェア割込4を発生

●80x86拡張命令

ニーモニックOP1OP2動作
PUSHA--「DI,SI,BP,SP,BX,DX,CX,AX」を同順でプッシュ
POPA--「DI,SI,BP,SP,BX,DX,CX,AX」を同順でポップ
ENTERI,IBスタックフレームの作成
「BP」をプッシュ
OP2の分「[BP]」より上のフレームポインタをプッシュ
「BP」に「BP」プッシュ時の「SP」を格納
「SP」からOP1を減算
LEAVE--スタックフレームの解放
「SP」に「BP」を格納
「BP」をポップ
INSDEST,DX「DX」で指定したI/Oポートから「ES:[DI]」に入力
「DI」を更新
INSBDEST,DXINSのbyte版
INSWDEST,DXINSのword版
OUTSDX,DEST「DX」に指定されたI/Oポートへ「[SI]」から出力
「SI」を更新
OUTSBDX,DESTOUTSのbyte版
OUTSWDX,DESTOUTSのword版

[TOPに戻る]