Что означает инструкция data32 data32 nopw% cs: 0x0 (% rax,% rax, 1) в gcc inline asm?
Выполняя некоторые тесты для оптимизации -O2 компиляторов gcc, я увидел следующую инструкцию в разобранном коде для функции:
data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)
Что делает эта инструкция?
Чтобы быть более подробным, я пытался понять, как компилятор оптимизирует бесполезные рекурсии, как показано ниже, с оптимизацией O2:
int foo(void)
{
return foo();
}
int main (void)
{
return foo();
}
Приведенный выше код вызывает переполнение стека при компиляции без оптимизации, но работает для кода, оптимизированного для O2.
Я думаю, что с O2 он полностью убрал толчок стека функции foo, но почемуdata32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)
нужно?
0000000000400480 <foo>:
foo():
400480: eb fe jmp 400480 <foo>
400482: 66 66 66 66 66 2e 0f data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)
400489: 1f 84 00 00 00 00 00
0000000000400490 <main>:
main():
400490: eb fe jmp 400490 <main>