web-dev-qa-db-ja.com

Rは、RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSPで何を表していますか?

X86プロセッサアーキテクチャが8ビットから16ビット、32ビット、そして現在は64ビットに変更されたため、x86アセンブラ言語を変更する必要がありました。

32ビットアセンブラレジスタ名(EAX、EBXなど)では、各名前のEプレフィックスはExtendedを表し、16ビット形式(AX、BXなど)ではなく32ビット形式のレジスタを意味します。

これらのレジスタ名のRプレフィックスは64ビットで何を表していますか?

X86-64には追加のレジスタR8〜R15があり、Rはレジスタに番号が付けられている多くのCPUアーキテクチャで一般的なプレフィックスであるため、「レジスタ」のRだけだと思います。

19
Paul R

オリジナルのIntelx86プロセッサである8080プロセッサは、汎用コンピュータ(競合他社にはMotorola 6800が含まれていました)ではなく、特殊用途の小型コンピュータ(キャッシュレジスタなど)や機器コントローラなどのアプリケーションを対象として設計された8ビットプロセッサでした。次の8086プロセッサフ​​ァミリ(8086およびコスト削減8088)は、16ビットマイクロプロセッサであり、プロセッサのより汎用的な使用を目的として、16ビットの追加でIntel8080アーキテクチャを拡張しました。

Intel8080およびIntel8086プロセッサのレジスタ数は限られており、そのほとんどは特別な目的を持っていたため、アセンブリ言語でA、B、AX、BXなどの特定の名前が付けられていました(Motorola 6800などの競合製品にも同様の規則がありました) 。 IBM360/370ファミリーやDECVAXなどの汎用コンピューターは、レジスターが汎用(Motorola 68000 32ビットプロセッサーが多くのハイエンドワークステーションで使用されている)であるため、レジスター(R0、R1など)などのコンポーネントに、より一般的な名前を使用していました。 1980年代には、D0からD7という名前の8つのデータレジスタと同様でした。

Intelは1970年代から何年にもわたってx86プロセッサを進化させ続けてきたため、x86のターゲットアプリケーションが特殊なマイクロコントローラアプリケーションから汎用コンピュータに拡大したとしても、下位互換性を維持しようとしました。この進化の間に、レジスタの数は拡大し、元々の特殊目的のレジスタの多くは、下位互換性を支援するために80286でプロセッサチップの動作モードのアイデアを導入したため、汎用用途に向かって進化しました。

64ビットプロセッサでは、Intelはアセンブリ言語での32ビットまたはその他の転送に対して64ビット転送を識別する何らかの方法を必要としていました。同時に、Intelは追加の汎用レジスタを導入していました。汎用レジスターに一般的な業界の命名規則を使用すると、文字Rの後に数字が続くのは簡単な決定でした。

ただし、Intelは、古いレジスタとの下位互換性を維持する必要もありました。したがって、32ビットプロセッサの場合と同様に、文字Rが16ビットレジスタ名のプレフィックスとして使用され、文字Eが16ビットレジスタ名のプレフィックスとして使用されました。同時に、64ビットレジスタ操作の設計は、前世代の32ビットレジスタ操作で行われたものとは少し異なって行われました。

8ビットプロセッサから16ビットプロセッサへの変更に伴い、レジスタが8ビットから16ビットに拡張され、AX、BXなどのレジスタ名の後に名前の文字がXになりました。これらのレジスタは2つの8ビットとして扱うことができます。レジスタ(16ビットAXレジスタは8ビットAHと8ビットALで構成され、HはAXレジスタの上位ビットまたは最上位ビットを表し、LはAXレジスタの下位ビットまたは最下位ビットを表します)。

16ビットから32ビットプロセッサへの変更に伴い、レジスタは16ビットから32ビットに拡張されたため、名前にはEAX、EBXなどのプレフィックスとして文字Eが付けられます。これらのレジスタは2つの別個の16ビットを持つものとして扱うことができます。コンポーネント(EAX-> AX、EBX-> BXなどの16ビット名を使用してアクセスされる最下位16ビット)または4つの8ビットレジスタ(EAX-> AHなどの2つの8ビットレジスタとしてアクセスされる最下位16ビットAL、EBX-> BHおよびBLなど)レジスタシフトおよびビット単位の操作を使用して、EAX、EBXなどの32ビットレジスタの上位16ビットと下位16ビットの間で16ビット値を移動した場合。 、ある程度、8ビットから16ビットへの変更で行われたことですが、32ビットレジスタの上位16ビットへの直接アクセスは、16ビットレジスタの上位8ビットへの直接アクセスでは利用できませんでした。 8086/8080が提供されていました。

第1巻のセクション3.7.2.1:インテル64およびIA-32アーキテクチャーの基本アーキテクチャーソフトウェア開発者マニュアル。これには、64ビットモードについて記載されています。

Register operands in 64-bit mode can be any of the following:
• 64-bit general-purpose registers (RAX, RBX, RCX, RDX, RSI, RDI, RSP, RBP, or R8-R15)
• 32-bit general-purpose registers (EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP, or R8D-R15D)
• 16-bit general-purpose registers (AX, BX, CX, DX, SI, DI, SP, BP, or R8W-R15W)
• 8-bit general-purpose registers: AL, BL, CL, DL, SIL, DIL, SPL, BPL, and R8L-R15L are available using REX
prefixes; AL, BL, CL, DL, AH, BH, CH, DH are available without using REX prefixes.
• Segment registers (CS, DS, SS, ES, FS, and GS)
• RFLAGS register
• x87 FPU registers (ST0 through ST7, status Word, control Word, tag Word, data operand pointer, and instruction
pointer)
• MMX registers (MM0 through MM7)
• XMM registers (XMM0 through XMM15) and the MXCSR register
• Control registers (CR0, CR2, CR3, CR4, and CR8) and system table pointer registers (GDTR, LDTR, IDTR, and
task register)
• Debug registers (DR0, DR1, DR2, DR3, DR6, and DR7)
• MSR registers
• RDX:RAX register pair representing a 128-bit operand

x86_64レジスタrax/eax/ax/alレジスタの全内容を上書きする および ほとんどのx64命令が32ビットレジスタの上部をゼロにする理由 の質問と回答を参照してください。これは、64ビットレジスタの動作が32ビットレジスタの動作とどのように異なるかについての説明を提供します。

6