Was bedeutet der Befehl data32 data32 nopw% cs: 0x0 (% rax,% rax, 1) in gcc inline asm?
Während ich einige Tests für die -O2-Optimierung der gcc-Compiler durchführte, habe ich die folgenden Anweisungen im disassemblierten Code für eine Funktion beobachtet:
data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)
Was macht diese Anweisung?
Um genauer zu sein, habe ich versucht zu verstehen, wie der Compiler nutzlose Rekursionen wie die folgenden mit O2-Optimierung optimiert:
int foo(void)
{
return foo();
}
int main (void)
{
return foo();
}
Der obige Code verursacht einen Stapelüberlauf, wenn er ohne Optimierung kompiliert wird, funktioniert jedoch für O2-optimierten Code.
Ich denke mit O2 hat es den Pushing Stack der Funktion foo komplett entfernt, aber warum ist dasdata32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)
erforderlich
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>