различие 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.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

Который заставляет меня задаться вопросом об их synonymity и почему это даже существует.

13
задан starblue 10 May 2010 в 19:54
поделиться

2 ответа

Неважно, какой код операции вы используете, если вы сравниваете два регистра. Единственная разница заключается в сравнении регистра с операндом памяти, поскольку используемый код операции определяет, какой из них будет вычитаться.

Относительно того, почему это существует: формат инструкции x86 использует байт ModR / M для обозначения либо адреса памяти, либо регистра. Каждая инструкция может иметь только одно значение ModR / M, что означает, что она может обращаться только к одному адресу памяти (не включая специальные инструкции, такие как MOVSB). Это означает, что не может быть общей инструкции cmp r / m32, r / m32 , и нам нужны два разных кода операции: cmp r / m32, r32 и cmp r32, r / m32 . В качестве побочного эффекта это создает некоторую избыточность при сравнении двух регистров.

19
ответ дан 1 December 2019 в 22:06
поделиться

CMP ECX, EAX - это ECX-EAX и CMP EAX, ECX - это EAX-ECX. Флаги устанавливаются по-разному в зависимости от того, какой операнд с которым сравнивается. Конечно, вы, вероятно, могли бы обойтись только одним из них, если бы не структура mod / r-m инструкций x86.

1
ответ дан 1 December 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: