Sei sulla pagina 1di 59

Subrutinas

Uso de subrutinas:

Frecuentemente la misma pieza de cdigo debe escribirse
varias veces en muchas partes diferentes de un programa.

En vez de repetir el cdigo cada vez que sea necesario, hay
una ventaja obvia si las instrucciones comunes se escriben
solamente una vez.

Un conjunto de instrucciones comunes que pueden utilizarse
en un programa muchas veces se denomina subrutina.
Subrutinas



Uso de subrutinas:

Cada vez que la subrutina se utiliza en la parte del programa
principal, una ramificacin se ejecuta al comienzo de la
subrutina.

Despus que la subrutina ha sido ejecutada, una ramificacin
se hace de nuevo al programa principal.

Uso de subrutinas:

Programa
principal
Subrutina
Llamado a
Subrutina
Subrutinas
Uso de subrutinas:

Programa
principal
Subrutina
Llamado a
Subrutina
Llamado a
Subrutina
j
j+1
Subrutinas



Uso de subrutinas:

Los registros y las memorias son comunes para el programa
principal y para la subrutina, i.e., se consideran variables
globales.

Ventaja: la comunicacin de los parmetros entre el
programa principal y la subrutina es simple y rpido.

Desventaja: el programador puede olvidar que ciertos
registros usados por en el programa principal no deben ser
alterados en la subrutina, esto puede causar serios
problemas y la deteccin de este error es difcil.
Subrutinas



Ejemplo:

Se desea hacer un programa que realice las siguientes
operaciones:

(0100) (0100) + 5
(0200) (0200) + 5
(0204) (0204) + 5

Subrutinas



Ejemplo:

Se desea hacer un programa que realice las siguientes
operaciones:

(0100) (0100) + 5
(0200) (0200) + 5
(0204) (0204) + 5

La mejor solucin sera utilizando una subrutina que tenga
como parmetro una direccin X y que realice la operacin:

(X) (X) + 5

El programa principal debe cargar correctamente el registro
X y llamar a la subrutina tres veces.
Subrutinas



Ejemplo:

Se desea hacer un programa que realice las siguientes
operaciones:

(0100) (0100) + 5
(0200) (0200) + 5
(0204) (0204) + 5

Programa principal Subrutina
LOAD X,0100 SUM5 LOAD A,(X)
CALL SUM5 ADD 5
LOAD X,0200 STORE (X),A
CALL SUM5 RET
LOAD X,0204
CALL SUM5
Subrutinas



Ejemplo:

Se desea hacer un programa que realice las siguientes
operaciones:

(0100) (0100) + 5
(0200) (0200) + 5
(0204) (0204) + 5

Programa principal Subrutina
LOAD X,0100 SUM5 LOAD A,(X)
CALL SUM5 ADD 5
LOAD X,0200 STORE (X),A
CALL SUM5 RET
LOAD X,0204
CALL SUM5
Qu pasa si el programa
principal estaba usando A?

Subrutinas



Ejemplo:

Se desea hacer un programa que realice las siguientes
operaciones:

(0100) (0100) + 5
(0200) (0200) + 5
(0204) (0204) + 5

Programa principal Subrutina
LOAD X,0100 SUM5 LOAD A,(X)
CALL SUM5 ADD 5
LOAD X,0200 STORE (X),A
CALL SUM5 RET
LOAD X,0204
CALL SUM5
Qu pasa si el programa
principal estaba usando A?
kaput!!

Subrutinas



Ejemplo:

Se desea hacer un programa que realice las siguientes
operaciones:

(0100) (0100) + 5
(0200) (0200) + 5
(0204) (0204) + 5

Programa principal Subrutina
LOAD X,0100 SUM5 PUSH A
CALL SUM5 LOAD A,(X)
LOAD X,0200 ADD 5
CALL SUM5 STORE (X),A
LOAD X,0204 POP A
CALL SUM5 RET
Solucin: se usa la pila
Subrutinas



La Pila (stack):

Existe una memoria direccionada por el registro SP (stack
pointer). Cmo se usa?

Cada vez que se hace PUSH X:

(SP) X
SP SP + 1

Cada vez que se hace POP X:

SP SP - 1
X (SP)

(es posible hacer PUSH X y luego POP Y)
Interrupciones



El ciclo de una instruccin (sin interrupcin)
Interrupciones



Diagrama de estado (sin interrupcin)
Interrupciones



