You are on page 1of 9

INGENIERA EN SISTEMAS DE INFORMACIN - 2013

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

1) En base a lo anterior, qu acciones realizan las instrucciones CALL y RET?


2) Qu accin realiza la instruccin INC sobre el registro DL?

Pila y Direcciones de Retorno


Cuando voy a Bs. As, a pesar de ir casi siempre al mismo Hotel, cuando salgo llevo en mi bolsillo
una tarjeta con la direccin del Hotel, porque sino no s dnde volver (tengo muy mala memoria)
La instruccin CALL, necesita guardar en algn lado la direccin de retorno, para saber donde
debemos volver al ejecutar la instruccin RET.
Para esto tenemos una porcin de memoria conocida como PILA (stack).
1

Ing. Juan Carlos Ansaldi

INGENIERA EN SISTEMAS DE INFORMACIN - 2013


ARQUITECTURA DE COMPUTADORAS
Veamos el siguiente ejemplo, el cual debemos correr con el comando T , excepto al llegar a la
INT 20, la cual ejecutamos con el comando P.
0100
0103

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.

Las instrucciones PUSH y POP


La pila es muy til para guardar palabras de datos temporalmente, siempre y cuando tengamos
cuidado de restablecer la pila antes de una instruccin RET. Hemos visto que una instruccin
CALL empuja (PUSH) la direccin de retorno (una palabra) a la parte superior de la pila, mientras
que una instruccin RET saca (POP) esta palabra de la pila, la pone en el registro IP y saca a la
superficie (es decir, a la parte superior de la pila) la palabra que estaba justo debajo.
Con las instrucciones PUSH y POP se puede hacer ms o menos lo mismo: nos permiten empujar y
sacar palabras de la pila. Pero, cundo es necesario hacer esto?
A menudo es necesario grabar los valores de algn registro al principio de un procedimiento y
recuperarlos al final, justo antes de la instruccin RET. De esta forma podemos usar estos
registros, dentro del procedimiento, de la forma que mejor nos convenga, siempre y cuando
tengamos cuidado de recuperar sus valores al final. Los programas suelen estar formados por
muchos niveles de procedimientos, donde cada nivel llama a un procedimiento y ste a otro
procedimiento de nivel inferior. Salvando los valores de los registros al principio del
2

Ing. Juan Carlos Ansaldi

INGENIERA EN SISTEMAS DE INFORMACIN - 2013


ARQUITECTURA DE COMPUTADORAS
procedimiento y recuperndolos al final, se suprimen todas las interacciones no deseadas entre
procedimientos a niveles diferentes, y esto hace mucho ms fcil la tarea de programar. Ahora
veamos un ejemplo que se puede usar para salvar y restablecer los valores de los registros CX y
DX:
0100 MOV CX,FFFF
0103 MOV DX,EEEE
0106 CALL 0200
0109 INT
20
.........................................
0200 PUSH CX
0201 PUSH DX

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.

Leer nmeros hexadecimales con ms elegancia


Queremos crear un procedimiento que lea caracteres hasta que reciba uno que pueda convertir en
un nmero hexadecimal comprendido entre 0h y Fh. No queremos visualizar los caracteres
invlidos, as es que desplazaremos la entrada usando una nueva funcin INT 21h, la nmero 8, la
cual lee un carcter, pero no permite que ste pase a imprimir en la pantalla. De esta forma
podemos imprimir slo los caracteres que son vlidos.
Pongamos 08h en el registro AH (MOV AH,08) y ejecute esta instruccin, tecleando una A
inmediatamente despus de introducir el comando G 104:
0100 MOV AH,08
0102 INT
21
7)Qu es lo que ocurre?
Usando esta funcin podemos conseguir que nuestro programa lea caracteres sin escribirlos en la
pantalla, hasta que lea un dgito hexadecimal vlido (0h a 9h o Ah a Fh), el cual s imprimir.
Veamos el siguiente ejemplo:
0200
0201
0203
0205
0207
0209
020B
020D
020F

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

Ing. Juan Carlos Ansaldi

INGENIERA EN SISTEMAS DE INFORMACIN - 2013


ARQUITECTURA DE COMPUTADORAS
0221
0223
0225

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

10) Grabar el programa anterior, incluyendo el procedimiento.


Este programa se puede ejecutar desde el DOS, puesto que lee un nmero hexadecimal de dos
dgitos y muestra en la pantalla el carcter ASCII que corresponde al nmero que se ha
introducido.
Aqu puede apreciarse tambin la razn por la cual hemos salvado el registro DX en el
procedimiento. El programa principal guarda el nmero hexadecimal en el registro DL, por lo que
no queremos que el procedimiento que comienza en 200h cambie el valor que hay en DL. Por otra
parte, el procedimiento tiene que usar el registro DL para imprimir los caracteres en la pantalla.
Por tanto, usando las instrucciones PUSH DX -al principio del procedimiento- y POP DX -al finalevitamos este problema.

