PROCEDIMIENTOS
fareloTesis16 de Junio de 2013
3.281 Palabras (14 Páginas)289 Visitas
PROCEDIMIENTOS
Procedimiento. Conjunto de instrucciones que realizan una tarea -y preferentemente solo una- que se ha de utilizar en más de una ocasión pero se declara una sola vez en el código fuente.
Un procedimiento puede llamar a otro, y este a su vez a otro y así sucesivamente
El procedimiento se guarda en memoria cuando se ensambla y ejecuta y entonces puede ser llamado tantas veces como sea necesario, ahorrando espacio y facilitando el desarrollo de software gracias a que permite organizarlo.
Los procedimientos deben ser cortos, de no más de una o dos páginas.
Sus ventajas son:
1. Reducen la cantidad de código
2. Permiten organizar mejor el programa
3. Facilitan la depuración del programa
4. Facilitan el mantenimiento progresivo del programa.
Su desventaja es que reducen la velocidad de ejecución de los programas debido a la forma en que se ejecutan (cada vez que se llama a un procedimiento, el programa tiene que ir a buscarlo pues sólo se ha generado el código del mismo una vez).
Al momento de invocar a un procedimiento se guarda en la pila la dirección de la siguiente instrucción del programa para que, una vez transferido el flujo del programa y terminado el procedimiento, se pueda regresar a la línea siguiente del programa original. Tener esto presente si se usa la pila antes, durante y después de llamar al procedimiento
TIPOS DE PROCEDIMIENTOS
Existen dos tipos de procedimientos:
A) los intrasegmentos, que se encuentran en el mismo segmento de instrucciones, se declaran y se llaman dentro del mismo programa en ellos se almacena en la pila el valor de IP. También se les conoce como procedimientos internos también son llamados procedimientos locales.
B) Los intersegmentos, que pueden ser almacenados en diferentes segmentos de memoria, y en cuyo caso se almacena en la pila el valor CS:IP. Se les llama también procedimientos externos. Se declaran en módulos o programas separados al programa donde el procedimiento es llamado, en otras palabras, la llamada al procedimiento se encuentra en un programa y el procedimiento en otro. Para poder utilizar procedimientos externos, es necesario que sean declarados como públicos en el programa donde se encuentran y que sean llamados como externos en el programa donde serán usados. Se debe contar con las directivas de ensamble:
PUBLIC
Ppara declarar los procedimientos como públicos, y hacerlos disponibles para otros módulos.
PUBLIC nombre
EXTRN
Para indicar qué nombres se van a usar está fuera del programa.
EXTRN nombre:tipo
Si el nombre representa un dato, tipo es BYTE, WORC, DWORD, QWORD o TBYTE
Si el nombre representa una etiqueta, tipo es FAR o NEAR
Es conveniente poner las directivas EXTERN y PUBLIC antes que las instrucciones y las directivas que definen datos a fin de que el ensamblador sepa qué significan esos nombres especiales antes de que aparezcan en el programa.
Los procedimientos son producidos y llamados gracias a las directivas e instrucciones CALL, PROC, RET y ENDP.
CALL
Es una instrucción que sirve para llamar al procedimiento desde el programa principal y además guarda la dirección de retorno en la pila, es decir, la dirección de la instrucción que sigue al CALL, de manera que al terminarse la ejecución del procedimiento, el programa que lo llamó pueda continuar ejecutándose.
CALL nombre del procedimiento
Los CALL pueden ser cercanos o lejanos.
Los cercanos utilizan 16 bits, lo que les permite “saltar” en un rango de -32KB a +32KB. Se usan en ensambladores 8086 a 80286.
Los lejanos utilizan 32 bits y pueden “saltar” en un rango de -2GB a +2GB. Se utilizan en en esmbladores 80386 o posteriores.
Ejemplo de un programa principal llamando a un procedimiento:
; Programa principal
Instrucciones del programa principal
CALL nombre ;El procesador guarda en pila a IP* y Coloca en
IP el desplazamiento correspondiente al procedimiento
Instrucciones del programa principal
*Si es NEAR, guarda solo el offset, si es FAR, guarda la dirección completa.
PROC
Es una directiva que indica donde inicia el procedimiento, su formato es:
nombre PROC tipo
Tipos.
1. Los locales (PROC NEAR), serán usados por una tarea específica
2. Los globales (PROC FAR), pueden ser usados por todo el software.
Notas:
-Si no se especifica tipo, se usa el default NEAR
-DOS inicia un programa llamando al programa principal, por ello, éste siempre es FAR
-PROC puede además utilizar la aseveración USES, que le permite definir qué registros serán almacenados en la pila antes de correr el procedimiento. Esos registros serán recuperados al terminar el procedimiento. Ejemplo:
Nombre PROC NEAR USES AX BX SI DI
ENDP
Es una directiva que indica donde termina el procedimiento
Nombre ENDP
Nótese que nombre de PROC y de ENDP deben ser el mismo.
Se recomienda que cada procedimiento salve y recupere registros, por lo que debe usar PUSHA al principio y POPA al final.
RET
Permite que el programa principal vuelva al procedimiento que lo llamó (DOS) o bien
Permite que los procedimientos secundarios vuelvan al procedimiento que los llamó (programa principal)
Es una instrucción que recupera la dirección de retorno de la pila para que el programa pueda seguir ejecutándose a partir de la instrucción que sigue a CALL. Se inserta antes de ENDP, su formato es:
RET
Un retorno cercano (local) recupera 16 bits de la pila y los coloca en el IP.
Un retorno lejano (global) recupera 32 bits de la pila y los coloca en IP y CS.
Ejemplo de un procedimiento llamado por el programa principal:
nombre PROC NEAR USES AX, BX, DX
(puede ser FAR)
PUSHA
Instrucciones
del
procedimiento
POPA
RET
Nombre ENDP
(el mismo)
CALL puede también usar direccionamiento indirecto. CALL WORD PTR [BX]
(el apuntador PTR más WORD indica el tipo de contenido de la dirección de memoria [BX])
Ejemplo de CALL indirecto cercano*:
LEA BX,DIR1 ;DIR1 contiene la dirección del procedimiento NEAR
CALL WORD PTR [BX] ;WORD = solo un offset como dirección.
*Previamente, debimos haber declarado un dato llamado DIR1, que contendrá la dirección del procedimiento a llamar:
DIR1 DW nombre del Proc. NEAR ;DW: queremos solo el offset.
Ejemplo de CALL indirecto lejano*:
LEA BX,DIR2 ;DIR2 contiene la dirección del Proc. FAR
CALL DWORD PTR [BX] ;DWORD = un offset y un Seg. como Dir.
*Previamente, debimos haber declarado un dato llamado DIR2, que contendrá la dirección del procedimiento a llamar:
DIR2 DD nombre del Proc. FAR ;DD: queremos offset y segm.
PASO DE PARÁMETROS
Los procedimientos en lenguaje ensamblador no cuentan con un mecanismo para el paso de parámetros; por esto, la única forma de lograrlo es colocando los parámetros que nos interesan en los registros de propósito general antes de que el procedimiento sea ejecutado.
Existen varias maneras de pasar parámetros del programa principal al procedimiento y viceversa:
1. A través de registros (cuando los parámetros son pocos):
Parámetros de entrada: El programa principal coloca los parámetros en registros específicos que luego serán utilizados por el procedimiento.
Parámetros de salida: El procedimiento es quien coloca los parámetros en registros, el programa principal los utilizará. Tener cuidado de hacerlo entre el POPA y el RET.
2. A través de la pila (cuando hay muchos parámetros):
No es muy recomendado, pues se debe tener cuidado de no interferir con PUSHA y POPA y sobre todo, con la actividad automática del CALL y del RET de empujar y sacar la dirección de retorno. El procedimiento termina siendo muy complicado.
3. A través del registro BP (cuando hay muchos parámetros):
Lo primero es guardar los parámetros en pila (desde el programa principal):
PUSH PARAMETRO1
PUSH PARAMETRO2
. . .
PUSH PARAMETRO7
CALL nombre
Nombre PROC
Una vez dentro del procedimiento, copiamos el TOS en BP:
MOV BP,SP
PUSHA
; Dado que el CALL usó los dos últimos bytes de la pila para guardar la dirección de retorno, nuestros parámetros estarán en:
MOV AX, [BP+16] ;PARAMETRO1
MOV BX, [BP+14] ;PARAMETRO2
. . . ;Todos los registros menos BP
MOV SI, [BP+4] ;PARAMETRO6
MOV DI, [BP+2] ;PARAMETRO7
Los parámetros de salida del procedimiento no se pueden meter en pila, pues empujarían la dirección de retorno, pero podemos simplemente modificarlos mediante
...