#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-разрядный регистр требуется префикс размера операнда.