Está en la página 1de 22

INSTITUTO TECNOLOGICO SUPERIOR DE ALVARADO

ING. SISTEMAS COMPUTACIONALES MATERIA:


LENGUAJE ENSAMBLADOR

SEMESTRE:
5TO.

PRACTICA 6:
PROGRAMAS CON PROCEDIMIENTOS

PRESENTA:
JOSE ANGEL SOSA ROSAS JORGE LUIS FLORES GONZALES ESTEFANY SOLANO MARQUEZ ALFREDO CRUZ RODIRGUEZ MADELIN DELFIN MARTINEZ

DOCENTE:
M.T.I. OSCAR LUIS PEA VALERIO
H. Y G. ALVARADO, VER. AGOSTOENERO 2011

PRCTICA 6
PROGRAMAS CON PROCEDIMIENTOS

OBJETIVO
Al terminar esta prctica, el alumno ser capaz de:

Comprender el mecanismo de llamada a un procedimiento y las instrucciones para el manejo de la pila.

ANTECEDENTES TERICOS
Los procedimientos nos permiten dividir un programa relativamente complejo en piezas de cdigo ms manejables. Un procedimiento debiera ser ms fcil de comprender y depurar que un programa completo.

Para implementar la llamada a un procedimiento y el regreso de ste, se tiene el siguiente mecanismo:

1. Cuando el programa lee de memoria y decodifica la instruccin que corresponde a la llamada a un procedimiento, el registro apuntador de instrucciones IP tiene el desplazamiento de la siguiente instruccin a ejecutar.

2. La instruccin call inserta el valor de este desplazamiento en la pila del programa y carga en el registro apuntador de instrucciones el valor de la direccin etiquetada con el nombre del procedimiento.

3. Al ejecutar una instruccin ret, sta extrae del tope de la pila el valor previamente almacenado por la instruccin call y lo carga en el registro apuntador de instrucciones. Como este valor es el desplazamiento de la instruccin que va despus de la llamada al procedimiento, sta ser la siguiente instruccin a ejecutarse. Esto es lo que se conoce como el regreso del procedimiento.

Adicionalmente a las instrucciones call y ret hay otras instrucciones que nos permiten insertar o extraer datos de la pila. Las instrucciones push y pop nos permiten insertar y extraer una palabra de la pila. Las instrucciones pushf y popf nos permite insertar y extraer el registro de banderas de la pila.

DESARROLLO
1. Use el editor de Turbo C para editar el siguiente programa en ensamblador y grbelo con el nombre de TRIANGU2.ASM:

2. Ensamble y ligue el programa anterior.

3. Cargue en el editor de Turbo C el archivo triangu2.lst. Busque la direccin de la instruccin: mov [tipo], al ; tipo = AL

Esta direccin es la de la siguiente instruccin a la llamada al procedimiento triang, y corresponde a la direccin de regreso del procedimiento. Apunte ste valor:

IP = 0013

Busque la direccin de la instruccin: push ax ; Guarda el valor de lado1 Esta direccin es la de la primera instruccin del procedimiento triang. Apunte ste valor: IP = 001D

4. Cargue el programa Turbo Debugger tecleando: td triangu2 5. Se va a agregar una cuarta ventana a la pantalla del Turbo Debugger. Para ello reduzca horizontalmente el tamao de la Ventana de Inspeccin al mnimo. Obtendr lo mostrado en la figura 6-1. 6. Presione [Alt][V] para seleccionar la opcin View del men principal. Del men que aparece seleccione la opcin Dump presionando la tecla [D]. Aparecer la Ventana de Vaciado, tal como se muestra en la figura 6-2.

7. Mueva y ajuste el tamao de la Ventana de Vaciado para que quede en la esquina inferior derecha de la pantalla, tal como se muestra en la figura 6.3. La Ventana de Vaciado nos permite visualizar el contenido de un bloque de la memoria. En este caso nos muestra el contenido de los primeros 48 bytes del segmento de datos, 8 en cada una de las seis filas. Cada fila est divida en tres campos: El primer campo es la direccin del primer byte de cada una de las filas. Por ejemplo el primer dato en esta ventana se encuentra en la direccin: ds:0000h

Fig. 6-1

Fig. 6-2

Fig. 6-3
mientras que el ltimo dato est en la direccin:

ds:002Fh.

El segundo campo muestra los valores de los ocho bytes que empiezan con la direccin dada por el primer campo. Los valores mostrados en este caso son "basura" y sern diferentes en cada computadora y en cada corrida.

