x86 プロセッサ アーキテクチャが 8 ビットから 16 ビット、32 ビット、そして現在は 64 ビットに変化したため、x86 アセンブラ言語も変更する必要がありました。
32 ビットのアセンブラー レジスタ名 (EAX、EBX など) では、各名前の E プレフィックスは Extended を表し、16 ビット形式 (AX、BX など) ではなく 32 ビット形式のレジスタを意味します。
これらのレジスタ名の R プレフィックスは 64 ビットで何を表していますか?
x86 プロセッサ アーキテクチャが 8 ビットから 16 ビット、32 ビット、そして現在は 64 ビットに変化したため、x86 アセンブラ言語も変更する必要がありました。
32 ビットのアセンブラー レジスタ名 (EAX、EBX など) では、各名前の E プレフィックスは Extended を表し、16 ビット形式 (AX、BX など) ではなく 32 ビット形式のレジスタを意味します。
これらのレジスタ名の R プレフィックスは 64 ビットで何を表していますか?
x86-64には追加のレジスタR8〜R15があり、Rはレジスタに番号が付けられている多くのCPUアーキテクチャで共通のプレフィックスであるため、「レジスタ」の単なるRだと思います。
オリジナルの Intel x86 プロセッサである 8080 プロセッサは、汎用コンピュータ (競合他社には Motorola 6800 が含まれていた) ではなく、専用の小型コンピュータ (たとえばレジ) や機器コントローラなどのアプリケーション向けに設計された 8 ビット プロセッサでした。次の 8086 プロセッサ ファミリ (8086 およびコストが削減された 8088) は、Intel 8080 アーキテクチャを継承しながら、プロセッサのより一般的な用途に向けて 16 ビットを追加して拡張した 16 ビット マイクロプロセッサでした。
Intel 8080 および Intel 8086 プロセッサには限られた数のレジスタがあり、そのほとんどは特別な目的を持っていたため、アセンブリ言語で A、B または AX、BX などの特定の名前が付けられていました (Motorola 6800 などの競合他社にも同様の規則がありました)。 . IBM 360/370 ファミリや DEC VAX などの汎用コンピュータでは、レジスタなどのコンポーネントに一般的な名前 (R0、R1 など) を使用していました。これは、レジスタが汎用 (Motorola 68000 32 ビット プロセッサの多くのハイエンド ワークステーションで使用) であるためです。 1980 年代には、D0 ~ D7 という名前の 8 つのデータ レジスタがあり、同様でした)。
Intel は 1970 年代から何年にもわたって x86 プロセッサを進化させ続けてきたため、x86 のターゲット アプリケーションが特殊なマイクロコントローラ アプリケーションから汎用コンピュータに拡大したときでも、下位互換性を維持しようと努めてきました。この進化の間に、レジスターの数が拡大し、元の専用レジスターの多くが汎用用途に向けて進化しました。これは、Intel が下位互換性を支援するために 80286 でプロセッサー チップ動作モードのアイデアも導入したためです。
64 ビット プロセッサでは、Intel はアセンブリ言語で 64 ビット転送と 32 ビットまたはその他の転送を識別する何らかの方法を必要としていました。同時に、インテルは追加の汎用レジスターを導入していました。汎用レジスターの一般的な業界命名規則である R の後に数字を使用することは、簡単な決定でした。
しかし、Intel は古いレジスターの下位互換性を維持する必要があるという問題にも直面していました。そのため、文字 R が 16 ビット レジスタ名のプレフィックスとして使用され、32 ビット プロセッサの場合は文字 E が 16 ビット レジスタ名のプレフィックスとして使用されました。同時に、64 ビット レジスタ操作の設計は、以前の世代の 32 ビット レジスタ操作で行われたものとは少し異なります。
8 ビット プロセッサから 16 ビット プロセッサへの変更に伴い、レジスタが 8 ビットから 16 ビットに拡張されたため、レジスタ名の後に AX、BX などの文字 X が付けられました。これらのレジスタは 2 つの 8 ビットとして扱うことができました。レジスタ (16 ビット AX レジスタは 8 ビット AH と 8 ビット AL で構成され、H は AX レジスタの High または最上位ビットを表し、L は AX レジスタの Low または最下位ビットを表します)。
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 ビットへの直接アクセスは、8086/8080 の 16 ビット レジスタの上位 8 ビットへの直接アクセスの方法では利用できませんでした。提供されています。
第 1 巻のセクション 3.7.2.1: Intel 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 register rax/eax/ax/al overwriting full register contentsの質問と回答、および Why do most x64 instruction zeros the upper part of a 32 bit register を参照してください。64 ビット レジスタ操作が32ビットレジスタ操作。