Convención de Llamada de CALLEE
En este esquema, la parte del código que llama la función, mete los parámetros en la pila, llama a la función. Luego la función llamada, antes de retornar retira los parámetros de la pila.
Ejemplo sacado del foro de Speccy.org:
ld hl, 4 push hl ld hl, 2 push hl ld hl, 3 push hl call Funcion ; Funcion(3, 2, 4) ... ; Nothing to pop. CALLEE has already done it :Funcion ; Funcion(a, b, c) push ix ld ix, 0 ; add ix, sp ; Nuevo registro de activación ld hl, -NN ; Tamaño de las variables locales add hl, sp ld sp, hl ; SP -> SP - NN // Reserva espacio en la pila para variables locales ... ld d, (ix + 4) ; operación con el 2º parámetro, por ejemplo ... ld sp, ix pop ix ; Comienzo del código de retorno pop hl ; HL es la dirección de retorno ld sp, ix ; Pone el stack a como estaba antes de meter los parámetros jp (hl) ; "Ret" coded as a jump
Como puedes ver, el retorno de esta función se hace con un jp (hl) y no con un ret. Además, es mucho más rápido recuperar el valor del registro de pila (SP) que hacer una serie de pops (esta optimización la puede hacer el esquema CALLER, pero sigue desperdiciando más bytes en cada llamada).
- *Nota**: El registro IX aquí está siendo usado como Registro de Activación.