05. Subrutinas INT y 8086

download 05. Subrutinas INT y 8086

of 59

Transcript of 05. Subrutinas INT y 8086

  • 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:

    ProgramaprincipalSubrutina Llamado a Subrutina

  • SubrutinasUso de subrutinas:

    ProgramaprincipalSubrutina Llamado a Subrutina Llamado a Subrutina jj+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 principalSubrutinaLOAD X,0100SUM5LOAD A,(X)CALL SUM5ADD 5LOAD X,0200STORE (X),ACALL SUM5RETLOAD X,0204CALL SUM5

  • Subrutinas

    Ejemplo:

    Se desea hacer un programa que realice las siguientes operaciones:

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

    Programa principalSubrutinaLOAD X,0100SUM5LOAD A,(X)CALL SUM5ADD 5LOAD X,0200STORE (X),ACALL SUM5RETLOAD X,0204CALL SUM5Qu 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 principalSubrutinaLOAD X,0100SUM5LOAD A,(X)CALL SUM5ADD 5LOAD X,0200STORE (X),ACALL SUM5RETLOAD X,0204CALL SUM5Qu 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 principalSubrutinaLOAD X,0100SUM5PUSH ACALL SUM5LOAD A,(X)LOAD X,0200ADD 5CALL SUM5STORE (X),ALOAD X,0204POP ACALL SUM5RETSolucin: 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) XSP 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.

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

  • Interrupciones

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

    123456tCPUsolicitadatosCPUrecibedatosUnidad de discolee y enva datosLa CPU no hace nada

  • Interrupciones

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

    El programa solicita datos a la unidad de disco.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.La unidad de disco se encarga de leer los datos correctamente. Cuando los datos estn listos la unidad de disco interrumpe a la CPU.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.

    124tCPUsolicitadatosCPUrecibedatosCPUhace otra cosaUnidad de discolee y enva datos3interrupcinAhorro detiempo

  • 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

  • InterrupcionesEl ciclo de una instruccin (con interrupcin)

  • InterrupcionesDiagrama de estado (con interrupcin)

  • InterrupcionesCPUROMRAMBus de direccionesBus de datosA12A11:A0A12CECERDRDWRA0A0A11A11D0D7D0D7D0D7A0A12WRRDMREQ

  • InterrupcionesCPUI/ORAMBus de direccionesBus de datosCECEA0A11D0D7D0D7A0A12WRRDMREQdecoderROMCEINTIORQ

  • InterrupcionesFuncionamiento de las interrupciones (posibilidad 1):

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

  • InterrupcionesFuncionamiento de las interrupciones (posibilidad 2):

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

  • Interrupciones

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

  • InterrupcionesInterrupcin mltiple (secuencial)

  • InterrupcionesInterrupciones mltiples (cont):

    2. Definicin de prioridadesInterrupciones 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.

  • InterrupcionesInterrupcin mltiple (anidadas)

  • InterrupcionesSecuencia temporal de varias interrupciones

  • Arquitectura en pipelineLos 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/8088Estos 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 generalBX = 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 programaIP = 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

  • NV ("No overflow")OV ("Overflow")DesbordamientoOFUP incrementoDN ("Down") decrementoDireccinDFDI ("Disabled Interrupt") desactivadaEI ("Enabled Interrupt") activaInterrupcinIFPL ("Plus") positivoNG ("Negative") negativoSignoSFNZ ("No Zero")ZR ("Zero")CeroZFNA ("No Auxiliar")AC ("Auxiliar Carry")Acarreo auxiliarAFPO ("Parity Odd") paridad imparPE ("Parity Even") paridad parParidadPFNC ("No Carry")CY ("Carry yes")AcarreoCFIndicativo si bit 0Indicativo si bit 1Indicador de:Bit

  • Segmentacin de la Memoria en el 8086

  • SEGMENTACINDireccin lgicaRegistro de segmentoDesplazamiento Direccin de segmentoDireccin fsicaCPUSEGMENTOMemoria0FFFFF

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

    SEGMENTOMemoria0FFFFF

  • Segmentos de MemoriaEl 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 MemoriaEl 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.

  • SEGMENTACINCSOTRO SEGMENTO SEGMENTO DE CDIGOPROGRAMAMEMORIA MEMORIA TRASLAPE DE SEGMENTOS

  • SEGMENTACIN02000 SEGMENTO DE CDIGO RELOCALIZADOSEGMENTO DE CDIGO EN CURSOPROGRAMAMEMORIA Relocalizacin de un programa usando el registro CSPROGRAMA6001A300600 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 LgicaPara 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 Fsica4 bitsDireccin de segmentoDireccin efectiva, lgica u offsetDireccin fsica EL REGISTRO DE SEGMENTO SE DESPLAZA 4 BITS HACIA LA IZQUIERDA (MULTIPLICACIN x16)20 BITS0000Siempre 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 FsicaPor Ejemplo:

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

    *******************************