Ejemplo sin interrupciones: un programa quiere leer datos
del disco duro.

1. El programa solicita datos a la unidad de disco.
2. La unidad de disco recibe solicitud y posiciona el cabezal
del disco en la posicin deseada.
3. La unidad lee los datos.
4. La unidad verifica consistencia de los datos (checksum)
5. if OK (Enva los datos a la CPU) else GOTO 3
6. La CPU recibe datos y contina su programa
1 2 3 4 5 6 t
1 2 3 4 5 6 t
Interrupciones



Ejemplo sin interrupciones: un programa quiere leer
datos del disco duro.

1 2 3 4 5 6 t
CPU
solicita
datos
CPU
recibe
datos
Unidad de disco
lee y enva datos
La CPU no hace nada
Interrupciones



Ejemplo con interrupciones: un programa quiere leer datos
del disco duro.

1. El programa solicita datos a la unidad de disco.
2. La CPU no espera datos, hace otra cosa: por ejemplo
ejecuta otro programa o continua ejecutando el mismo
programa siempre que pueda prescindir de los datos
solicitados.
3. La unidad de disco se encarga de leer los datos
correctamente. Cuando los datos estn listos la unidad
de disco interrumpe a la CPU.
4. La CPU deja de hacer lo que est haciendo y atiende la
interrupcin, i.e., recibe los datos de la unidad de disco.

t (CPU)
t (unidad de disco)
Interrupciones



Ejemplo con interrupciones: un programa quiere leer datos
del disco duro.



1 2 4 t
CPU
solicita
datos
CPU
recibe
datos
CPU
hace
otra cosa
Unidad de disco
lee y enva datos
3
interrupcin
Ahorro de
tiempo
Interrupciones



La interrupcin es el mecanismo mediante el cual otros
mdulos pueden interrumpir una secuencia normal de
procesamiento.

Programa: por ejemplo divisin por cero

Temporizador: cuando se cumple un tiempo especfico

E/S: cuando hay algo que comunicar

Hardware: cuando ocurre una falla
Interrupciones
El ciclo de una instruccin (con interrupcin)
Interrupciones
Diagrama de estado (con interrupcin)
Interrupciones
CPU
ROM RAM
Bus de direcciones
Bus de datos
A12
A11
:
A0
A12
CE CE
RD
RD
WR
A0
A0
A11 A11
D0
D7
D0 D7 D0 D7
A0
A12
WR
RD
MREQ
Interrupciones
CPU
I/O RAM
Bus de direcciones
Bus de datos
CE
CE
A0
A11
D0
D7
D0 D7
A0
A12
WR
RD
MREQ
decoder
ROM
CE
INT
IORQ
Interrupciones
Funcionamiento de las interrupciones (posibilidad 1):

1. El dispositivo I/O cuando necesita interrumpir solicita
atencin y enva una seal INT a la CPU.
2. La CPU termina su instruccin y enva un
reconocimiento a quien interrumpe mediante la seal
IORQ (I/O request).
3. El dispositivo enva por el bus de datos un byte y la
CPU forma una direccin a partir de este byte.
4. La CPU salta a esta direccin y ejecuta el programa
de atencin a la interrupcin.
5. La CPU finaliza esta rutina de interrupcin y regresa
a la direccin que estaba en el momento de la
interrupcin.
Interrupciones
Funcionamiento de las interrupciones (posibilidad 2):

1. Igual
2. Igual
3. La CPU al saber que es el dispositivo X el que
interrumpe lee el elemento X del vector de
interrupciones ubicado en algn lugar de la
memoria, a partir de este elemento calcula la
direccin de memoria de la rutina de atencin de la
interrupcin.
4. Igual
5. Igual
Interrupciones
Interrupciones
Interrupciones mltiples:

1. Inhibicin de interrupciones:
La CPU ignora las interrupciones cuando ya est
procesando una interrupcin.
Las interrupciones ocurridas quedan pendientes y se
ejecutan en una determinada secuencia una vez que la
CPU termine la primera interrupcin.

Interrupciones
Interrupcin mltiple (secuencial)
Interrupciones
Interrupciones mltiples (cont):

