Beispiel für ein hex: 83 E4 F0
Wenn ich mir das Entwicklerhandbuch von Intel ansehe, kann ich feststellen, dass 83
für and
steht und FO
für -16
steht. Mit E4
kann ich decodieren, dass das Quell- / Zielregister entweder SP oder ESP ist.
Daraus kann ich schließen, dass das hex entweder and $-16, %ESP
oder and $-16, %SP
bedeutet. Im Handbuch werden jedoch beide als 83 /4 ib
aufgeführt.
Wie kann ich zwischen diesen beiden unterscheiden?
Wie Harold sagt, ist die Standardoperandengröße nicht in der Anweisung codiert, sondern hängt vom aktuellen Prozessormodus ab.
Im Realmodus und 16-Bit-geschützten Modus ist die Standardoperandengröße 16-Bit, daher dekodiert 83 E4 F0
zu and $-16, %sp
.
Im 32-Bit-Modus ist die Operandengröße standardmäßig 32-Bit, also and $-16, %esp
.
Im x64-Modus wird bei den meisten Befehlen wieder die 32-Bit-Operandengröße verwendet (ausgenommen Verzweigungen und solche, die indirekt den Stapel verwenden, wie Pushs, Pops, Aufrufe und Returns), also dekodiert sie wieder zu and $-16, %esp
.
Es ist möglich, die Standardoperandengröße mithilfe von Präfixen zu überschreiben. Beispiel: Präfix 66h wechselt zwischen 32-Bit- und 16-Bit-Operandengröße.% Co_de% dekodiert im 16-Bit-Modus 66 83 E4 F0
und im 32-Bit- oder 64-Bit-Modus and $-16, %esp
. Um die 64-Bit-Operandengröße zu erhalten, müssen Sie das REX-Präfix mit dem gesetzten W-Bit verwenden, also and $-16, %sp
dekodiert zu 48 83 E4 F0
(aber nur im 64-Bit-Modus!).
Im geschützten Modus kann es nur die 32-Bit-Version sein, sowohl die 16- als auch die 64-Bit-Version benötigen ein vordefiniertes Größen-Override-Byte. In diesem Fall erfordert die 16-Bit-Version die 0x66-Präfix-Überschreibung, sodass Sie 66:83 E4 F0
erhalten. Intel gibt dies in der Beschreibung von AND eindeutig an:
Im 64-Bit-Modus beträgt die Standardoperationsgröße des Befehls 32 Bit.
und die Referenz für 066H, Kapitel 2.2.1:
Das Override-Präfix in Operandengröße ermöglicht einem Programm, zwischen 16 und 32 Bit zu wechseln Operandengrößen. Jede Größe kann der Standard sein; Die Verwendung des Präfixes wählt den Nicht-Standard aus Größe.
Tags und Links x86 disassembly