web-dev-qa-db-ja.com

AX、AH、ALはEAXにどのようにマッピングされますか?

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

この例では、EAXが32ビットレジスタであり、AXを呼び出すと、最初の16ビットが返され、AHまたはAL itを呼び出すと、 16ビットの次の8ビットを返し、ALは最後の8ビットを返す必要があります。

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

0000 0100 0000 1000 0110 0000 0000 0111

したがって、AXにアクセスすると、

0000 0100 0000 1000

AHを読み取ると、返されるはずです

0000 0100

そして、ALを読み取ると、

0000 0111

これは正しいです?そして、それがAHが本当に保持する値である場合は?

34
Randy

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

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)

編集:

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

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

AXはEAXの下位16ビットです。 AHはAXの上位8ビット(つまりEAXのビット8-15)であり、ALはAXと同様にEAXの最下位バイト(ビット0-7)です。

例(16進数):

EAX: 12 34 56 78
AX: 56 78
AH: 56
AL: 78
32
pascalhein
| 0000 0001 0010 0011 0100 0101 0110 0111 | ------> EAX

|                     0100 0101 0110 0111 | ------> AX

|                               0110 0111 | ------> AL

|                     0100 0101           | ------> AH
12
Miku Ghoul

いいえ、あなたのANSは間違っています

AlとAhの選択は、EAXからではなくAXからです

例えば

EAX=0000 0000 0000 0000 0000 0000 0000 0111

したがって、AXを呼び出すと、

0000 0000 0000 0111

aHを呼び出すと、返されるはずです

0000 0000

そして、ALを呼び出すと、返されるはずです

0000 0111

例番号2

EAX: 22 33 55 77
AX: 55 77
AH: 55    
AL: 77

例3

EAX: 1111 0000 0000 0000 0000 0000 0000 0111    
AX= 0000 0000 0000 0111
AH= 0000 0000
AL= 0000 0111  
7

以下のスニペットは、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ビット
4
scanjee

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

Eaxで04030201hを使用する場合、おそらく最も簡単に対処できます。この場合、AXには0201hが含まれ、AHには02hが含まれ、ALには01hが含まれます。

4
Jerry Coffin