レジスタ、ハードウェア レジスタ、プログラム レジスタ、レジスタ ファイルという用語を聞いたことがあります。
これらすべての違いは何ですか?アセンブリでは、EAXレジスタのタイプは何ですか? プログラム登録?
レジスタ、ハードウェア レジスタ、プログラム レジスタ、レジスタ ファイルという用語を聞いたことがあります。
これらすべての違いは何ですか?アセンブリでは、EAXレジスタのタイプは何ですか? プログラム登録?
レジスタはCPU内部の記憶領域です。以下にいくつかの定義を示します。
レジスタは、最も基本的なデータ ストレージ デバイスです。これらが主な違いです。
レジスタファイルは、一般に、計算に使用できるように編成されたレジスタの大きなコレクションです。最新のプロセッサでは、レジスタ ファイル内の複数のレジスタに格納された値の間ですべての計算が実行されます。
ハードウェア レジスタは、通常、構成およびステータス情報を格納するレジスタを指します。これは、プロセッサまたは一部の外部ハードウェア I/O デバイス用である可能性があります。
プログラムレジスタは、プロセッサによって実行されている現在の命令のメモリ位置を格納する特別なレジスタであるプログラムカウンタを指す場合があります。
レジスタは、CPU 内にある小さなメモリです。さまざまなタスクを実行するためにアセンブリ言語によって使用されます。
プログラムレジスタとは、プログラムカウンタを意味するのでしょうか?
汎用レジスタ、特殊用途のレジスタ (プログラム カウンタ レジスタなど)、その他さまざまなレジスタ (メモリ/セグメント レジスタ、SSE) があります。
EAX、EBX などは、標準の汎用レジスタです。好きなように使用できます。通常、戻り値はEAXに入れることになっていますが、基本的にはそれだけです。次に、スタックの先頭を指すスタック ポインター EBP があります。最後に、現在の命令 EIP を指すカウンターをプログラムする必要があります。x86 では、64 ビット整数の計算を行うときに 2 つのレジスタが融合する特殊なケースがいくつかあります。文字列命令には、さらに特殊なケースが存在します。アセンブリを学習しようとしている場合、より多くのレジスタを備えた PowerPC から始めるのが最も簡単で、それらすべてを制限なく自由に使用できます。
もちろん、これらのレジスタはすべてハードウェア レジスタです。つまり、CPU に物理的に組み込まれています ;) それらが存在する場所は、レジスタ ファイルと呼ばれます。
表示できるレジスターの他のタイプは、レジスター ( Parrot ) を使用する仮想マシンがある場合、「仮想レジスター」を取得し、後で実際のレジスターに割り当てられることです。これは、自分でコンパイラを作成するときにできることと似ています。基本的に、無制限の量のレジスタを想定し (つまり、使用ごとに新しいレジスタを生成します)、別のフェーズで実際のレジスタへの変換を行います (レジスタ割り当て)。 )。
「ハードウェア レジスタ」は、一部のハードウェア デバイス内の場所を指すこともあります。たとえば、UART (COM ポート) は、キャビネットの外側から見ると 9 ピンまたは 25 ピンの D 字型コネクタのように見えますが、デバイス ドライバーからは、複数の構成レジスタ、ステータス レジスタ、次の文字を保持するデータ レジスタのように見えます。送信し、最後に受信した文字。(細かいところは割愛してます。)
x86 アーキテクチャでは、これらのレジスタは通常、I/O 命令でアクセスされる特別な物理アドレス空間に配置されます。他のプラットフォームでは、ハードウェア レジスタが通常のメモリ空間の隅にマップされるのが一般的です。どちらの場合でも、オペレーティング システムとそのデバイス ドライバーの重要な役割の 1 つは、アプリケーション コードがハードウェア レジスタの場所とその意味の詳細を知る必要がないようにすることです。
一部の種類のハードウェア デバイスでは、メモリとハードウェア レジスタの区別が明確ではありません。たとえば、ビデオ アダプタには、個々のピクセルの色と明るさの値を保持するフレーム バッファと呼ばれるメモリ ブロックが含まれています。そのメモリは大きなハードウェア レジスタですか、それとも興味深い副作用を持つ単なるバッファですか?
質問に関連して、考慮すべきレジスターには 2 つの一般的なタイプがあります。
ハードウェア レジスタはクロックされ (クロック ティックで更新)、プロセッサ回路の物理設計で使用されます。
プログラム レジスタはランダム アクセス メモリであり、CPU 内のレジスタ ファイルに保持されます。アセンブリ/マシン コード命令は、%eax、%esp、%rdi、%edi などの名前でこれらのレジスタにアクセスします。