В этом компиляторе я пытаюсь понять, как работает машинное кодирование команды nopw:
00000000004004d0 <main>:
4004d0: eb fe jmp 4004d0 <main>
4004d2: 66 66 66 66 66 2e 0f nopw %cs:0x0(%rax,%rax,1)
4004d9: 1f 84 00 00 00 00 00
В разделе http://john.freml.in/amd64-nopl обсуждается обсуждение "nopw". Может ли кто-нибудь объяснить значение 4004d2-4004e0? Из просмотра списка опций кажется, что коды 66 .. являются многобайтовыми расширениями. Я чувствую, что, возможно, я получу лучший ответ на этот вопрос, чем если бы я не попытался перекрыть список опкодов на несколько часов.
Этот вывод asm происходит из следующего (безумного) кода в C, который оптимизируется до простого бесконечного цикла:
long i = 0;
main() {
recurse();
}
recurse() {
i++;
recurse();
}
При компиляции с gcc -O2 компилятор распознает бесконечную рекурсию и превращает ее в бесконечный цикл; он делает это так хорошо, фактически, что он фактически петли в main(), не вызывая функцию recurse().
примечание редактора: функции заполнения с помощью NOP не являются специфическими для бесконечных циклов. Здесь набор функций с диапазоном длин NOP, в проводнике компилятора Godbolt.