El tercer campo muestra los valores de los mismos ocho bytes pero desplegados como caracteres . 8. Guarde esta configuracin de ventanas. Seleccione del men principal la opcin Options presionando [Alt][O]. Del men que aparece, seleccionar la opcin Save options presionando [S]. Aparece otro men. Seleccione la opcin All, presionando la tecla [A]. Aparece un recuadro pidindonos el nombre de un archivo en donde se almacenar la configuracin. Tecle:

tddump.td Recuerde que la configuracin previa, con las tres ventanas: Ventana de Registros, Ventana de Mdulo y Ventana de Observacin esta almacenada en el archivo TTDCONFIG.TD y que sta nueva configuracin, con la cuarta ventana: Ventana de Vaciado, se ha almacenado en el archivo TDDUMP.TD. Podemos volver a la configuracin anterior seleccionando del men principal la opcin Options presionando [Alt][O]. Del men que aparece, seleccionar la opcin Restore options presionando [R]. Aparece un recuadro pidindonos el nombre del archivo en donde est almacenada la configuracin. Tecle el nombre del archivo con la configuracin deseada.

9. La Ventana de Vaciado se va a utilizar para observar los datos en la pila del programa. Para hacer que la Ventana de vaciado muestre otro bloque de memoria siga el siguiente procedimiento:

a) Asegrese que la Ventana de Vaciado sea la ventana activa. La ventana activa es la que tiene un marco con lneas dobles. De no ser as presione [Alt][n], donde n es el nmero de la ventana que deseamos que sea la ventana activa.

b) Presione [Ctrl][G]. Aparecer un recuadro como el mostrado en la figura 6.4.

Fig. 6-4

Aqu nos piden la direccin inicial del bloque de memoria a visualizar en la Ventana de Vaciado. Deseamos visualizar la pila del programa. Como la pila del programa crece de la direccin ms alta a la ms baja del segmento en el que se encuentra la pila, debemos mostrar en la Ventana de Vaciado la ltima n bytes del bloque de memoria asignado a la pila, donde n es el nmero de bytes que se pueden mostrar en la Ventana de Vaciado. As en realidad estaremos mostrando los primeros n bytes de la pila. Recuerde que al cargar a memoria el programa para su ejecucin los registros de segmento de la pila SS y apuntador a la pila SP son inicializados al segmento que contiene la pila y al tamao de la pila, respectivamente. Por lo tanto, la direccin SS:SP es la del siguiente byte de donde termina el bloque de memoria asignado a la pila. Como deseamos mostrar en la Ventana de Vaciado los n bytes anteriores teclearemos: ss:(sp - n)

donde n es el tamao en bytes de la Ventana de Vaciado. Por omisin este valor est en hexadecimal, podemos agregar la terminacin d si lo escribimos en decimal. por ejemplo si el tamao de la Ventana de Vaciado es como el mostrado en la figura 6-4, teclearemos: ss:(sp - 30) o ss:(sp - 48d)

En la pantalla aparecer lo mostrado en la figura 6-5.

Fig. 6-5
De la Ventana de Registros tome los valores de SS y SP y calcule las siguientes direcciones:

SS:(SP - 30) = 00D0

SS:SP = 0000

Verifique que esas direcciones corresponden a las del primero y ltimo byte de los mostrados en la Ventana de Vaciado. 10. Como los valores que se insertan o extraen de la pila son de tamao palabra (2 bytes) conviene visualizar los valores mostrado en la Ventana de Vaciado como palabras. Para ello, asegrese que la Ventana de Vaciado es la ventana activa. Presione [Ctrl][F10] para mostrar el men principal de esa ventana. Del men que aparece seleccione la opcin Display as presionando [D]. Aparece un men con las diferentes formas de visualizar los datos en la Ventana de Vaciado. Seleccione la opcin Word presionando [W]. En la pantalla aparecer lo mostrado en la figura 6-6

11. Coloque en la Ventana de Inspeccin las variables lado1, lado2, lado3 y tipo. Inicialice las variables lado1, lado2 y lado3 a los valores 1h, 2h y 3h respectivamente

12. Haga que la Ventana de Mdulo sea la6-6 ventana activa, tecleando: Fig. [Alt] n

donde n es el nmero de la ventana.

13. Coloque el cursor en la lnea: call triang

y presione [F4] ejecutar el programa hasta antes de esta instruccin. Observe y anote los valores de los registros AX, BX, CX:
AX = 0000 BX = 0000 CX = 0000

