proyectos:zxbcompiler:zxbc_callee_convention

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).

  • proyectos/zxbcompiler/zxbc_callee_convention.txt
  • Última modificación: 24-01-2009 20:51
  • por sromero