サーチ…


備考

レジスタとは何ですか?

プロセッサは数値(数値)を操作できますが、これらは最初にどこかに格納する必要があります。データは主にメモリに格納されますが、通常はメモリにも格納されている命令オペコードの内部に格納されています。プロセッサに直接配置された特別なオンチップメモリ​​( レジスタと呼ばます)に格納さます。

レジスタ内の値を処理するには、アドレスでアドレス指定する必要はありませんが、たとえばax x86、 A Z80、またはARMのr0ような特殊なニーモニックの名前が使用されます。

いくつかのプロセッサは、ほぼすべてのレジスタが等しく、すべての目的(多くの場合RISCプロセッサグループ)で使用できるように構築されていますが、いくつかのレジスタのみが算術演算に使用される場合もあります(早期CPUの「アキュムレータ」 )およびメモリアドレッシング専用の他のレジスタ

プロセッサ・チップ上に直接メモリを使用して、この構成は、巨大なパフォーマンス含意を有し、登録するバックを格納レジスタから2つの数値を追加すると、通常、ARMプロセッサ上のプロセッサ(例により最短時間で行われる: ADD r2,r0,r1設定r2します(r0 + r1)値をシングルプロセッササイクルで(r0 + r1)ます)。

逆に、オペランドの1つがメモリ位置を参照していると、プロセッサはメモリチップから値が到着するのを待っている間にストールします(x86ではL0キャッシュの値を0から数百値がどのキャッシュにもなく、メモリDRAMチップから直接読み取らなければならないときのCPUサイクル)。

したがって、プログラマがいくつかのデータ処理コードを作成しているとき、彼は通常、処理中にすべてのデータをレジスタに入れて最高のパフォーマンスを得ることを望んでいます。それが不可能で、メモリの読み込み/書き込みが必要な場合は、それらを最小限に抑え、特定のプラットフォームのキャッシュ/メモリアーキテクチャと協力するパターンを形成する必要があります。

ビット単位のレジスタのネイティブサイズは、 Z80「8ビットプロセッサ」80386「32ビットプロセッサ」などのプロセッサをグループ化するためによく使用されますが、そのグループ化はほとんどありません。例えば、Z80は、ネイティブの16ビット値を形成し、レジスタのペアでも動作し、32ビット80686 CPUは、ネイティブ64ビットレジスタで動作するMMX命令を有しています。

Zilog Z80レジスタ

レジスタ:8ビット: ABCDEHLFIR 、16ビット: SPPCIXIY 、およびいくつかの8bレジスタのシャドウ: A'B'C'D'E'H'L'F'

大部分の8ビットレジスタは、 AFBCDEHL 16ビットレジスタとしてペアでも使用できます。

SPスタックポインタであり 、スタックメモリの底部をマークします( PUSH / POP / CALL / RET命令で使用されます)。
PCは現在実行されている命令を指すプログラムカウンタです。
I割り込みレジスタでIM 2割り込みモードのベクタテーブルアドレスの上位バイトを供給します。
Rリフレッシュレジスタで、CPUがオペコード(またはオペコードプレフィックス)をフェッチするたびにインクリメントします。
一部のZ80プロセッサでは、 IX 8ビット部分をIXH:IXLとして操作するための非公式な指示がありますIYH:IYLIYIYH:IYLです。

シャドウ・バリアントにはどの命令でも直接アクセスすることはできませんEX AF,AF'命令はAFAF'間でスワップし、 EXX命令はBC,DE,HLBC',DE',HL'とスワップします。


値をレジスタにロードする:

    ; from other register
    LD   I,A        ; copies value in A into I (8 bit)
    LD   BC,HL      ; copies value in HL into BC (16 bit)
    ; directly with value encoded in instruction machine code
    LD   B,d8       ; 8b value d8 into B
    LD   DE,d16     ; 16b value d16 into DE
    ; from a memory (ROM/RAM)
    LD   A,(HL)     ; value from memory addressed by HL into A
    LD   A,(a16)    ; value from memory with address a16 into A
    LD   HL,(a16)   ; 16b value from memory with address a16 into HL
    POP  IX         ; 16b value popped from stack into IX
    LD   A,(IY+a8)  ; IX and IY allows addressing with 8b offset
    ; from I/O port (for writing value at I/O port use "OUT")
    IN   A,(C)      ; reads I/O port C, value goes to A

可能なソースオペランドとデスティネーションオペランドの正しい組み合わせは限定されています(例えばLD H,(a16)は存在しません)。