Observe los valores de la pila en la Ventana de Vaciado, en especial la ltima palabra (2 bytes). En este momento la pila est vaca y esos valores son basura.

14. Note que la siguiente instruccin a ejecutar es la llamada al procedimiento triang. Presione [F7]. Note que el marcador de instruccin apunta a la lnea: push ax ; Guarda el valor de lado1 que es la primera instruccin del procedimiento triang. Esto es, el control de flujo del programa pas al procedimiento. Observe la ltima palabra en la Ventana de vaciado, que corresponde al primer dato almacenado en la pila y cuya direccin est dada por SS:SP - 2. Anote ese valor en el recuadro apuntado por SP en la figura de la pila que se muestra a continuacin. Pila SP
00FE

SS:00FC

SS:00FE

Qu representa este valor? ES el dato almacenado en la pila

Compare ese valor con el valor obtenido en el paso 3. Representan el mismo valor? Explique:

15. Presione [F8] para ejecutar la instruccin:

push ax

; Guarda el valor de ; lado1

Observe la pila y ubique dnde quedo almacenado el valor de AX. Llene los recuadros que representan el contenido de la pila en la siguiente figura. Pila SP
00FC 00FE

SS:00FA

SS:00FC SS:00FE

16. Ejecute las siguientes cuatro instrucciones hasta que el marcador de instruccin quede sobre la lnea: pop ax ; recupera lado1

Note que se lleg a esta lnea por que en las instrucciones anteriores se determin que con los valores de los lados no se puede formar un tringulo. El propsito de almacenar y despus restaurar el valor de AX es de conservar el valor del lado1 que se pierde al usar AX para sumar lado1 y lado2. Se requiere almacenar ese valor para despus poder compararlo con los otros lados y as determinar el tipo de tringulo. Sin embargo en este caso ya sabemos que los lados no forman un tringulo y ya no se van a comparar los lados. Podramos omitir esta instruccin del programa?

No

De contestar que no, explique por qu es necesaria. Se produce un error al quitar la instruccion

Ejecute la instruccin. Observe la pila del programa y llene los recuadros que representan el contenido de la pila en la siguiente figura. Pila SP
00FE

SS:00FA SS:00FC SS:00FE

Qu pas con el valor que estaba en el tope de la pila? Se recuper con la instruccin Pop

17. Ejecuta las siguientes dos instrucciones. Qu ocurri con el marcador de instruccin?

Observe el valor del registro IP:

IP = 0027

Comprelo con el valor que se tena en el tope de la pila en el paso 15. No es el mismo

18. Termine la ejecucin del programa y observe el valor de la variable tipo:

tipo = 004E

Es ste correcto? Si

19. Presione [Ctrl][F2] para reiniciar el programa. Inicialice las variables lado1, lado2 y lado3 al mismo valor de 5h.

20. Ejecute el programa hasta la lnea

call triang

21. En la corrida anterior se ejecut la llamada al procedimiento triang, presionando [F7]. En lugar de esto, presione [F8]. Observe donde queda el marcador de instruccin. Qu fue lo que ocurri?

Cul es la diferencia entre presionar [F7] y [F8] si la siguiente instruccin es un procedimiento.

22. Termine la ejecucin del programa y observe el valor de la variable tipo:

tipo = E 96 (45h)

Es ste correcto? Es un equiltero

23. El programa anterior requiere que los valores de los lados del tringulo sean suministrados en orden ascendente. Modifique el programa anterior para que acepte los datos en cualquier orden. Para ello haga lo siguiente:

a) Escriba un procedimiento llamado ordena que reciba los valores de los lados del tringulo en cualquier orden en los registros AX, BX y CX, y los regrese ordenados: el menor en AX y el mayor en CX.

b) Modifique el procedimiento triang para que primero llame al procedimiento ordena.

24. Edite el programa y grbelo con el nombre de TRIANGU3.ASM. Ensamble y ligue el programa anterior.

25. Cargue el programa Turbo Debugger y ajuste la Ventana de Vaciado para que muestre los primeros n bytes de la pila, tal como se hizo en el paso 9.

26. Coloque en la Ventana de Inspeccin las variables lado1, lado2, lado3 y tipo. Inicialice las variables lado1, lado2 y lado3 a los valores 3h, 2h y 1h respectivamente.

27. Ejecute el programa paso a paso. En cada instruccin que modifique la pila, haga un diagrama de la pila mostrando su estado as como los valores que contiene y qu representan.