Ing. Juan Carlos Ansaldi

INGENIERA EN SISTEMAS DE INFORMACIN - 2013


ARQUITECTURA DE COMPUTADORAS
Ejercicios complementarios de pila
11) Cules son los valores que se guardan en la pila si ejecutamos el programa que se lista a
continuacin a partir de la instruccin a la que apunta el contador de programa o registro de
prxima instruccin hasta que finaliza? . Cul ser el nuevo valor del puntero de pila?
DX= 3B87h IP=0103h SP=FFEEh BX=2345h AX=0211h R.Estado=7234h CS=1F52h
CS:0100 MOV DX,AX
CS:0102 PUSH DX
CS:0103 CALL 300

CS:0106 INT 21
CS:0108 POP DX

CS:0300 MOV DH,25


CS:0302 INT 21
CS:0304 RET

12) Idem anterior con:


BX= 1122h IP=0102h SP=FFAEh DX=2345h AX=0211h R.Estado=7223h CS=23F1h
CS: 0100 PUSH AX
CS: 0106 POP DX
CS: 0300 MOV DH,20
CS: 0102 CALL 300
CS: 0108 INT 20
CS: 0302 INT 21
CS: 0104 INT 21
CS: 0304 RET

13) Qu ocurrir si ejecutamos el programa que se lista a continuacin, utilizando el modelo de


memoria pequeo?. Cul ser el ltimo valor de SP si inicialmente tena el valor SP=FFEE?
CS: 0100 MOV CX,FFFE
CS: 0103 MOV AX,FFFF
CS: 0106 PUSH AX
CS: 0107 LOOP 106
CS: 0109 INT 20

Comprobar su funcionamiento con el DEBUG.

14) Idem anterior pero para el siguiente listado.


CS: 0100 MOV CX,FFFE
CS: 0103 POP AX
CS: 0104 LOOP 106
CS: 0106 INT 20

Comprobar

su funcionamiento con el DEBUG.

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]

Comprobar su funcionamiento con el DEBUG.


16- a. Representar los diferentes estados de la pila detallando los valores que se guardan en la
misma y los valores del puntero de pila al ejecutar paso a paso el programa que se describe a
continuacin a partir de la direccin que indica el IP.
16- b. Indicar las direcciones absolutas en donde se encuentra el operando de las instrucciones que
hacen uso de la memoria principal (rea de datos y pila nicamente), cuales son los datos que
contienen y de donde provienen.
DS=A320 SS=7F32 SP= FFEE IP=0100 RE=7898
197D:0100 BB0220
197D:0103 B86223
197D:0106 BE000F
197D:0109 53
197D:010A 50
197D:010B 88C5

MOV BX,2002
MOV AX,2362
OV SI,0F00
PUSH BX
PUSH AX
MOV CH,AL

197D:010D 882E003A MOV


[3A00],CH
197D:0111 8AA4002B MOV
AH,[SI+2B00]
197D:0115 E8F800 CALL 0210
197D:0118 B404
MOV AH,04
197D:011A CD21
INT 21

..........................................
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

17) Idem anterior


5

Ing. Juan Carlos Ansaldi

INGENIERA EN SISTEMAS DE INFORMACIN - 2013


ARQUITECTURA DE COMPUTADORAS
CS=209A DS=5FF0 SS=60F0 SP= FFEE IP=0100 RE=7898
CS:0100 BA8509 MOV DX,0985
CS:0103 B82362 MOV AX,6223
CS:0106 BEF000 MOV DI,00F0
CS:0109 52 PUSH BX
CS:010A 50 PUSH AX
CS:010B 8861 MOV CL,AL

CS:010D 880E005B MOV [5B00],CL


CS:0111 8A95105AMOVDL,[DI+5A10]
CS:0115 E80D02 CALL 0310
CS:0118 B404 MOV AH,04
CS:011A CD21 INT 21
..........................................

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

18) Idem anterior:


CS= A723 DS=B520 SS=7A81 SP= E9DE IP=0100
CS:0100 BA0A00 MOV DX,000A
CS:0103 B90B04 MOV CX,040B
CS:0106 BE0005 MOV SI,0500
CS:0109 51 PUSH CX
CS:010A 52 PUSH DX
CS:010B 89D0 MOV AX,DX

CS:010D 3E8836341B MOV


DS:[1B34],DH
CS:0112 898C0005 MOV [SI+0500],CX
CS:0116 E80700 CALL 0120
CS:0119 CD20 INT 20
CS:011B

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

152A:0220 8B1E6151 MOV BX,[5161]


