私は現在、レジスタ遅延やディスプレースメントなど、いくつかのアドレッシング モードをサポートする小さな CPU インタープリターを構築しています。これは、従来の IF-ID-EX-MEM-WB RISC パイプラインを利用しています。デコードされたアドレス モード オペランドの値がパイプラインのどの段階であるか。例えば:
addw r9, (r2), 8(r3)
(r2) と 8(r3) が実際の値にデコードされるのはどの段階ですか?
私は現在、レジスタ遅延やディスプレースメントなど、いくつかのアドレッシング モードをサポートする小さな CPU インタープリターを構築しています。これは、従来の IF-ID-EX-MEM-WB RISC パイプラインを利用しています。デコードされたアドレス モード オペランドの値がパイプラインのどの段階であるか。例えば:
addw r9, (r2), 8(r3)
(r2) と 8(r3) が実際の値にデコードされるのはどの段階ですか?
面白い質問です。
RISC アーキテクチャの特性の 1 つは、レジスタ間操作です。つまり、ADD などの計算命令のすべてのオペランドは、既にレジスターに存在している必要があります。これにより、RISC 実装は、質問で言及した IF-ID-EX-MEM-WB パイプラインなどの通常のパイプラインを利用できます。この制約により、メモリ アクセスと例外も簡素化されます。たとえば、メモリからデータを読み取る唯一の命令がロード命令であり、これらの命令がレジスタ + ディスプレースメントのような単純なアドレス指定モードしか持たない場合、特定の命令は最大 1 つのメモリ保護例外を発生させる可能性があります。
対照的に、CISC アーキテクチャでは通常、レジスタ間接などの豊富なオペランド アドレッシング モードが許可され、質問のようにインデックスが付けられます。これらのアーキテクチャの実装には、多くの場合、不規則なパイプラインがあり、オペランドが計算 (ADD など) に使用可能になる前に 1 つまたは複数のメモリ アクセスが発生するため、ストールする可能性があります。
それにもかかわらず、マイクロアーキテクトは CISC アーキテクチャのパイプライン化に成功しています。たとえば、Intel 486 には、オペランドと結果をメモリに読み書きできるパイプラインがありました。したがって、ADD [eax],42 を実装する場合、8 KB の d キャッシュから [eax] を読み取るパイプライン ステージ、追加を実行するパイプライン ステージ、合計を [eax] に書き戻す別のパイプライン ステージがありました。 .
CISC 命令とオペランドの使用は動的に非常に混在し、不規則であるため、最悪の場合を考慮してパイプライン設計をかなり長くする必要があります。たとえば、複数のメモリ読み取りでオペランドにアクセスし、メモリ書き込みで結果を書き戻すなどです。必要に応じて、追加のメモリ アクセスを挿入するためにパイプラインをストールする必要があります。
したがって、これらの CISCy アドレッシング モードに対応するには、IF-ID-EA-RD1-RD2-EX-WR パイプラインが必要になる場合があります (EA=eff addr、RD1=read op 1、RD2=read op 2、WR=write result to RAM)またはregファイル)。
ハッピーハッキング。
Jan Grayが前述したように、実行しようとしている命令は、このパイプラインでは実際には機能しません。MEMステージでデータをロードし、EXステージ(memの前)でデータを計算する必要があります。
ただし、別の関連する質問に答えるには、次のことを行います。
Load R9, 8(R3)
'value-moddedオペランドの値'の値は、EXステージで計算されます。