47

x86 レジスタについての私の理解では、各レジスタは 32 ビット コード全体からアクセスでき、複数のアクセス可能なレジスタに分割されています。

この例EAXでは 32 ビット レジスタです。呼び出すAXと最初の 16 ビットが返され、 AHorを呼び出すと 16 ビットALの次の 8 ビットALが返され、最後の 8 ビットが返されます。

だから私の質問は、これがどのように機能するかを本当に信じていないからです。32ビット値を保存する場合、別名EAX保存:

0000 0100 0000 1000 0110 0000 0000 0111

したがって、アクセスAXすると返されるはずです

0000 0100 0000 1000

読めAHば戻るはずです

0000 0100

そして、私たちが読むALと、それが返されるはずです

0000 0111

これは正しいです?もしそれがAH真に保持される値であるなら?

4

6 に答える 6

93

いいえ、それは正しくありません。

EAX is the full 32-bit value
AX is the lower 16-bits
AL is the lower 8 bits
AH is the bits 8 through 15 (zero-based)

したがって、AX は AH:AL の半分で構成され、それ自体が EAX の下位半分です。(EAX の上半分は 16 ビット レジスタとして直接アクセスできません。取得したい場合は、EAX をシフトまたはローテーションできます。)

完全を期すために、32 ビット CPU に基づく上記に加えて、64 ビット Intel/AMD CPU には

RAX, which hold a 64-bit value, and where EAX is mapped to the lower 32 bits.

これはすべて、EBX/RBX、ECX/RCX、および EDX/RDX にも当てはまります。EDI/RDI などの他のレジスタには DI 下位 16 ビット部分レジスタがありますが、上位 8 部分はなく、下位 8 DIL は 64 ビット モードでのみアクセスできます。64 ビット アーキテクチャのアセンブリ レジスタ


AL、AH、または AX を書き込むと、歴史的な理由から、完全な AX/EAX/RAX の他のバイトは変更されません。たとえば、新しい AL を完全な RAX にマージする必要があります。(32 ビットまたは 64 ビットのコードでは、このマージが特に必要ない場合は、movzx eax, byte [mem]またはロードを優先してください:なぜ GCC は部分レジスタを使用しないのですか? )movzx eax, word [mem]

EAX ゼロ拡張を RAX に書き込む。( 32 ビット レジスタの x86-64 命令が完全な 64 ビット レジスタの上位部分をゼロにするのはなぜですか? )

繰り返しますが、これはすべて RAX だけでなく、すべてのレジスターに適用されます。たとえば、DI または DIL を書き込むと古い RDI にマージされ、EDI を書き込むと完全な RDI がゼロ拡張されて上書きされます。R10B または R10W の書き込みも同様で、R10D を書き込み、古い R10 値から独立した R10 を残します。

于 2013-03-03T21:37:23.360 に答える
44

AX は EAX の下位 16 ビットです。AH は AX の上位 8 ビット (つまり、EAX のビット 8 ~ 15) であり、AL は EAX および AX の最下位バイト (ビット 0 ~ 7) です。

例 (16 進数):

EAX: 12 34 56 78
AX: 56 78
AH: 56
AL: 78
于 2013-03-03T21:38:10.130 に答える
4

以下のスニペットは、GDB を使用して EAX を調べます。

    (gdb) info register eax
    eax            0xaa55   43605
    (gdb) info register ax
    ax             0xaa55   -21931
    (gdb) info register ah
    ah             0xaa -86
    (gdb) info register al
    al             0x55 85
  1. EAX - 完全な 32 ビット値
  2. AX - 下位 16 ビット値
  3. AH - 8 ~ 15 のビット
  4. AL - EAX/AX の下位 8 ビット
于 2015-11-28T03:40:59.403 に答える
4

いいえ -- AL は AX の最下位 8 ビットです。AX は、EAX の最下位 16 ビットです。

おそらく、eax で 04030201h から始めるのが最も簡単です。この場合、AX には 0201h、AH には 02h、AL には 01h が含まれます。

于 2013-03-03T21:37:31.150 に答える