0x66
байты являются префиксом "Переопределение размера операнда". Наличие более одного из них эквивалентно наличию одного.
0x2e
- это «нулевой префикс» в 64-битном режиме (в противном случае это переопределение сегмента CS: - именно поэтому он отображается в мнемонике сборки).
0x0f 0x1f
- это 2-байтовый код операции для NOP, который принимает байт ModRM
0x84
- это байт ModRM , который в этом случае кодирует режим адресации, который использует еще 5 байтов.
Некоторые процессоры медленно декодируют инструкции со многими префиксами (например, более трех), поэтому байт ModRM, который задает SIB + disp32, является гораздо лучшим способом использовать дополнительные 5 байтов, чем пять байтов префикса.
Декодеры AMD K8 в микроархиве Agner Fog pdf :
Каждый из декодеров команд может обрабатывать три префикса за такт
цикл. Это означает, что три инструкции с тремя префиксами могут
быть декодирован в том же тактовом цикле. Инструкция с 4 - 6 префиксами
требуется дополнительный тактовый цикл для декодирования.
По сути, эти байты являются одной длинной инструкцией NOP, которая никогда не будет выполнена в любом случае. Это сделано для того, чтобы следующая функция была выровнена по 16-байтовой границе, потому что компилятор выпустил директиву .p2align 4
, поэтому ассемблер дополняется NOP. GCC по умолчанию для x86:
-falign-functions=16
. Для NOP, которые будут выполняться, оптимальный выбор long-NOP зависит от микроархитектуры. Для микроархитектуры, которая задыхается от многих префиксов, таких как Intel Silvermont или AMD K8, две NOP с 3 префиксами в каждой, возможно, были бы декодированы быстрее.
Статья в блоге, на которую связан вопрос (http://john.freml.in/amd64-nopl), объясняет, почему компилятор использует сложную одиночную инструкцию NOP вместо набора однобайтовых инструкций NOP размером 0x90.
Подробную информацию о кодировке инструкций можно найти в документах технической ссылки AMD:
Главным образом в «Руководстве по программированию для архитектуры AMD64, том 3: Общее назначение и системные инструкции». Я уверен, что технические ссылки Intel по архитектуре x64 будут содержать ту же информацию (и, возможно, даже более понятную).