Assembly Language
レジスタ
サーチ…
備考
レジスタとは何ですか?
プロセッサは数値(数値)を操作できますが、これらは最初にどこかに格納する必要があります。データは主にメモリに格納されますが、通常はメモリにも格納されている命令オペコードの内部に格納されています。プロセッサに直接配置された特別なオンチップメモリ( レジスタと呼ばれます)に格納されます。
レジスタ内の値を処理するには、アドレスでアドレス指定する必要はありませんが、たとえば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ビット: A
、 B
、 C
、 D
、 E
、 H
、 L
、 F
、 I
、 R
、16ビット: SP
、 PC
、 IX
、 IY
、およびいくつかの8bレジスタのシャドウ: A'
、 B'
、 C'
、 D'
、 E'
、 H'
、 L'
、 F'
大部分の8ビットレジスタは、 AF
、 BC
、 DE
、 HL
16ビットレジスタとしてペアでも使用できます。
SP
はスタックポインタであり 、スタックメモリの底部をマークします( PUSH
/ POP
/ CALL
/ RET
命令で使用されます)。
PC
は現在実行されている命令を指すプログラムカウンタです。
I
は割り込みレジスタで 、 IM 2
割り込みモードのベクタテーブルアドレスの上位バイトを供給します。
R
はリフレッシュレジスタで、CPUがオペコード(またはオペコードプレフィックス)をフェッチするたびにインクリメントします。
一部のZ80プロセッサでは、 IX
8ビット部分をIXH:IXL
として操作するための非公式な指示がありますIYH:IYL
とIY
はIYH:IYL
です。
シャドウ・バリアントにはどの命令でも直接アクセスすることはできませんEX AF,AF'
命令はAF
とAF'
間でスワップし、 EXX
命令はBC,DE,HL
をBC',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ビット)のデータを表示します。セグメント・レジスタがメモリ・ブロックを指し示すように設定された後、レジスタ( BX
、 SI
、 DI
)をセグメント・レジスタへのオフセットとして使用して、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ビット。