8086 |
 
レジスタセット |
8086のレジスタセットは専用レジスタ形式を採っています。
歴史的にはインテルの最初の16ビットのプロセッサです。
|
 
フラグレジスタ |
8080/8085 のフラグレジスタを上位に8ビット拡張するかたちになっています。
フラグは命令に起因して1か0になりますので詳しくは命令の項を参照してください 概要は次のとおりです。
|
 
セグメント |
8086は64Kバイト以上のメモリ空間を扱えますが全レジスタが16ビットなので、これで直接に
指定することはできません。
|
 
セグメントレジスタ |
今までの8ビットのプロセッサではなかったことですが1Mバイトのメモリ空間を64Kバイトに分割して使います。
今までになかったことと言うのはメモリ空間の大きさのことではなくメモリ空間が論理的メモリ空間と物理的
メモリ空間の2本立てになったことです。
プロセッサで動いているプログラムを2種類に分ける構造が導入されていると思います。 すなわち論理的メモリ空間の中だけで動くプログラムと物理的メモリ空間も操作しながら動くプログラム の2種類です。 ユーザープログラムとシステムプログラムの関係、アプリーケーションとオペレーティングシステムの関係 に分離されていきます。 次にメモリ空間を機能的に分ける構造が導入されています、 8080 のときにもアセンブリ言語ではプログラムを書くときにコード領域やデータ領域を定義する文が用意されて いて使っていました。 8086 では論理的メモリ空間を コード を置くところと データ を置くところと スタック を置くところに分けることができます。 これらは3種類のセグメントレジスタを使って実現されています。 すなわちプログラムカウンタの IP は暗黙的にコード用のセグメントレジスタで番地を指します。 スタックポインタの SP は暗黙的にスタック用のセグメントレジスタで番地を指します。 その他のメモリ操作ではは暗黙的にデータ用のセグメントレジスタで番地を指します。 コード と スタック と データ が別々の論理的メモリ空間に配置されるようになりました。
8086で方向づけを行い80286で大枠を作り80386で実用化させて以降のプロセッサで完成発展させていったと言うことになるでしょう。
大型計算機で行っていたことをマイクロプロセッサに導入する端緒を作ったことになると思います。
|
 
レジスタCS |
本レジスタは コードセグメントレジスタ と呼び16倍されてレジスタ IP に加算されて命令を読み出す番地になります。 |
 
レジスタDS |
本レジスタは データセグメントレジスタ と呼び暗黙的に データ を操作する番地に16倍されて加算されます。 レジスタ SI の間接番地指定は暗黙的に本レジスタが当てられます。 |
 
レジスタSS |
本レジスタは スタックセグメントレジスタ と呼び暗黙的に スタック を操作する番地に16倍されて加算されます。 レジスタ BP の間接番地指定は暗黙的に本レジスタが当てられます。 |
 
レジスタES |
本レジスタは エクストラセグメントレジスタ と呼び一部の命令で暗黙的に データ を操作する番地に16倍されて加算されます。 レジスタ DI の間接番地指定は暗黙的に本レジスタが当てられます。 |
 
初期化 |
初期化で値の確定するのは下記のレジスタです。
プログラムの読み取りの開始番地は FFFF0H からになります。 |
 
メモリ操作 |
8ビットのプロセッサが8ビットのデータバスでメモリを操作するように
16ビットのプロセッサが16ビットのデータバスでメモリを操作すれば8ビットと同じ考え方ですが
8086では8ビットデータも扱えるようになっていますのでプロセッサとメモリの関係が複雑になっています。
新規にプロセッサを設計する場合には操作するデータサイズの種類を少なくして プロセッサの論理を簡素にして速度を向上するのに16ビットなら16ビット以下のデータを扱わないようにするのは8ビットのプロセッサ が4ビットのレジスタを持たないように考慮されてよいと思います。 |
 
