Professional Documents
Culture Documents
ARQUITECTURA DE COMPUTADORAS
Trabajo Prctico N 5
Procedimientos - Pila
Introduccin
Los procedimientos son bsicamente una lista de instrucciones que se pueden ejecutar desde
muchos lugares diferentes de un programa, en lugar de tener que repetir la misma lista de
instrucciones cada vez que se necesitan.
Los procedimientos se llaman por medio de la instruccin CALL y los abandonamos (mejor dicho
salimos de un procedimiento) por medio de la instruccin RET.
Deseamos (tantas cosas) escribir 4 caracteres distintos comenzando por la A y terminando por la
D. Por que nos gusta hacer las cosas difciles lo haremos en Assembler, utilizando el Debug, (No
es ms fcil hacerlo en el Word?. Seguro que s, pero si lo hacemos en el Word, como hace el
profesor para explicar que es una pila?, Cmo funcionan los registros SP y SS?, que significa push
y pop, etc.,etc.).
Escribamos las siguientes instrucciones, utilizando el comando A del Debug, respetando las
direcciones que aparecen a la izquierda.
0100
0102
0105
0108
010A
MOV
MOV
CALL
LOOP
INT
DL,41
CX,0004
0200
0105
20
0200
0202
0204
0206
MOV
INT
INC
RET
AH,02
21
DL
Ejecutemos nuestro programa con T, y completemos la tabla (de la cual solamente se adjunta la
cabecera) teniendo en cuenta de proceder de la siguiente manera:
1) Escribir los valores de los registros correspondientes por cada rastreo T.
2) Cada vez que se ejecute una instruccin Call o Ret indicarlo con una cruz en la columna que
corresponde.
3) La ltima columna la dejaremos para llenarla ms adelante, por lo que debemos grabar nuestro
programa (para refrescar como hacerlo veamos el TP N 4).
IP
DL
CALL 0200
RET
SP
Valor en la Pila
CALL
INT
0200
20
0200
0203
CALL
RET
0300
0300
0303
CALL
RET
0400
0400
RET
Para completar la tabla, las tres primeras columnas no tienen complicaciones, pero la ltima se nos
puede complicar. Teniendo en cuenta que, como dijimos anteriormente, la pila es una porcin de
memoria:
3) Cmo hacemos para ver los valores que se guardan en ella?
4) Cmo sabemos en que direccin se encuentran los valores que vamos guardando?
Una vez que encontramos la respuesta a los interrogantes anteriores, estamos en condiciones de
llenar la tabla (tambin de la cual solamente se adjunta la cabecera).
IP
Instruccin
SP
Valor en la Pila
En este programa, la instruccin que se encuentra en la direccin 100h llama a la que est en 200h,
la cual llama a la que se encuentra en 300h, que a su vez llama a la que est en 400h, donde por fin
nos encontramos con una instruccin de retorno (RET). Esta instruccin RET devuelve el control a
la instruccin que hay a continuacin de la CALL, la direccin 300h, comenzando a ejecutar
instrucciones en la direccin 303h. Pero en esa direccin se encuentra otra
direccin RET, la cual enva el control a la 203h. En esta direccin se vuelve a encontrar otra
instruccin 203h, y as sucesiva mente. Cada instruccin RET saca (POP) la ltima direccin, es
decir, la ms alta de la pila; esto quiere decir que las instrucciones RET siguen el mismo camino
que las instrucciones CALL, slo que en direccin contraria.
5) Ahora estamos en condiciones de llenar la columna de la derecha de nuestro primer
programa, el cual deberamos tener grabado.
0202
0205
0207
0209
020A
020B
MOV
INC
LOOP
POP
POP
RET
CX,0003
DL
0205
DX
CX
6) Ejecutar el ejemplo anterior, y completar una tabla que nos permita registrar los valores de
IP, SP y los datos guardados temporalmente en la pila, indicando en particular cuando se ha
ejecutado instrucciones PUSH, POP, CALL y RET.
Las instrucciones POP estn en orden inverso a las PUSH. Esto se debe a que la instruccin POP
toma la ltima palabra que se ha puesto en la pila, y en este caso el valor del registro DX est
encima del valor del registro CX.
Salvando y restableciendo CX y DX podemos cambiar estos registros en el procedimiento que
comienza en la direccin 200h, pero sin cambiar los valores que usa el procedimiento que llama a
este ltimo. Una vez salvados los registros CX y DX, stos se pueden usar para guardar variables
locales (variables que podemos usar en este procedimiento sin afectar a los valores utilizados
por el programa que ha efectuado la llamada). Estas variables locales se usan para simplificar el
programa. Mientras tengamos cuidado de restablecer los valores originales, no nos tendremos que
preocupar de que los, procedimientos cambien los registros que usa el programa que efecta la
llamada. Esto se ver ms claro en el ejemplo siguiente, que es un procedimiento para leer un
nmero hexadecimal. Al contrario que el programa anterior, este nuevo programa slo nos
permitir aceptar caracteres vlidos, como por ejemplo la A, pero no aceptar la K.
PUSH
MOV
INT
CMP
JB
CMP
JA
CMP
JA
DX
AH,08
21
AL,30
0203
AL,46
0203
AL,39
021B
0211
0213
0215
0217
0219
021A
021B
021D
021F
MOV
MOV
INT
SUB
POP
RET
CMP
JB
MOV
AH,02
DL,AL
21
AL,30
DX
AL,41
0203
AH,02
MOV
INT
SUB
DL,AL
21
AL,37
0227
0228
POP
RET
DX
8) Interpretar como funciona el programa anterior, para eso nosotros les daremos una pequea
ayuda.
Las instrucciones JA (Jump if Above, saltar si est por encima) y JB (Jump if Below, saltar si est
por debajo) tratan a los dos nmeros como si fuesen nmeros sin signo, mientras que la instruccin
JL que usamos anteriormente trata a ambos nmeros como un complemento a dos.
Al llegar a la lnea 21h sabemos que tenemos un dgito vlido comprendido entre 0 y 9; as que
restamos el cdigo del carcter 0 y devolvemos el resultado en el registro AL, acordndonos de
recuperar (POP) el valor del registro DX que salvamos en la pila al principio del procedimiento. El
proceso para los dgitos comprendidos entre la A y la F es muy parecido. Fjese que en este
procedimiento tenemos dos instrucciones RET; podamos haber tenido ms, o simplemente
podamos haber tenido una.
He aqu un programa muy simple para comprobar el procedimiento:
0100
0103
CALL
INT
0200
20
Usar el comando G con un punto de ruptura, o nicamente el comando P, puesto que lo que
queremos es ejecutar la instruccin CALL 200h sin ejecutar la INT 20h, para ver los registros justo
antes de que el programa termine y se restablezcan los registros.
9) Comprobar con este procedimiento los lmites:/ (el carcter anterior al 0), el 0, el 9, el
carcter :" (el carcter que va despus del 9), y as sucesivamente.
Ahora que ya tenemos este procedimiento, el programa para leer un nmero hexadecimal de dos
dgitos, con deteccin de errores, es bastante sencillo:
0100
0103
0105
0107
0109
CALL
MOV
MOV
SHL
CALL
0200
DL,AL
CL,04
DL,CL
0200
010C
010E
0110
0112
ADD
MOV
INT
INT
DL,AL
AH,02
21
20
CS:0106 INT 21
CS:0108 POP DX
Comprobar
15) Qu diferencia tienen los siguientes listados en assembler con respecto a los 4 valores que
toma el registro AX, si suponemos que partimos de iguales datos en la zona de la pila?
Cul es el valor inicial y cul el final del Puntero de Pila en ambos casos?. A qu se debe la
diferencia?
Listado A)
CS:0100 MOV
CS:0102 MOV
CS:0105 MOV
CS:0108 MOV
CS:010B MOV
Listado B)
CS:0100 POP AX
CS:0101 POP AX
CS:0102 POP AX
CS:0103 POP AX
BP,SP
AX,[BP+00]
AX,[BP+02]
AX,[BP+04]
AX,[BP+06]
MOV BX,2002
MOV AX,2362
OV SI,0F00
PUSH BX
PUSH AX
MOV CH,AL
..........................................
197D:0210 50
PUSH AX
197D:0211 B224 MOV DL,24
197D:0213 B002 MOV AL,02
197D:0215 CD21 INT 21
197D:0217 C3
RET
CS:0310 50 PUSH AX
CS:0311 B231 MOV DL,31
CS:0313 B002 MOV AL,02
CS:0315 CD21 INT 21
CS:0317 C3 RET
CS:0120 5B POP BX
CS:0121 58 POP AX
CS:0122 B401 MOV AH,01
CS:0124 CD21 INT 21
CS:0126 C3 RET
19.a) Dadas las siguientes direcciones absolutas en 20 bits, 18303 18304 18305 18306 26798
26799 2679A 2679B 2679C 2679D 2679E 2679F 16A70 16A71 16A72 16A73 168E3 168E4
29548 29549 2954A 2954B 2954C 2954D 2954E 2954F
determinar cules de ellas son utilizadas con datos por el siguiente segmento de programa, y en
caso de que as sea, cules son los datos que contienen y de donde provienen
CS= DS=ES=SS
167D:0100
167D:0103
167D:0107
167D:0108
MOV
MOV
PUSH
PUSH
SP= FFCE
167D:0109
167D:010B
167D:010E
167D:0112
AX,0980
BX,01A1
AX
BX
ADD AX,BX
MOV [1B34],AX
MOV [BX+0100],BL
INT 20
19.b) Cul ser la direccin absoluta de la prxima instruccin a ejecutar al finalizar el programa?
20) Dado el siguiente programa en el cual SS= ED61 y SP= FFEE RE = 7211 (4.00 ptos.)
152A:0100 B92020
152A:0103 B81001
152A:0106 A36151
152A:0109 05D3F3
152A:010C 50
152A:010D E81001
152A:0110 58
152A:0111 CD20
MOV CX,2020
MOV AX,0110
MOV [5161],AX
ADD AX,F3D3
PUSH AX
CALL 0220
POP AX
INT 20
812B:1000 4F 4A 4F 2C 20 4E 4F 20-74 65 72 6D 69 6E 61 20
812B:1010 63 6F 6E 20 65 72 72 6F-72 24 20 5B 2F 56 5D 0D
Calcular:
En que direcciones absolutas de la pila se guardan los valores al ejecutarse la INT 21 de la
direccin 152A:022A y de qu direccin absoluta obtiene la direccin de retorno al ejecutarse el
RET de la direccin 152A:022C
En que direcciones absolutas se guarda el operando de la instruccin ADD AX,F3D3
En que direcciones absolutas se guarda el valor de AX en la instruccin MOV [5161],AX
Cul es el valor que contendr IP al finalizar la ejecucin del programa. Explique por qu.
MOV
MOV
INT
CALL
INT
AH,02
DL,30
21
0200
20
..................................
11F5:0200 MOV
11F5:0202
MOV
11F5:0204
INT
11F5:0206
RET
AH,02
DL,31
21
NT
IOPL
OF DF
IF
TF
SF
ZF
//
AF
//
PF
//
CF