x86 finde die Operandengröße des Befehls nur mit dem Hex-Maschinencode angegeben?

8

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?

    
Hery 19.02.2013, 16:47
quelle

2 Antworten

7

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!).

    
Igor Skochinsky 20.02.2013, 13:27
quelle
0

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.

    
Necrolis 19.02.2013 16:54
quelle

Tags und Links