2013-02-19 4 views
8

Zum Beispiel einen Hex gegeben: 83 E4 F0x86 herauszufinden, Operandengröße der Anweisung nur den Hex-Maschinencode gegeben?

Mit Blick auf das Handbuch Intel Entwickler, kann ich herausfinden, dass 83 bedeutet and und FO bedeutet die -16. Mit Blick auf E4 kann ich decodieren, dass das Quell-/Zielregister entweder SP oder ESP ist.

Daher kann ich schließen, dass das hex bedeutet entweder and $-16, %ESP oder and $-16, %SP. Im Handbuch werden diese jedoch als 83 /4 ib aufgeführt.

Wie kann ich zwischen diesen beiden unterscheiden?

+2

Kommt drauf an. Wenn im Realmodus oder wenn die Standardoperandengröße des aktuellen Segments/Selektors auf 16 Bit gesetzt ist, wird dies als 'und sp, -16 'ausgeführt. "Normalerweise" wäre es die 32-Bit-Version. – harold

Antwort

7

Wie Harold sagt, ist die Standardoperandengröße nicht in der Anweisung codiert, sondern hängt vom aktuellen Prozessormodus ab.

Im Real-Modus und 16-Bit-geschützten Modus ist die Standardoperandengröße 16-Bit, also 83 E4 F0 dekodiert zu .

Im 32-Bit-Modus ist die Operandengröße standardmäßig 32-Bit, also and $-16, %esp. Im x64-Modus verwenden die meisten Befehle standardmäßig die 32-Bit-Operandengröße (ausgenommen Verzweigungen und solche, die indirekt den Stapel verwenden, wie Pushs, Pops, Aufrufe und Returns), so dass sie erneut zu and $-16, %esp dekodiert werden.

Es ist möglich, die Standardoperandengröße mithilfe von Präfixen zu überschreiben. Zum Beispiel schaltet das Präfix 66h zwischen 32-Bit- und 16-Bit-Operandengröße um, so dass im 16-Bit-Modus zu and $-16, %esp und im 32-Bit- oder 64-Bit-Modus zu dekodiert. Um die 64-Bit-Operandengröße zu erhalten, müssen Sie die REX prefix mit dem W-Bit-Satz verwenden, also 48 83 E4 F0 dekodiert zu and $-16, %rsp (aber nur im 64-Bit-Modus!).

+0

kann ich irgendwie wissen, in welchem ​​Modus der Prozessor arbeitet? – Hery

+2

Nicht ohne mehr Kontext. Woher kommen die Bytes? Erinnerung? Datei? In einer abgewaschenen Flasche gefunden? Kam zu dir in einem Traum? –

+0

Die hexadezimale Zeichenfolge stammt aus einer Datei, ist aber als ASCII-Zeichenfolge codiert (diese ganze Sache ist ein Kursprojekt, daher das einfache Format). Gibt es so etwas wie ein Register, das den Betriebsmodus des Prozessors speichert? – Hery

0

Im geschützten Modus kann es nur die 32-Bit-Version sein, sowohl 16- als auch 64-Bit-Versionen erfordern 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 eindeutig in der Beschreibung für AND an:

Im 64-Bit-Modus beträgt die Standardoperationsgröße des Befehls 32 Bit.

und die Referenz für 066h, Kapitel 2.2.1:

Der Operand-Größe-Override-Präfix kann ein Programm zum Umschalten zwischen 16- und 32-Bit-Operandengrößen . Jede Größe kann der Standard sein; Die Verwendung des Präfixes wählt die nicht standardmäßige Größe aus.

+0

ich bin nicht der downvoter aber deine antwort ist irgendwie widersprüchlich mit harold's kommentar ... – Hery

+0

@Hery: angenommen hes im 32bit oder 64bit protected mode (was "die norm" ist, hes erwähnt nichts anderes), der einzige weg Die Generierung der 16- oder 64-Bit-Versionen erfolgt über das Override-Präfix. Es widerspricht überhaupt nicht Harold, es ist die Definition für geschützten Modus (außer er verwendet zufällig eine 16bit CPU, die fast 30 Jahre alt ist ....). – Necrolis

+1

Eigentlich gibt es auch 16-Bit-geschützten Modus, in der 286 eingeführt. –