2. Definicin de prioridades
Interrupciones de baja prioridad pueden ser interrumpidas
por interrupciones de mayor prioridad.
Cuando una interrupcin de prioridad alta ha sido
atendida, la CPU regresa a la interrupcin previa.
Interrupciones
Interrupcin mltiple (anidadas)
Interrupciones
Secuencia temporal de varias interrupciones
Arquitectura en pipeline
Los procesadores previos al 8086, estaban limitados en
su desempeo por la necesidad de realizar los dos
pasos principales de ejecucin del procesador:
Fetch/Execute, en forma secuencial. Es decir, no se puede ejecutar
una instruccin hasta que se traiga de memoria (Fetch); y no
podan traerse instrucciones de memoria mientras ejecutaba
una instruccin, pues el procesador estaba ocupado.
Resumiendo, un alto porcentaje del tiempo, el
procesador estaba ocupado haciendo Fetch, cuando su
funcin debiera ser ejecutar las instrucciones. La
capacidad de ejecutar instrucciones slo se ocupaba en
un bajo porcentaje.
Arquitectura en pipeline
Para solucionar sto, Intel desarroll la arquitectura en
pipeline del Fetch/Execute, en la cual simplemente se
divide la tarea en dos secciones:
una encargada del Fetch (BIU)
y otra del Execute (EU).
De esta manera, existen circuitos separados para
cada funcin, los cuales trabajan en paralelo.
Si bien el proceso an es secuencial, solamente al
principio se requiere desperdiciar tiempo en el Fetch.
A partir de ah, Fetch va adelante del Execute, y trae
instrucciones al procesador mientras este ejecuta las
anteriores.
Arquitectura del 8086/8088
Estos microprocesadores
tiene 2 procesadores
conectados internamente,
estos procesadores son:
EU
Unidad de ejecucin
(Execution Unit).
BIU
Unidad de interfaz con el
Bus (Bus Interface Unit).


La unidad de ejecucin (EU)

La unidad de ejecucin (EU) se encarga de realizar las operaciones
aritmticas y lgicas, adems de proporcionar las direcciones
lgicas al BIU --una direccin lgica est formada de dos
direcciones, la primera indica el segmento en el cual se est
trabajando y la otra indica el offset, o desplazamiento, de este
segmento; esto es segment:offset --.

La EU tiene una unidad aritmtica lgica (ALU) de 16 bits, un
registro de banderas y un conjunto de registros de propsito
general. El registro de banderas contiene 6 banderas de estado
(que la EU manipula para indicar el estado del resultado de una
operacin lgica o aritmtica) y 3 banderas de control que se
pueden manipular por los programas para alterar las operaciones
del procesador .

La Unidad de Interfaz con el Bus (BIU)
Es la responsable de la comunicacin externa del
procesador. Esta unidad de proceso se encarga de
traducir las direcciones lgicas a direcciones fsicas de
la memoria con ayuda de los registros de segmento DS,
SS, ES, CS e IP.

Para convertir una direccin lgica en una direccin
fsica el BIU corre el valor del registro de segmento 4
posiciones a la izquierda (que es equivalente a
multiplicar por 16h) y suma el valor del offset para
obtener un valor de 20 bits.
MODELO DE PROGRAMACIN
DEL 8086.
El modelo de programacin del 8086
Registros de datos o de propsito
general
AX, BX, CX, DX: pueden utilizarse bien como registros de 16 bits o
como dos registros separados de 8 bits (byte superior e inferior) cambiando
la X por H o L segn queramos referirnos a la parte alta o baja
respectivamente. Por ejemplo,
AX se descompone en AH (parte alta) y AL (parte baja). Evidentemente,
cualquier cambio sobre AH o AL altera AX

AX = Acumulador.
Es el registro principal, es utilizado en las instrucciones de multiplicacin y
divisin y en algunas instrucciones aritmticas especializadas, as como en
ciertas operaciones de carcter especfico como entrada, salida y
traduccin. Obsrvese que el 8086 es suficientemente potente para realizar
las operaciones lgicas, la suma y la resta sobre cualquier registro de
datos, no necesariamente el acumulador.



Registros de propsito general
BX =Base.
Se usa como registro base para referenciar direcciones de memoria
con direccionamiento indirecto, manteniendo la direccin de la base o
comienzo de tablas o matrices. De esta manera, no es preciso indicar una
posicin de memoria fija, sino la nmero BX (as, haciendo avanzar de
unidad en unidad a BX, por ejemplo, se puede ir accediendo a un gran
bloque de memoria en un bucle).

