-[ 0x0E ]-------------------------------------------------------------------- -[ Procesadore 8086 ]-------------------------------------------------------- -[ by elotro ]-------------------------------------------------------SET-32-- P R O C E S A D O R ______ ______ ______ _____ | __ | | __ | | __ | | ___| | |__| | | | | | | |__| | | |____ | __ | | | | | | __ | | __ | | |__| | | |__| | | |__| | | |__| | |________| |______| |________| |______| Si, si. Ya se lo que estan pensando, vieron el enorme [e inutil] ascii y dijieron : - Uf! Otra vez este otro!. Pues no soy este otro, sino elotro y seguire molestando con mis articulos de retroinformatica [y tendran que aguantarse los de electronica tambien !] He escrito este articulo para aquellos que, cuando vieron las tablas de instrucciones del Z80, cayeron desmayados por la cantidad de instrucciones que tenia [y otros cayeron por la cantidad de alcohol que tenian XD). El procesador 8086 es, como adivinaron, el predecesor de los x86 que la mayoria de nosotros usamos; asi que las instrucciones que veran seran relativamente pocas y familiares para todo el que sepa algo de assembler. Bueno, es momento de dejar de hacerse el gracioso [aunque no tenga nada de humor] y comenzar el articulo. Consultas, criticas o lo que quieras ---> elotro.ar@gmail.com INDICE DE CONTENIDOS - uP 8086 """""""""""""""""""""""""""""""" 1. Un poco de historia 2. Caracteristicas Principales 2.1 Descripcion de los terminales 2.2 Registros del uP 3. Sistema minimo y maximo del 8086 4. Tabla de instrucciones del uP 4.1 Significado de abreviaturas 4.2 Condiciones 4.3 Modos de direccionamiento 5. Agradecimientos 6. Bibliografia 1. Un poco de historia =================== Cuando este uP salio a la luz (1978), los microprocesadores de 8 bits dominaban el mercado, tanto en el campo profesional, como en el de la informatica y automatica de aficionados. Los microprocesadores de 16 bits quedaban reservados al ambito extremo de lo profesional, entre otras cosas porque la realizacion de una CPU con estos procesadores era costosa y compleja, principalmente porque el uP estaba compuesto de unos cuantos microchips. La aparicion del 8086 produjo una revolucion, en la que se comenzaron a tomar en cuenta los uP de 16 bits, que aventajaban por mucho a sus predecesores de 8 bits. 2. Caracteristicas Principales =========================== Las caracteristicas mas importantes de este microprocesador son : * Bus de datos de 16 bits * Capacidad de direccionamiento que se extiende hasta un megabyte (1048576 bytes, era suficiente y en algunos casos mucho para su epoca) * Esta fabricado en tecnologia HMOS (High MOS, MOS de alta velocidad), lo que le permite operar a una frecuencia minima de 5 MHz; proporcionando un tiempo de ejecucion de aproximadamente 500 nanosegundos para las instrucciones mas cortas. * Fue concebido para trabajar con lenguajes de alto nivel, como Basic, Cobol, Fortran o Pascal; y su utilizacion en computadoras personales. * Posee un amplio repertorio de instrucciones (menos que el Z80), que le permiten operar tanto con 8 como con 16 bits. * Su alimentacion es unica y de 5V. 2.1 Descripcion de los terminales ============================= .----------.---------.----------. GND | | | | Vcc (+5V) AD14 | \_______/ | AD15 AD13 | | A16/S3 AD12 | | A17/S4 AD11 | | A13/S5 AD10 | | A19/S6 AD9 | #### #### #### #### | BHE/S7 AD8 | # # # # # # # | MN/MX <------------- AD7 | #### # # #### # #### | RD _ | AD6 | # # # # # # # # | RQ/GTO(HOLD | | AD5 | #### #### #### #### | RQ/GT1(HLDA | Terminales AD4 | | LOCK (WR) | de doble AD3 | | S2 (M/I0) | funcion AD2 | | S1 DT/R | segun AD1 | | S0 (DEN) | estado AD0 | | QS0 (ALE) | de MN/MX NMI | | QS1 INTA _| INTR | | TEST CLX | | READY GND | | RESET |_______________________________| El 8086 esta encapsulado en el formato clasico de 40 patas, cuyas funciones son: - AD0-AD15: Son los terminales del bus de direcciones y de datos, ya que ambos buses salen al exterior en tiempos diferentes. Existen 4 tiempos de funcionamiento T1, T2, T3 y T4, durante T1 sale al exterior la direccion, durante T2 a T4 salen al exterior los datos. - A16-A19: Son 4 terminales por donde sale la parte alta de la direccion para poder acceder al megabyte de espacio de memoria. Esto ocurre durante T1. Durante T2 a T4 se usan estos bits para indicar el uso de los registros internos. (S3 a S6) - BHE: Durante T1 este terminal en combinacion con ADO da las funciones siguientes: BHE=0,ADO=0 : Bus de datos 16 bits BHE=1,ADO=0 : El byte inferior esta redirigido a las direcciones pares. BHE=0,ADO=1 : El byte superior del bus de datos esta referido a las direcciones impares. BHE=1,ADO=1 no se utiliza - RD: Salida para indicar el ciclo de lectura (READ) - READY: Entrada para la adaptacion de memorias y perifericos lentos. Es muy util en el 8086, teniendo en cuenta su velocidad y los perifericos de su epoca. - INTR: Entrada de interrupcion enmascarable. - NMI: Entrada de interrupcion no enmascarable. - TEST: Entrada de comprobacion de la instruccion TEST. - RESET: Inicializacion del uP - CLX: Clock externo (Aprox. 5 MHz) - Vcc y GND: Terminales de alimentacion. Vcc=+5V, GND=Masa o tierra - MN/MX: Discrimina algunas seniales con respecto a su conexion a un sistema minimo de funcionamiento (MN/MX=1) o a un sistema maximo o de mayor envergadura (MN/MX=1). Para MN/MX=1 los terminales tienen estas funciones: - HOLD: Peticion de acceso a bus desde algun periferico. - HOLDA: Salida de reconocimiento por parte del uP al acceso y permiso del mismo. - WR: Ciclo de escritura (WRITE) - M/IO: Por esta salida el uP activa la memoria cuando es uno, debido a alguna instruccion referida a la misma; o activa los circuitos de INPUT/ OUTPUT (I/O), cuando es un cero, debido a la ejecucion de una instruccion referida a los circuitos I/O a los que se pueden conectar perifericos o bloques de datos de hasta 64 KB, que es la extension del I/O. - DT/R: Salida por donde se indica el ciclo de transmision o recepcion de datos para circuitos especializados que se aniaden al uP en un sistema minimo, como por ejemplo un IC 8287 (demultiplexor de bus) - DEN: Salida para la habilitacion de los datos en un sistema minimo que utilize el 8287. - ALE: Esta salida habilita el latch (acceso) de direcciones. - INTA: Indica a un periferico que ha solicitado una interrupcion, que esta sera atendida a partir de ese momento. Cuando MN/MX=0, los terminales numerados del 32 al 34 tienen los siguientes cometidos por este mismo orden. (ver figuras) - RQ/GT0: Otro uP asociado puede pedir acceso a un bus comun una vez que el uP anterior haya concluido la instruccion en curso. - RQ/GT1: Por esta salida el uP pide acceso al bus comun compartido por varios microprocesadores en un sistema complejo. - LOCK: Indica a otros uP que no pueden acceder al bus comun mientras este en estado bajo o cero. - S0-S2: Son tres terminales que decodifican alguno de los ocho posibles estados segun: S0=0,S1=0,S2=0: Reconocimiento de interrupcion S0=1,S1=0,S2=0: Lectura de circuitos I/O S0=0,S1=1,S2=0: Escritura circuitos I/O S0=1,S1=1,S2=0: Paro, halt S0=0,S1=0,S2=1: Codigo de acceso a interrupcion, fetch (ir por interrupt) S0=1,S1=0,S2=1: Lectura de memoria S0=0,S1=1,S2=1: Escritura de memoria S0=1,S1=1,S2=1: No opera - QS0 y QS1: Son salidas que indican el estado del uP en el manejo de las instrucciones segun: QS1=0,QS0=0: No opera QS1=0,QS0=1: Primer byte del codigo OP desde la cola QS1=1,QS0=0: Cola vacia QS1=1,QS0=1: Byte subsiguiente desde la cola. No era el primero. 2.2 Registros del uP ================ El 8086 posee un completo repertorio de registros, tal como se muestra en la figura. El juego de instrucciones del uP permite operar con ocho o 16 bits, segun lo indique la instruccion, de ahi que el primer bloque de registros sean acumuladores de 8, denominados AH, BH, CH, DH y DL (A,B,C,D indica el registro, H (high) indica parte alta y L (low) indica parte baja). Cuando los acumuladores son tratados como de 16 bits, reciben los nombres de AX, BX, CX y DX. El siguiente bloque de registros contiene el puntero stack y tres punteros mas denominados base, fuente y destino para el movimiento interno de los datos o con respecto a la memoria. El tercer bloque contiene el puntero de instruccion, que hace de contador de programa y el registro de flags, que es realmente, el registro de estado; tipico de todos los uP. Estos bits indican el signo del dato operado, si ha habido acarreo, overflow, la paridad, el estado de las interrupciones enmascarables mediante el bit 1, el autoincremento o decremento de un registro y un bit auxiliar llamado trap. El ultimo bloque lo componen cuatro registros de 16 bits, que definen de forma independiente cuatro areas de memoria de 64 KB cada una. _____________ AX : | AH | AL | Registro Acumulador BX : | BH | BL | Registro Base CX : | CH | CL | Registro Contador DX : | _DH | DL | Registro de Datos `------'------' ________ | SP | Registro del apuntador de la pila (stack) | BP | Registro de apuntadores base | SI | Registro ¡ndice fuente | DI | Registro ¡ndice destino `--------' ___________________ |________IP_________| Registro de apuntador de siguiente instrucci¢n | FLAGS | FLAGS | Registro de banderas (flags) `---------'---------' ________ | CS | Registro del segmento de c¢digo | DS | Registro del segmento de datos | SS | Registro del segmento de pila | ES | Registro del segmento extra `--------' ________ | PC | Contador de programa `--------' ________ | SR | Registro de estado `--------' Diagrama del registro de estado: _____________________________________________________________________ | | | | | | | | | | | | | | | | | | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |____|____|____|____|____|____|___|___|___|___|___|___|___|___|___|___| | | | | | | | | |_ ACARREO | | | | | | | |____ PARIDAD (P) OVERFLOW ______________| | | | | | |_______ ACARREO AUXILIAR AUTOINC/DEC _______________| | | | |_______________________ CERO (Z) DE SI Y DI(D) | | |__________________________ SIGNO (S) INTERRUPCIONES __________________| | TRAP(T) _____________________________| Para mayor informacion sobre las caracteristicas de cada registro, consulta el articulo 'Diseccion del 8086', por Sir Willy the Psikopath, en SET 13. 3. Sistema minimo y maximo del 8086 ================================ El 8086 fue concebido para trabajar de dos formas: en uns sistema minimo, y en un sistema maximo. En el sistema minimo el uP trabaja independiente con la circuiteria tipica de este microprocesador, a la cual se le conecta, es decir, el sistema minimo de cualquier otro microprocesador. Todos los microprocesadores de la serie 80 tienen algo en comun, por ejemplo el circuito 8284, que es el clock que se usa en todos los demas. Como ya mencione, su bus de 16 bits es comun para los datos y las direciones por lo que hace falta un latch que almacene la direccion por la que sale el bus en el primer ciclo, para luego operar con los datos que salen por el bus en esta direccion. En realidad, este el el sistema seguido por otros microprocesadores de 16 bits, que tambien se encuentran encapsulados en 40 terminales. El circuito 8286 es, basicamente, un amplificador bidireccion del bus de datos, que atiende al flujo de entrada y salida. El sistema de conexion maximo, denominado asi por su mayor extension comparativa con el minimo, esta especialemte concebido para operar en sistemas mucho mas complejos y para la union con otros microprocesadores 8086, trabajando enlazadamente (PCs de multiprocesamiento multiprocesador) En un sistema multiprocesador en el que operan independientemente varios micro procesadores compartiendo a veces buses comunes, siempre hay uno de ellos cuyo software esta pensado para que haga como master o maestro del sistema, trabajando como esclavos los demas. En el sistema de configuracion maxima, ademas de los circuitos de generacion del clock, latch y amplificador de bus, es posible aniadir alguno mas, como el 8288 como controlador de buses, y el 8285, como controlador de interrupciones, que en el 8086 son similares a los de su predecesor, el 8085. En el esquema veras la representacion del sistema maximo de conexion, con todos los circuitos en LSI (large scale integration/integracion a gran escala) .------. .------------. .-------. .--------------. | 8284 | ---> | | <==== | 8259A | <==== |Interrupciones| |______| | 8086 | |_______| |______________| | | |____________| || | | .------. || _| |_ | 8288 | <=======/ \___/ |______| .-----------. || | 8282/8289 | || | 8286/8287 | || |___________| || | | | | || | | | | || | | | |==========> .-----------. ||===================================> | Memoria | || | |================> |___________| || | | | | || | | | | || | | | |==========> .-----------. ||===================================> | 8087 | || | |================> |___________| || | | | | || | | | | || | | | | .------------------------------. ||===================================> | Chips del sistema | || | | | |==========> | 8202 Control RAM dinamica | || | |================> | 8251A UART | || D | | | | | 8253.5 Timer de intervalos | || A | | | | D | 8255A.5 Interface Perifericos| || T | | | | I | 8257.5 Controlador DMA | || O | | | | R | 8271 Control Floppy Disk | || S | | | | E | 8273 Control HDLC/SDLC | || | | | | C | 8275 Control CRT | || | | | | C | 8278/79 Interface Teclado/ | || | | | | I | Display ___________| || | | | | O | 8291 GPIB I/O |IEEE 488BUS| || | | | | N | |___________| || | | | | E | 8292 GPIB control bus | || | | | | S | 8295 Control Imp. | || | | | | | Matriz de punto | || | | | | |______________________________| || | | | | || | | | | || | | | | || | | | |==================> .--------. || | |========================> | 8089 | ||===========================================> |________| || | | | | .------------|--|--|-----------. || | | | | | .------------|--|--------. | | || | | | | | | .------------|----. | | | || | | | | | | | | | | | | | | _||_ _| |__| |_ | | | | | | | | | | \__/ \____/\____/ \_/\_/ V \_/\_/ V V \_/\_/ .------------------------------. .---------. .--------. .--------. | Interfaz multiprocesador | | Memoria | | I/O | | DMA | |______________________________| |_________| |________| |________| || | | | | _||_ _| |__| |_ \__/ \____/\____/ Hacia otros microprocesadores Referencias : """"""""""""" 8284 : Generador del clock 8086 : Microprocesador 8259A : Controlador de interrupciones 8288 : Controlador de Bus 8282/8283 : Demultiplexor de Bus 8286/8287 8087 : Procesador de datos numericos 8089 : Procesador de Input/Output Puedes ampliar los datos sobre los diferentes circuitos integrados mediante una buena busqueda en internet, o en la pagina de intel: www.intel.com 4. Tabla de instrucciones del 8086 =============================== Estas instrucciones son MUY familiares a las que ustedes, chicos que conocen assembler, o que vos, cracker, estas acostumbrado a cambiar. (supongo que no crackearas programas comerciales, o no ?) :) Por supuesto que no veras nada del estilo de INC EAX por que esa es una instruccion de 32 bits y este es un uP de 16 bits. Instrucciones de Transferencia: MOV : Trasfiere una palabra (16 bits) o un byte (8 bits) XCHG : Intercambia una palabra o un byte LEA : Carga una direccion en un registro LDS : Carga un puntero mediante Ds LES : Carga un puntero mediante Es LAHF : Carga los flags SAHF : Transfiere los flags PUSHF : Coloca los flags en el stack POPF : Saca los flags XLAT : Transforma un caracter de un codigo EBCDID a uno ASCII [ util no? ] Instrucciones aritmeticas: ADD : Suma de dos palabras o bytes con o sin signo ADC : Suma teniendo en cuenta el acarreo SUB : Resta SUBB : Resta teniendo en cuenta el borrow MUL : Multiplicacion de dos palabras o bytes con o sin signo IMUL : Multiplicacion de datos enteros DIV : Division de datos de 32 y 16 bits por datos de 16 y 8 bits sin signo IDIV : Division entera sin signo CMP : Compara palabras o datos CBN : Extension de signo al pasar de 8 a 16 bits CWD : Extension de signo al pasar de 16 a 32 bits DAA : Ajuste decimal para sumar DAS : Ajuste decimal para restar DEG : Negacion de un numero AAM : Ajuste decimal para multiplicar AAD : Ajuste decimal para dividir INC : Incrementar DEC : Decrementar Instrucciones Logicas: NOT : Negacion OR : Operacion OR AND : Operacion AND XOR : Operacion XOR TEST : Operacion AND para comprobar los flags Instrucciones de salto e interrupcion: JMP : Salto sin condicion J : Salto segun 30 condiciones diferentes Las mas comunues son: JE : Jump if equal, salta si es igual JNE: Jump if not equal, salta si no es igual JZ : Jump if is zero, salta si es cero JNZ: Salta si no es cero. JA : Salta si es mayor. JNA: Salta si no es mayor JBE: Salta si es menor o igual. JNB: Salta si no es menor JAE: Salta si es mayor o igual. JCX : Salto si el valor de CX=0 LOOP : Regula de 5 formas el final de un bucle INT : Interrupcion por software INTO : Interrupcion condicional IRET : Retorno de una interrupcion LODS : Transfiere un dato a AL y AX STOS : Transfiere un dato desde AL y AX SCAS : Compara un dato con AL y AX CMPS : Compara dos caracteres MOVSB : Transfieren bytes o palabras MOVSM Instrucciones de control: NOP : No opera WAIT : Para el procesador hasta que TEST=0 HALT : Para el procesador LOCK : Permite a LOCK que pase a 0, durante la ejecucion de la proxima instruccion CLD y CLI : Ponen a 0 los flags D e I, respectivamente STD y STI : Ponen a 1 los flags D e I CLC y STC : Ponen a 0 y 1 los flags de acarreo CMC : Complementa el flag de acarreo IN : Entrada de un periferico y transfiere a AL o AX OUT : Salida de AL o AX a un periferico ROL : Rotacion a la izquierda ROR : Rotacion a la derecha RCL : Rotacion a la izquierda incluyendo el nit (o flag) carry del status RCR : Rotacion a la derecha incluyendo el nit (o flag) carry del status CALL : Salto a sub(rutina) RET : Retorno desde sub PUSH : Carga un dato en el stack POP : Saca un dato del stack REP : Repetir REPE : Repetir si es igual REPNE : Repetir si no es igual REPZ y REPNZ : Repetir si es cero o no, respectivamente. Son instrucciones que manejan cadenas de caracteres, usando como punteros los registros SI y DI 4.1 Significado de abreviaturas =========================== AL = Registro de 8 bits AX = Registro acumulador de 16 bits CX = Registro contador DS = Segmento de datos ES = Segmento extra 4.2 Condiciones =========== * Si Mod=11 entonces r/m se trata como un registro * Si Mod=00 entonces DISP=0 (sin desplazamiento, excepto si r/m=110, entonces EA indica el desplazamiento * Si Mod=01 entonces (DISP) el desplazamiento bajo es de 16 bits con signo (no hay desplazamiento alto) * Si Mod=10 entonces Desplazamiento.Alto=Desplazamiento.Bajo * Si r/m=000 entonces EA=(BX)+(SI)+desplazamiento * Si r/m=001 entonces EA=(BX)+(DI)+desplazamiento * Si r/m=010 entonces EA=(BP)+(SI)+desplazamiento * Si r/m=011 entonces EA=(BP)+(DI)+desplazamiento * Si r/m=100 entonces EA=(SI)+desplazamiento * Si r/m=101 entonces EA=(DI)+desplazamiento * Si r/m=110 entonces EA=(BP)+desplazamiento * Si r/m=111 entonces EA=(BX)+desplazamiento * Si S=W=01, entonces toma el dato como 16 bits * Si S=W=01, entonces el dato de un byte es extendido a 16 bits * Si V=0 entonces Count=1 * Si V=1 entonces Count en (CL) * X=Cualquier valor * Prefijo de segmento=001 reg 1101 * Reg es asignado segun la tabla Las instrucciones con referencia a los bits o flag del status usan 16 bits. El simbolo de los flags es: FLAGS=XXXX(OF): (DF): (IF): (TF): (SF): (ZF): X: (AF): X: (PF):X(CF) 4.3 Modos de direccionamiento ========================= Existen 7 modos de direccionamiento disponibles en el 8086 * Registro base: La direccion se obtiene mediante la suma del contenido de un registro base y el dato de la instruccion. * Inmediato: Indicado por la propia instruccion * Registro indirecto: La direccion se encuentra en BX, BP, SI o DI * Directo: La direccion esta en la misma instruccion * Relativo: Usado por instrucciones de salto y acceso a subrutinas * Registro indexado: La direccion se obtiene sumando a un registro indice el dato de la instruccion * Registro base indexado: La direccion es la suma del contenido del registro base mas el registro indice mas el dato de la instruccion. 5. Agradecimientos =============== Como siempre, a todo el staff de SET, a madfran y a todos que tienen y tuvieron algo que ver con SET. Y a vos que estas leyendo el articulo. 6. Bibliografia ============ Microprocesadores - Editorial Nueva Lente Informatica - Editorial Nueva Lente Microprocesadores de 16 bits - Jose Maria Angulo - Ed. Paraninfo