152A:0224 53
PUSH BX
152A:0225 B409
MOV AH,09
152A:0227 BA0010
MOV DX,1000
152A:022A CD21
INT 21
152A:022C C3
RET

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.

Ing. Juan Carlos Ansaldi

INGENIERA EN SISTEMAS DE INFORMACIN - 2013


ARQUITECTURA DE COMPUTADORAS
Complemento al Trabajo Prctico N 5. La pila
La pila (stack) es una caracterstica interna de los microprocesadores. Proporciona a los
programas un lugar donde almacenar y seguir la pista del trabajo que se est llevando a cabo. La
funcin ms importante de la pila es la de mantener el registro de los lugares donde se llam a una
subrutina y de los parmetros que se le pasaron. La pila tambin puede utilizarse para el
almacenamiento temporal de datos de trabajo, aunque esto es menos fundamental y no tan comn.
La pila obtiene su nombre por analoga con los montones de platos apilados (pilas de platos) de las
cafeteras.
Cuando un dato nuevo es introducido (push) en la cima de la pila, el anterior es extrado (pop).
Una pila siempre opera en el orden ltimo-en-entrar-primero-en-salir (LIFO: last-in-first-out).
Esto significa que cuando la pila se utiliza para seguir la pista de los retornos de las subrutinas, la
primera llamada a subrutina que se hizo es la ltima que vuelve. De esta manera, la pila mantiene
ordenado el funcionamiento del programa, las subrutinas y las rutinas de tratamiento de
interrupcin, sin importar lo complejo de la operacin. En la mayora de los microprocesadores, la
pila se utiliza desde la parte de abajo (direccin ms alta) a la parte de arriba (direccin ms baja)
de forma que cuando un dato es introducido (push) a la cima de la pila, se almacena en la posicin
de memoria justo por debajo de la cima actual de la pila. La pila crece hacia abajo, de forma que, a
medida que se aaden datos, la posicin de la cima de la pila se mueve ms y ms hacia
direcciones ms bajas, decrementando cada vez el valor de SP. Cualquier parte de cualquier
programa puede crear un nuevo espacio de pila en cualquier momento, pero esto no se hace
normalmente. Por lo general, cuando un programa est funcionando se crea para l una sola pila y
se utiliza durante el funcionamiento del programa. No hay una forma sencilla de estimar el tamao
de la pila que un programa pueda necesitar, y en general, el diseo del microprocesador no
proporciona ninguna manera automtica de detectar cundo el espacio de la pila est agotado o
casi agotado. Esto puede llevar a que los programadores estn indecisos acerca del espacio que
deben reservar para la pila. Una estimacin conservadora del espacio que hay que reservar da
alrededor de 2 KB (2048 bytes), que es la cantidad que asignan por defecto la mayora de los
compiladores de lenguajes de alto nivel.
En el caso de las interrupciones, antes de que se pase a ejecutar la subrutina del sistema operativo
o del BIOS que da servicio a dicha interrupcin, la UC guarda automticamente en memoria la
direccin de retorno, donde est la instruccin a partir de la cul continua el programa
interrumpido. En este caso, la direccin de retorno es segmentada.
De esta forma, luego que se ejecut dicha subrutina, se podr retornar a ejecutar el programa.
Cuando se trata de Interrupciones tambin es normal que la UC guarde el estado actual del
Registro de Estado, que incluye, como sabemos el Indicador de Acarreo, Desbordamiento, Cero,
etc.
La pila es necesaria, porque es comn que la subrutina llamada por una interrupcin a su vez sea
interrumpida para llamar a otra subrutina, y esta segunda tambin puede sufrir interrupciones, y as
sucesivamente.
A fin de aclarar los conceptos, veamos un ejemplo realizado utilizando un microprocesador de
arquitectura 80x86 en el cual es utilizada la pila por Interrupciones y tambin por Procedimientos.
Sera conveniente ejecutar el siguiente ejemplo utilizando el DEBUG, y ver el volcado de memoria
de las direcciones que corresponden a la pila.
11F5:0100
11F5:0102
11F5:0104
11F5:0106
11F5:0109

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

Ing. Juan Carlos Ansaldi

INGENIERA EN SISTEMAS DE INFORMACIN - 2013


ARQUITECTURA DE COMPUTADORAS

En la Figura (1) se supone una pila definida a partir de la


