lea ecx,[esp+0x4] ; I assume this is for getting the adress of the first argument of the main...why ?
and esp,0xfffffff0 ; ??? is the compiler trying to align the stack pointer on 16 bytes ???
push DWORD PTR [ecx-0x4] ; I understand the assembler is pushing the return adress....why ?
push ebp
mov ebp,esp
push ecx ;why is ecx pushed too ??
Incluso si cada instrucción funcionó perfectamente sin penalización de velocidad a pesar de los operandos alineados arbitrariamente, la alineación aún aumentaría el rendimiento. Imagine un bucle que hace referencia a una cantidad de 16 bytes que simplemente se superpone a dos líneas de caché.Ahora, para cargar ese pequeño wchar en el caché, dos líneas de caché completas tienen que ser desalojadas, ¿y qué pasa si las necesitas en el mismo ciclo? La memoria caché es tremendamente más rápida que la RAM, por lo que el rendimiento de la memoria caché siempre es crítico.
Además, generalmente hay una penalización de velocidad para desviar los operandos desalineados a los registros. Dado que la pila se está realineando, naturalmente tenemos que guardar la alineación anterior para atravesar los marcos de pila para los parámetros y regresar.
ecx es un registro temporal por lo que debe guardarse. Además, según el nivel de optimización, algunas de las operaciones de vinculación de trama que no parecen estrictamente necesarias para ejecutar el programa podrían ser importantes para configurar una cadena de tramas lista para trazar.
¿Qué compilador está utilizando y puede proporcionar la subrutina principal desensamblada completa? – Inshallah