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
が本当に保持する値である場合は?
いいえ、それはまったく正しくありません。
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
| 0000 0001 0010 0011 0100 0101 0110 0111 | ------> EAX
| 0100 0101 0110 0111 | ------> AX
| 0110 0111 | ------> AL
| 0100 0101 | ------> AH
いいえ、あなたの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
以下のスニペットは、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
いいえ-ALはAXの最下位8ビットです。 AXはEAXの最下位16ビットです。
Eaxで04030201hを使用する場合、おそらく最も簡単に対処できます。この場合、AXには0201hが含まれ、AHには02hが含まれ、ALには01hが含まれます。