В этом выводе компилятора я пытаюсь понять, как машина- Кодирование кода инструкции nopw
работает:
00000000004004d0 :
4004d0: eb fe jmp 4004d0
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 не являются t специфичен для бесконечных циклов. Вот набор функций с диапазоном длин NOP, в проводнике компилятора Godbolt.