Questionx86 CMP Différence d'instructions
Quel est le (non trivial) différence entre les deux instructions x86 suivantes?
39 /r CMP r/m32,r32 Compare r32 with r/m32
3B /r CMP r32,r/m32 Compare r/m32 with r32
Contexte
Je construis un assembleur Java, qui sera utilisé par le langage intermédiaire de mon compilateur pour produire des exécutables Windows 32.
Actuellement, j'ai le code suivant:
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();
Pour produire un fichier exécutable valide, qui contient deux instructions CMP dans un texte de section. L'exécutable sorti en "text.exe" ne fera rien d'intéressant, mais ce n'est pas le but. La classe Compare
est un wrapper autour de l'instruction CMP
.
Le code ci-dessus produit (inspectait avec OllyDbg):
Address Hex dump Command
0040101F |. 3BC8 CMP ECX,EAX
00401021 |. 3BC1 CMP EAX,ECX
La différence est subtile: si j'utilise le 39
octet opcode:
Address Hex dump Command
0040101F |. 39C1 CMP ECX,EAX
00401021 |. 39C8 CMP EAX,ECX
Ce qui me fait me demande au sujet de leur synonymie et pourquoi cela existe même.
Ces degrés de liberté de 1 bit fournissent également un canal caché pour que les compilateurs puissent "téléphoner à la maison" - ils peuvent "filigraner" les binaires qu'ils produisent, et le fournisseur du compilateur peut vous demander s'il trouve votre logiciel avec son filigrane, mais sans licence dans le fichier. –