CX =Contador.
Se utiliza comnmente como contador en bucles y operaciones
repetitivas de manejo de cadenas. En las instrucciones de desplazamiento y
rotacin se utiliza como contador de 8 bits.

DX =Datos.
Usado en conjuncin con AX en las operaciones de multiplicacin y
divisin que involucran o generan datos de 32 bits. En las de entrada y
salida se emplea para especificar la direccin del puerto E/S.


Registros de segmento:
Definen reas de 64 KB dentro del espacio de direcciones de 1 MB del 8086.
Estas reas pueden traslaparse total o parcialmente. No es posible acceder a una
posicin de memoria no definida por algn segmento: si es preciso, habr de
moverse alguno.

CS =Registro de segmento de cdigo (code segment).
Contiene la direccin del segmento con las instrucciones del programa. Los
programas de ms de 64 Kb requieren cambiar CS peridicamente.

DS =Registro de segmento de datos (data segment).
Segmento del rea de datos del programa.

SS =Registro de segmento de pila (stack segment).
Segmento de pila.

ES =Registro de segmento extra (extra segment).
Segmento de ampliacin para zona de datos. Es extraordinariamente til
actuando en conjuncin con DS: con ambos se puede definir dos zonas de 64 Kb,
tan alejadas como se desee en el espacio de direcciones, entre las que se pueden
intercambiar datos
Registros punteros de pila

SP = Puntero de pila (stack pointer).
Apunta al inicio de la pila. Utilizado en las
instrucciones de manejo de la pila.

BP = Puntero base (base pointer).
Es un puntero de base, que apunta a una zona dentro de la
pila dedicada al almacenamiento de datos (variables locales y parmetros
de las funciones en los programas compilados).



Puntero de instrucciones o contador de
programa
IP = Puntero de instruccin (instruction pointer).
Marca el desplazamiento de la instruccin en curso dentro del segmento de
cdigo. Es automticamente modificado con la lectura de una instruccin.

Registros ndices:


SI = ndice fuente (source index).
Utilizado como registro de ndice en ciertos modos de
direccionamiento indirecto, tambin se emplea para guardar un
valor de desplazamiento en operaciones de cadenas.

DI = ndice destino (destination index).
Se usa en determinados modos de direccionamiento indirecto
y para almacenar un desplazamiento en operaciones con cadenas.





Registro de estado o de indicadores (flags)
Es un registro de 16 bits de los cuales 9 son utilizados para indicar
diversas situaciones durante la ejecucin de un programa.
Los bits 0, 2, 4, 6, 7 y 11 son indicadores de condicin, que reflejan
los resultados de operaciones del programa
los bits del 8 al 10 son indicadores de control y el resto no se
utilizan.
Estos indicadores pueden ser comprobados por las instrucciones de
salto condicional, lo que permite variar el flujo secuencial del
programa segn el resultado de las operaciones.


