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