proyectos:zxbcompiler:zxbc_convention_call

Secuencia de Llamada

La Secuencia de LLamada (Calling Convention) es la forma en la que se implementan a bajo nivel las llamadas a funciones y subrutinas en los programas de alto nivel. El paso de parámetros, o cómo devolver un valor de retorno de una función son las cosas más discutidas.

Existe un documento muy interesante en internet, sobre el paso de parámetros a función en C, aunque aplicable a todos los lenguajes de programación de alto nivel, en general. También se ha discutido este tema en el foro de speccy. Y también se exponen ideas en otros sitios en internet, como éste.

Existen tres tipos de implementación típicas de secuencias de llamada:

  1. CALLER .- El código que llama a la subrutina pone los parámetros en la pila (STACK), hace la llamada (CALL) y tras el retorno de la misma, retira los parámetros de la pila, para dejarla consistente. Esta implementación es típica de los lenguajes como C, y tiene la ventaja de que permitiría definir funciones con número de parámetros variables. Por contra, tiene la desventaja de que consume más memoria.
  2. CALLEE .- El código llamado (la subrutina) se encarga de retirar de la pila los parámetros que el CALLER ha puesto. Esta operación es un poco más complicada, porque la dirección de retorno está en el stack y tras ella, los parámetros que metió el CALLER. Por eso, se requiere tomar el valor de retorno de la pila y guardarlo temporalmente en un registro, para alterar la pila antes de retornar. Este esquema de llamada lo suele implementar el lenguaje PASCAL, y tiene la ventaja de que al ser la subrutina la que limpie siempre la pila, se ahorran bytes de memoria en cada llamada y es más rápida. Por contra, no admite parámetros variables (al menos no sin ciertos trucos).
  3. FASTCALL .- Ni el código llamado ni el que llama hacen nada con la pila. Los parámetros se pasan y se devuelven a través de registros. Es de lejos el más rápido y eficiente (ocupa poca memoria), pero no siempre puede hacerse. Los registros son escasos (especialmente en el Z80). Es útil, no obstante para implementar funciones a bajo nivel (ensamblador) y a mano.
  • proyectos/zxbcompiler/zxbc_convention_call.txt
  • Última modificación: 24-01-2009 20:50
  • por sromero