Banderas del 8086
Bit
Seala desbordamiento aritmtico
Desbordamiento (Overflow Flag")
OF
Indica la direccin de las operaciones.
Direccin ("Direction Flag")
DF

Este bit controla el estado del sistema de
interrupciones enmascarables . Cuando est activo
(1) permite las interrupciones; el estado inactivo (0)
las deshabilita.

Interrupcin ("Interrupt Flag")
IF
Si est activo, el procesador genera automticamente
una interrupcin despus de la ejecucin de cada
instruccin, lo que permite controlar paso a paso la
ejecucin del programa. Este bit debe estar
normalmente inactivo (a 0).

Detencin ("Trap Flag")
TF
Si est activo indica que el resultado de operacin o
de comparacin son negativos.
Signo ("Sign Flag")
SF
Est activo si el resultado de operacin es cero o
resultado de comparacin igual.
Cero ("Zero Flag")
ZF
Indicador de ajuste en operaciones aritmticas con
cantidades BCD
Acarreo auxiliar
AF
Si est activo Indica un nmero par de bits activos
(bits cuyo contenido es 1). Esta informacin es til
cuando el procesador controla transmisiones de
datos.

Paridad ("Parity Flag")
PF
Indicador de arrastre del bit de mayor orden, que
puede ocurrir en las operaciones aritmticas suma y
resta.

Acarreo ("Carry Flag")
CF
Uso
Indicador de:
NV ("No overflow") OV ("Overflow") Desbordamiento O
F
UP incremento DN ("Down") decremento Direccin D
F
DI ("Disabled Interrupt") desactivada EI ("Enabled Interrupt") activa Interrupcin IF
PL ("Plus") positivo NG ("Negative") negativo Signo SF
NZ ("No Zero") ZR ("Zero") Cero ZF
NA ("No Auxiliar") AC ("Auxiliar Carry") Acarreo auxiliar AF
PO ("Parity Odd") paridad impar PE ("Parity Even") paridad par Paridad PF
NC ("No Carry") CY ("Carry yes") Acarreo CF
Indicativo si bit 0 Indicativo si bit 1 Indicador de: Bit
Segmentacin de la Memoria en el 8086
SEGMENTACIN
Direccin lgica
Registro de segmento
Desplaza
miento
Direccin de segmento
Direccin fsica
CPU
SEGMENTO
Memoria
0
FFFFF
Segmento de Memoria
Un segmento es un rea
continua de memoria que puede
tener hasta 64K-bytes, que
debe comenzar en una localidad
de memoria cuya direccin sea
lmite de 16 bytes (cantidad
denominada prrafo) y que
puede traslaparse con otros
segmentos.

SEGMENTO
Memoria
0
FFFFF
Segmentos de Memoria
El segmento de cdigo (tiene como base el
contenido del registro CS).
En este segmento se encuentran las
instrucciones que forman el programa. Para
acceder a los datos contenidos en l, se usa el
registro IP como desplazamiento.

El segmento de datos (que tiene como base el
registro DS).
Contiene los datos que utiliza el programa
(variables, etc.) Para acceder a los datos
contenidos en l, se suele utilizar los registros
SI y DI como desplazamiento.
Segmentos de Memoria
- El segmento de pila (con SS como base).
- En l se desarrolla la pila del programa, utilizada para
almacn temporal de datos, llamadas a funciones, etc.
Debe estar presente en todos los programas EXE de
forma obligada. Se utiliza el registro SP para acceder a
los datos de este segmento.

- El segmento extra (con ES como base).
- Su uso es opcional, y en l se encuentra un segmento
definido por el usuario y que, regularmente, contiene
datos adicionales. Al igual que ocurre con el segmento
de datos, para acceder a los datos contenidos en l, se
suelen utilizar los registros SI y DI.

SEGMENTACIN
CS
DS
SS
ES
STACK
SEGMENTO EXTRA
DE DATOS
SEGMENTO DE
DATOS
SEGMENTO DE
CDIGO
CS
OTRO SEGMENTO
SEGMENTO DE
CDIGO
PROGRAMA
MEMORIA
MEMORIA
TRASLAPE DE SEGMENTOS
SEGMENTACIN
02000
SEGMENTO DE
CDIGO
RELOCALIZADO
SEGMENTO DE
CDIGO EN CURSO
PROGRAMA
MEMORIA
Relocalizacin de un programa usando el registro CS
PROGRAMA
600
1A300
600
nuevo (CS)=1A30

Cada localidad de memoria tiene dos tipos de
direcciones :
Direccin Fsica y Direccin Lgica o
efectiva

Una direccin Fsica es el valor nico de 20 bits que
identifica la localizacin de cada byte en el espacio
de memoria de 1 Mbyte.

Los programas tratan con direccin Lgicas mas
que con la direccin Fsica.

Direccin Fsica y Direccin Lgica


Direccin Fsica y Direccin Lgica
Para cualquier localidad de memoria, el
valor base del segmento ubica el primer
byte del contenido del segmento y el
valor del offset es la distancia, en bytes
, de la localizacin destino del principio
del segmento.

Los valores de la base del Segmento y
del offset son cantidades no signadas
de 16 bits; la direccin del byte ms
bajo del segmento tiene un offset 0.

Formacin de una Direccin Fsica
4 bits
Direccin de
segmento
Direccin
efectiva, lgica
u offset
Direccin fsica
EL REGISTRO DE
SEGMENTO SE
DESPLAZA 4 BITS
HACIA LA
IZQUIERDA
(MULTIPLICACIN
x16)
20 BITS
0000
Siempre que una memoria es accesada , se genera una
direccin fsica a partir de la direccin lgica.

+
Formacin de una Direccin Fsica
Formacin de una Direccin Fsica
Por Ejemplo:

Si la direccin base del
segmento es 2915h, entonces
las direcciones en este
segmento inician en 2915:0000
y van hasta 2915:FFFF

Potrebbero piacerti anche