Кодирование многобайтовой инструкции без операции (x86/x64)

Эта инструкция находится на странице 1018 справочного руководства Intel x64. Вот как это выглядит:

Opcode    Instruction Description
90        NOP         One byte no-operation instruction.
0F 1F /0  NOP r/m16   Multi-byte no-operation instruction.
0F 1F /0  NOP r/m32   Multi-byte no-operation instruction.

Я где-то читал, что максимальная длина без операции составляет 9 байт. Находится ли неактивная длина в 16/32-битном регистре или адресе памяти, или я сам кодирую ее с помощью набора нулей, и если да, то как применяются r / m16 или r / m32?


person Ryan Brown    schedule 14.05.2015    source источник
comment
Вы можете использовать обычный формат для /0 r/m, как указано, для кодирования любого операнда, который вы хотите. Конечно, он не будет использоваться, в конце концов, это NOP :) См. также раздел 3.5.1.10 Использование NOPs в руководстве по оптимизации.   -  person Jester    schedule 14.05.2015
comment
Вы можете сделать NOP длиной до 15 байт с избыточными префиксами, но это будет медленно декодироваться на процессорах Atom и Intel старше Core2 и большинстве процессоров AMD (не Bobcat и Jaguar)   -  person harold    schedule 14.05.2015
comment
Длина (увы) не является параметром опкодов Intel. Вы должны создать аргумент valid r/m16/r/m32, который кодирует правильную длину.   -  person Jongware    schedule 14.05.2015


Ответы (1)


Из хэда:

xed64 -64 -e NOP MEM4:EAX,EAX,1,00000000
OPERAND ORDER: MEM0 
Encodable! 670F18A40000000000
.byte 0x67,0x0f,0x18,0xa4,0x00,0x00,0x00,0x00,0x00

Преимущество использования 9-байтового nop заключается в снижении нагрузки на декодер, который может декодировать только 4 инструкции за такт. И NOP технически является инструкцией.

person Vlad Krasnov    schedule 14.05.2015
comment
Хорошо, но как найти nop меньше 9 байт? - person Jongware; 14.05.2015
comment
Например, вы можете удалить префикс 67, чтобы получить 8 байт. Используйте другой режим адресации (2 src) или однобайтовую немедленную адресацию. Есть много комбинаций. - person Vlad Krasnov; 14.05.2015
comment
Да, это то, что я имел в виду. Есть ли процедура, которой нужно следовать, чтобы найти конкретную длину? Сводится ли это к вводу разных байтов mod/rm и их сборке, чтобы убедиться, что это то, что нужно? Это то, о чем спрашивает ОП - его идея заполнения нулями не сработает. - person Jongware; 14.05.2015
comment
Я нашел эту страницу: felixcloutier.com/x86/NOP.html Коды операций действительны. , но судя по xed не совсем так как описано. - person Vlad Krasnov; 15.05.2015
comment
Проверьте Том. 2B Руководства разработчика программного обеспечения для архитектур Intel® 64 и IA-32: Таблица 4-9. Рекомендуемая многобайтовая последовательность инструкции NOP перечисляет варианты от 2 до 9 байтов. - person Jongware; 15.05.2015