Implementación de Procedimientos
En términos muy groseros, un PROCEDIMIENTO es simplemente una dirección de la memoria que contiene una secuencia de instrucciones y termina con una instrucción RET. A partir de este punto, comienzan a aparecer “detalles”, tales como los PARAMETROS, el mantenimiento de los REGISTROS y BANDERAS en la “PILA” o “STACK”, el mantenimiento de VARIABLES en la pila, el retorno de valores (para implementar las funciones), etcétera. Todas estas cuestiones son importantes al implementar compiladores ya que en los lenguajes de alto nivel, se toman en cuenta minuciosamente.
En la Fig. 1 observamos el código de un procedimiento que comienza en la línea 108 y que consiste de una rutina que permite mostrar un carácter por la pantalla, es el código que vemos a continuación:
0DE3:0108 MOV AH,2
0DE3:010A MOV DL,31
0DE3:010C INT 21
0DE3:010F RET
El “Programa Principal” es el siguiente:
0DE3:0100 CALL 108
0DE3:0103 MOV AX,4C
0DE3:0106 INT 21
Como vemos, el “programa” completo no es mucho mas que esto, ya que lo único adicional es que tiene las instrucciones de “salida” de DOS. Sin embargo, muestra dos conceptos importantes:
1) El procedimiento es simplemente una DIRECCION de memoria.
2) La instrucción RET devuelve el puntero de instrucciones, o, en términos simples, el control del programa a la instrucción siguiente a la del llamado.
En este ejemplo, el LLAMADO del procedimiento se realiza en la dirección 100 y el RETORNO se produce en la dirección 103.
El Programa en Ejecución
Observen la Fig. 2:
1) El programa muestra la ejecución de la primera instrucción que es la llamada al procedimiento (CALL 108).
2) Luego aparece un 1 en la pantalla que es lo que imprimió la subrutina. En este punto, es interesante notar que el IP = 103 (puntero de instrucciones) esta dirección es la del retorno del procedimiento.
3) Desde la dirección 103 el programa TERMINA
¡Esto es todo por ahora!
Sergio Otaño
viernes, 25 de enero de 2008
Suscribirse a:
Enviar comentarios (Atom)
0 comentarios:
Publicar un comentario