Mein Verständnis von x86-Registern besagt, dass auf jedes Register mit dem gesamten 32-Bit-Code zugegriffen werden kann und dass es in mehrere zugreifbare Register unterteilt ist.
In diesem Beispiel ist EAX
ein 32-Bit-Register, wenn wir AX
aufrufen, sollte es die ersten 16 Bits zurückgeben, und wenn wir AH
oder AL
aufrufen sollte die nächsten 8 Bits nach den 16 Bits zurückgeben und AL
sollte die letzten 8 Bits zurückgeben.
Meine Frage ist also, weil ich nicht wirklich glaube, dass es so funktioniert. Wenn wir den 32-Bit-Wert aka EAX
saving speichern:
0000 0100 0000 1000 0110 0000 0000 0111
Wenn wir also auf AX
zugreifen, sollte es zurückkehren
0000 0100 0000 1000
wenn wir AH
lesen, sollte es zurückkehren
0000 0100
und wenn wir AL
lesen, sollte es zurückkehren
0000 0111
Ist das richtig? und wenn ja, welchen Wert hat AH
wirklich?
Nein, das stimmt nicht ganz.
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)
Bearbeiten:
Der Vollständigkeit halber haben zusätzlich zu den oben genannten, auf einer 32-Bit-CPU basierenden, 64-Bit-Intel/AMD-CPUs
RAX, which hold a 64-bit value, and where EAX is mapped to the lower 32 bits.
AX sind die 16 unteren Bits von EAX. AH sind die 8 hohen Bits von AX (d. H. Die Bits 8-15 von EAX) und AL ist das niederwertigste Byte (Bits 0-7) von EAX sowie AX.
Beispiel (hexadezimale Ziffern):
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
nein dein ans ist falsch
Die Auswahl von Al und Ah stammt von AX und nicht von EAX
z.B
EAX=0000 0000 0000 0000 0000 0000 0000 0111
Wenn wir AX aufrufen, sollte es zurückkehren
0000 0000 0000 0111
wenn wir AH anrufen, sollte es zurückkehren
0000 0000
und wenn wir AL anrufen, sollte es zurückkehren
0000 0111
Beispiel Nummer 2
EAX: 22 33 55 77
AX: 55 77
AH: 55
AL: 77
beispiel 3
EAX: 1111 0000 0000 0000 0000 0000 0000 0111
AX= 0000 0000 0000 0111
AH= 0000 0000
AL= 0000 0111
Das folgende Snippet untersucht EAX mit GDB.
(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
Nein - AL sind die 8 niedrigstwertigen Bits von AX. AX sind die 16 niedrigstwertigen Bits von EAX.
Vielleicht ist es am einfachsten, mit 04030201h in eax zu beginnen. In diesem Fall enthält AX 0201h, AH 02h und AL 01h.