8086/8080 マイクロプロセッサを研究しています。それらで使用されるレジスタには名前があり、
- ラックス
- RBX
- RCX
- RDX
レジスタの名前が R8、R9... から R15 の場合、R8 まで続きます。知りたかった
また、レジスタ RAX、RBX などを R1、R2 などと呼びますか?
8086/8080 マイクロプロセッサを研究しています。それらで使用されるレジスタには名前があり、
レジスタの名前が R8、R9... から R15 の場合、R8 まで続きます。知りたかった
また、レジスタ RAX、RBX などを R1、R2 などと呼びますか?
標準的な慣行は、最初の 8 つのレジスターがその歴史的な名前を保持することです。この規則は、Intel と AMD のドキュメント、およびほとんどのアセンブラで使用されています。
その理由は、これらの名前がレジスターの機能のニーモニックだからです。たとえばrsp
、スタック ポインターとして突き出ます。r4
それほどではありません。対照的に、新しいレジスタには特定の機能はありません。
そうは言っても、いつでもマクロを使用しr0-r7
て asを定義できますrax,rcx,rdx,rbx,rsp,rbp,rsi,rdi
。たとえば、これらの定義をnasmで取得できます
%use altreg
繰り返しますが、これは非標準であり、コードが読みにくくなります。
まず、8086/80386/x86-64 と 8080/8085 はまったく異なるアーキテクチャです。8080 は8 ビットのCPU で、8086 は16ビットの CPUです。8085 は 8080 の命令セットを拡張し、80386 と x86-64 は 8086 の 32 ビットと 64 ビットの拡張 ISA です。アーキテクチャが異なるため、バイナリ互換性はありません 。 . Rxx について学習している場合、それは8086ではなく64 ビットのx86-64です。8086 はx86-16命令セットを持つ CPU であり、アーキテクチャではありませんが、その命令セットは 8086 と呼ばれることもあります。
質問については、RBX は R2 ではありません。実際にエンコードされた順序は、AX、CX、DX、BXです(なぜ最初の 4 つの x86 GPR がこのような非直感的な順序で命名されているのかを参照してください)。また、レジスタはほとんどの場合ゼロからカウントされるため、RBX は R3で、AX、CX、DX はそれぞれ R0、R1、R2 になります。一部の VIA CPUは内部 RISC 命令を公開し、R0 ~ R4 も予想どおり EAX/ECX/EDX/EBX に直接マップされます。
nasmでは、これらの番号付きレジスタを次のように使用することもできます%use altreg
5.1 altreg: 代替レジスタ名
標準マクロ パッケージは、
altreg
代替レジスタ名を提供します。すべてのレジスター (R8–R15 だけでなく) の数値レジスター名、レジスターの下位バイト用の Intel 定義のエイリアス R8L–R15L (NASM/AMD 標準名 R8B–R15B とは対照的に)、および名前 R0H– を提供します。 AH、CH、DH、および BH に対する R3H (R0L–R3L との類推による)。
ただし、これらの番号付きレジスタを使用することはお勧めしません。コードが他の人にとって理解しにくくなり、名前のニーモニック機能が失われるためです ( A: アキュムレータ、B: ベース、C: カウンタ、D: データ、SI: ソースインデックス、DI: 宛先インデックス、SP: スタック ポインタ、BP: ベース ポインタ)。また、ABI をもう一度学習し、どのレジスタを保存して引数を渡すかを知る必要があります。
参考までに、Intel-8080のレジスタは次のようにエンコードされています。
000 0 B
001 1 C
010 2 D
011 3 E
100 4 H
101 5 L
111 7 A
アルファベット順でもない