命令 |
8086の命令は可変長の命令形態をとっており1バイトから6バイトの長さの命令があります。
8086の命令はメモリ番地の指定方法が豊富なCISCのプロセッサの典型で大枠としての基本構造はあるものの
複雑で命令解析の論理設計は難解です、インテルのチップはマイクロコードで命令解析をしていると思われ
ます。
|
 
構造 |
命令の構造を MOV 命令の例で概観します。
8086の命令の標準的な構造は
図3
のようなものでこの後に
8086には先にも述べたように命令構造の厳格な一貫性はありませんがほぼ 図4 のようになっています。 これはメモリかレジスタの2個のデータを操作する命令の情報を表現する構造です、ほかに 番地を即値で表したりデータを即値で表す場合にはバイトが追加されます。 また簡単な命令では2バイト目が無いものや番地やデータの即値になっているものもあります。 図4 の reg を opcode の拡張に使っている命令もあります。
命令の解析は命令語を全部読み取らないとできませんが8086は可変長命令なので命令語を 全部読み取るためには命令語の長さを知る必要があります。 8086では簡単な命令では1バイト目で標準的な命令では2バイト目まで読めば命令長が分かります。
|
 
MOV命令 |
 
MOV AX ,mem |
命令の第一バイトで命令長を特定できます、第二、三バイトはメモリを指定する番地です。 番地はセグメントレジスタ DS の値を16倍したものと加算して有効番地になります。 セグメントレジスタ DS 以外を使う場合はセグメントを指定する命令を本命令の直前に実行すると セグメントレジスタを変更できます。
本命令ではフラグレジスタは変化しません。
|
 
MOV AL ,mem |
命令の第一バイトで命令長を特定できます、第二、三バイトはメモリを指定する番地です。 番地はセグメントレジスタ DS の値を16倍したものと加算して有効番地になります。 セグメントレジスタ DS 以外を使う場合はセグメントを指定する命令を本命令の直前に実行すると セグメントレジスタを変更できます。
本命令ではフラグレジスタは変化しません。
|
 
MOV mem ,AX |
命令の第一バイトで命令長を特定できます、第二、三バイトはメモリを指定する番地です。 番地はセグメントレジスタ DS の値を16倍したものと加算して有効番地になります。 セグメントレジスタ DS 以外を使う場合はセグメントを指定する命令を本命令の直前に実行すると セグメントレジスタを変更できます。
本命令ではフラグレジスタは変化しません。
|
 
