私はテスト用紙でこの質問に遭遇しました。それは、与えられたアドレッシングモードのどれがより速いですか? なんで?
- レジスタ・アドレッシング・モード
- ダイレクトアドレッシングモード
今私によれば、レジスタはコンピュータ内で最速のメモリ位置であるため、レジスタアドレッシングモードはより高速である必要があります。これはそれに対する正しい答えですか?
助けてください。ありがとう
私はテスト用紙でこの質問に遭遇しました。それは、与えられたアドレッシングモードのどれがより速いですか? なんで?
今私によれば、レジスタはコンピュータ内で最速のメモリ位置であるため、レジスタアドレッシングモードはより高速である必要があります。これはそれに対する正しい答えですか?
助けてください。ありがとう
2 つのアドレッシング モードの違いは... アドレスのソースです... 直接アドレッシング モードの場合、アクセスされる項目のアドレスは、命令でエンコードされたイミディエイトであるため、命令はより大きく、場合によってははるかに大きくなります。したがって、アクセスするにはより多くのクロックサイクルが必要です。理想的には、オペコードの直後のバイトであり、オペコードのフェッチにより、少なくともその背後にあるキャッシュラインがフェッチされるため、キャッシュ内にあります。最も古い x86 プラットフォーム以外のもの残りの命令と、次のいくつか/多くの命令が既にフェッチされ、パイプ内にない場合、命令を実行している場所にどのように到達するかわかりません。古い x86 プロセッサでさえ、ある程度のサイズのプリフェッチ キューを持っていました。
レジスター・アドレッシングとは、アクセスされる項目のアドレスがレジスター内にあることを意味します。アドレスがすでにそこにあると仮定すると、より大きな命令、余分なサイクル、命令のために焼かれたキャッシュラインの多くが発生しないため、これは高速です。この引数に注意する必要があるのは、たとえば、直前の命令が即値アドレスをレジスタにロードしている場合です。
mov ax,[1000h]
mov ax,[bx]
2 番目のものは、命令サイズと追加のキャッシュの焼き付きとサイクルがかかるため、最初のものよりも高速です (このレベルで比較できるものについて)。
しかし
mov ax,[1000h]
mov bx,1000h
mov ax,[bx]
直接アドレス指定は、(比較可能なものについて) フェッチと実行にかかるサイクルが全体的に少ないため、高速です。
比較できるものとはどういう意味ですか? アドレッシング モードは、アドレスがどこから来るかに関係しています。その命令のEXECUTEを開始してメモリサイクルを実行すると、2つは等しくなります。これはバス上のアドレスであり、2つの命令を比較するとデータサイズは同じです。一部のテスト プログラムでは、データが常にデータ キャッシュにあるという理由だけで、直接アドレス指定の方が高速である場合が非常によくあります。したがって、2 つの命令間で比較できるのは、命令のサイズであり、それがサイクルとキャッシュ ラインにつながります。1 つのキャッシュ ラインは多くのレジスタ ベースの命令を保持できますが、直接/即時ベースの命令は少数しか保持できません。したがって、直接/即時を使用すると、機会費用が発生し、プログラムの実行時に全体的により多くのメモリ サイクルが発生します。はい、これらのサイクルの多くは、リモートで最新のもので並行しています。
したがって、これらのタイプの質問は、命令セットを理解しているかどうか、および返される詳細に応じて、実際のコストが何であるかを理解しているかどうかに関係しています。同様に、経験がなければ、キャッシュに基づいて実験を作成する必要があるため、単純に実験を試みるだけでは失敗するか、違いが見られない可能性があります。
Michael Abrash 著 The Zen of Assembly Language という本を強くお勧めします。
1 つが不完全な大きな黒いグラフィック プログラミング ブックに付属している無料のものではありません。状態の良い中古本を手に入れることができます(2本目を購入しましたが、店で購入して本棚に保管していたオリジナルよりも優れていました)。8088 と 8086 に関する詳細は、本が印刷された時点では古くなっています。それは本の重要性ではありません。重要なのは、問題に対処する方法、問題について考える方法、および問題について基本的な洞察を得る方法を理解することです。舞台裏で進んでいます。今日はかなり複雑ですが、それでも理解できますが、今日見ているものに飛び込む前に、このような基礎から始めることをお勧めします. 特に x86 を使用する場合 (バスやキャッシングなどを調べ始めるときは、最初に x86 以外の何かを学ぶことを強くお勧めします)。 http://github.com/dwelch67/amber_samples。オープン ソース ツールを使用してアンバー プロセッサ (arm2 クローン) をクリーンアップして利用できるようにしたので、プロセッサ内で実行されているものを確認できます。琥珀の 1 つのバージョンにはキャッシュがあります。再び足がかり、mmus やマルチコアの追加など、複雑さが増すだけです。
非常に短い答えです。直接アドレッシングは、2 つの命令のみを比較する場合、レジスタ アドレッシングよりも長い命令、より多くのサイクルを使用してエンコードします。メモリの副作用、キャッシュなどにより、違いが混乱したり中和されたりする可能性があります。
レジスタアクセスは最速です。ただし、アクセスしているメモリ データが既に CPU のデータ キャッシュにある場合、メモリ アクセスは高速になります。