Другой код операции для инструкции mov, чем ожидалось в x86

#assembly #x86 #opcode #fasm #mov

#сборка #x86 #код операции #fasm #mov

Вопрос:

Допустим, у меня есть очень простая инструкция mov eax,12345h . Я собрал его с помощью fasm и сгенерировал файл bin. Когда я проверил код операции вышеуказанной инструкции с помощью шестнадцатеричного редактора, он выдал 66 B8 45 23 01 00 эквивалентный шестнадцатеричный код. Теперь, исходя из того, что я изучил, я ожидал, что первый байт будет 0xb8 представлять инструкцию «загрузить 32-разрядную константу в eax», а остальные четыре байта будут такими же, как указано выше. В упомянутом мной aritcle также указано, что та же 0xb8 самая инструкция, которая загружает 32-разрядную константу в eax, может использоваться с 0x66 префиксом для загрузки 16-разрядной константы, но, очевидно, я не загружаю 16-разрядную константу в свою программу. Тем не менее, результирующий код операции в моем случае начинается с 66 первого байта. Теперь я не могу понять, откуда это 66 взялось? Есть ли какое-либо другое поведение в случае fasm?

Ответ №1:

Байт 66h префикса — это префикс размера операнда. При использовании в 32-битном коде он определяет размер 16-битного операнда, а при использовании в 16-битном коде он определяет 32-битный операнд.

Итак, вы собираете 16-битный код x86. При загрузке 32-разрядного значения в 32-разрядный регистр требуется префикс размера операнда.