Saltar al contenido

Convención de llamadas C: ¿quién limpia la pila en funciones variádicas frente a funciones normales?

No dejes de divulgar nuestros tutoriales y códigos con otro, apóyanos para ampliar nuestra comunidad.

Solución:

en lo que a mí respecta, C usa cdecl

A pesar de su nombre, la convención cdecl no es universal para el código C, ni siquiera en la arquitectura x86. Tiene la ventaja de ser simple de definir e implementar, pero no utiliza los registros de la CPU para el paso de argumentos, que es más eficiente. Eso marca la diferencia incluso en x86 sin registros, pero hace mucha más diferencia en arquitecturas con más registros disponibles, como x86_64.

Hablando de la limpieza, aquí está mi pregunta. No entiendo: ¿son tres cosas diferentes?

  1. apilar limpio
  2. moviendo el puntero de regreso al penúltimo marco de pila
  3. restauración de pila

O como debo verlos?

Me inclinaría a interpretar (1) y (3) como formas diferentes de decir lo mismo, pero es concebible que alguien haga distinciones entre ellas. (3) y la redacción relacionada es lo que encuentro con más frecuencia. (2) no es necesariamente lo mismo, porque puede haber dos parámetros relevantes de la pila que se restaurarán: la base del marco de la pila (ver más abajo) y la parte superior de la pila. La base del marco de pila es importante en el caso de que el marco de pila contenga más información que argumentos y valores de variables locales, como la base del marco de pila anterior.

Además, el objetivo de esta pregunta es básicamente cómo podría funcionar la función variádica en convenciones de llamada como Pascal o stdcall donde el destinatario debe borrar/limpiar/restaurar (no sé qué operación) la pila, pero no sabe cuántos parámetros que recibirá.

La pila no es necesariamente la imagen completa.

El receptor de la llamada no puede restaurar la pila si no sabe cómo encontrar la parte superior de la pila de la persona que llama y, si es necesario, la base del marco de la pila de la persona que llama. Pero en la práctica, esto suele ser asistido por hardware.

Tomando x86 (para el cual se diseñó cdecl) como ejemplo, la CPU tiene registros tanto para la base de la pila (marco) como para el puntero de la pila actual. La base de la pila de la persona que llama se almacena en la pila en un desplazamiento conocido (0) de la base de la pila de la persona que llama. Independientemente de la cantidad de argumentos, la persona que recibe la llamada restaura la pila moviendo la parte superior de la pila a su propia base de pila y extrayendo el valor allí para obtener la base de pila de la persona que llama.

Sin embargo, es concebible que haya una convención de llamada en uso en alguna parte que no permita restaurar la pila a un estado previo elegido que no sea haciendo estallar elementos uno a la vez, que no transmita explícitamente la cantidad de argumentos a la llamada función, y eso requiere que el receptor de la llamada restaure la pila de la persona que llama. Tal convención de llamadas no admitiría funciones variádicas.

¿Por qué es tan importante el orden en que se colocan los parámetros en la pila?

el orden es no importante en cualquier sentido general, pero es esencial que el llamador y el destinatario, que pueden compilarse por separado, estén de acuerdo al respecto. De lo contrario, el receptor de la llamada no puede hacer coincidir los valores pasados ​​con los parámetros para los que están destinados. Por lo tanto, en la medida en que una convención de llamada se base en la pila, debe especificar con precisión qué argumentos se pasan allí y en qué orden.

Con respecto a los marcos de pila: este es más material que no está especificado por C y que varía, al menos en cierta medida. Sin embargo, conceptualmente, el marco de la pila de una llamada de función es la parte de la pila que proporciona el contexto de ejecución para esa llamada. Por lo general, proporciona almacenamiento para variables locales y puede contener información adicional, como una dirección de retorno y/o el valor del puntero del marco de pila de la persona que llama. También puede contener otra información por llamada de función apropiada para el entorno de ejecución. Los detalles son parte de la convención de llamadas en uso.

valoraciones y reseñas

Más adelante puedes encontrar los comentarios de otros sys admins, tú incluso eres capaz dejar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *