¿Cuál es el significado de la instrucción data32 data32 nopw% cs: 0x0 (% rax,% rax, 1) en gcc inline asm?
Mientras ejecutaba algunas pruebas para la optimización -O2 de los compiladores gcc, observé las siguientes instrucciones en el código desmontado para una función:
data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)
¿Qué hace esta instrucción?
Para ser más detallado, estaba tratando de entender cómo el compilador optimiza las recursiones inútiles como las siguientes con la optimización de O2:
int foo(void)
{
return foo();
}
int main (void)
{
return foo();
}
El código anterior provoca un desbordamiento de la pila cuando se compila sin optimización, pero funciona para el código optimizado de O2.
Creo que con O2 eliminó por completo el empuje de la pila de la función foo, pero ¿por qué es eldata32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)
¿necesario?
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>