c++ assembly 64bit low-level

c++ - ¿Qué es el ''espacio de sombra'' en el ensamblaje x64?



assembly 64bit (2)

El espacio de sombra (también llamado a veces espacio de derrame o espacio de inicio ) está destinado a ser utilizado para facilitar la depuración de x64.

Recuerde que los primeros 4 parámetros se pasan en los registros . Si ingresa al depurador e inspecciona la pila de llamadas en busca de un hilo, no podrá ver ningún parámetro pasado a las funciones. Los valores almacenados en los registros son transitorios, y no pueden reconstruirse al subir la pila de llamadas.

Aquí es donde el espacio de Inicio entra en juego: los compiladores pueden utilizarlo para dejar una copia de los valores de registro en la pila para su posterior inspección en el depurador. Esto suele suceder para las construcciones no optimizadas. Sin embargo, cuando las optimizaciones están habilitadas, los compiladores generalmente tratan el espacio de Inicio como disponible para uso desde cero. No quedan copias en la pila, y la depuración de un volcado se convierte en una pesadilla.

Desafíos de la depuración El código x64 optimizado ofrece información detallada sobre el problema.

Encontré muchos temas sobre este espacio de sombra, pero no pude encontrar la respuesta en ninguno de ellos, por lo que mi pregunta es:

¿Cuántos bytes exactamente necesito restar del puntero de pila, antes de ingresar a un procedimiento?

¿Y debo empujar los parámetros del procedimiento a la pila antes de restar el "espacio de sombra"?

Desarmé mi código, pero no pude encontrar la lógica.


El espacio en la sombra es el obligatorio de 32 bytes (4x8 bytes) que debe reservar para el procedimiento llamado. Solo significa que debe proporcionar 32 bytes en la pila antes de llamar. Este espacio se puede dejar sin inicializar, no importa.

Tenga en cuenta que en la convención de llamada x64, los argumentos después del 4 se insertan en la pila, que se encuentran en la parte superior de este espacio de sombra (antes de los 32 bytes).

En resumen, puede verlo como si las funciones en x64 tuvieran un mínimo de 4 argumentos, pero con el valor de los 4 primeros en los registros.

Las cosas como la alineación de la pila también deben considerarse al llamar a x64.