Operaciones CALL y RET

La instrucción CALL transfiere el control a un procedimiento llamado, y la instrucción RET regresa del procedimiento llamado al procedimiento original que hizo la llamada. RET debe ser la ultima instrucción en un procedimiento llamado. Los formatos generales para CALL y RET son:


El código objeto particular que CALL y RET generan depende de si la operación implica un procedimiento NEAR (cercano) o un procedimiento FAR (lejano).

Llamada y regreso cercanos

Una llamada (CALL) a un procedimiento dentro del mismo segmento es cercana y realiza lo siguiente:

  • Disminuye el SP en 2 (una palabra)
  • Mete el IP (que contiene el desplazamiento de la instrucción que sigue al CALL) en la pila.
  • Inserta la dirección del desplazamiento del procedimiento llamado en el IP (esta operación vacía el resultado de la instrucción previamente procesada),

Un RET que regresa desde un procedimiento cercano realiza lo siguiente:

  • Saca el antiguo valor de IP de la pila y lo envía al IP (lo cual también vacía el resultado de la instrucción previamente procesada).
  • Incrementa el SP en 2.

Ahora el CS:IP apunta a la instrucción que sigue al CALL original en la llamada del procedimiento, en donde se reasume la ejecución. Llamada y regreso lejanos. Una llamada (CALL) lejana llama a un procedimiento etiquetado con FAR, tal vez en un segmento de código separado. Un CALL lejano mete a la pila al CS y al IP, y RET los saca de la pila.

page 60,132
TITLE     P08CALLP (EXE) Llamada a procedimientos
.MODEL     SMALL
.STACK      64
.DATA
;———————————————————————
.CODE
BEGIN    PROC        FAR
CALL          B10             ;Llama a B10
;              …
MOV         AX,4C00H     ;Salida a DOS
INT 21H
BEGIN    ENDP
;———————————————————————
B10        PROC       NEAR
CALL         C10               ;Llama a C10
;             …
RET                                ;De regreso
B10       ENDP                              ;Quien llama
;———————————————————————
END BEGIN