x86 CMP инструкция разница

Вопрос

В чем (нетривиальная) разница между следующими двумя инструкциями 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-разделе. Исполняемый файл, выведенный в «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

Что заставляет меня задуматься об их синонимичности и о том, почему это вообще существует.

Ответы на вопрос(3)

Ваш ответ на вопрос