Sie sollten die Intel Handbücher lesen, es erklärt, wie man das macht. Für eine einfachere Referenz, read this. Die Art und Weise, wie x86-Anweisungen codiert sind, ist ziemlich einfach, aber die Anzahl der Möglichkeiten kann etwas überwältigend sein.
Auf den Punkt gebracht, umfasst ein x86-Befehl die folgenden Teile, wobei jeder Teil mit Ausnahme des Opcode fehlen werden:
prefix opcode operands immediate
Das prefix
Feld, um das Verhalten des Befehls ändern kann, was nicht gilt Ihr Anwendungsfall. Sie können die opcode
in einer Referenz nachschlagen (ich mag this one), zum Beispiel mov r/m32, imm32
ist C7 /0
was bedeutet: Der Opcode ist C7
und einer der beiden Operanden ist Null als ein erweiterter Operand. Diese Anweisung nimmt ein 32-Bit-Sofort, so dass die Anweisung hat die Form
C7 operand/0 imm32
Der Operand/extended Opcode als modr/m-Byte mit einem optionalen SIB (Skalenindex base) Byte für einige Adressierungsarten codiert ist und ein optionale 8-Bit- oder 32-Bit-Verschiebung. Sie können nachsehen, welchen Wert Sie benötigen in the reference. In Ihrem Fall wollen Sie also einen Speicheroperanden mit einer Ein-Byte-Verschiebung und einem Register-Operanden von 0 codieren, der zum modr/m-Byte 45
führt. So ist die Kodierung:
C7 45 disp8 imm32
Jetzt codieren wir die 8-Bit-Verschiebung in Zweierkomplement. -4
entspricht FC
, so ist dies
C7 45 FC imm32
Schließlich kodieren wir das 32-Bit-Direkt, die Sie 2
sein wollen. Beachten Sie, dass es in Little Endian ist:
C7 45 FC 02 00 00 00
Und so ist der Befehl codiert.
Was meinst du mit "konvertieren"? Ein Programm benutzen? Tun Sie es manuell? – Shiro
Konvertierung manuell. –
'int b = 2;' ist keine Assemblersprache.Der Unterschied ist, dass C kompilierte Sprache ist, also kann die Zeile "int b = 2;" auf viele verschiedene Arten implementiert werden (sogar vollständig vom Optimierer entfernt), je nachdem, welcher Compiler entscheiden wird, wie Maschinencode produziert wird Ergebnisse gemäß dem C-Standard. Die Assembler-Sprache unterscheidet sich in einer Weise, dass Assembler kein Compiler dieser Art ist. Wenn Sie in Assembly 'add rax, rbx' schreiben, wird das kompiliert, die Anweisung nicht geändert oder durch irgendeine Art von Optimierer entfernt das ist mehr wie "1: 1 Transformation". – Ped7g