Preguntax86 instrucción CMP Diferencia
¿Cuál es el (no trivial) diferencia entre las dos siguientes instrucciones x86?
39 /r CMP r/m32,r32 Compare r32 with r/m32
3B /r CMP r32,r/m32 Compare r/m32 with r32
Antecedentes
Estoy construyendo un ensamblador de Java, que será utilizado por el lenguaje intermedio de mi compilador para producir Windows 32 ejecutables.
Actualmente tengo el código siguiente:
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();
Para dar salida a un archivo ejecutable válido, que contiene dos instrucción CMP en una sección TEXTO. El ejecutable enviado a "text.exe" no hará nada interesante, pero ese no es el punto. La clase Compare
es un contenedor alrededor de la instrucción CMP
.
El código anterior produce (inspeccionando con OllyDbg):
Address Hex dump Command
0040101F |. 3BC8 CMP ECX,EAX
00401021 |. 3BC1 CMP EAX,ECX
La diferencia es sutil: si uso el 39
byte de código de operación:
Address Hex dump Command
0040101F |. 39C1 CMP ECX,EAX
00401021 |. 39C8 CMP EAX,ECX
que me pregunto sobre su sinonimia y por qué esto incluso existe.
Estos grados de libertad de 1 bit también proporcionan un canal encubierto para que los compiladores puedan "llamar a casa": pueden "filtrar" los binarios que producen, y el proveedor del compilador puede pedirle que explique si encuentran su software con su marca de agua, pero sin licencia en el archivo. –