Monografias | Historia de los MicroprocesadoresHistoria de los MicroprocesadoresResumen: Intel - CISC. RISC. Historia, Arquitectura del 8086/8088. Unidad Aritmética Lógica. Sistema de control de la unidad de ejecución. Cola de instrucciones. Registros de la unidad de interfaz con el bus. Lógica de control del bus. Modos de direccionamiento del 8086/8088. Estructuras de interrupciones del 8086/8088. Historia de los Microprocesadores Intel Desde la aparición de los primeros microprocesadores en losinicios de la década de los setentas, todas las áreas científicas y tecnológicashan sido experimentado su más acelerado desarrollo en la historia de lahumanidad. El bajo costo, confiabilidad y reducido espacio de los sistemasdigitales basados en microprocesadores les han posibilitado el incursionar enaplicaciones que hasta antes de esa década se hallaban restringidas a sistemasde alto costo y considerados de alta tecnología. Las industrias de latelecomunicación, automotriz, aeronáutica, de transformación, médica y deconsumo casero, asi como la educación, banca, y empresas de servicios, son soloalgunas de las áreas en las cuales el impacto de la electrónica digital es másevidente, ya que lo palpamos en nuestro actuar cotidiano. CISC Es una abreviación de "Complex Instrution setcomputer". Se refiere a los microprocesadores tradicionales que operan congrupos grandes de instrucciones de procesador (lenguaje de maquina). Losmicroprocesadores INTEL 80xxx estan dentro de esta categoria (incluido elPENTIUM). Los procesadores CISC tienen un Set de instrucciones complejas pornaturaleza que requieren varios a muchos ciclos para completarse. RISC Es una abreviación de "Reduced Instruction SetCode", a diferencia de los CISC, los procesadores RISC tienen un grupo de oSet de instrucciones simples requiriendo uno o pocos ciclos de ejecución. Estasinstrucciones pueden ser utilizadas más eficientemente que la de losprocesadores CISC con el diseño de software apropiado, resultando enoperaciones más rapídas. LOS MICROPROCESADORES 8086 Y 8088 Historia del 8086/8088 En junio de 1978 Intel lanzó al mercado el primermicroprocesador de 16 bits: el 8086. En junio de 1979 apareció el 8088(internamente igual que el 8086 pero con bus de datos de 8 bits) y en 1980 loscoprocesadores 8087 (matemático) y 8089 (de entrada y salida). El primerfabricante que desarrolló software y hardware para estos chips fue la propia Intel.Reconociendo la necesidad de dar soporte a estos circuitos integrados, laempresa invirtió gran cantidad de dinero en un gran y moderno edificio en SantaClara, California, dedicado al diseño, fabricación y venta de sus sistemas dedesarrollo que, como se explicó anteriormente, son computadoras autosuficientescon el hardware y software necesario para desarrollar software demicroprocesadores. Los sistemas de desarrollo son factores clave para asegurarlas ventas de una empresa fabricantes de chips. La inmensa mayoría de ventasson a otras empresas, las cuales usan estos chips en aparatos electrónicos,diseñados, fabricados y comercializados por ellas mismas. A estas empresas selas llama "fabricantes de equipo original", o en inglés, OEM(Original Equipment Manufacturer). El disminuir el tiempo de desarrollo dehardware y software para las OEM es esencial, ya que el mercado de estosproductos es muy competitivo. Necesitan soporte pues los meses que les puedellevar el desarrollo de las herramientas apropiadas les puede significar pérdidaspor millones de dólares. Además quieren ser los primeros fabricantes en elmercado, con lo cual pueden asegurarse las ventas en dos áreas importantes: acorto plazo, ya que al principio la demanda es mucho mayor que la oferta, y alargo plazo, ya que el primer producto marca a menudo los estándares. De esta manera la empresa Intel habíadesarrollado una serie completa de software que se ejecutaba en unamicrocomputadora basada en el 8085 llamada "Intellec MicrocomputerDevelopment System". Los programas incluían ensambladores cruzados (éstosson programas que se ejecutan en un microprocesador y generan código de máquinaque se ejecuta en otro), compiladores de PL/M, Fortran y Pascaly varios programas de ayuda. Además había un programa traductor llamado CONV86 que convertía código fuente 8080/8085 a código fuente 8086/8088.Si se observan de cerca ambos conjuntos de instrucciones, queda claro que latransformación es sencilla si los registros se traducen así: A -> AL, B-> CH, C -> CL, D -> DH, E -> DL, H -> BH y L -> BL. Puedeparecer complicado traducir LDAX B (por ejemplo) ya que el 8088 nopuede utilizar el registro CX para direccionamiento indirecto, sinembargo, se puede hacer con la siguiente secuencia: MOV SI, CX; MOV AL,[SI].Esto aprovecha el hecho que no se utiliza el registro SI. Por supuesto elprograma resultante es más largo (en cantidad de bytes) y a veces más lento decorrer que en su antecesor 8085. Este programa de conversión sólo servíapara no tener que volver a escribir los programas en una primera etapa. Luegodebería reescribirse el código fuente en assembler para poder obtener lasventajas de velocidad ofrecidas por el 8088. Luego debía correr elprograma en la iSBC 86/12 Single Board Computer basado en el 8086.Debido al engorro que resultaba tener dos plaquetas diferentes, la empresaGodbout Electronics (también de California) desarrolló una placa donde estabanel 8085 y el 8088, donde se utilizaba un ensamblador cruzado provisto porla compañía Microsoft. Bajo control de software, podían conmutarse losmicroprocesadores. El sistema operativo utilizado era el CP/M (de DigitalResearch). El desarrollo más notable para la familia 8086/8088fue la elección de la CPU 8088 por parte de IBM (InternationalBusiness Machines) cuando en 1981 entró en el campo de las computadoraspersonales. Esta computadora se desarrolló bajo un proyecto con el nombre "Acorn"(Proyecto "Bellota") pero se vendió bajo un nombre menos imaginativo,pero más correcto: "Computadora Personal IBM", con un precioinicial entre 1260 dólares y 3830 dólares según la configuración (con 48KBde memoria RAM y una unidad de discos flexibles con capacidad de 160KB costaba2235 dólares). Esta computadora entró en competencia directa con las ofrecidaspor Apple (basado en el 6502) y por Radio Shack (basado en el Z-80). ARQUITECTURA DE LOS PROCESADORES 8088 Y 8086 El 8086 es un microprocesador de 16 bits, tanto en loque se refiere a su estructura como en sus conexiones externas, mientras que el8088 es un procesador de 8 bits que internamente es casi idéntico al 8086.La única diferencia entre ambos es el tamaño del bus de datos externo. Inteltrata esta igualdad interna y desigualdad externa dividiendo cada procesador8086 y 8088 en dos sub-procesadores. O sea, cada uno consta de una unidad deejecución (EU: Execution Unit) y una unidad interfaz del bus (BIU: BusInterface Unit). La unidad de ejecución es la encargada de realizartodas las operaciones mientras que la unidad de interfaz del bus es la encargadade acceder a datos e instrucciones del mundo exterior. Las unidades de ejecuciónson idénticas en ambos microprocesadores, pero las unidades de interfaz del busson diferentes en varias cuestiones, como se desprende del siguiente diagrama enbloques: La ventaja de esta división fue el ahorro de esfuerzonecesario para producir el 8088. Sólo una mitad del 8086 (elBIU) tuvo que rediseñarse para producir el 8088. La explicación del diagrama en bloques es la siguiente: Registros de uso general del 8086/8088: Tienen 16 bits cada uno y son ocho: 1) AX = Registro acumulador, dividido en AH y AL (8 bits cadauno). 2) BX = Registro base, dividido en BH y BL. 3) CX = Registro contador, dividido en CH y CL. 4) DX = Registro de datos, dividido en DH y DL. 5) SP = Puntero de pila (no se puede subdividir). 6) BP = Puntero base (no se puede subdividir). 7) SI = Puntero índice (no se puede subdividir). 8) DI = Puntero destino (no se puede subdividir). Cualquiera de estos registros puede utilizarse como fuente odestino en operaciones aritméticas y lógicas, lo que no se puede hacer conninguno de los seis registros que se verán más adelante. Además de lo anterior, cada registro tiene usos especiales: AX: Usándolo se produce (en general) una instrucción queocupa un byte menos que si se utilizaran otros registros de uso general. Suparte más baja, AL, también tiene esta propiedad. El último registromencionado es el equivalente al acumulador de los procesadores anteriores (8080y 8085). Además hay instrucciones como DAA; DAS; AAA; AAS; AAM; AAD; LAHF;SAHF; CBW; IN y OUT que trabajan con AX o con uno de sus dos bytes (AH o AL).También se utiliza este registro (junto con DX a veces) en multiplicaciones ydivisiones. BX: Es el registro base de propósito similar (se usa paradireccionamiento indirecto) y es una versión más potente del par de registrosHL de los procesadores anteriores. CX: Se utiliza como contador en bucles (instrucción LOOP),en operaciones con cadenas (usando el prefijo REP) y en desplazamientos yrotaciones (usando el registro CL en los dos últimos casos). DX: Se utiliza junto con el registro AX en multiplicaciones ydivisiones, en la instrucción CWD y en IN y OUT para direccionamiento indirectode puertos (el registro DX indica el número de puerto de entrada/salida). SP: Aunque es un registro de uso general, debe utilizarse sólocomo puntero de pila, la cual sirve para almacenar las direcciones de retorno desubrutinas y los datos temporarios (mediante las instrucciones PUSH y POP). Alintroducir (push) un valor en la pila a este registro se le resta dos, mientrasque al extraer (pop) un valor de la pila este a registro se le suma dos. BP: Generalmente se utiliza para realizar direccionamientoindirecto dentro de la pila. SI: Sirve como puntero fuente para las operaciones concadenas. También sirve para realizar direccionamiento indirecto. DI: Sirve como puntero destino para las operaciones concadenas. También sirve para realizar direccionamiento indirecto. UNIDAD ARITMÉTICA Y LÓGICA Es la encargada de realizar las operaciones aritméticas(suma, suma con "arrastre", resta, resta con "préstamo" ycomparaciones) y lógicas (AND, OR, XOR y TEST). Las operaciones pueden ser de16 bits o de 8 bits. Indicadores (flags): Hay nueve indicadores de un bit en esteregistro de 16 bits. Los cuatro bits más significativos están indefinidos,mientras que hay tres bits con valores determinados: los bits 5 y 3 siemprevalen cero y el bit 1 siempre vale uno (esto también ocurría en losprocesadores anteriores). Registro de indicadores (16 bits)Bit 15 14 13 12 11 10 9 8 76 5 4 3 2 1 0 Flag -- -- -- -- OF DF IF TF SF ZF 0 AF 0 PF 1 CF CF (Carry Flag, bit 0): Si vale 1, indica que hubo"arrastre" (en caso de suma) hacia, o "préstamo" (en casode resta) desde el bit de orden más significativo del resultado. Este indicadores usado por instrucciones que suman o restan números que ocupan varios bytes.Las instrucciones de rotación pueden aislar un bit de la memoria o de unregistro poniéndolo en el CF. PF (Parity Flag, bit 2): Si vale uno, el resultado tieneparidad par, es decir, un número par de bits a 1. Este indicador se puedeutilizar para detectar errores en transmisiones. AF (Auxiliary carry Flag, bit 4): Si vale 1, indica que hubo"arrastre" o "préstamo" del nibble (cuatro bits) menossignificativo al nibble más significativo. Este indicador se usa con lasinstrucciones de ajuste decimal. ZF (Zero Flag, bit 6): Si este indicador vale 1, el resultadode la operación es cero. SF (Sign Flag, bit 7): Refleja el bit más significativo delresultado. Como los números negativos se representan en la notación decomplemento a dos, este bit representa el signo: 0 si es positivo, 1 si esnegativo. TF (Trap Flag, bit 8): Si vale 1, el procesador está en modopaso a paso. En este modo, la CPU automáticamente genera una interrupcióninterna después de cada instrucción, permitiendo inspeccionar los resultadosdel programa a medida que se ejecuta instrucción por instrucción. IF (Interrupt Flag, bit 9): Si vale 1, la CPU reconocepedidos de interrupción externas enmascarables (por el pin INTR). Si vale 0, nose reconocen tales interrupciones. Las interrupciones no enmascarables y lasinternas siempre se reconocen independientemente del valor de IF. DF (Direction Flag, bit 10): Si vale 1, las instrucciones concadenas sufrirán "auto-decremento", esto es, se procesarán lascadenas desde las direcciones más altas de memoria hacia las más bajas. Sivale 0, habrá "auto-incremento", lo que quiere decir que las cadenasse procesarán de "izquierda a derecha". OF (Overflow flag, bit 11): Si vale 1, hubo un desborde enuna operación aritmética con signo, esto es, un dígito significativo se perdiódebido a que tamaño del resultado es mayor que el tamaño del destino. SISTEMA DE CONTROL DE LA UNIDAD DE EJECUCIÓN Es el encargado de decodificar las instrucciones que le envíala cola y enviarle las órdenes a la unidad aritmética y lógica según unatabla que tiene almacenada en ROM llamada CROM (Control Read Only Memory). COLA DE INSTRUCCIONES Almacena las instrucciones para ser ejecutadas. La cola secarga cuando el bus está desocupado, de esta manera se logra una mayoreficiencia del mismo. La cola del 8086 tiene 6 bytes y se carga de a dos bytespor vez (debido al tamaño del bus de datos), mientras que el del 8088 tienecuatro bytes. Esta estructura tiene rendimiento óptimo cuando no se realizansaltos, ya que en este caso habría que vaciar la cola (porque no se van aejecutar las instrucciones que van después del salto) y volverla a cargar coninstrucciones que se encuentran a partir de la dirección a donde se salta.Debido a esto las instrucciones de salto son (después de multiplicaciones ydivisiones) las más lentas de este microprocesador. Registros de la unidad de interfaz con el bus: El programador puede acceder a cinco registros de 16 bitscada uno, siendo cuatro de ellos registros de segmento y el restante el punterode instrucción (IP). Los registros de segmento se llaman: CS: Registro de segmento de código. DS: Registro de segmento de datos. ES: Registro de segmento extra. SS: Registro de segmento de pila. La utilización de estos registros se explica más adelante,en la sección que trata de direccionamiento a memoria. Lógica de control del bus: El cometido de este bloque es poder unir los bloquesanteriormente mencionados con el mundo exterior, es decir, la memoria y losperiféricos. El 8088 tiene un bus de datos externo reducido de 8 bits. Larazón para ello era prever la continuidad entre el 8086 y los antiguosprocesadores de 8 bits, como el 8080 y el 8085. Teniendo el mismo tamaño delbus (así como similares requerimientos de control y tiempo), el 8088, que esinternamente un procesador de 16 bits, puede reemplazar a los microprocesadoresya nombrados en un sistema ya existente. El 8088 tiene muchas señales en común con el 8085,particularmente las asociadas con la forma en que los datos y las direccionesestán multiplexadas, aunque el 8088 no produce sus propias señales de relojcomo lo hace el 8085 (necesita un chip de soporte llamado 8284, que es diferentedel 8224 que necesitaba el microprocesador 8080). El 8088 y el 8085 siguen elmismo esquema de compartir los terminales correspondientes a los 8 bits másbajos del bus de direcciones con los 8 bits del bus de datos, de manera que seahorran 8 terminales para otras funciones del microprocesador. El 8086 compartelos 16 bits del bus de datos con los 16 más bajos del bus de direcciones. El 8085 y el 8088 pueden, de hecho, dirigir directamente losmismos chips controladores de periféricos. Las investigaciones de hardware parasistemas basados en el 8080 o el 8085 son, en su mayoría, aplicables al 8088. En todo lo recién explicado se basó el éxito del 8088. El 8086/8088 puede conectarse al circuito de dos formasdistintas: el modo máximo y el modo mínimo. El modo queda determinado al ponerun determinado terminal (llamado MN/MX) a tierra o a la tensión de alimentación.El 8086/8088 debe estar en modo máximo si se desea trabajar en colaboracióncon el Procesador de Datos Numérico 8087 y/o el Procesador de Entrada/Salida8089 (de aquí se desprende que en la IBM PC el 8088 está en modo máximo). Eneste modo el 8086/8088 depende de otros chips adicionales como el Controlador deBus 8288 para generar el conjunto completo de señales del bus de control. Elmodo mínimo permite al 8086/8088 trabajar de una forma más autónoma (paracircuitos más sencillos) en una manera casi idéntica al microprocesador 8085. Los 40 pines del 8088 en modo mínimo tienen las siguientesfunciones: 1.- GND (Masa) 2.- A14 (Bus de direcciones) 3.- A13 (Bus de direcciones) 4.- A12 (Bus de direcciones) 5.- A11 (Bus de direcciones) 6.- A10 (Bus de direcciones) 7.- A9 (Bus de direcciones) 8.- A8 (Bus de direcciones) 9.- AD7 (Bus de direcciones y datos) 10.- AD6 (Bus de direcciones y datos) 11.- AD5 (Bus de direcciones y datos) 12.- AD4 (Bus de direcciones y datos) 13.- AD3 (Bus de direcciones y datos) 14.- AD2 (Bus de direcciones y datos) 15.- AD1 (Bus de direcciones y datos) 16.- AD0 (Bus de direcciones y datos) 17.- NMI (Entrada de interrupción no enmascarable) 18.- INTR (Entrada de interrupción enmascarable) 19.- CLK (Entrada de reloj generada por el 8284) 20.- GND (Masa) 21.- RESET (Para inicializar el 8088) 22.- READY (Para sincronizar periféricos y memorias lentas) 23.- /TEST 24.- /INTA (El 8088 indica que reconoció la interrupción) 25.- ALE (Cuando está uno indica que salen direcciones porAD, en caso contrario, es el bus de datos) 26.- /DEN (Data enable: cuando vale cero debe habilitar lostransceptores 8286 y 8287 (se conecta al pin de "output enable"), estosirve para que no se mezclen los datos y las direcciones). 27.- DT/R (Data transmit/receive: se conecta al pin dedirección de los chips recién indicados). 28.- IO/M (Si vale 1: operaciones con ports, si vale 0:operaciones con la memoria) 29.- /WR (Cuando vale cero hay una escritura) 30.- HLDA (Hold Acknowledge: el 8088 reconoce el HOLD) 31.- HOLD (Indica que otro integrado quiere adueñarse delcontrol de los buses, generalmente se usa para DMA o acceso directo a memoria). 32.- /RD (Cuando vale cero hay una lectura) 33.- MN/MX (Cuando esta entrada está en estado alto, el 8088está en modo mínimo, en caso contrario está en modo máximo) 34.- /SSO (Junto con IO/M y DT/R esta salida sirve paradeterminar estados del 8088) 35.- A19/S6 (Bus de direcciones/bit de estado) 36.- A18/S5 (Bus de direcciones/bit de estado) 37.- A17/S4 (Bus de direcciones/bit de estado) 38.- A16/S3 (Bus de direcciones/bit de estado) 39.- A15 (Bus de direcciones) 40.- Vcc (+5V) En modo máximo (cuando se aplica +5V al pin 33) hay algunospines que cambian de significado: 24.- QS1: Estado de la cola de instrucciones (bit 1). 25.- QS0: Estado de la cola de instrucciones (bit 0). 26.- S0: Bit de estado 0. 27.- S1: Bit de estado 1. 28.- S2: Bit de estado 2. 29.- /LOCK: Cuando vale cero indica a otros controladores delbus (otros microprocesadores o un dispositivo de DMA) que no deben ganar elcontrol del bus. Se activa poniéndose a cero cuando una instrucción tiene elprefijo LOCK. 30.- RQ/GT1: Es bidireccional y tiene la misma función queHOLD/HLDA en modo mínimo. 31.- RQ/GT0: Como RQ/GT1 pero tiene mayor prioridad. 34.- Esta salida siempre está a uno. Por ser este microprocesador mucho más complejo que el 8085,tiene más bits de estado que el recién mencionado. A título informativo sedetallan los bits de estado: S2 IO/M S1 DT/R S0 /SSO Significado 1 0 0 0 Acceso a código (instrucciones) 1 0 0 1 Lectura de memoria 1 0 1 0 Escritura a memoria 1 0 1 1 Bus pasivo (no hace nada) 0 1 0 0 Reconocimiento de interrupción 0 1 0 1 Lectura de puerto de entrada/salida 0 1 1 0 Escritura a puerto de E/S 0 1 1 1 Estado de parada (Halt) QS1 QS0 Significado 0 0 No hay operación 0 1 Primer byte del código de operación 1 0 Se vacía la cola de instrucciones 1 1 Siguiente byte de la instrucción Modos de direccionamiento del 8086/8088: Estos procesadores tienen 27 modos de direccionamiento (unacantidad bastante más grande que los microprocesadores anteriores) o reglaspara localizar un operando de una instrucción. Tres de ellos son comunes amicroprocesadores anteriores: direccionamiento inmediato (el operando es un númeroque se encuentra en la misma instrucción), direccionamiento a registro (eloperando es un registro del microprocesador) y direccionamiento inherente (eloperando está implícito en la instrucción, por ejemplo, en la multiplicaciónuno de los operandos siempre es el acumulador). El resto de los modos sirve paralocalizar un operando en memoria. Para facilitar la explicación de estos modos,se pueden resumir de la siguiente manera: Deben sumarse cuatro cantidades: 1) dirección de segmento,2) dirección base, 3) una cantidad índice y 4) un desplazamiento. La dirección de segmento se almacena en el registro desegmento (DS, ES, SS o CS). En la próxima sección se indica la forma en que sehace esto. Por ahora basta con saber que el contenido del registro de segmentose multiplica por 16 antes de utilizarse para obtener la dirección real. Elregistro de segmentación siempre se usa para referenciar a memoria. La base se almacena en el registro base (BX o BP). El índicese almacena en el registro índice (SI o DI). Cualquiera de estas doscantidades, la suma de las dos o ninguna, pueden utilizarse para calcular ladirección real, pero no pueden sumarse dos bases o dos índices. Los registrosrestantes (AX, CX, DX y SP) no pueden utilizarse para direccionamientoindirecto. El programador puede utilizar tanto la base como el índice paragestionar ciertas cosas, tales como matrices de dos dimensiones, o estructurasinternas a otras estructuras, esquemas que se utilizan en las prácticas comunesde programación. La base y el índice son variables o dinámicas, ya que estánalmacenadas en registros de la CPU. Es decir, pueden modificarse fácilmentemientras se ejecuta un programa. Además del segmento, base e índice, se usa undesplazamiento de 16 bits, 8 bits o 0 bits (sin desplazamiento). Ésta es unacantidad estática que se fija al tiempo de ensamblado (paso de código fuente acódigo de máquina) y no puede cambiarse durante la ejecución del programa (amenos que el programa se escriba sobre sí mismo, lo que constituye una prácticano aconsejada). Todo esto genera los 24 modos de direccionamiento a memoriaque se ven a continuación: Aquí desp8 indica desplazamiento de 8 bits y desp16 indicadesplazamiento de 16 bits. Otras combinaciones no están implementadas en la CPUy generarán error al querer ensamblar, por ejemplo, ADD CL,[DX+SI]. El ensamblador genera el tipo de desplazamiento másapropiado (0, 8 ó 16 bits) dependiendo del valor que tenga la constante: sivale cero se utiliza el primer caso, si vale entre -128 y 127 se utiliza elsegundo, y en otro caso se utiliza el tercero. Nótese que [BP] sindesplazamiento no existe. Al ensamblar una instrucción como, por ejemplo, MOVAL,[BP], se generará un desplazamiento de 8 bits con valor cero. Esta instrucciónocupa tres bytes, mientras que MOV AL,[SI] ocupa dos, porque no necesita eldesplazamiento. Estos modos de direccionamiento producen algunosinconvenientes en el 8086/8088. La CPU gasta tiempo calculando una direccióncompuesta de varias cantidades. Principalmente esto se debe al hecho de que el cálculode direcciones está programado en microcódigo (dentro de la CROM del sistemade control de la unidad de ejecución). En las siguientes versiones (a partirdel 80186/80188) estos cálculos están cableados en la máquina y, por lotanto, cuesta mucho menos tiempo el realizarlos. Veamos un ejemplo: MOV AL, ES:[BX+SI+6]. En este caso eloperando de la izquierda tiene direccionamiento a registro mientras que el de laderecha indica una posición de memoria. Poniendo valores numéricos, supongamosque los valores actuales de los registros sean: ES = 3200h, BX = 200h, SI = 38h.Como se apuntó más arriba la dirección real de memoria será: ES * 10h + BX + SI + 6 = 3200h * 10h + 200h + 38h + 6 =3223Eh Estructura de memoria de segmentación: Como se ha mencionadoanteriormente, el 8086/8088 usa un esquema ingenioso llamado segmentación, paraacceder correctamente a un megabyte completo de memoria, con referencias dedirecciones de sólo 16 bits. Veamos cómo funciona. Cualquier dirección tiene dos partes,cada una de las cuales es una cantidad de 16 bits. Una parte es la dirección desegmento y la otra es el offset. A su vez el offset se compone de varias partes:un desplazamiento (un número fijo), una base (almacenada en el registro base) yun índice (almacenado en el registro índice). La dirección de segmento sealmacena en uno de los cuatro registros de segmento (CS, DS, ES, SS). Elprocesador usa estas dos cantidades de 16 bits para calcular la dirección realde 20 bits, según la siguiente fórmula: Dirección real = 16 * (dirección del segmento) + offset Tal como veíamos antes, dado que 16 en decimal es 10 enhexadecimal, multiplicar por ese valor es lo mismo que correr el númerohexadecimal a la izquierda una posición. Hay dos registros de segmento que tienen usos especiales: elmicroprocesador utiliza el registro CS (con el offset almacenado en el punterode instrucción IP) cada vez que se debe acceder a un byte de instrucción deprograma, mientras que las instrucciones que utilizan la pila (llamados aprocedimientos, retornos, interrupciones y las instrucciones PUSH y POP) siempreutilizan el registro de segmento SS (con el offset almacenado en el registropuntero de pila SP). De ahí los nombres que toman: CS es el segmento de códigomientras que SS es el registro segmento de pila. Para acceder a datos en la memoria se puede utilizarcualquiera de los cuatro registros de segmento, pero uno de ellos provoca que lainstrucción ocupe un byte menos de memoria: es el llamado segmento por defecto,por lo que en lo posible hay que tratar de usar dicho segmento para direccionardatos. Este segmento es el DS (registro de segmento de datos) para todos loscasos excepto cuando se utiliza el registro base BP. En este caso el segmentopor defecto es SS. Si se utiliza otro registro, el ensamblador genera un byte deprefijo correspondiente al segmento antes de la instrucción: CS -> 2Eh, DS-> 3Eh, ES -> 26h y SS -> 36h. El uso de estos diferentes segmentossignifica que hay áreas de trabajo separadas para el programa, pila y losdatos. Cada área tiene un tamaño máximo de 64 KBytes. Dado que hay cuatroregistros de segmento, uno de programa (CS), uno de pila (SS) y dos de datos(segmento de datos DS y segmento extra ES) el área de trabajo puede llegar a 4* 64 KB = 256 KB en un momento dado suponiendo que las áreas no se superponen. Si el programa y los datos ocupan menos de 64 KB, lo que sehace es fijar los registros de segmento al principio del programa y luego seutilizan diferentes offsets para acceder a distintas posiciones de memoria. Encaso contrario necesariamente deberán cambiarse los registros de segmento en laparte del programa que lo requiera. Los registros de segmento DS, ES y SS secargan mediante las instrucciones MOV y POP, mientras que CS se carga mediantetransferencias de control (saltos, llamadas, retornos, interrupciones)intersegmento. Estructura de interrupciones del 8086/8088 Hay tres clases de interrupción: por hardware, por softwaree internas (a las dos últimas también se las llama "excepciones"). Veremos primeramente el caso de interrupciones por hardware:Como se mencionó anteriormente, el 8086/8088 tiene dos entradas de petición deinterrupción: NMI e INTR y una de reconocimiento (INTA). La gran mayoría delas fuentes de interrupción se conectan al pin INTR, ya que esto permiteenmascarar las interrupciones (el NMI no). Para facilitar esta conexión, seutiliza el circuito integrado controlador de interrupciones, que tiene el código8259A. Este chip tiene, entre otras cosas, ocho patas para sendas fuentes deinterrupción (IRQ0 - IRQ7), ocho para el bus de datos (D0 - D7), una salida deINTR y una entrada de INTA. Esto permite una conexión directa con el 8088/8086.Al ocurrir una petición de alguna de las ocho fuentes, el 8259A activa la pataINTR. Al terminar de ejecutar la instrucción en curso, el microprocesadoractiva la pata INTA, lo que provoca que el 8259A envíe por el bus de datos un númerode ocho bits (de 0 a 255) llamado tipo de interrupción (programable por elusuario durante la inicialización del 8259A), que el 8086/8088 utiliza parasaber cuál es la fuente de interrupción. A continuación busca en la tabla devectores de interrupción la dirección del manejador de interrupción(interrupt handler). Esto se hace de la siguiente manera. Se multiplica el tipode interrupción por cuatro, y se toman los cuatro bytes que se encuentran apartir de esa dirección. Los dos primeros indican el offset y los dos últimosel segmento del manejador, como se muestra a continuación. Posición memoria 00 02 04 06 08 0A 0C 0E 10 12 …… 3FC 3FE IP CS IP CS IP CS IP CS IP CS …… IP CS Tipo de Interrupción 00 01 02 03 04 FF Como se puede observar, la tabla ocupa el primer kilobyte dememoria (256 tipos * 4 bytes/tipo = 1024 bytes). Una vez que se pusieron en la pila los flags, CS e IP (en eseorden), la CPU hace IF Las interrupciones por software ocurren cuando se ejecutala instrucción INT tipo. De esta manera se pueden simular interrupcionesdurante la depuración de un programa. El tipo de interrupción (para poderbuscar el vector en la tabla) aparece en la misma instrucción como unaconstante de 8 bits. Muchos sistemas operativos (programas que actúan a modo deinterfaz entre los programas de los usuarios (llamados también"aplicaciones") y el hardware del sistema) utilizan esta instrucciónpara llamadas a servicios, lo que permite no tener que conocer la direcciónabsoluta del servicio, permitiendo cambios en el sistema operativo sin tener quecambiar los programas que lo ejecutan. De esta manera, una de las primerasoperaciones que debe realizar dicho sistema operativo es inicializar la tabla devectores de interrupción con los valores apropiados. Existen algunas interrupciones predefinidas, de uso exclusivodel microprocesador, por lo que no es recomendable utilizar estos tipos deinterrupción para interrupciones por hardware o software. - Tipo 0: Ocurre cuando se divide por cero o el cociente esmayor que el valor máximo que permite el destino. - Tipo 1: Ocurre después de ejecutar una instrucción si TF(Trap Flag) vale 1. Esto permite la ejecución de un programa paso a paso, loque es muy útil para la depuración de programas. - Tipo 2: Ocurre cuando se activa la pata NMI (interrupciónno enmascarable). - Tipo 3: Existe una instrucción INT que ocupa un sólobyte, que es la correspondiente a este tipo. En los programas depuradores(debuggers) (tales como Debug, CodeView, Turbo Debugger, etc.), se utiliza estainstrucción como punto de parada (para ejecutar un programa hasta unadeterminada dirección, fijada por el usuario del depurador, se inserta estainstrucción en la dirección correspondiente a la parada y se lanza la ejecución.Cuando el CS:IP apunte a esta dirección se ejecutará la INT 3, lo que devolveráel control del procesador al depurador). Debido a esto, si se le ordena aldepurador que ejecute el programa hasta una determinada dirección en ROM(memoria de sólo lectura) (por ejemplo, para ver cómo funciona una subrutinaalmacenada en dicha memoria), la ejecución seguirá sin parar allí (ya que lainstrucción INT 3 no se pudo escribir sobre el programa). En el 80386, con suelaborado hardware de ayuda para la depuración, se puede poner un punto deparada en ROM. - Tipo 4: Ocurre cuando se ejecuta la instrucción deinterrupción condicional INTO y el flag OF (Overflow Flag) vale 1. Los tipos 5 a 31 (1F en hexadecimal) están reservados parainterrupciones internas (también llamados "excepciones") de futurosmicroprocesadores. Prioridad entre diferentes fuentes de interrupción: 1) Error de división, INT n (no enmascarable), INTO. 2) NMI (no enmascarable). 3) INTR (enmascarable mediante IF). 4) Ejecución paso a paso (enmascarable mediante TF). BIBLIOGRAFIA CONTENIDO Historia de los microprocesadores Intel Publicación enviada por ilustrados Contactar Código ISPN de la Publicación EpypkAFZFFNSUJGyAq Publicado Thursday 7 de August de 2003 Ultimas Publicaciones en ilustrados.com
ilustrados.com nace con el fin difundir el conocimiento publicando trabajos de investigación, monografias, tesis, presentaciones powerpoint y afines. Publicar trabajos en ilustrados.com ha alcanzado prestigio y reconocimiento internacional siendo cada vez más el número de académicos, empresas, investigadores, científicos que consultan las publicaciones de nuestro portal. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||