Domandax86 CMP istruzioni Differenza
Qual è il (non banale) differenza tra le due seguenti istruzioni x86?
39 /r CMP r/m32,r32 Compare r32 with r/m32
3B /r CMP r32,r/m32 Compare r/m32 with r32
Sfondo
Sto costruendo un'assembler Java, che sarà utilizzato per lingua intermedia del mio compilatore per produrre Windows 32 eseguibili.
Attualmente ho il codice seguente:
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();
Per produrre un file eseguibile valido, che contiene due istruzione CMP in un testo-sezione. L'eseguibile inviato a "text.exe" non farà nulla di interessante, ma non è questo il punto. La classe Compare
è un wrapper attorno all'istruzione CMP
.
Il codice di cui sopra produce (ispezionando con OllyDbg):
Address Hex dump Command
0040101F |. 3BC8 CMP ECX,EAX
00401021 |. 3BC1 CMP EAX,ECX
La differenza è sottile: se uso il 39
byte opcode:
Address Hex dump Command
0040101F |. 39C1 CMP ECX,EAX
00401021 |. 39C8 CMP EAX,ECX
Il che mi fa chiedere circa la loro sinonimia e perché questo esiste anche.
Questi gradi di libertà a 1 bit forniscono anche un canale segreto per i compilatori a "casa telefono" - possono "filigranare" i binari che producono, e il compilatore può chiederti di spiegare se trova il tuo software con la filigrana, ma senza licenza su file. –