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