MOV mem ,AL |
命令の第一バイトで命令長を特定できます、第二、三バイトはメモリを指定する番地です。 番地はセグメントレジスタ DS の値を16倍したものと加算して有効番地になります。 セグメントレジスタ DS 以外を使う場合はセグメントを指定する命令を本命令の直前に実行すると セグメントレジスタを変更できます。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,R16s |
図4 の基本命令構造の命令です。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,R8s |
図4 の基本命令構造の命令です。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,mem |
図4 の基本命令構造に番地を指定するための2バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[BX] |
図4 の基本命令構造の命令です。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[SI] |
図4 の基本命令構造の命令です。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[DI] |
図4 の基本命令構造の命令です。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[BX+SI] |
図4 の基本命令構造の命令です。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[BX+DI] |
図4 の基本命令構造の命令です。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[BP+SI] |
図4 の基本命令構造の命令です。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[BP+DI] |
図4 の基本命令構造の命令です。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[SI+d8] |
図4 の基本命令構造の命令です。 d8 を指定するための1バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[DI+d8] |
図4 の基本命令構造の命令です。 d8 を指定するための1バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[BX+d8] |
図4 の基本命令構造の命令です。 d8 を指定するための1バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[BP+d8] |
図4 の基本命令構造の命令です。 d8 を指定するための1バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[BX+SI+d8] |
図4 の基本命令構造の命令です。 d8 を指定するための1バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[BX+DI+d8] |
図4 の基本命令構造の命令です。 d8 を指定するための1バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[BP+SI+d8] |
図4 の基本命令構造の命令です。 d8 を指定するための1バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[BP+DI+d8] |
図4 の基本命令構造の命令です。 d8 を指定するための1バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[SI+d16] |
図4 の基本命令構造の命令です。 d16 を指定するための2バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[DI+d16] |
図4 の基本命令構造の命令です。 d16 を指定するための2バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[BP+d16] |
図4 の基本命令構造の命令です。 d16 を指定するための2バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[BX+d16] |
図4 の基本命令構造の命令です。 d16 を指定するための2バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[BX+SI+d16] |
図4 の基本命令構造の命令です。 d16 を指定するための2バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[BX+DI+d16] |
図4 の基本命令構造の命令です。 d16 を指定するための2バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[BP+SI+d16] |
図4 の基本命令構造の命令です。 d16 を指定するための2バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R16d,[BP+DI+d16] |
図4 の基本命令構造の命令です。 d16 を指定するための2バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,mem |
図4 の基本命令構造の命令です。 番地を指定するための2バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[BX] |
図4 の基本命令構造の命令です。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[SI] |
図4 の基本命令構造の命令です。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[DI] |
図4 の基本命令構造の命令です。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[BX+SI] |
図4 の基本命令構造の命令です。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[BX+DI] |
図4 の基本命令構造の命令です。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[BP+SI] |
図4 の基本命令構造の命令です。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[BP+DI] |
図4 の基本命令構造の命令です。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[SI+d8] |
図4 の基本命令構造の命令です。 d8 を指定するための1バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[DI+d8] |
図4 の基本命令構造の命令です。 d8 を指定するための1バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[BP+d8] |
図4 の基本命令構造の命令です。 d8 を指定するための1バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[BX+d8] |
図4 の基本命令構造の命令です。 d8 を指定するための1バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[BX+SI+d8] |
図4 の基本命令構造の命令です。 d8 を指定するための1バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[BX+DI+d8] |
図4 の基本命令構造の命令です。 d8 を指定するための1バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[BP+SI+d8] |
図4 の基本命令構造の命令です。 d8 を指定するための1バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[BP+DI+d8] |
図4 の基本命令構造の命令です。 d8 を指定するための1バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[SI+d16] |
図4 の基本命令構造の命令です。 d16 を指定するための2バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[DI+d16] |
図4 の基本命令構造の命令です。 d16 を指定するための2バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[BP+d16] |
図4 の基本命令構造の命令です。 d16 を指定するための2バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[BX+d16] |
図4 の基本命令構造の命令です。 d16 を指定するための2バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[BX+SI+d16] |
図4 の基本命令構造の命令です。 d16 を指定するための2バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[BX+DI+d16] |
図4 の基本命令構造の命令です。 d16 を指定するための2バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[BP+SI+d16] |
図4 の基本命令構造の命令です。 d16 を指定するための2バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV R8d,[BP+DI+d16] |
図4 の基本命令構造の命令です。 d16 を指定するための2バイトが追加されています。
本命令ではフラグレジスタは変化しません。
|
 
MOV SRd,R16s |
図4 の基本命令構造の命令ですが受けのレジスタがセグメントレジスタです。
本命令ではフラグレジスタは変化しません。
|
 
MOV SRd,mem |
図4 の基本命令構造の命令ですが受けのレジスタがセグメントレジスタです。 番地を指定するための2バイトが追加されています。 セグメントレジスタの選択は 図116 を見てください。
本命令ではフラグレジスタは変化しません。
|
 
MOV SRs,R16d |
図4 の基本命令構造の命令ですが受けのレジスタがセグメントレジスタです。 セグメントレジスタの選択は 図116 を見てください。
本命令ではフラグレジスタは変化しません。
|
 
MOV mem,SRs |
図4 の基本命令構造の命令ですが送りのレジスタがセグメントレジスタです。 番地を指定するための2バイトが追加されています。 セグメントレジスタの選択は 図116 を見てください。
本命令ではフラグレジスタは変化しません。
|