direccin de memoria FFFFh, para el programa del listado. Este
programa luego de la interrupcin INT 21 debe proseguir en la
instruccin localizable mediante la direccin de retorno
11F5:0106h.
No bien la CPU acepta la solicitud de interrupcin, guarda automticamente en la pila dicha
direccin: 11F5:0106h, quedando en el orden que se muestra en la Figura (2). Sobre este valor se
guarda otro valor, indicado 3446, que debe ser el valor del Registro de Estado.
Como sabemos existe un registro puntero de pila ("stackpointer"-SP), que contiene la direccin
de la pila que en el al comienzo corresponde a su cima, siendo el mismo actualizado tambin en
forma automtica por la UC cada vez que se lee o escribe la pila.
En el ejemplo, se ha supuesto que al sobrevenir la interrupcin se poda apilar a partir del
comienzo de la pila (direccin FFFEh), o sea que en la pila no haba nada "apilado" anteriormente.
Entones el SP en una PC estara con el valor FFFEh antes de la interrupcin, para alcanzar el valor
FFF8h luego que ella tiene lugar, indicando as el SP la nueva direccin de la cima de la pila.
Cuando se termina de ejecutar la subrutina que atiende la interrupcin, se retorna al programa
interrumpido, leyendo el valor de la pila 11F5:0106h, y SP vuelve a indicar el valor FFFEh, que
era el que tena antes de que se llam a la interrupcin, Figura (3). En la direccin 0106h, hay una
llamada a un procedimiento, por lo que nuevamente se guardar en la pila el valor de retorno
0109h, y el SP decrementar su valor a FFFCh, Figura (4). Se hace notar que en este caso se
guarda nicamente en valor de desplazamiento de la direccin de retorno y no como en el caso de
la interrupcin que se guard el valor segmentado de la direccin de retorno.
En el procedimiento hay una nueva interrupcin, (INT 21) apilndose los valores como se observa
en la Figura (5).
En la Figura (6) se representa el estado de la pila despus de finalizada la interrupcin, y en la
Figura (7), el estado de la pila al retornar del procedimiento. Es de hacer notar que los datos en la
pila, al igual que en cualquier parte de la memoria, no se borran, sino que son sobrescritos por
datos nuevos.

Instrucciones de manejo de la pila


PUSH {registro/memoria}
8

Ing. Juan Carlos Ansaldi

INGENIERA EN SISTEMAS DE INFORMACIN - 2013


ARQUITECTURA DE COMPUTADORAS
Guarda una palabra de un origen especificado en la pila para uso posterior. El origen puede ser un
registro general, una direccin de memoria o un registro de segmento. El SP se disminuye en 2.
POP {registro/memoria}
Saca una palabra de la pila previamente guardada y la enva a un destino especificado, que puede
ser un registro general, una direccin de memoria o un registro de segmento (salvo CS). El SP se
incrementa en 2.
PUSHA {sin operandos}
Copia los registros de uso general AX,BX,CX,DX,SI,DI,BP,SP en la pila. Para procesadores
80286 y superiores. El SP se decrementa en 16 (10h).
POPA {sin operandos}
Saca los registros de uso general AX,BX,CX,DX,SI,DI,BP,SP de la pila. Para procesadores 80286
y superiores. El SP se incrementa 16 (10h).
PUSHF {sin operandos}
Guarda en la pila el contenido del registro de estado. El SP se disminuye en 2.
POPF {sin operandos}
Saca de la pila la palabra previamente guardada y la enva al registro de estado. El SP se
incrementa en 2.
Aprovechamos la oportunidad para recordar los indicadores del registro de estado de la familia
80x86. Consideramos el registro de la figura:
//

NT

IOPL

OF DF

IF

TF

SF

ZF

//

AF

//

PF

//

CF

CF: Indicador de Acarreo


PF: Indicador de Paridad
AF: Indicador Auxiliar de Acarreo
ZF: Indicador de Cero
SF: Indicador de Signo
OF: Indicador de Desbordamiento
TF: Indicador de Trampa-Tap. Pone el microprocesador en modo de paso simple y habilita la
depuracin de un programa.
IF: Indicador de habilitacin de Interrupciones. Habilita interrupciones externas cuando se pone
a 1 y las deshabilita cuando se pone a 0.
DF: Indicador de direccin. Con DF a cero, SI y/o DI son incrementados automticamente, con DF
a cero, SI y/o DI son decrementados automticamente.
IOPL y NT: se utilizan cuando el microprocesador est en modo protegido.
IOPL: Indicador de Entrada/Salida de privilegio se utiliza para garantizar que una instruccin
realiza solo aquellas operaciones que est autorizada a realizar.
NT: indicador de tartas anidadas, se utiliza para indicar si la ejecucin de la tarea actual est
anidada en otra tarea. Si NT=1 la tarea actual anidada tiene un enlace vlido a la tarea previa.
Luego en el ejemplo anterior, los valores que se guardaron en la pila al producirse la interrupcin
21h, se pueden tranquilamente decodificar teniendo en cuenta el orden de los indicadores del
registro de estado.
3446h= 0011010001000110b
7202h= 0111001000000010b
9

Ing. Juan Carlos Ansaldi

You might also like