メモリに値を格納する:

    LD   (HL),D     ; value D stored into memory addressed by HL
    LD   (a16),A    ; value A into memory with address a16
    LD   (a16),HL   ; value HL into 16b of memory with address a16
    LD   (IX+a8),d8 ; value d8 into memory at address IX+a8
    LD   (IY+a8),B  ; value B into memory at address IY+a8
    ; specials ;)
    PUSH DE         ; 16b value DE pushed to stack
    CALL a16        ; while primarily used for execution branching
      ; it also stores next instruction address into stack

x86レジスタ

32ビットの世界では、汎用レジスタは3つの一般的なクラスに分類されます:16ビットの汎用レジスタ、32ビットの拡張汎用レジスタ、および8ビットレジスタの半分です。これらの3つのクラスは、まったく異なる3つのレジスタセットを全く表さない。 16ビットと8ビットのレジスタは、実際は32ビットレジスタの領域の名前です。 x86 CPUファミリのレジスタの増加は、古いCPUに存在するレジスタを拡張することによって実現されています

AX、BX、CX、DX、BP、SI、DI、SPの8つの16ビット汎用レジスタがあります。 16ビット以下で表現できる任意の値を配置することができます。

Intelがx86アーキテクチャを1986年に32ビットに拡張したとき、8つのレジスタすべてのサイズを2倍にし、各レジスタ名の前にEを付けて新しい名前を付けると、EAX、EBX、ECX、EDX、EBP、ESI、 EDI、およびESP。

x86_64では、レジスタのサイズが2倍になり、いくつかの新しいレジスタが追加されました。 RAX / r0、RBX / r3、RCX / r1、RDX / r2、RBP / r5、RSI / r6、RDI / r7、RSP / r4これらのレジスタは64ビット幅で、名前はスラッシュ(代替レジスタ名を示すために使用)です。 R8、R9、R10、R11、R12、R13、R14、R15である。

汎用レジスタは技術的に何でも使用できますが、各レジスタには代替/主目的もあります。

  • AX(アキュムレータ)は算術演算で使用されます。
  • CX(カウンタ)は、シフトおよび回転命令で使用され、ループに使用されます。
  • DX(データ)は、算術演算とI / O演算で使用されます。
  • データへのポインタとして使用されるBX(ベース)(特に、セグメント化モードのときにDSセグメントレジスタへのオフセットとして)。
  • SP(スタック)はスタックの先頭を指します。
  • BP(スタックベース)は、スタックのベースを指します。
  • SI(source)は、ストリーム操作(たとえばlodsb )のためにメモリ内のソースを指します。
  • DI(デスティネーション)は、ストリーム操作のメモリ内のデスティネーションを指します( stosb )。

セグメント・モードで使用されるセグメント・レジスタは、メモリ内の異なるセグメントを指します。各16ビットセグメントレジスタは、64k(16ビット)のデータを表示します。セグメント・レジスタがメモリ・ブロックを指し示すように設定された後、レジスタ( BXSIDI )をセグメント・レジスタへのオフセットとして使用して、64k空間内の特定の位置にアクセスすることができます。

6つのセグメントレジスタとその用途は次のとおりです。

登録フルネーム説明
SS スタックセグメントスタックへのポイント
CS コードセグメント CPUがコードを取得するために使用する
DS データセグメント MOV操作のデフォルトのレジスタ
ES 余分なセグメント余分なデータセグメント
FS 余分なセグメント余分なデータセグメント
GS 余分なセグメント余分なデータセグメント

x64レジスタ

x64アーキテクチャーは古いx86アーキテクチャーの進化であり、以前のアーキテクチャーとの互換性を維持しています(x86レジスターはまだ利用可能です)が、新しい機能も導入しました。

  • レジスタの容量は64ビットになりました。
  • さらに8つの汎用レジスタがあります。
  • セグメントレジスタは64ビットモードで強制的に0になります。
  • 各レジスタの下位32ビット、16ビット、8ビットが使用可能になりました。

一般的用途

登録サブレジスタ(ビット)
RAX アキュムレータ EAX(32)、AX(16)、AH(8)、AL(8)
RBX ベース EBX(32)、BX(16)、BH(8)、BL(8)
RCX カウンタ ECX(32)、CX(16)、CH(8)、CL(8)
RDX データ EDX(32)、DX(16)、DH(8)、DL(8)
RSI ソース ESI(32)、SI(16)、SL(8)
RDI EDI(32)、DI(16)、DL(8)
RBP ベースポインタ EBP(32)、BP(16)、BPL(8)
RSP スタックポインタ ESP(32)、SP(16)、SPL(8)
R8〜R15 新規登録 R8D-R15D(32)、R8W-R15W(16)、R8B-R15B(8)

注意

新しいレジスタの下位ビットをアドレス指定するために使用される接尾辞は、

  • Bバイト、8ビット。
  • Wワード、16ビット;
  • Dダブルワード、32ビット。


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow