Fragex86 CMP Instruction Difference
Was ist der (nicht-triviale) Unterschied zwischen den folgenden zwei x86-Befehle?
39 /r CMP r/m32,r32 Compare r32 with r/m32
3B /r CMP r32,r/m32 Compare r/m32 with r32
Hintergrund
Ich baue eine Java-Assembler, die von meinem Compiler Zwischensprache verwendet werden, wird Windows-32 ausführbaren Dateien zu erzeugen.
Zur Zeit habe ich folgenden Code:
final ModelBase mb = new ModelBase(); // create new memory model
mb.addCode(new Compare(Register.ECX, Register.EAX)); // add code
mb.addCode(new Compare(Register.EAX, Register.ECX)); // add code
final FileOutputStream fos = new FileOutputStream(new File("test.exe"));
mb.writeToFile(fos);
fos.close();
Zur Ausgabe einer gültige ausführbare Datei, die in einem TEXT-Abschnitt zwei CMP-Befehl enthält. Die ausführbare Datei, die an "text.exe" ausgegeben wird, wird nichts Interessantes tun, aber das ist nicht der Punkt. Die Klasse Compare
ist ein Wrapper um die CMP
Anweisung.
Der obige Code erzeugt (Inspektion mit OllyDbg):
Address Hex dump Command
0040101F |. 3BC8 CMP ECX,EAX
00401021 |. 3BC1 CMP EAX,ECX
Der Unterschied ist subtil: wenn ich den 39
Byte-Opcode:
Address Hex dump Command
0040101F |. 39C1 CMP ECX,EAX
00401021 |. 39C8 CMP EAX,ECX
Was ich über ihren synonymity macht mich fragen und warum das überhaupt existiert.
Diese 1-Bit-Freiheitsgrade bieten auch einen verborgenen Kanal für Compiler zum "Telefonieren nach Hause" - sie können die von ihnen produzierten Binärdateien "markieren", und der Compiler-Anbieter kann Sie bitten, zu erklären, ob sie Ihre Software mit ihrem Wasserzeichen finden, aber ohne Lizenz in Datei. –