¿Qué es el ‘espacio de sombra’ en el ensamblaje x64?

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 stack, antes de ingresar a un procedimiento?

¿Y debo empujar los parámetros del procedimiento a la stack antes de restar el “espacio de sombra”?

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

El espacio de sombra (también llamado a veces espacio de derrame o espacio de inicio ) se utiliza 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 stack 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 stack de llamadas.

Aquí es donde el espacio de Inicio entra en juego: los comstackdores pueden utilizarlo para dejar una copia de los valores de registro en la stack 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 comstackdores generalmente tratan el espacio de Inicio como disponible para uso desde cero. No quedan copias en la stack, 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.

El espacio en la sombra es los 32 bytes obligatorios (4×8 bytes) que debe reservar para el procedimiento llamado. Solo significa que debe proporcionar 32 bytes en la stack 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 stack, que se encuentran en la parte superior de este espacio en la 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 stack también deben considerarse al llamar a x64.

    Intereting Posts