シリコンダイから始めて8086をリバースエンジニアリングしてきました。 下のダイの写真は、顕微鏡下のチップを示しています。 チップの上部にある金属層が見え、シリコンとポリシリコンはほとんどその下に隠れています。 ダイの周囲で、ボンド ワイヤがパッドをチップの 40 個の外部ピンに接続します。 最も役立つブロックにラベルを付けました。 この議論に不可欠なこれらはより暗いものであり、以下で詳しく説明します. アーキテクチャ上、チップは先端のバス インターフェイス ユニット (BIU) とその下の実行ユニット (EU) に分割されます。 BIU はバスとメモリ ジョブを処理して起動し、実行ユニット (EU) は指示とマイクロコードを実行します。 それぞれのファッションは、メモリアドレッシングにおいて重要な役割を果たします.
8086 ダイは顕微鏡の下にあり、主な役立つブロックにラベルが付けられています。 この写真は、チップの単一金属層を示しています。 ポリシリコンとシリコンが下にあります。 この画像 (または他の画像) をクリックすると、さらに大きなバージョンが表示されます。8086 アドレッシング モード 加算命令から始めましょう 追加
dst, src[DI] 、ソース ラベルをギャロップ ゴール ラベルに追加し、ギャロップ ゴール内に存在を保存します。3 ソースとギャロップゴールは何ですか? メモリー? レジスター? アドレッシングモードはこの質問に答えます. さらに、レジスターをソースとして、もう 1 つのレジスターをギャロップ ゴールとして実行する必要があります。 以下の命令は AX をギャロップゴールとして登録し、BX をソースとして登録します。 したがって、 BX に 斧
結果を AX.[SI+0x1234] ADD AX, BX )BXレジスタの内容をAXレジスタに加算 [SI+0x1234] へのメモリ担当者の入場は、「有効なハンドル」を横切る角括弧で示されます 4 担当者への入場。 例えば、 ハンドル 1234 を持つメモリ空間を
[BP] 方法 のメモリ空間BP 関数を登録します。 より複雑なアドレス指定モードの場合、 [BP+SI+1234] のように、メモリ空間は BP および SI レジスタを定数 1234 (変位と呼ばれます)。 8086 では、ソースまたはギャロップ ゴールのメモリを使用する可能性がありますが、両方ではありません。 以下に、メモリをソースとして使用する例をいくつか示します: ADD AX, メモリ空間 1234 の内容を追加AXレジスタへ ADD CX, [BP] BPレジスタが指すメモリをCXレジスタに追加[BX+SI] DX を追加、[BX+SI+1234] 提供メモリハンドルは BX + SI + 定数 1234 ここにリストされているのは、ギャロップの目標としてメモリを使用する例です: 追加、 AX 内容に AX を追加メモリ空間の 1234 ADD [BP]、CX [DI] CX を BP レジスタが指すメモリに追加します 追加 [BX+SI+1234]、DX 休暇の目標のメモリ ハンドルは、BX + SI + 定数 1234 フレーズよりもさらにバイトを操作する必要があり、バイトレジスタを使用してアクセスする必要があります。メモリ バイト: 追加、[SI+1234] AXレジスタの下位バイトに加算[BX] 追加ああ、[SI+1234] AXレジスタの余分なバイトに加算 として お気付きかもしれませんが、8086 はさまざまなアドレッシング スキームをサポートしています。 それらがどのように実装されているかを知るには、まず、指示が ModR/M バイト内のアドレッシング スキームをどのようにエンコードするかを確認する必要があります ModR/Mバイト
ModR/M バイトは、アドレッシング モードを指定するために多くのオペコードに続きます。 このバイトはすべて公平性が複雑ですが、この部分でレベルを上げようとすることができました。 以下のデザインは、バイトがどのように損傷するかを 3 つのフィールドに分けて示しています:
5 モッド 一般モードを選択します reg レジスタを選択し、 r/m は、レジスタまたはメモリ モード。 私は、mod ビットは 11[DI] そしてその reg および r/m[SI+0x1234] 各ホールのフィールド d 以下で証明されるように、8 つのレジスタの 1 つ。 命令 ADD AX,BX 運動します reg
=011 運ぶ BX および r/m=000 運ぶ AX[BX+SI] であるため、ModR/M バイトはおそらく 11[SI+0x1234] 011000。 (レジスタの割り当ては、命令がフレーズ、バイト、またはセクション レジスタで動作するかどうかに依存しています。たとえば、監視命令では、001 CX[BX+SI] を選択します。 レジスタ、バイト命令では [DI] 001 は を選択します。 CLレジスタ、の下位バイトCX .)
次はアドレッシング モードは、メモリ引数とレジスタ引数を指定します。 この場合、 mod ビットは 00、reg[BX+SI] トピックは、上記のようにレジスタを指定し、r/m topic は、次の表に従ってメモリ ハンドルを指定します。 たとえば、命令 ADD [BX+SI],CX は reg=001 運ぶ [BX+SI] CX と r/m=[BX+SI] 100[DI] 運ぶ [BX+SI],したがって、ModR/M バイトはおそらく
00001100. 
r/m オペランド Take care of[SI+0x1234]
000
[BX+SI]
[BX+DI]010
[DI]
011[DI]
100[BX+SI]
[SI+0x1234] 101[BX+SI+1234] [DI]
110[BP]
111[DI]
[BX] [DI] 次のモード、[SI+0x1234] 01、ハンドルに 8 ビットの符号付き変位を追加します。 この変位には、ModR/M バイトに続く 1 バイトが含まれます。 これは、 などのアドレッシング モードをサポートします。 。 モード 10 は、 などのアドレス指定モードの場合、変位が 2 バイト長であることを除いて類似しています[SI+0x1234]. 以下の表は、ModR/M バイトの 256 個すべての値の意味を示しています。 mod ビットは赤色で、
reg
経験の浅いビット、および r/m ビット青。 16ビット搭載ハンドルを強化する特殊なケース「disp16」をリストアップ ModR/M 値。 この表は、8 進数から 16 進数への要求が弱い場合、簡単なものになる可能性があることを示しています。 内デスク6-13による) ASM386アセンブリ言語リファレンス.
メモリ アクセスのレジスタの組み合わせは、正直なところランダムに見えるかもしれませんが、配列やデータ構造などの過度なレベルの言語のニーズを高めるように設計されています。 基本は、ハンドルを解決するために、パス レジスタ、インデックス レジスタ、および/またはマウントされたディスプレイスメントを追加することです。 6 パス レジスタは配列の先頭にレベルを合わせることができ、インデックス レジスタは配列内のオフセットを保持し、変位は配列エントリ内のトピックのオフセットを表します。 パスレジスタは
BX データまたは
BP スタック上のデータ用。 インデックス レジスタは SI (オファーインデックス) および [SI+0x1234] DI (休暇目標指数). 7 一部のアドレッシング関数は、ModR/M バイトではなく、オペコードによって処理されます。 たとえば、ModR/M バイトは
ADD AX を区別しません。 、[SI] と ADD [BX+SI],AX。 代わりに、2 つのバリアントは、命令のビット 1
によってよく知られています。 D または「パス」ビット
8 さらに、フレーズを操作するオペコードと、フレーズを操作するオペコードをぶら下げる方向がたくさんあります。バイトでは、オペコードのビット 0 でよく知られている W または監視ビット[BX+SI] D と W ビットは直交性の例です8086 命令の範囲内で機能を組み合わせて大量にブレンドすることができます。 たとえば、アドレッシング モードでは、8 種類のオフセット計算と 3 つのサイズのディスプレースメントおよび 8 つのターゲット レジスタが組み合わされています。 算術指示は、これらのアドレッシング モードを 8 つの ALU 操作と組み合わせたもので、それぞれが 1 バイトまたは観察に作用する可能性があります。 これらの組み合わせはすべて、マイクロコードの 1 つのブロックで実装され、少量のマイクロコードで十分な命令が実行されます。 (ただし、8086 の直交性を誇張してはなりません。多くの特別な条件と合理的に適合しない問題があります。)8086 マイクロコードの明確化
ほとんどの人は、マシン ディレクションをコンピューターが実行する基本的なステップと見なしています。 一方、多くのプロセッサ (8086 の側面) は、その下にもう 1 つのユーティリティ層 (マイクロコード) をぶら下げています。 マイクロコードを使用すると、複雑な常識ゲートから管理回路を構築するのではなく、管理の常識が基本的にコードに置き換えられます。 機械命令を機能させるために、コンピュータは、マイクロコードによって指定されたいくつかの単純なマイクロ方向を内部的に実行します。 )
8086 はハイブリッド ポテンシャルを発揮します: マイクロコードを発揮しますが、命令機能のマイティはゲート コモンで実装されます。検出。 これは、マイクロコードからの重複を根絶し、1978 年のノウハウのためにマイクロコードを十分に節約したことを意味します。 モードでは、マイクロコードはパラメーター化されます。 たとえば、マイクロコードは、一般的な算術/コモン センス ユニット (ALU) 操作と一般的なレジスタを指定できます。 ゲート常識は、どのスコーク動作を考案するか、正しいレジスターを解決するための命令を調べます。
8086 内のマイクロ命令は、以下で証明されるように 21 ビットにエンコードされます。 各マイクロ命令には、ソース レジスタからギャロップ ゴール レジスタへのスイッチがあり、それぞれが 5 ビットで指定されます。 最後のビットの意味は、型トピックに依存しています。 「ショート バウンス」は、16 のマイクロ方向の現代的なブロックによる条件付きバウンスです。 ALU 演算は、算術常識単位を構成して演算を発明します。 ブックキーピング操作とは、プリフェッチ キューのフラッシュから最新の命令の終了までのことです。 メモリ操作は、メモリを学習または書き込むためのバス サイクルをトリガーします。 「長いバウンス」は、16 のマウントされたマイクロコードの場所 (変換 ROM として知られる外部テーブルで指定) のいずれかへの条件付きバウンスです。 最後に、「長い名前」は、16 か所のうちの 1 つに対する条件付きサブルーチン名です。 8086 マイクロコードの詳細については、私の マイクロコードのウェブログを公開しました
. [SI+0x1234] アドレス指定用のマイクロコードの例 この部分では、いくつかのアドレッシング モードでの終了チェックと、それらがマイクロコードで実装されている手順を解決できました。 次の部分で、アドレッシング モードのマイクロコード全体を要約できます。 登録-登録操作 メモリアクセスの問題を説明する前に、レジスタ間命令から始めましょう: ADD BX,AX 追加 AX
~ [BX+SI] BX、
に常駐を格納BX. この命令には、オペコード ラベル 01 と ModR/M ラベル C3 (16 進数) があります。 マイクロコードが開始される前に、ハードウェアはオペコードのデコードを実行します。 チーム デコード ROM (以下) は、命令を複数のカテゴリに分類します。この命令には、D ビット、W ビット、および ALU 演算が組み込まれ、ModR/M バイトがあります。 オペコードと ModR/M バイトからフィールドが抽出され、レジスタ内の塊に格納されます。 ALU演算タイプ (
ADD) は 内に格納されます) ALU opr 登録。 ModR/M バイトから、reg 登録コード ([SI+0x1234] 斧
) は 内に格納されます。 N レジスタ、および r/m 登録コード ( BX) は、 M[DI] 登録。 (彼ら と ん レジスターは、プログラマーには見えないレジスターの内部にあり、それぞれがレジスターを指定する 5 ビットのレジスター コードを保持します。 9)
このデザインはチーム デコード ROM を表しています。 チーム デコード ROM は、2 層の NOR ゲートを備えた PLA (プログラマブル コモン センス アレイ) に近いものです。 その入力トレースは左下にあり、その出力はより単純で正確です.予備デコードが完了すると、この ALU 命令の以下のマイクロコードが実行されます。10 (3 つのマイクロ方向があるため、命令には 3 クロック サイクルかかります。) 各マイクロ命令には、スイッチと行動。 まず、Mで指定されるレジスタ (つまり [SI+0x1234] BX
) は、ALU の非永続 A レジスタ ( に移動されますtmpA)。 一方、ALU は
tmpA; XI[DI] は、ALU 演算が命令ビットによって指定されることを示します。つまり、[DI] 追加). [BX+SI] 2 番目の命令は、 で指定されたレジスタにヒットします。 N (すなわち 斧
) を ALU の にtmpB
) 登録。 アクション
NX は、マイクロコード エンジンが次のマシンの処理を開始できるように、次のクロージング マイクロ命令がここにあることを示します。命令。 終了マイクロ命令は、ALU の結果 (Σ) で示されるレジスタ内) M (つまり BX)。 F 。 WB,RNI[DI] (Plug Next Instruction) は、ここで中断が発生し、マイクロコード エンジンが次の機械語命令を処理できることを示します。 WB プレフィックスは、メモリ ライトバックが保留中の場合にアクションをスキップします (これはあってはならないことです)。 スイッチアクション M → tmpA XI tmpA
ALU rm↔ r: BX to tmpA[SI+0x1234] N → tmpB WB,NX AX to tmpB Σ → M WB,RNI F 結果をBXに、次の命令を逃げる.
このマイクロコードはとても3つのマイクロ方向にたくさん。 非常に一般的であることのリスト: マイクロコードは、実行されている ALU 操作や脆弱なレジスタを認識できません。 代わりに、マイクロコードは抽象的なレジスタと操作を処理しますが、ハードウェアは方向からのビットの使用を詳細に埋めます。 同一のマイクロコードは、8 つのさまざまな ALU 操作に対して脆弱です。 また、ご承知のとおり、複数のアドレッシング モードをサポートしています。
ギャロップゴールとしての記憶力の行使
8086 でのメモリ操作には、マイクロコードとハードウェアの両方が関係します。 メモリ操作では、レジスタ内の 2 つの操作が行われます: IND (間接) はメモリ ハンドルを保持しますが、OPR
(オペランド) は、学習または書き込みされる観察を保持します。 習慣的なメモリ マイクロ命令は R DS,P0、「プラス 0」をオンにしてファイル セクションから学習を開始します。 IND 後で登録します。 バス インターフェイス ユニットは、セクション レジスタを追加して物理ハンドルを計算し、メモリ バス サイクルを処理することによって、この操作を実行します。 その背景を踏まえて、説明書で確認してみましょう ADD [BX+SI],AX[SI+0x1234] に を追加斧
SI によってインデックス付けされたメモリ空間へ。 すぐに、ハードウェアは命令の診断を実行します (hex 01 04)。 ModR/M バイト内で、mod=00 (メモリ、変位なし)、reg=000 (AX)、および R/M=100 ([BX+SI])。 それから レジスタには のコードがロードされます) 斧 お早めに。 彼ら レジスタには がロードされます。 OPR (メモリ データ レジスタ) は、Team Decode ROM が命令にメモリ アドレッシング モードがあると判断したためです。 以下のマイクロコードは、[BX+SI] モード。 マイクロコード サブルーチンの重要な行は、 をロードするだけで有効なハンドルを計算します。 )tmpA で登録 SI
。 マイクロルーチン EAOFFSET[SI+1234] にジャンプします。 結果は [SI+0x1234] EALOAD (以下に説明する理由により)、メモリからラベルを大量に取得します。 特に、EALOAD[DI] はハンドルを に入れますIND、メモリからラベルを読み取り、ラベルを に入れる) )tmpB、サブルーチンから戻ります。 SI → tmpA JMP EAOFFSET [SI]: SI を tmpA に入れる[DI] tmpA → IND R DS,P0 イーロード: 学習記憶 OPR → tmpB RTN M → tmpA XI t mpA ALU rm↔r : tmpA への OPR N → tmpB WB,NX AX から tmpB[BX+SI] Σ → M WB,RNI F 結果をBXに、次の命令を逃げる W DS,P0 RNI 結果をメモリに書き込みます [BX] マイクロコードの実行は ALU rm↔r ルーチンは上記で説明されていますが、いくつかのバリエーションがあります。 彼ら レジスタは を示しますOPR )、したがって、メモリから学習するラベルは tmpA。 より早く、N レジスタは を指定します。 斧、レジスタが tmpB に入れられていることを開示します。 。 この場合、 WB,NX は、結果が動機をメモリに書き込むことを決定するため、 をスキップします。 NXT 手術。 ALU の結果 (Σ) は に格納されます) OPR M の指示に従って。 WB,RNI はスキップされるため、マイクロコードの実行は続行されます。 W DS,P0[BX+SI] マイクロ命令は結果を書き込みます (in [SI+0x1234] OPR ) を のメモリハンドルに) IND。 このレベルでは、
RNI は、マイクロコード シーケンスを終了します。 2 つの数字を足すために、ここでたくさんのことが行われています。 重要なレベルは、同一のマイクロコードがレジスタ ケース内で実行されることですが、効果は Mレジスタおよび条件付き WB コード。 さまざまなサブルーチンを実行することで、さまざまな効果的なハンドル計算も実行できる可能性があります。 ソースとしての記憶の行使 では、マイクロコードが命令内のように、メモリをソースとしてどのように実行するかを確認しましょう ADD AX,[BX+SI]。 この命令 (hex 03 04) は、同じ ModR/M バイトをすぐに持っているため、N レジスタ保持 斧
そしてその
Mレジスタ保持OPR[SI+0x1234] 。 一方、オペコードには D ビットが生きているため、M と [DI] ん レジスタはアクセス時にスワップされます。 したがって、マイクロコードが M、ラベル [DI] を取得します。 斧 から N
、 およびその逆。 (はい、ここは複雑です。) マイクロコードは、古い例と同じように始まります [BX+SI] に tmpB[BX+SI] そして ALU コードに戻ります。 一方、M と ん が反転し、AX ラベルが に入ります。 tmpA 一方、メモリラベルは
tmpB[SI+0x1234] 。 (このスイッチは足し算には関係ありませんが、引き算には問題になります。) 重要な違いは、ライトバックがあってはならないということです。 WB,NX は、次の機械語命令の処理を開始します。 終了マイクロ命令内で、結果が M、 を示す) 斧 登録。 最後に WB,RNI[BX+SI] は、次の機械語命令を実行します [SI+0x1234] SI → tmpA JMP EAOFFSET
[BX+SI]: tmpAにSIを入れる tmpA → IND R DS,P0 EALOAD: 記憶学習[DI] OPR → tmpB RTN M → tmpA XI tmpA ALU rm↔r : AX から tmpA N → tmpB WB,NX OPR to tmpB Σ → M WB,RNI F 結果を AX に返し、次の命令を回避します。 [SI+0x1234] 重要なレベルは、同じマイクロコードがメモリをソースとギャロップの目標として処理することです。単に環境によって D 少し。 まず、
D ビットは、スワップによってオペランドを逆にします M および N。 2d、WB 条件は、時代遅れのケースで発生したメモリへの書き戻しを未然に防ぎます。 変位の練習
メモリ アドレッシング モードは、オプションで符号付きディスプレースメントを強化します。 1 または 2 バイトの ADD AX, 命令で確認してみましょう。 . 16 進数では、この命令は 03 84 34 12 であり、最後の 2 バイトは変位であり、8086 が分のエンディアン番号を実行するため、反転されています。 mod ビットは 10 で、16 ビットの変位を示しますが、反対のビットは古い例と同じです。
8086 アドレッシング モード 加算命令から始めましょう 追加
dst, src[DI] 、ソース ラベルをギャロップ ゴール ラベルに追加し、ギャロップ ゴール内に存在を保存します。3 ソースとギャロップゴールは何ですか? メモリー? レジスター? アドレッシングモードはこの質問に答えます. さらに、レジスターをソースとして、もう 1 つのレジスターをギャロップ ゴールとして実行する必要があります。 以下の命令は AX をギャロップゴールとして登録し、BX をソースとして登録します。 したがって、 BX に 斧
結果を AX.[SI+0x1234] ADD AX, BX )BXレジスタの内容をAXレジスタに加算 [SI+0x1234] へのメモリ担当者の入場は、「有効なハンドル」を横切る角括弧で示されます 4 担当者への入場。 例えば、 ハンドル 1234 を持つメモリ空間を
[BP] 方法 のメモリ空間BP 関数を登録します。 より複雑なアドレス指定モードの場合、 [BP+SI+1234] のように、メモリ空間は BP および SI レジスタを定数 1234 (変位と呼ばれます)。 8086 では、ソースまたはギャロップ ゴールのメモリを使用する可能性がありますが、両方ではありません。 以下に、メモリをソースとして使用する例をいくつか示します: ADD AX, メモリ空間 1234 の内容を追加AXレジスタへ ADD CX, [BP] BPレジスタが指すメモリをCXレジスタに追加[BX+SI] DX を追加、[BX+SI+1234] 提供メモリハンドルは BX + SI + 定数 1234 ここにリストされているのは、ギャロップの目標としてメモリを使用する例です: 追加、 AX 内容に AX を追加メモリ空間の 1234 ADD [BP]、CX [DI] CX を BP レジスタが指すメモリに追加します 追加 [BX+SI+1234]、DX 休暇の目標のメモリ ハンドルは、BX + SI + 定数 1234 フレーズよりもさらにバイトを操作する必要があり、バイトレジスタを使用してアクセスする必要があります。メモリ バイト: 追加、[SI+1234] AXレジスタの下位バイトに加算[BX] 追加ああ、[SI+1234] AXレジスタの余分なバイトに加算 として お気付きかもしれませんが、8086 はさまざまなアドレッシング スキームをサポートしています。 それらがどのように実装されているかを知るには、まず、指示が ModR/M バイト内のアドレッシング スキームをどのようにエンコードするかを確認する必要があります ModR/Mバイト
ModR/M バイトは、アドレッシング モードを指定するために多くのオペコードに続きます。 このバイトはすべて公平性が複雑ですが、この部分でレベルを上げようとすることができました。 以下のデザインは、バイトがどのように損傷するかを 3 つのフィールドに分けて示しています:
5 モッド 一般モードを選択します reg レジスタを選択し、 r/m は、レジスタまたはメモリ モード。 私は、mod ビットは 11[DI] そしてその reg および r/m[SI+0x1234] 各ホールのフィールド d 以下で証明されるように、8 つのレジスタの 1 つ。 命令 ADD AX,BX 運動します reg
=011 運ぶ BX および r/m=000 運ぶ AX[BX+SI] であるため、ModR/M バイトはおそらく 11[SI+0x1234] 011000。 (レジスタの割り当ては、命令がフレーズ、バイト、またはセクション レジスタで動作するかどうかに依存しています。たとえば、監視命令では、001 CX[BX+SI] を選択します。 レジスタ、バイト命令では [DI] 001 は を選択します。 CLレジスタ、の下位バイトCX .)
次はアドレッシング モードは、メモリ引数とレジスタ引数を指定します。 この場合、 mod ビットは 00、reg[BX+SI] トピックは、上記のようにレジスタを指定し、r/m topic は、次の表に従ってメモリ ハンドルを指定します。 たとえば、命令 ADD [BX+SI],CX は reg=001 運ぶ [BX+SI] CX と r/m=[BX+SI] 100[DI] 運ぶ [BX+SI],したがって、ModR/M バイトはおそらく
00001100. 
r/m オペランド Take care of[SI+0x1234]
000
[BX+SI]
[BX+DI]010
[DI]
011[DI]
100[BX+SI]
[SI+0x1234] 101[BX+SI+1234] [DI]
110[BP]
111[DI]
[BX] [DI] 次のモード、[SI+0x1234] 01、ハンドルに 8 ビットの符号付き変位を追加します。 この変位には、ModR/M バイトに続く 1 バイトが含まれます。 これは、 などのアドレッシング モードをサポートします。 。 モード 10 は、 などのアドレス指定モードの場合、変位が 2 バイト長であることを除いて類似しています[SI+0x1234]. 以下の表は、ModR/M バイトの 256 個すべての値の意味を示しています。 mod ビットは赤色で、
reg
経験の浅いビット、および r/m ビット青。 16ビット搭載ハンドルを強化する特殊なケース「disp16」をリストアップ ModR/M 値。 この表は、8 進数から 16 進数への要求が弱い場合、簡単なものになる可能性があることを示しています。 内デスク6-13による) ASM386アセンブリ言語リファレンス.
メモリ アクセスのレジスタの組み合わせは、正直なところランダムに見えるかもしれませんが、配列やデータ構造などの過度なレベルの言語のニーズを高めるように設計されています。 基本は、ハンドルを解決するために、パス レジスタ、インデックス レジスタ、および/またはマウントされたディスプレイスメントを追加することです。 6 パス レジスタは配列の先頭にレベルを合わせることができ、インデックス レジスタは配列内のオフセットを保持し、変位は配列エントリ内のトピックのオフセットを表します。 パスレジスタは
BX データまたは
BP スタック上のデータ用。 インデックス レジスタは SI (オファーインデックス) および [SI+0x1234] DI (休暇目標指数). 7 一部のアドレッシング関数は、ModR/M バイトではなく、オペコードによって処理されます。 たとえば、ModR/M バイトは
ADD AX を区別しません。 、[SI] と ADD [BX+SI],AX。 代わりに、2 つのバリアントは、命令のビット 1
によってよく知られています。 D または「パス」ビット
8 さらに、フレーズを操作するオペコードと、フレーズを操作するオペコードをぶら下げる方向がたくさんあります。バイトでは、オペコードのビット 0 でよく知られている W または監視ビット[BX+SI] D と W ビットは直交性の例です8086 命令の範囲内で機能を組み合わせて大量にブレンドすることができます。 たとえば、アドレッシング モードでは、8 種類のオフセット計算と 3 つのサイズのディスプレースメントおよび 8 つのターゲット レジスタが組み合わされています。 算術指示は、これらのアドレッシング モードを 8 つの ALU 操作と組み合わせたもので、それぞれが 1 バイトまたは観察に作用する可能性があります。 これらの組み合わせはすべて、マイクロコードの 1 つのブロックで実装され、少量のマイクロコードで十分な命令が実行されます。 (ただし、8086 の直交性を誇張してはなりません。多くの特別な条件と合理的に適合しない問題があります。)8086 マイクロコードの明確化
ほとんどの人は、マシン ディレクションをコンピューターが実行する基本的なステップと見なしています。 一方、多くのプロセッサ (8086 の側面) は、その下にもう 1 つのユーティリティ層 (マイクロコード) をぶら下げています。 マイクロコードを使用すると、複雑な常識ゲートから管理回路を構築するのではなく、管理の常識が基本的にコードに置き換えられます。 機械命令を機能させるために、コンピュータは、マイクロコードによって指定されたいくつかの単純なマイクロ方向を内部的に実行します。 )
8086 はハイブリッド ポテンシャルを発揮します: マイクロコードを発揮しますが、命令機能のマイティはゲート コモンで実装されます。検出。 これは、マイクロコードからの重複を根絶し、1978 年のノウハウのためにマイクロコードを十分に節約したことを意味します。 モードでは、マイクロコードはパラメーター化されます。 たとえば、マイクロコードは、一般的な算術/コモン センス ユニット (ALU) 操作と一般的なレジスタを指定できます。 ゲート常識は、どのスコーク動作を考案するか、正しいレジスターを解決するための命令を調べます。
8086 内のマイクロ命令は、以下で証明されるように 21 ビットにエンコードされます。 各マイクロ命令には、ソース レジスタからギャロップ ゴール レジスタへのスイッチがあり、それぞれが 5 ビットで指定されます。 最後のビットの意味は、型トピックに依存しています。 「ショート バウンス」は、16 のマイクロ方向の現代的なブロックによる条件付きバウンスです。 ALU 演算は、算術常識単位を構成して演算を発明します。 ブックキーピング操作とは、プリフェッチ キューのフラッシュから最新の命令の終了までのことです。 メモリ操作は、メモリを学習または書き込むためのバス サイクルをトリガーします。 「長いバウンス」は、16 のマウントされたマイクロコードの場所 (変換 ROM として知られる外部テーブルで指定) のいずれかへの条件付きバウンスです。 最後に、「長い名前」は、16 か所のうちの 1 つに対する条件付きサブルーチン名です。 8086 マイクロコードの詳細については、私の マイクロコードのウェブログを公開しました
. [SI+0x1234] アドレス指定用のマイクロコードの例 この部分では、いくつかのアドレッシング モードでの終了チェックと、それらがマイクロコードで実装されている手順を解決できました。 次の部分で、アドレッシング モードのマイクロコード全体を要約できます。 登録-登録操作 メモリアクセスの問題を説明する前に、レジスタ間命令から始めましょう: ADD BX,AX 追加 AX
~ [BX+SI] BX、
に常駐を格納BX. この命令には、オペコード ラベル 01 と ModR/M ラベル C3 (16 進数) があります。 マイクロコードが開始される前に、ハードウェアはオペコードのデコードを実行します。 チーム デコード ROM (以下) は、命令を複数のカテゴリに分類します。この命令には、D ビット、W ビット、および ALU 演算が組み込まれ、ModR/M バイトがあります。 オペコードと ModR/M バイトからフィールドが抽出され、レジスタ内の塊に格納されます。 ALU演算タイプ (
ADD) は 内に格納されます) ALU opr 登録。 ModR/M バイトから、reg 登録コード ([SI+0x1234] 斧
) は 内に格納されます。 N レジスタ、および r/m 登録コード ( BX) は、 M[DI] 登録。 (彼ら と ん レジスターは、プログラマーには見えないレジスターの内部にあり、それぞれがレジスターを指定する 5 ビットのレジスター コードを保持します。 9)
このデザインはチーム デコード ROM を表しています。 チーム デコード ROM は、2 層の NOR ゲートを備えた PLA (プログラマブル コモン センス アレイ) に近いものです。 その入力トレースは左下にあり、その出力はより単純で正確です.予備デコードが完了すると、この ALU 命令の以下のマイクロコードが実行されます。10 (3 つのマイクロ方向があるため、命令には 3 クロック サイクルかかります。) 各マイクロ命令には、スイッチと行動。 まず、Mで指定されるレジスタ (つまり [SI+0x1234] BX
) は、ALU の非永続 A レジスタ ( に移動されますtmpA)。 一方、ALU は
tmpA; XI[DI] は、ALU 演算が命令ビットによって指定されることを示します。つまり、[DI] 追加). [BX+SI] 2 番目の命令は、 で指定されたレジスタにヒットします。 N (すなわち 斧
) を ALU の にtmpB
) 登録。 アクション
NX は、マイクロコード エンジンが次のマシンの処理を開始できるように、次のクロージング マイクロ命令がここにあることを示します。命令。 終了マイクロ命令は、ALU の結果 (Σ) で示されるレジスタ内) M (つまり BX)。 F 。 WB,RNI[DI] (Plug Next Instruction) は、ここで中断が発生し、マイクロコード エンジンが次の機械語命令を処理できることを示します。 WB プレフィックスは、メモリ ライトバックが保留中の場合にアクションをスキップします (これはあってはならないことです)。 スイッチアクション M → tmpA XI tmpA
ALU rm↔ r: BX to tmpA[SI+0x1234] N → tmpB WB,NX AX to tmpB Σ → M WB,RNI F 結果をBXに、次の命令を逃げる.
このマイクロコードはとても3つのマイクロ方向にたくさん。 非常に一般的であることのリスト: マイクロコードは、実行されている ALU 操作や脆弱なレジスタを認識できません。 代わりに、マイクロコードは抽象的なレジスタと操作を処理しますが、ハードウェアは方向からのビットの使用を詳細に埋めます。 同一のマイクロコードは、8 つのさまざまな ALU 操作に対して脆弱です。 また、ご承知のとおり、複数のアドレッシング モードをサポートしています。
ギャロップゴールとしての記憶力の行使
8086 でのメモリ操作には、マイクロコードとハードウェアの両方が関係します。 メモリ操作では、レジスタ内の 2 つの操作が行われます: IND (間接) はメモリ ハンドルを保持しますが、OPR
(オペランド) は、学習または書き込みされる観察を保持します。 習慣的なメモリ マイクロ命令は R DS,P0、「プラス 0」をオンにしてファイル セクションから学習を開始します。 IND 後で登録します。 バス インターフェイス ユニットは、セクション レジスタを追加して物理ハンドルを計算し、メモリ バス サイクルを処理することによって、この操作を実行します。 その背景を踏まえて、説明書で確認してみましょう ADD [BX+SI],AX[SI+0x1234] に を追加斧
SI によってインデックス付けされたメモリ空間へ。 すぐに、ハードウェアは命令の診断を実行します (hex 01 04)。 ModR/M バイト内で、mod=00 (メモリ、変位なし)、reg=000 (AX)、および R/M=100 ([BX+SI])。 それから レジスタには のコードがロードされます) 斧 お早めに。 彼ら レジスタには がロードされます。 OPR (メモリ データ レジスタ) は、Team Decode ROM が命令にメモリ アドレッシング モードがあると判断したためです。 以下のマイクロコードは、[BX+SI] モード。 マイクロコード サブルーチンの重要な行は、 をロードするだけで有効なハンドルを計算します。 )tmpA で登録 SI
。 マイクロルーチン EAOFFSET[SI+1234] にジャンプします。 結果は [SI+0x1234] EALOAD (以下に説明する理由により)、メモリからラベルを大量に取得します。 特に、EALOAD[DI] はハンドルを に入れますIND、メモリからラベルを読み取り、ラベルを に入れる) )tmpB、サブルーチンから戻ります。 SI → tmpA JMP EAOFFSET [SI]: SI を tmpA に入れる[DI] tmpA → IND R DS,P0 イーロード: 学習記憶 OPR → tmpB RTN M → tmpA XI t mpA ALU rm↔r : tmpA への OPR N → tmpB WB,NX AX から tmpB[BX+SI] Σ → M WB,RNI F 結果をBXに、次の命令を逃げる W DS,P0 RNI 結果をメモリに書き込みます [BX] マイクロコードの実行は ALU rm↔r ルーチンは上記で説明されていますが、いくつかのバリエーションがあります。 彼ら レジスタは を示しますOPR )、したがって、メモリから学習するラベルは tmpA。 より早く、N レジスタは を指定します。 斧、レジスタが tmpB に入れられていることを開示します。 。 この場合、 WB,NX は、結果が動機をメモリに書き込むことを決定するため、 をスキップします。 NXT 手術。 ALU の結果 (Σ) は に格納されます) OPR M の指示に従って。 WB,RNI はスキップされるため、マイクロコードの実行は続行されます。 W DS,P0[BX+SI] マイクロ命令は結果を書き込みます (in [SI+0x1234] OPR ) を のメモリハンドルに) IND。 このレベルでは、
RNI は、マイクロコード シーケンスを終了します。 2 つの数字を足すために、ここでたくさんのことが行われています。 重要なレベルは、同一のマイクロコードがレジスタ ケース内で実行されることですが、効果は Mレジスタおよび条件付き WB コード。 さまざまなサブルーチンを実行することで、さまざまな効果的なハンドル計算も実行できる可能性があります。 ソースとしての記憶の行使 では、マイクロコードが命令内のように、メモリをソースとしてどのように実行するかを確認しましょう ADD AX,[BX+SI]。 この命令 (hex 03 04) は、同じ ModR/M バイトをすぐに持っているため、N レジスタ保持 斧
そしてその
Mレジスタ保持OPR[SI+0x1234] 。 一方、オペコードには D ビットが生きているため、M と [DI] ん レジスタはアクセス時にスワップされます。 したがって、マイクロコードが M、ラベル [DI] を取得します。 斧 から N
、 およびその逆。 (はい、ここは複雑です。) マイクロコードは、古い例と同じように始まります [BX+SI] に tmpB[BX+SI] そして ALU コードに戻ります。 一方、M と ん が反転し、AX ラベルが に入ります。 tmpA 一方、メモリラベルは
tmpB[SI+0x1234] 。 (このスイッチは足し算には関係ありませんが、引き算には問題になります。) 重要な違いは、ライトバックがあってはならないということです。 WB,NX は、次の機械語命令の処理を開始します。 終了マイクロ命令内で、結果が M、 を示す) 斧 登録。 最後に WB,RNI[BX+SI] は、次の機械語命令を実行します [SI+0x1234] SI → tmpA JMP EAOFFSET
[BX+SI]: tmpAにSIを入れる tmpA → IND R DS,P0 EALOAD: 記憶学習[DI] OPR → tmpB RTN M → tmpA XI tmpA ALU rm↔r : AX から tmpA N → tmpB WB,NX OPR to tmpB Σ → M WB,RNI F 結果を AX に返し、次の命令を回避します。 [SI+0x1234] 重要なレベルは、同じマイクロコードがメモリをソースとギャロップの目標として処理することです。単に環境によって D 少し。 まず、
D ビットは、スワップによってオペランドを逆にします M および N。 2d、WB 条件は、時代遅れのケースで発生したメモリへの書き戻しを未然に防ぎます。 変位の練習
メモリ アドレッシング モードは、オプションで符号付きディスプレースメントを強化します。 1 または 2 バイトの ADD AX, 命令で確認してみましょう。 . 16 進数では、この命令は 03 84 34 12 であり、最後の 2 バイトは変位であり、8086 が分のエンディアン番号を実行するため、反転されています。 mod ビットは 10 で、16 ビットの変位を示しますが、反対のビットは古い例と同じです。
追加
dst, src[DI] 、ソース ラベルをギャロップ ゴール ラベルに追加し、ギャロップ ゴール内に存在を保存します。3 ソースとギャロップゴールは何ですか? メモリー? レジスター? アドレッシングモードはこの質問に答えます. さらに、レジスターをソースとして、もう 1 つのレジスターをギャロップ ゴールとして実行する必要があります。 以下の命令は AX をギャロップゴールとして登録し、BX をソースとして登録します。 したがって、 BX に 斧
結果を AX.[SI+0x1234] ADD AX, BX )BXレジスタの内容をAXレジスタに加算 [SI+0x1234] へのメモリ担当者の入場は、「有効なハンドル」を横切る角括弧で示されます 4 担当者への入場。 例えば、 ハンドル 1234 を持つメモリ空間を
[BP] 方法 のメモリ空間BP 関数を登録します。 より複雑なアドレス指定モードの場合、 [BP+SI+1234] のように、メモリ空間は BP および SI レジスタを定数 1234 (変位と呼ばれます)。 8086 では、ソースまたはギャロップ ゴールのメモリを使用する可能性がありますが、両方ではありません。 以下に、メモリをソースとして使用する例をいくつか示します: ADD AX, メモリ空間 1234 の内容を追加AXレジスタへ ADD CX, [BP] BPレジスタが指すメモリをCXレジスタに追加[BX+SI] DX を追加、[BX+SI+1234] 提供メモリハンドルは BX + SI + 定数 1234 ここにリストされているのは、ギャロップの目標としてメモリを使用する例です: 追加、 AX 内容に AX を追加メモリ空間の 1234 ADD [BP]、CX [DI] CX を BP レジスタが指すメモリに追加します 追加 [BX+SI+1234]、DX 休暇の目標のメモリ ハンドルは、BX + SI + 定数 1234 フレーズよりもさらにバイトを操作する必要があり、バイトレジスタを使用してアクセスする必要があります。メモリ バイト: 追加、[SI+1234] AXレジスタの下位バイトに加算[BX] 追加ああ、[SI+1234] AXレジスタの余分なバイトに加算 として お気付きかもしれませんが、8086 はさまざまなアドレッシング スキームをサポートしています。 それらがどのように実装されているかを知るには、まず、指示が ModR/M バイト内のアドレッシング スキームをどのようにエンコードするかを確認する必要があります ModR/Mバイト
ModR/M バイトは、アドレッシング モードを指定するために多くのオペコードに続きます。 このバイトはすべて公平性が複雑ですが、この部分でレベルを上げようとすることができました。 以下のデザインは、バイトがどのように損傷するかを 3 つのフィールドに分けて示しています:
5 モッド 一般モードを選択します reg レジスタを選択し、 r/m は、レジスタまたはメモリ モード。 私は、mod ビットは 11[DI] そしてその reg および r/m[SI+0x1234] 各ホールのフィールド d 以下で証明されるように、8 つのレジスタの 1 つ。 命令 ADD AX,BX 運動します reg
=011 運ぶ BX および r/m=000 運ぶ AX[BX+SI] であるため、ModR/M バイトはおそらく 11[SI+0x1234] 011000。 (レジスタの割り当ては、命令がフレーズ、バイト、またはセクション レジスタで動作するかどうかに依存しています。たとえば、監視命令では、001 CX[BX+SI] を選択します。 レジスタ、バイト命令では [DI] 001 は を選択します。 CLレジスタ、の下位バイトCX .)
次はアドレッシング モードは、メモリ引数とレジスタ引数を指定します。 この場合、 mod ビットは 00、reg[BX+SI] トピックは、上記のようにレジスタを指定し、r/m topic は、次の表に従ってメモリ ハンドルを指定します。 たとえば、命令 ADD [BX+SI],CX は reg=001 運ぶ [BX+SI] CX と r/m=[BX+SI] 100[DI] 運ぶ [BX+SI],したがって、ModR/M バイトはおそらく
00001100. 
r/m オペランド Take care of[SI+0x1234]
000
[BX+SI]
[BX+DI]010
[DI]
011[DI]
100[BX+SI]
[SI+0x1234] 101[BX+SI+1234] [DI]
110[BP]
111[DI]
[BX] [DI] 次のモード、[SI+0x1234] 01、ハンドルに 8 ビットの符号付き変位を追加します。 この変位には、ModR/M バイトに続く 1 バイトが含まれます。 これは、 などのアドレッシング モードをサポートします。 。 モード 10 は、 などのアドレス指定モードの場合、変位が 2 バイト長であることを除いて類似しています[SI+0x1234]. 以下の表は、ModR/M バイトの 256 個すべての値の意味を示しています。 mod ビットは赤色で、
reg
経験の浅いビット、および r/m ビット青。 16ビット搭載ハンドルを強化する特殊なケース「disp16」をリストアップ ModR/M 値。 この表は、8 進数から 16 進数への要求が弱い場合、簡単なものになる可能性があることを示しています。 内デスク6-13による) ASM386アセンブリ言語リファレンス.
メモリ アクセスのレジスタの組み合わせは、正直なところランダムに見えるかもしれませんが、配列やデータ構造などの過度なレベルの言語のニーズを高めるように設計されています。 基本は、ハンドルを解決するために、パス レジスタ、インデックス レジスタ、および/またはマウントされたディスプレイスメントを追加することです。 6 パス レジスタは配列の先頭にレベルを合わせることができ、インデックス レジスタは配列内のオフセットを保持し、変位は配列エントリ内のトピックのオフセットを表します。 パスレジスタは
BX データまたは
BP スタック上のデータ用。 インデックス レジスタは SI (オファーインデックス) および [SI+0x1234] DI (休暇目標指数). 7 一部のアドレッシング関数は、ModR/M バイトではなく、オペコードによって処理されます。 たとえば、ModR/M バイトは
ADD AX を区別しません。 、[SI] と ADD [BX+SI],AX。 代わりに、2 つのバリアントは、命令のビット 1
によってよく知られています。 D または「パス」ビット
8 さらに、フレーズを操作するオペコードと、フレーズを操作するオペコードをぶら下げる方向がたくさんあります。バイトでは、オペコードのビット 0 でよく知られている W または監視ビット[BX+SI] D と W ビットは直交性の例です8086 命令の範囲内で機能を組み合わせて大量にブレンドすることができます。 たとえば、アドレッシング モードでは、8 種類のオフセット計算と 3 つのサイズのディスプレースメントおよび 8 つのターゲット レジスタが組み合わされています。 算術指示は、これらのアドレッシング モードを 8 つの ALU 操作と組み合わせたもので、それぞれが 1 バイトまたは観察に作用する可能性があります。 これらの組み合わせはすべて、マイクロコードの 1 つのブロックで実装され、少量のマイクロコードで十分な命令が実行されます。 (ただし、8086 の直交性を誇張してはなりません。多くの特別な条件と合理的に適合しない問題があります。)8086 マイクロコードの明確化
ほとんどの人は、マシン ディレクションをコンピューターが実行する基本的なステップと見なしています。 一方、多くのプロセッサ (8086 の側面) は、その下にもう 1 つのユーティリティ層 (マイクロコード) をぶら下げています。 マイクロコードを使用すると、複雑な常識ゲートから管理回路を構築するのではなく、管理の常識が基本的にコードに置き換えられます。 機械命令を機能させるために、コンピュータは、マイクロコードによって指定されたいくつかの単純なマイクロ方向を内部的に実行します。 )
8086 はハイブリッド ポテンシャルを発揮します: マイクロコードを発揮しますが、命令機能のマイティはゲート コモンで実装されます。検出。 これは、マイクロコードからの重複を根絶し、1978 年のノウハウのためにマイクロコードを十分に節約したことを意味します。 モードでは、マイクロコードはパラメーター化されます。 たとえば、マイクロコードは、一般的な算術/コモン センス ユニット (ALU) 操作と一般的なレジスタを指定できます。 ゲート常識は、どのスコーク動作を考案するか、正しいレジスターを解決するための命令を調べます。
8086 内のマイクロ命令は、以下で証明されるように 21 ビットにエンコードされます。 各マイクロ命令には、ソース レジスタからギャロップ ゴール レジスタへのスイッチがあり、それぞれが 5 ビットで指定されます。 最後のビットの意味は、型トピックに依存しています。 「ショート バウンス」は、16 のマイクロ方向の現代的なブロックによる条件付きバウンスです。 ALU 演算は、算術常識単位を構成して演算を発明します。 ブックキーピング操作とは、プリフェッチ キューのフラッシュから最新の命令の終了までのことです。 メモリ操作は、メモリを学習または書き込むためのバス サイクルをトリガーします。 「長いバウンス」は、16 のマウントされたマイクロコードの場所 (変換 ROM として知られる外部テーブルで指定) のいずれかへの条件付きバウンスです。 最後に、「長い名前」は、16 か所のうちの 1 つに対する条件付きサブルーチン名です。 8086 マイクロコードの詳細については、私の マイクロコードのウェブログを公開しました
. [SI+0x1234] アドレス指定用のマイクロコードの例 この部分では、いくつかのアドレッシング モードでの終了チェックと、それらがマイクロコードで実装されている手順を解決できました。 次の部分で、アドレッシング モードのマイクロコード全体を要約できます。 登録-登録操作 メモリアクセスの問題を説明する前に、レジスタ間命令から始めましょう: ADD BX,AX 追加 AX
~ [BX+SI] BX、
に常駐を格納BX. この命令には、オペコード ラベル 01 と ModR/M ラベル C3 (16 進数) があります。 マイクロコードが開始される前に、ハードウェアはオペコードのデコードを実行します。 チーム デコード ROM (以下) は、命令を複数のカテゴリに分類します。この命令には、D ビット、W ビット、および ALU 演算が組み込まれ、ModR/M バイトがあります。 オペコードと ModR/M バイトからフィールドが抽出され、レジスタ内の塊に格納されます。 ALU演算タイプ (
ADD) は 内に格納されます) ALU opr 登録。 ModR/M バイトから、reg 登録コード ([SI+0x1234] 斧
) は 内に格納されます。 N レジスタ、および r/m 登録コード ( BX) は、 M[DI] 登録。 (彼ら と ん レジスターは、プログラマーには見えないレジスターの内部にあり、それぞれがレジスターを指定する 5 ビットのレジスター コードを保持します。 9)
このデザインはチーム デコード ROM を表しています。 チーム デコード ROM は、2 層の NOR ゲートを備えた PLA (プログラマブル コモン センス アレイ) に近いものです。 その入力トレースは左下にあり、その出力はより単純で正確です.予備デコードが完了すると、この ALU 命令の以下のマイクロコードが実行されます。10 (3 つのマイクロ方向があるため、命令には 3 クロック サイクルかかります。) 各マイクロ命令には、スイッチと行動。 まず、Mで指定されるレジスタ (つまり [SI+0x1234] BX
) は、ALU の非永続 A レジスタ ( に移動されますtmpA)。 一方、ALU は
tmpA; XI[DI] は、ALU 演算が命令ビットによって指定されることを示します。つまり、[DI] 追加). [BX+SI] 2 番目の命令は、 で指定されたレジスタにヒットします。 N (すなわち 斧
) を ALU の にtmpB
) 登録。 アクション
NX は、マイクロコード エンジンが次のマシンの処理を開始できるように、次のクロージング マイクロ命令がここにあることを示します。命令。 終了マイクロ命令は、ALU の結果 (Σ) で示されるレジスタ内) M (つまり BX)。 F 。 WB,RNI[DI] (Plug Next Instruction) は、ここで中断が発生し、マイクロコード エンジンが次の機械語命令を処理できることを示します。 WB プレフィックスは、メモリ ライトバックが保留中の場合にアクションをスキップします (これはあってはならないことです)。 スイッチアクション M → tmpA XI tmpA
ALU rm↔ r: BX to tmpA[SI+0x1234] N → tmpB WB,NX AX to tmpB Σ → M WB,RNI F 結果をBXに、次の命令を逃げる.
このマイクロコードはとても3つのマイクロ方向にたくさん。 非常に一般的であることのリスト: マイクロコードは、実行されている ALU 操作や脆弱なレジスタを認識できません。 代わりに、マイクロコードは抽象的なレジスタと操作を処理しますが、ハードウェアは方向からのビットの使用を詳細に埋めます。 同一のマイクロコードは、8 つのさまざまな ALU 操作に対して脆弱です。 また、ご承知のとおり、複数のアドレッシング モードをサポートしています。
ギャロップゴールとしての記憶力の行使
8086 でのメモリ操作には、マイクロコードとハードウェアの両方が関係します。 メモリ操作では、レジスタ内の 2 つの操作が行われます: IND (間接) はメモリ ハンドルを保持しますが、OPR
(オペランド) は、学習または書き込みされる観察を保持します。 習慣的なメモリ マイクロ命令は R DS,P0、「プラス 0」をオンにしてファイル セクションから学習を開始します。 IND 後で登録します。 バス インターフェイス ユニットは、セクション レジスタを追加して物理ハンドルを計算し、メモリ バス サイクルを処理することによって、この操作を実行します。 その背景を踏まえて、説明書で確認してみましょう ADD [BX+SI],AX[SI+0x1234] に を追加斧
SI によってインデックス付けされたメモリ空間へ。 すぐに、ハードウェアは命令の診断を実行します (hex 01 04)。 ModR/M バイト内で、mod=00 (メモリ、変位なし)、reg=000 (AX)、および R/M=100 ([BX+SI])。 それから レジスタには のコードがロードされます) 斧 お早めに。 彼ら レジスタには がロードされます。 OPR (メモリ データ レジスタ) は、Team Decode ROM が命令にメモリ アドレッシング モードがあると判断したためです。 以下のマイクロコードは、[BX+SI] モード。 マイクロコード サブルーチンの重要な行は、 をロードするだけで有効なハンドルを計算します。 )tmpA で登録 SI
。 マイクロルーチン EAOFFSET[SI+1234] にジャンプします。 結果は [SI+0x1234] EALOAD (以下に説明する理由により)、メモリからラベルを大量に取得します。 特に、EALOAD[DI] はハンドルを に入れますIND、メモリからラベルを読み取り、ラベルを に入れる) )tmpB、サブルーチンから戻ります。 SI → tmpA JMP EAOFFSET [SI]: SI を tmpA に入れる[DI] tmpA → IND R DS,P0 イーロード: 学習記憶 OPR → tmpB RTN M → tmpA XI t mpA ALU rm↔r : tmpA への OPR N → tmpB WB,NX AX から tmpB[BX+SI] Σ → M WB,RNI F 結果をBXに、次の命令を逃げる W DS,P0 RNI 結果をメモリに書き込みます [BX] マイクロコードの実行は ALU rm↔r ルーチンは上記で説明されていますが、いくつかのバリエーションがあります。 彼ら レジスタは を示しますOPR )、したがって、メモリから学習するラベルは tmpA。 より早く、N レジスタは を指定します。 斧、レジスタが tmpB に入れられていることを開示します。 。 この場合、 WB,NX は、結果が動機をメモリに書き込むことを決定するため、 をスキップします。 NXT 手術。 ALU の結果 (Σ) は に格納されます) OPR M の指示に従って。 WB,RNI はスキップされるため、マイクロコードの実行は続行されます。 W DS,P0[BX+SI] マイクロ命令は結果を書き込みます (in [SI+0x1234] OPR ) を のメモリハンドルに) IND。 このレベルでは、
RNI は、マイクロコード シーケンスを終了します。 2 つの数字を足すために、ここでたくさんのことが行われています。 重要なレベルは、同一のマイクロコードがレジスタ ケース内で実行されることですが、効果は Mレジスタおよび条件付き WB コード。 さまざまなサブルーチンを実行することで、さまざまな効果的なハンドル計算も実行できる可能性があります。 ソースとしての記憶の行使 では、マイクロコードが命令内のように、メモリをソースとしてどのように実行するかを確認しましょう ADD AX,[BX+SI]。 この命令 (hex 03 04) は、同じ ModR/M バイトをすぐに持っているため、N レジスタ保持 斧
そしてその
Mレジスタ保持OPR[SI+0x1234] 。 一方、オペコードには D ビットが生きているため、M と [DI] ん レジスタはアクセス時にスワップされます。 したがって、マイクロコードが M、ラベル [DI] を取得します。 斧 から N
、 およびその逆。 (はい、ここは複雑です。) マイクロコードは、古い例と同じように始まります [BX+SI] に tmpB[BX+SI] そして ALU コードに戻ります。 一方、M と ん が反転し、AX ラベルが に入ります。 tmpA 一方、メモリラベルは
tmpB[SI+0x1234] 。 (このスイッチは足し算には関係ありませんが、引き算には問題になります。) 重要な違いは、ライトバックがあってはならないということです。 WB,NX は、次の機械語命令の処理を開始します。 終了マイクロ命令内で、結果が M、 を示す) 斧 登録。 最後に WB,RNI[BX+SI] は、次の機械語命令を実行します [SI+0x1234] SI → tmpA JMP EAOFFSET
[BX+SI]: tmpAにSIを入れる tmpA → IND R DS,P0 EALOAD: 記憶学習[DI] OPR → tmpB RTN M → tmpA XI tmpA ALU rm↔r : AX から tmpA N → tmpB WB,NX OPR to tmpB Σ → M WB,RNI F 結果を AX に返し、次の命令を回避します。 [SI+0x1234] 重要なレベルは、同じマイクロコードがメモリをソースとギャロップの目標として処理することです。単に環境によって D 少し。 まず、
D ビットは、スワップによってオペランドを逆にします M および N。 2d、WB 条件は、時代遅れのケースで発生したメモリへの書き戻しを未然に防ぎます。 変位の練習
メモリ アドレッシング モードは、オプションで符号付きディスプレースメントを強化します。 1 または 2 バイトの ADD AX, 命令で確認してみましょう。 . 16 進数では、この命令は 03 84 34 12 であり、最後の 2 バイトは変位であり、8086 が分のエンディアン番号を実行するため、反転されています。 mod ビットは 10 で、16 ビットの変位を示しますが、反対のビットは古い例と同じです。