Вопрос
В чем (нетривиальная) разница между следующими двумя инструкциями x86?
39 /r CMP r/m32,r32 Compare r32 with r/m32
3B /r CMP r32,r/m32 Compare r/m32 with r32
Фон
Я создаю ассемблер Java, который будет использоваться промежуточным языком моего компилятора для создания исполняемых файлов Windows-32.
В настоящее время у меня есть следующий код:
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();
Вывести корректный исполняемый файл, содержащий две инструкции CMP в текстовом разделе. Исполняемый файл, выведенный в "text.exe", ничего интересного не сделает, но это не главное. Класс Compare
является оболочкой инструкции CMP
.
Приведенный выше код производит (проверка с помощью OllyDbg):
Address Hex dump Command
0040101F |. 3BC8 CMP ECX,EAX
00401021 |. 3BC1 CMP EAX,ECX
Разница тонкая: если я использую 39
байтовый код операции:
Address Hex dump Command
0040101F |. 39C1 CMP ECX,EAX
00401021 |. 39C8 CMP EAX,ECX
Что заставляет меня задаться вопросом об их синонимичности и почему это вообще существует.