В этом компиляторе я пытаюсь понять, как работает машинное кодирование команды 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.