2009-10-08 22 views
6

Desde: http://en.wikipedia.org/wiki/X86_calling_conventions¿Por qué la persona que llama debe borrar la pila en la convención de llamadas cdecl?

push c 
push b 
push a 
call function_name 
add esp, 12 ;Stack clearing 
mov x, eax 

¿Por qué tenemos que añadir explícitamente a 12 ESP para borrar la pila ya que la función llamada debería haber poped los parámetros de la pila, por lo tanto restaurar el puntero de pila ...?

Otra pregunta:

En teoría, sería posible implementar funciones de los parámetros variables con el destinatario de la llamada el cuidado de la derecha de limpieza (por ejemplo, si se pasa el número de argumentos en la pila en un registro)?

Respuesta

19

Porque, con la convención de llamadas C, la función llamada será no pop los parámetros. Ese es el objetivo de esta convención de llamadas.

Permite cosas como argumentos variables.

+0

Exactamente. Con las funciones C, el que llama puede insertar tantos argumentos en la pila como quiera antes de llamar a una función. La función llamada simplemente no sabe cuántos deben limpiarse. –

+1

¿cómo sabe el destinatario con cuántos parámetros se ha llamado para que pueda acceder de forma segura a ellos? En el caso de printf() puede analizar la cadena de formato pero, de lo contrario, ¿cómo lo hace? – anon

+0

http://en.wikipedia.org/wiki/Stdarg.h –

6

Fue allí mismo, en la página de Wikipedia por encima de la cabecera _cdecl

En estas convenciones la persona que llama limpia los argumentos de la pila, lo que permite una lista de argumentos, por ejemplo. printf().

Cuestiones relacionadas