Pregunta

Me gustaría saber cuál es el responsable de la limpieza de la pila

Suponga que tiene una función fun digamos así:

var = fun(int x, int y, float z, char x);

cuando fun se llamará el tope en la pila junto con los parámetros a continuación, cuando se devuelve la función que se encarga de la limpieza de la pila es que el auto función o el "var", que contendrá el valor de retorno.

Una cosa más, ¿alguien puede explicar los conceptos de convenciones de llamada?

¿Fue útil?

Solución

convención de llamada se refiere a que está haciendo la limpieza de la pila; persona que llama o destinatario de la llamada.

  

convenciones de llamada puede diferir en:

     
      
  • donde se colocan los parámetros y valores de retorno (en registros; en la llamada   apilar; una mezcla de ambos)
  •   
  • el orden en que se pasan los parámetros (o partes de una sola   parámetro)
  •   
  • cómo la tarea de la creación y la limpieza de una llamada de función se divide   entre el que llama y el destinatario de la llamada.
  •   
  • que registra que puede ser utilizado directamente por el destinatario de la llamada puede a veces también   ser incluido
  •   
     

Arquitecturas casi siempre tienen más   de una posible convención de llamada.

Otros consejos

Usted ha hecho referencia a la respuesta por ti mismo:. convenciones de llamada

Una convención de llamada es similar a un contrato . Se decide lo siguiente:

  • ¿Quién es responsable de la limpieza de los parámetros.
  • ¿Cómo y en qué orden los parámetros se pasan a la función llamada.
  • ¿Dónde se almacena el valor de retorno.

Hay muchas diferentes convenciones de llamada, dependiendo de la plataforma y el entorno de programación. Dos convenciones de llamada comunes en las plataformas x86 son:

  

stdcall

     

Los parámetros se pasan en la pila de derecha a izquierda. El llamada función limpia la pila.

     

cdecl

     

Los parámetros se pasan en la pila de derecha a izquierda. El llamando función limpia la pila.

En ambos casos el valor de retorno es en el registro EAX (o ST0 para los valores de coma flotante)

Muchos lenguajes de programación para la plataforma x86 permiten especificar la convención de llamada, por ejemplo:

  

Delphi

function MyFunc(x: Integer): Integer; stdcall;
     

Microsoft C / C ++

int __stdcall myFunc(int x)

Algunas notas de uso:

Al crear una aplicación sencilla que es raramente necesario cambiar o saber sobre la convención de llamada, pero hay dos casos típicos donde es necesario preocuparse por convenciones de llamada:

  • Cuando se llama a bibliotecas externas, Win32 API, por ejemplo: usted tiene que utilizar convenciones de llamada compatibles, de lo contrario la pila podría corromperse
  • .
  • Al crear código ensamblador en línea: Usted tiene que saber en que registra y donde en la pila a encontrar las variables
  • .

Para más detalles, recomiendo estos artículos de Wikipedia:

En el momento en que la línea se completa var contendrá el valor devuelto por diversión () y cualquier memoria en la pila usada por diversión se ha ido:. "Push", "pop" todo ordenado

convenciones de llamada: todo lo que el compilador organiza de manera que la diversión puede hacer su trabajo. Considere esos parámetros x, y, z. ¿En qué orden Cómo consiguen inserta en la pila (de hecho es lo que se pasan a través de la pila)? No importa, siempre y cuando la persona que llama y el destinatario de la llamada de acuerdo! Es una convención.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top