Download Folleto Ensamblador #2
Document related concepts
no text concepts found
Transcript
UNIVERSIDAD NACIONAL DE INGENIERIA RECINTO UNIVERSITARIO SIMON BOLIVAR Facultad de Electrotecnia y Computación Departamento de Arquitectura y Sistemas Folleto de Arquitectura de Máquinas Computadoras II Curso 2013 Folleto adicional de Ensamblador: Programando la Computadora basada en P8086 Preparado por: Profesor José Díaz Chow Managua, Noviembre de 2013 Folleto de Arquitectura de Máquinas Computadoras II Copyright, Xdc ©, Universidad Nacional de Ingeniería. Departamento de Arquitectura y Sistemas, Facultad de Electrotecnia y Computación. Elaborado Agosto 2004. Actualizado Noviembre de 2013. INDICE DE CONTENIDO 3. LA COMPUTADORA BASADA EN MICROPROCESA-DOR IX86 .........................1 3.1 ESTRUCTURA FÍSICA DE LA PC. ......................................................................................................... 1 3.1.1 Dentro de la caja de la PC ..................................................................................................... 2 3.2 ARQUITECTURA DE BUSES................................................................................................................. 4 3.3 EL ENTORNO DE PROCESAMIENTO ..................................................................................................... 6 3.3.1 Organización .......................................................................................................................... 6 3.3.2 Modelo de Memoria................................................................................................................ 7 3.3.3 Registros del CPU y su uso .................................................................................................... 9 3.3.4 Modos de direccionamiento ...................................................................................................12 3.3.5 El Conjunto de Instrucciones.................................................................................................13 3.3.5.1 3.3.5.2 Listado general de instrucciones: .................................................................................................... 13 Listado más detallado: ..................................................................................................................... 16 3.3.6 Los servicios de la ROM BIOS ..............................................................................................20 3.3.7 El lenguaje ensamblador. ......................................................................................................21 3.4 LOS CHIPS DE APOYO ......................................................................................................................23 3.4.1 El temporizador del sistema 8253-5 ......................................................................................23 3.4.2 El controlador de DMA .........................................................................................................23 3.4.3 El Controlador programable de Interrupciones (PIC) ..........................................................24 3.5 LA ENTRADA Y SALIDA ESTÁNDAR...................................................................................................25 3.5.1 El video de la PC ...................................................................................................................25 3.5.1.1 3.5.1.2 3.5.2 La pantalla ....................................................................................................................................... 25 Procesamiento básico de pantalla .................................................................................................... 25 La entrada estándar de la PC ................................................................................................27 3.5.2.1 Procesamiento básico de teclado ..................................................................................................... 27 3.5.3 Las interfaces estándares de la PC........................................................................................29 3.6 EL SUBSISTEMA DE ALMACENAMIENTO. ..........................................................................................30 3.6.1 La geometría del Disco ..........................................................................................................30 3.6.2 Estructura lógica del disco según DOS .................................................................................31 3.6.3 El sistema de archivos de DOS ..............................................................................................33 3.6.4 Acceso a archivos ..................................................................................................................36 3.6.4.1 3.6.4.2 Ejemplo1: Crear y escribir en archivo. ............................................................................................ 36 Ejemplo2: Abrir y leer un archivo existente .................................................................................... 39 3.7 PROGRAMACIÓN EN ENSAMBLADOR CON MACROS...........................................................................42 3.7.1 Definición de macro ..............................................................................................................42 3.7.2 Macros con parámetros .........................................................................................................42 3.7.3 Uso anidado de macros .........................................................................................................43 3.7.4 Directiva LOCAL ...................................................................................................................43 3.7.5 Directivas Include y PURGE .................................................................................................43 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I 3. LA COMPUTADORA BASADA EN MICROPROCESADOR ix86 Desde 1981, con la introducción de la IBM PC original, basada en 8088, la computadora personal basada en microprocesadores de la familia ix86 o compatibles se han posicionado de manera irrefutable como líder en este sector del mercado. Para bien o para mal, estas máquinas son las disponibles en nuestro entorno y se han ganado el ser nuestro caso de estudio en este curso. En esta unidad nos enfocaremos en el estudio tanto de la estructura física, organización y arquitectura de estas máquinas como del lenguaje ensamblador de sus microprocesadores con el objetivo de propiciar una comprensión más íntima de las particularidades arquitecturales de estas máquinas, porque estamos convencidos que existe una estrecha relación indisoluble entre el hardware y el software, misma que nos sirve de base en nuestra tarea académica en este curso. 3.1 Estructura física de la PC. La Computadora basada en microprocesador ix86, no ha cambiado mucho de aspecto físico desde sus raíces con la introducción de la PC original en 1981. Si inspeccionamos una configuración típica podemos identificar la misma estructura de siempre: Una unidad central o principal (a menudo erróneamente llamada CPU), a la que se conectan una serie de periféricos, de los cuales, el monitor (unidad predeterminada de salida) y el teclado (unidad predeterminada de entrada) son infaltables. Tenemos además otros dispositivos bastantes populares como la impresora, el ratón o apuntador y los parlantes. La unidad principal, que se puede encontrar en varios factores de forma o configuraciones (disposición horizontal o desktop , vertical o torre y una serie de subvariantes de las anteriores), contiene normalmente otros periféricos e interfaces disponibles al exterior en su superficie, como la unidad de disquetes, la unidad de CDROM (que si se pronuncia en inglés debe sonar cidi rom, no cidi rum) y las interfaces estándares de entrada/salida como los puertos paralelos, seriales y usb. El 12 de agosto de 1981, IBM presentó el IBM PC original que estaba basado en el microprocesador 8088, de 16 bits, aunque su bus externo era de 8, manteniendo así compatibilidad con la mayoría de aplicaciones hardware de la época. Este PC solo tenía 256Kbytes de RAM y no tenía disco duro, solo una unidad de casete y una de disquete de 5¼ de 160/180 Kbytes, dependiendo del modelo. El bus de expansión del sistema (ISA) permitía insertar tarjetas controladoras de E/S de 8 bits, logrando hacer el sistema abierto en cuanto a los dispositivos de E/S que se podrían conectar a él. Prof. José Díaz Chow Página 1 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . En 1983 apareció el IBM PC-XT, basada en un 8086, con un bus de datos de 16 bits. Esta traía como novedad un disco duro de 10 Mbytes y hasta 640Kbytes de RAM. Un año más tarde aparecería el IBM PC-AT, introduciendo el microprocesador 286, así como ranuras de expansión de 16 bits (el bus ISA de 16 bits) en contraposición con las de 8 bits del PC y el XT (bus ISA de 8 bits), además incorporaba un disco duro de 20 Mbytes y disquetes de 5¼ pero con formato de 1.2 Mbytes. En general, todos los equipos con procesador 286 o superior pueden catalogarse dentro de la categoría AT; el término XT hace referencia al 8088/8086 y similares. Es necesario notar, sin embargo que con la especificación ATX, muchas PCs modernas, deberían llamarse ATX y no AT (Esta especificación fue implementada más o menos con los últimos Pentium MMX de 233MHz y a partir de los PII). 3.1.1 Dentro de la caja de la PC Dentro de la caja de la PC original, se podía identificar en el centro, la placa base o tarjeta madre, componente esencial que provee la estructura de interconexión para los tres subsistemas y los chips de apoyo de la computadora. Además de la placa base, podemos identificar algunos periféricos internos como los discos duros que proveen almacenamiento masivo, así como las tarjetas de expansión del sistema donde se encuentran los módulos de entrada salida para una serie de funciones de soporte como el vídeo, los discos y las interfaces estándares (COM y LPT). Un speaker de audio interno, también era integrado a la unidad (no confundir con los modernos sistemas multimedia actuales). No podemos obviar finalmente, la alimentación de energía eléctrica que es provista por una fuente de poder especializada. La placa base contiene tanto el subsistema de procesamiento, como el de memoria y la parte central del sistema de entrada/salida, que es extensible mediante el bus de expansión, que en la PC original era el ISA. Haciendo un recuento rápido: El procesador Intel 8088 Un socket para el coprocesador matemático 8087 Sockets para hasta 256K de RAM Hasta 48 Kbytes de ROM del sistema Un temporizador del sistema o contador 8253-5 Un controlador programable de interrupciones 8259A Un controlador de DMA 8237-5 Un expansor de puerto paralelo PPI 8255A que se empleaba para la configuración del sistema mediante jumpers. Audio Speaker El sistema de memoria principal consistía en 16 KBytes de memoria ampliables a 64 mediante zócalos en la placa base (y a 256 añadiendo tarjetas). La configuración típica Página 2 Prof. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I permitía la instalación de hasta 4 bancos de 64KBytes formados por 9 chips de 64 Kbit. EL noveno chip implementaba el bit de paridad. En el mapa de memoria esta se localiza en la parte baja desde la 00000H-3FFFFH. La memoria principal se implementó con memoria dinámica que requerían refrescamiento cada 2ms máximo. El ciclo de refrescamiento de la RAM fue implementado por el chip de DMA (8237-5) a intervalos especificados por el timer (8253-5) cada 15.2 s. El procesador es puesto en estado de espera (wait state) durante el ciclo de refrescamiento, lo cual podía reducir un poco la productividad del 8088. Adicionalmente, se tenían hasta 48 KB de memoria ROM para software del sistema. Este ROM se implementaba en chips de 8KBytes localizados en la parte alta del mapa de memoria en el rango desde F4000H al FFFFFH. Los 40K más altos contienen código que implementa: Un intérprete de BASIC El Power on self-test (POST). Los drivers de E/S standard El cargador del sistema o puntero al arranque (bootstrap loader) Los patrones de caracteres 00000 00000 064-067 064-067 Interrupt Vectors: CPU, IRQ, DOS, BIOS Cold System Boot (ALT+CTRL+DEL) 000FF 000FF 0F0000 0F0000 ROM - BIOS (routines) 0FFFFF 0FFFFF Warm System Boot (Reset) Figura 1. Mapa simple de memoria del 8088 El almacenamiento externo se hacía inicialmente en cintas de casete, aunque pronto aparecieron las unidades de disco de 5¼ pulgadas y simple cara (160/180 Kb por disco) o doble cara (320/360 Kb). Con la XT aparece el disco duro integrado en la PC. Con la AT se amplían los formatos de disquete (720K, 1.2 M y 1.44M), apareciendo además, la unidad de 3½ y discos con capacidades de 20 MB. Prof. José Díaz Chow Página 3 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . 3.2 Arquitectura de buses. La estructura de interconexión entre los subsistemas de la PC se implementa mediante buses. Desde la PC original donde el bus del sistema podía ser accedido directamente mediante las ranuras de expansión, hasta nuestra fecha donde se ha implementado toda una jerarquía de buses. El bus del sistema o bus local permite la interconexión del procesador con la memoria y los chips de apoyo que administran el sistema de entrada-salida. Este se compone de tres conjuntos de líneas lógicas bien diferenciadas: el bus de datos, el bus de direcciones y el conjunto de líneas de control. Adicionalmente, podemos mencionar las líneas de suministro de corriente que normalmente se encuentran entre las líneas de los buses de expansión. Bus de Dirección Bus del Sistema Sistema de Memoria CPU Bus de Control Sistema de E/S CPU Memoria Entrada/Salida Bus de Dato Buses del sistema Además del bus local, mediante un controlador de bus, la PC provee un bus de expansión donde se pueden insertar tarjetas controladoras de dispositivos periféricos que permite extender las capacidades de comunicación de la PC. La PC original introdujo el bus de expansión ISA de 8 bits. La AT extendió este bus a 16 bits Bus del Sistema CPU Memoria Controlador de bus Bus de Expansión estándar (ISA, EISA o MC) Controlador de Vídeo Controlador de Disco Puerto Serie y Paralelo Slot Slot Bus de expansión el las primeras PCs Con las mejoras en la tecnología de buses introducidas por Intel en 1993 con el bus PCI, se logran mayores anchos de banda. La PC ahora establece una jerarquización de buses. Los dispositivos de alta velocidad se conectan al PCI y los de baja velocidad a un bus ISA. El PCI se conecta con el bus local facilita mediante el North bridge del chipset. Existe otro puente de interface (south bridge) que enlaza el bus PCI con el bus de periféricos ISA. Página 4 Prof. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S CPU + Cache L1 Controlador de vídeo Controladores del sistema (Chipset) Controlador de Memoria y Puente PCI "Bus" AGP C O M P U T A D O R A S I I Cache L2 Memoria Principal Bus del Sistema Bus PCI SCSI Dispositivos IDE CD DD DD DD Controlador IDE Controlador de DMA Puente PCI a ISA LAN Slot USB Bus ISA Slot Slot LPT Com 1 Disquete Super I/O Com 2 Teclado Ratón PS/2 Arquitectura de Buses de las PC modernas Prof. José Díaz Chow Página 5 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . 3.3 El entorno de procesamiento Como es más que obvio, estas máquinas se basan en un procesador de la familia x86 de Intel. Podemos decir que la familia de arquitecturas de Intel x86, tiene dos generaciones bien diferenciadas: la arquitectura de 16 bits que es la generadora de la familia y la arquitectura de 32 bits, más moderna y versátil. La familia nace con el lanzamiento del microprocesador 8086 y su primo 8088. Ambos idénticos en su arquitectura de 16 bits pero diferentes en su interfaz de bus. (el 8088 tenía una ruta de 8 bits para guardar compatibilidad con su predecesor 8080). Sorprendentemente, esta familia de procesadores que dan soporte a la IBM PC y compatibles desde su introducción en 1981 hasta hoy día, guardan compatibilidad en arquitectura hacia atrás. La tabla a continuación muestra la evolución de estos CPUs en cuanto a tamaño de registros, Memoria que es capaz de direccionar y velocidad de cómputo. Procesador Tamaño Registros [bits] 8088 80188 8086 80186 80286 80386 80486 Pentium, PRO, mmx Pentium II Pentium III Pentium IV 3.3.1 16 16 16 16 16 32 32 32 32 32 32 Ancho bus [bits] Memoria que direcciona 8 8 16 16 16 32 32 64 64 64 64 1 MB 1 MB 1 MB 1 MB 16 MB 4 GB 4 GB 4 GB 4 GB 4 GB 4 GB Velocidad [MHz] 4.71 6 4.71 6 4.7, 8, 12 25, 33 33, 66, 100 75 … 233 266 … 450 450 … 1,300 1,300 … 3,600 Organización Intel organiza el Datapath de estos microprocesadores en dos unidades lógicas: La unidad de ejecución (EU) y la Unidad de Interfaz de Bus (BIU). La EU contiene a la ALU, los registros de propósito general y punteros así como el de banderas. Algunos autores defienden que también contiene a la unidad de control. La BIU contiene los registros de control de programa (PC) y direccionamiento segmentado, la lógica de acceso al bus y una cola de instrucciones (de 2 a 8 instrucciones según CPU). Página 6 Prof. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I Figura 2. Organización básica del 8086 3.3.2 Modelo de Memoria La memoria principal a que acceden estos procesadores se compone en parte de RAM de lectura/escritura y ROM que contiene el software del sistema (Programa de configuración del sistema y la BIOS). El esquema básico de direccionamiento de la PC original, con arquitectura de 16 bits, permitía el acceso a 1MB de direcciones de memoria. Esta arquitectura estaba bastante relacionada con el sistema operativo MS-DOS que administraba las PC en esa época. La figura 2 muestra su mapa de memoria que integra 640KB de memoria RAM para ejecución de programas de usuario, denominada Memoria Convencional. El resto del 1MB, es denominada memoria alta o superior, aloja la ROM con un espacio de 64KB básicos para setup y 192KB para extensión y el BIOS. Prof. José Díaz Chow Página 7 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . Figura 3. Mapa de la memoria 8086. Un aspecto importante a considerar del sistema de memoria que manejan los 80x86 es el ordenamiento de bytes. Intel emplea para estos little endian, es decir que el byte menos significativo se almacena en la posición más baja, al inverso de cómo se ordenan a lo interno de los registros. (Big endian es al contrario: más significativo en posición más baja). La arquitectura de 16 bits implementa un modelo de memoria denominado segmentado, donde cada programa de usuario, reside en segmentos de memoria. Cada programa puede tener uno o más segmentos para datos, uno o más segmentos para código, otro para la pila y un extra segmento. La arquitectura de 32 bits, en cambio, emplea un modelo de memoria flan, donde cada programa de usuario tiene un espacio virtual de 32 GB de memoria. En el modelo de programación segmentado se emplean registros de base de segmento para llevar el control del inicio de cada segmento cargado en la memoria. Esto permite que los programas sean relocalizables. Se definen cuatro segmentos básicos: Uno para Datos, otro para Código, uno para Pila (stack) y otro extra. Los registros base para éstos son: DS, CS; SS y ES respectivamente. Las direcciones físicas de memoria de 1MB (20 bits) se obtienen mediante un modo de direccionamiento desplazado, donde el registro base del segmento se desplaza 4 posiciones a la derecha y luego se suma al valor del desplazamiento para obtener la dirección física de 20 bits. Por ejemplo, suponga que el DS tiene 045FH y el desplazamiento para el dato X es 32H, entonces, DS se desplaza 4 posiciones volviéndose su contenido 045F0H a lo que se suma el 32H para obtener 04622H. Página 8 Prof. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I Es importante recordar que el modelo de programación del 8086 es segmentado y que el modo [dirección] que podríamos considerar como “absoluto” (porque definimos directamente la dirección de memoria a la que queremos acceder) se refiere a una dirección que implícitamente está desplazada. Por ejemplo, basándonos en el caso del párrafo anterior, la instrucción MOVE AX, [0032] carga en el registro AX el valor de M(DS:32). La figura 3 muestra comparativamente la evolución de los micros de la familia Intel x86 de 16 y 32 bits respecto a sus modelos de memoria: Micros de 16bits 8086 80186 80286 Micros de 32bits 80386 486 Pentium P5 8088 Pro PII MMX (P6) PIII PIV Bus externo de 8 bits Bus de datos de 16 bits Modo Real o Segmentado Bus de datos de 32 bits Bus externo de datos de 64 Bits Modelo FLAT Figura 4. Procesadores de la familia ix86. 3.3.3 Registros del CPU y su uso Los procesadores ix86 poseen diversos registros. En dependencia de su generación, estos registros pueden ser de 16 o 32 bits. La mayoría de ellos, sin embargo, puede accederse en campos de bits de 8 y 16. Según su uso o función, los podemos clasificar en diferentes grupos: Registros de propósito general (GPRs) o de datos: Estos registros sirven para las operaciones regulares de programación, aunque intel propone una función para cada uno de ellos, como veremos más adelante. Desde su introducción y por asuntos de compatibilidad con el modo byte tan difundido en esa época, los registros de propósito general se pueden acceder en subgrupos o campos de bits de 8, 16 o 32 bits según se requiera. Si su denominación tiene como prefijo E, significa que el registro pertenece a un procesador de 32 bits y nos estamos refiriendo a todos los 32 bits del registro, Sin prefijo y con sufijo X, indica que el registro es de 16 bits o nos referimos a la porción menos significativa de 16 bits de un registro de 32. Finalmente, estos 16 bits menos significativos se pueden acceder como dos registros por separado, referenciando en uno a la parte alta Prof. José Díaz Chow Página 9 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . (sufijo H) y en el otro a la baja (sufijo L), cada una de 8 bits. Por ejemplo, el registro EAX es el acumulador de 32 bits. Sus 16 bits menos significativos se denominan AX, quien a su vez se divide en AH y AL. Los registros de propósito general de la familia son; o AX (EAX, AX, AH, AL): Acumulador. Es el registro principal, utilizado en la mayoría de operaciones binarias. Además se emplea de manera implícita en algunas instrucciones de multiplicación y división y en algunas instrucciones aritméticas especializadas, así como en ciertas operaciones de carácter específico como entrada, salida y traducción. o BX (EBX, BX, BH, BL): Registro Base. Usado como registro base para referenciar direcciones de memoria con direccionamiento indirecto, manteniendo la dirección de la base o comienzo de tablas o matrices. De esta manera, no es preciso indicar una posición de memoria fija, BX. o CX (ECX, CX, CH, CL): Contador. Se utiliza comúnmente como contador en bucles y operaciones repetitivas de manejo de cadenas. En las instrucciones de desplazamiento y rotación se utiliza como contador de 8 bits. o DX (EDX, DX, DH, DL): Datos. Este registro sirve como almacén auxiliar de datos y en conjunción con AX. Cabe mencionar que los registros AX-DX, EAX-EDX así como BX-CX, EBXECX se concatenan en algunas instrucciones específicas para obtener operandos o resultados del doble del tamaño de cada uno de ellos. REGISTROS DE PUNTEROS: o SP: Stack Pointer. Mantiene la dirección tope del elemento de pila. o BP:Base Pointer. Registro auxiliar en cálculos de la Pila. REGISTROS DE INDICE: o SI: Source Index. Utilizado como registro de índice en ciertos modos de direccionamiento indirecto, también se emplea para guardar un valor de desplazamiento en operaciones de cadenas. o DI: Destination Index. Se usa en determinados modos de direccionamiento indirecto y para almacenar un desplazamiento en operaciones con cadenas. REGISTROS DE SEGMENTO: Son aquellos registros que apuntan al inicio de un segmento. o CS: Segmento de código. o DS: Segmento de Datos. o SS: Puntero que señala el inicio de segmento de pila. Página 10 Prof. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I o ES (Extra Segment): Segmento de ampliación para zona de datos. Es extraordinariamente útil actuando en conjunción 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 DE INSTRUCCIONES: o IP: Lleva la dirección de la próxima instrucción dentro del segmento. o IR: Mantiene la instrucción en ejecución. 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 ejecución de un programa. Los bits 0, 2, 4, 6, 7 y 11 son indicadores de condición, 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 según el resultado de las operaciones. 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 OF DF IF TF SF ZF AF PF CF CF (Carry Flag): Indicador de acarreo. Su valor más habitual es lo que nos llevamos en una suma o resta. OF (Overflow Flag): Indicador de desbordamiento. Indica que el resultado de una operación no cabe en el tamaño del operando destino. ZF (Zero Flag): Indicador de resultado 0 o comparación igual. SF (Sign Flag): Indicador de resultado o comparación negativa. PF (Parity Flag): Indicador de paridad. Se activa tras algunas operaciones aritmético-lógicas para indicar que el número de bits a uno resultante es par. AF (Auxiliary Flag): Para ajuste en operaciones BCD. DF (Direction Flag): Indicador de dirección. Manipulando bloques de memoria, indica el sentido de avance (ascendente/descendente). IF (Interrupt Flag): Indicador de interrupciones: puesto a 1 están permitidas. TF (Trap Flag): Indicador de atrape (ejecución paso a paso). Prof. José Díaz Chow Página 11 A R Q U I T E C T U R A 3.3.4 D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . Modos de direccionamiento En ensamblador de la familia 80x86, tenemos los modos básicos de direccionamiento inmediato, directo de registro y directo de memoria. En este último modo es necesario especificar que dado el modelo segmentado del 8086, las variables deben ser relocalizables en cualquier segmento de memoria en que se carguen, por tanto, el directo de memoria con que trata el programador normalmente es en realidad una modo desplazado relativo al segmento de datos activo en el momento. Por ejemplo, mem8 .data db 25 .code . . . move al, mem8 En este caso, mem8 representa una variable de memoria relocalizable. Suponga que mem8 inicia a partir del byte 18 del segmento de datos, entonces mem8 equivaldría a escribir [18] y su dirección absoluta sería en realidad CS:18, es decir: CS << 4 + 18. Usted puede especificar una dirección efectivamente absoluta, si es preciso, especificando el registro de segmento a considerar de la forma Registro de Segmento: Desplazamiento, como se muestra: Move ax, ES:bx Existe también una serie de modos complejos muy poderosos. Tenemos el modo indirecto de registro: Move ax, [bx], muy utilizado. En este caso nótese que los corchetes en ensamblador ix86 se denominan especificadores de índice y representan una referencia a memoria o indirección. Tenemos también una serie de modos desplazados: base-desplazamiento, indizados, baseíndice y los base-índice con escalación. Normalmente los registros BP, BX se llaman registros base y SI y DI registros de índice. Un modo base, parte de un registro base + un desplazamiento inmediato. Un modo indizado, parte de una dirección base + un registro de índice opcional + un desplazamiento inmediato opcional. El modo base-índice parte de una dirección base + un registro de índice + un desplazamiento inmediato opcional y el modo con escalación, que está disponible solo en arquitectura de 32 bits, permite una dirección generada a partir de un registro base o general + un registro de índice que puede estar escalado, es decir multiplicado por un factor (0, 1, 2, 4 u 8) + un desplazamiento opcional. Ejemplos: Página 12 base: Indice: b-i: escalado: [bx+4], BX[4] TABLA [2], [TABLA+2], TABLA[DI] Tabla[bx][di] [BX+DI*4+2] Prof. José Díaz Chow A R Q U I T E C T U R A 3.3.5 D E M Á Q U I N A S C O M P U T A D O R A S I I El Conjunto de Instrucciones 3.3.5.1 Listado general de instrucciones: Aritméticas ADD: Suma binaria. ADC: Suma con acarreo. INC: Incremento en uno. SUB: Resta binaria. SUBB: Resta con el bit prestado. DEC: Decremento en uno. MUL: Multiplicación. IMUL: Multiplicación con signo. DIV: División entera. IDIV: División entera con signo NEG: Negación aritmética. Lógicas AND: NOT: OR: XOR: Y lógica. Negación lógica. O lógica. O Exclusiva lógica. Corrimiento de bits RCL: Rotación a izquierda con acarreo. RCR: Rotación a derecha con acarreo. ROL: Rotación a izquierda. ROR: Rotación a derecha. SAL: Corrimiento aritmético a izquierda. SAR: Corrimiento aritmético a derecha. SHL: Corrimiento lógico a izquierda. SHR: Corrimiento lógico a derecha. SHLD: Corrimiento lógico a izquierda en doble precisión. SHRD: Corrimiento lógico a derecha en doble precisión. Comparación CMP: Comparación CMPS: Comparación de cadenas de caracteres TEST: Verificación de bits BSF/BSR: Exploración de bits (32bits). BT/BTC/BTR/BTS: Prueba o test de bits (32 bits). Prof. José Díaz Chow Página 13 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . Conversión de Tipo CBW: Convierte byte a palabra. CDQ: Convierte palabra doble a cuádruiple. CWD: Convierte palabra a palabra doble. CWDE: Convierte palabra a palabra doble extendida. Conversión ASCII-BCD AAA: AAD: AAM: AAS: DAA: DAS: Ajuste ASCII después de sumar. Ajuste ASCII antes de dividir Ajuste ASCII después de multiplicar Ajuste ASCII después de restar. Ajuste decimal después de sumar. Ajuste decimal después de restar. Transferencia de datos MOV: Transfiere o copia datos enteros. MOVS: Transfiere cadenas de caracteres. MOVSX: Mueve con extensión de signo. MOVZX: Mueve con extensión de cero. LEA: Carga dirección efectiva. LDS: Carga el registro de segmento de datos. LES: Carga el registro de segmento extra. LSS: Carga el registro de segmento de pila. LODS: Carga una cadena. STOS: Almacena una cadena. XCHG: Intercambia el contenido de los operandos. XLAT: Traducción. Operaciones con la pila PUSH: Introduce un elemento a la pila. POP: Remueve un elemento de la pila. PUSHA: Introduce los GPR a la pila. POPA: Restaura los GPR desde la pila. Transferencia de Entrada-Salida IN: Lee desde un puerto E/S a un registro. OUT: Escribe a un puerto de E/S. Página 14 Prof. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I Operaciones con banderas CLC: Limpiar acarreo. CLD: Limpiar dirección. CLI: Limpiar interrupción. STC: Establece la bandera de acarreo. STD: Establece la bandera de acarreo. STI: Establece la bandera de acarreo. CMC: Complementa acarreo. LAHF: Cargar banderas en AH. SAHF: Cargar AH en banderas. PUSHF: Introduce las banderas a la pila. POPF: Restaura banderas desde la pila. Operaciones con cadenas CMPS: Compara cadenas. LODS: Carga cadena. MOVS: Mueve una cadena. REP: Repite una cadena. REPE: Repite la cadena mientras sea igual a. REPZ: Repite la cadena mientras sea cero. REPNE: Repite la cadena mientras sea igual a. REPNZ: Repite la cadena mientras sea cero. SCAS: Explora una cadena. STOS: Almacena una cadena. Operaciones de control de programa CALL: Llamada a procedimiento. RET: Regreso de procedimiento. RETN/RETF: Regreso cercano / lejano. INT: Llamada a Interrupción. IRET: Regreso de la interrupción. INTO: Interrupción de desborde. JMP: Salto incondicional. JA/JNBE: Salta si mayor / No menor o igual. JAE/JNB: Salta si mayor o igual / No es menor. JB/JNAE: Salta si es menor / No es mayor o igual. JBE/JNA: Salta si es menor o igual / No es mayor. JC/JNC: Salta si hay acarreo / No hay acarreo JCXZ: Salta si CX es cero, JE/JZ: Salta si es igual / Es cero. JG/JNLE: Salta si es mayor / No es menor o igual. JGE/JNL: Salta si es mayor o igual / No es menor. Prof. José Díaz Chow Página 15 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . JL/JNGE: Salta si es menor / No es mayor o igual. JLE/JNG: Salta si es menor o igual / No mayor. JNE/JNZ: Salta si no es igual / No es cero. JNP/JPO: Salta si no hay paridad / Paridad es par. JO/JNO: Salta si hay desbordamiento / No hay desbordamiento. JP/JPE: Salta si hay paridad / Paridad es par. JS/JNS: Salta si el signo es negativo / Es positivo. Ciclos LOOP: Repetir el ciclo. LOOPE: Repetir mientras sea igual a. LOOPZ: Repetir mientras sea cero. LOOPNE: Repetir mientras no sea igual a. LOOPNZ: Repetir mientras no sea cero. Control del procesador ESC: Escape. HLT: Introduce en estado de detención. LOCK: Bloquea el bus. NOP: No operar. WAIT: Pone el procesador en estado de espera. 3.3.5.2 Listado más detallado: En la siguiente tabla se muestran encolumnados los Mnemónicos (como MOV), los operandos (como fuente, destino) y la descripción de la operación. Los operandos son combinaciones entre tipos (registro, memoria e inmediato) con los direccionamientos admitidos en cada instrucción. Las instrucciones IN y OUT admiten un cuarto tipo de operando: puertos de I/O, con direccionamiento registro o inmediato. Instrucciones de movimientos de datos MOV destino, fuente ;la única instrucción que utiliza todos los tipos de direccionamiento XCHG destino, fuente ;Intercambia los contenidos de destino y fuente XLAT tabla_fuente ;carga el registro AL con el byte direccionado por (BX+AL) LAHF ;carga las flags S, Z, A, P y C en AH SAHF ;guarda AH en el registro de flags LDS destino,fuente ;transfiere un puntero de 32 bits al registro DS y al registro destino LES destino,fuente ;transfiere un puntero de 32 bits al registro ES y al registro destino Página 16 Prof. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I LEA destino,fuente ;transfiere el offset de fuente (una dirección) a destino (un registro) PUSH fuente ;guarda fuente en el stack (en la dirección SS:SP) POP destino ;recupera del stack (dirección SS:SP-1) y guarda en registro destino PUSHF ;almacena el registro de flags en/desde el stack POPF ;recupera el registro de flags en/desde el stack PUSHA ; almacena los reg DI,SI,BP,SP,BX,DX,CX,AX en/desde el stack POPA ;recupera los reg DI,SI,BP,SP,BX,DX,CX,AX en/desde el stack IN origen ;carga desde un puerto origen un byte o word en AL o AX OUT destino ;escribe Al o AX en el puerto destino (direccionamiento inmediato o DX) Las operaciones aritméticas ADD destino,fuente ;suma fuente + destino y guarda el resultado en destino ADC destino,fuente ;suma fuente + destino + Carry y guarda el resultado en destino SUB destino,fuente ;resta destino - fuente y guarda el resultado en destino SUB destino,fuente ;resta destino - fuente - Carry y guarda el resultado en destino MUL fuente ;multiplica AL o AX * fuente y guarda el resultado en DX:AX IMUL fuente ;igual que la anterior pero con numeros enteros con signo DIV fuente ;divide DX:AX / fuente y guarda cociente en AX y resto en DX IDIV fuente ;igual que la anterior pero con numeros enteros con signo AND destino,fuente ;opera destino AND fuente y guarda resultado en destino OR destino,fuente ;opera destino OR fuente y guarda el resultado en destino XOR destino,fuente ;opera destino XOR fuente y guarda el resultado en destino NOT destino ;el NOT cambia todos los 1 en 0 y los 0 en 1 de destino. NEG destino ;NEG realiza el complemento a 2 de destino INC destino ;Incremente en 1 el contenido de destino DEC destino ;Decrementa en 1 el contenido de destino DAA / DAS ;Efectúa el ajuste decimal en suma / resta del registro AL AAA/AAD/ AAM/AAS ;ajustan el registro AL a valor decimal desempaquetado (para aplicar en operaciones suma, resta, multiplicación y división) Instrucciones de rotación RCL destino,contador ;rota destino a través de carry a la izquierda contador veces RCR destino,contador ;rota destino a través de carry a la derecha contador veces ROL destino,contador ;rota destino a la izquierda contador veces ROR destino,contador ;rota destino a la derecha contador veces Prof. José Díaz Chow Página 17 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . SAL destino,contador ;desplaza destino a la izquierda contador veces y rellena con ceros SAR destino,contador ;desplaza destino a la derecha contador veces y rellena con bit SF SHR destino,contador ;desplaza destino a la derecha contador veces y rellena con ceros Instrucciones de comparación CMP destino,fuente ;compara fuente y destino. Modifica las flags V, Z, S, C, P y AC TEST destino,fuente ;AND entre fuente y destino . Ninguno de los operandos cambia. TEST modifica las mismas flags que CMP pero siempre deja a V = 0 y C = 0. Instrucciones de strings CMPS string_destino,string_fuente ;compara las dos cadenas de a bytes o words CMPSB string_destino,string_fuente ;origen y destino indicados por DS:SI y ES:DI (bytes) CMPSW string_destino,string_fuente ;origen y destino indicados por DS:SI y ES:DI (words) LODS string_fuente ;mueve un byte o una word desde fuente a AL o AX LODSB string_fuente ;origen indicado por DS:SI (mueve un byte a AL) LODSW string_fuente ;origen indicado por DS:SI (mueve una word a AX) STOS string_destino ;mueve un byte o una word al destino desde AL o AX STOSB string_destino ;destino indicado por ES:DI (mueve AL a un byte) STOSW string_destino ;destino indicado por ES:DI (mueve AX a una word) MOVS string_destino,string_fuente ;mueve un byte o word de fuente a destino MOVSB string_destino,string_fuente ;origen y destino indicados por DS:SI y ES:DI (un byte) MOVSW string_destino,string_fuente ;origen y destino indicados por DS:SI y ES:DI (una word) SCAS string_destino ;compara la cadena de destino con AL o AX SCASB string_destino ;destino indicado por ES:DI (compara AL con un byte) SCASW string_destino ;destino indicado por ES:DI (compara AX con una word) En todos los casos, si se utiliza el prefijo REP, la cantidad de elementos de la cadena a operar está dada por el contenido del registro CX, si no es un solo elemento de la cadena. A cada operación, CX es decrementado y SI y DI son incrementados o decrementados de acuerdo con el estado de la flag de dirección (Si D=0, se incrementan). El incremento o decremento de estos registros se hace de a uno si son operaciones de bytes o de a dos si son de a words. Para los casos en que se especifica el largo del operando con la B o W final, la string_destino está apuntada por ES:DI, la string_fuente está apuntada por DS:SI . Página 18 Prof. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I Instrucciones de repetición LOOP offset ;decrementa CX. Si CX no es cero, salta a offset (IP = IP + offset) LOOPZ offset ;decrementa CX, Si CX <> 0 y Z = 1 , salta a offset (IP = IP + offset) LOOPNZ offset ;decrementa CX, Si CX <> 0 y Z = 0 , salta a offset (IP = IP + offset) * Ver además el grupo REP en instrucciones de cadenas Instrucciones de salto CALL destino ;llama a procedimiento. IP <-- offset de destino y CS <-- segmento de destino RET valor ;retorna desde un procedimiento (el inverso de CALL), valor es opcional INT número ;llamado a interrupción. CS:IP <-- vector de INT.Las flags se guardan en el stack INTO ;llama a la INT 4 si la flag de overflow (V) está en 1 cuando se ejecuta la instrucción IRET ;retorna de interrupción al programa restaurando flags JMP dirección ;Salta incondicionalmente al lugar indicado por dirección JA offset ;salta a IP + offset si las flags C=0 Y Z=0 (salta si primer operando es mayor) JAE offset ;salta a IP + offset si la flag C=0 (salta si primer operando es mayor o igual) JB offset ;salta a IP + offset si las flags C=1 (salta si primer operando es menor)(igual a JC) JBE offset ;salta a IP + offset si las flags C=1 o Z=1 (salta si primer operando es menor o igual) JZ offset ;salta a IP + offset si las flags Z=1 (salta si primer operando es igual al segundo)(=JE) JG offset ;salta a IP + offset si las flags S=V Y Z=0 (salta si primer operando es mayor) JGE offset ;salta a IP + offset si las flags S=V (salta si primer operando es mayor o igual) JL offset ;salta a IP + offset si las flags S<>V (salta si primer operando es menor) JLE offset ;salta a IP + offset si las flags S<>V o Z=1(salta si primer operando es menor o igual) JNC offset ;salta a IP + offset si la flag C=0 (salta si no hay carry) JNZ offset ;salta a IP + offset si la flag Z=0 (salta si no son iguales o no es cero) JNO offset ;salta a IP + offset si la flag V=0 (salta si no hay overflow) JNP offset ;salta a IP + offset si la flag P=0 (salta si no hay paridad -o la paridad es impar =JPO) JNS offset ;salta a IP + offset si la flag S=0 (salta si no hay hay bit de signo) JO offset ;salta a IP + offset si la flag V=1 (salta si hay desbordamiento -overflow) JP offset ;salta a IP + offset si la flag P=1 (salta si la paridad es par ) (=JPE) JS offset ;salta a IP + offset si la flag S=1 (salta si el signo es negativo) JCXZ offset ;salta a IP + offset si la flag CX=0 (salta si el registro CX es cero) Prof. José Díaz Chow Página 19 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . Las instrucciones de saltos por Above o Below se refieren entre dos valores sin signo (JA, JAE, JB y JBE), mientras que las Greater y Less se refieren a la relación entre dos valores con signo (JG, JGE, JL y JLE). Instrucciones que afectan flags CLC/CMC/STC ;pone a cero / complementa / pone en 1 la flag C (carry) CLD/STD ;pone a cero / uno la flag de dirección (D=0 hace que SI y DI se incrementen) CLI/STI ;deshabilita / habilita las interrupciones por hardware enmascarables Instrucciones misceláneas NOP ;no-operación: el procesador pasa a la instrucción siguiente sin hacer nada CBW ;convierte el byte de AL en palabra (AX), copiando el bit 7 a todo el registro AH CWD ;convierte word en double-word, copiando bit 15 de AX a todo el registro DX HLT ;el procesador se detiene hasta que llegue un Reset o una interrupción por hard. 3.3.6 Los servicios de la ROM BIOS Uno de los recursos más valiosos que asiste al programador de ensamblador de la PC son los servicios de la ROM BIOS. Estos servicios se refieren a una serie de rutinas de entrada salida (Basic Input Output Services) que se encuentran almacenadas en la memoria ROM del sistema. Estas rutinas permiten acceder y programar el hardware básico de la PC. Todos los servicios de la BIOS se invocan mediante interrupciones. Estos servicios pueden agruparse en cinco temas de acuerdo al objetivo. Cada tema contiene una serie de servicios organizados en torno a la estructura hardware o función que soportan, empleando una interrupción diferente para cada grupo de servicios, según muestra la tabla: Interrupción Hex Dec 10H 13H 14H 15H 16H 17H 16 19 20 21 22 23 11H 12H 17 18 Página 20 Uso Servicios de dispositivos periféricos Servicios de video Servicios de disco Servicios de comunicaciones seriales Servicios del sistema Servicios del teclado Servicios de impresión Servicios de estado del equipo Listado de equipamiento del sistema Tamaño de memoria Servicios de fecha y tiempo Prof. José Díaz Chow A R Q U I T E C T U R A 1AH 26 5H 5 18H 19H 24 25 D E M Á Q U I N A S C O M P U T A D O R A S I I Servicios de hora y fecha Servicio de impresión de pantalla Impresión de la pantalla Servicios especiales Activar la ROM Basic Activar rutina de arranque Llamadas al sistema operativo DOS: INT 21H Aunque el DOS reserva para su uso muchas interrupciones (desde la 20H hasta la 3FH), normalmente los servicios del sistema los proporciona a través de solo cinco de ellas: 20H, 21H, 25H, 26H y 27H. Interrupción Hex Dec 20H 32 21H 33 25H 37 26H 38 27H 39 Descripción Terminación de programa Servicios generales del DOS Lectura absoluta de disco Escritura absoluta en disco Terminar y quedar residente Para efectos de este curso nos centraremos en los servicios generales o interrupción 21H. La interrupción 21h, provee una serie de funciones. Para invocar a un servicio del DOS mediante la interrupción 21H, se establece el número de función en AH y el parámetro en AL. Por ejemplo: Mov Mov Int ah, 4CH al, 0 21H ; Función regresar al DOS ; Valor de retorno = 0, normal. ; Llama al DOS. ax, 4C00H 21H ; Función regresar al DOS normalmente. ; Llama al DOS. Equivale a: Mov Int Un programa en lenguaje ensamblador está compuesto por una secuencia de sentencias. Estas sentencias representan tanto instrucciones del procesador como directivas o comandos al ensamblador. 3.3.7 El lenguaje ensamblador. El lenguaje ensamblador permite al programador a bajo nivel escribir código directamente interpretable por el CPU sin necesidad de conocer exactamente el lenguaje Prof. José Díaz Chow Página 21 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . de máquina. Un programa en ensamblador se compone por una secuencia de sentencias ensamblador. Una sentencia en ensamblador se estructura de la siguiente forma: [[nombre:]] [[operacion]] [[operandos]] [[;comentario]] Donde nombre: es un identificador de etiqueta de código, que es una referencia simbólica a la dirección de la instrucción y a la instrucción misma. El componente opcional operacion representa una instrucción del procesador o una directiva o comando del ensamblador. Los operandos representan los operandos de las instrucciones o parámetros de las directivas y finalmente, un comentario es una facilidad para documentar la sentencia e inicia con un punto y coma (;) y termina al final de la línea. Un identificador es un nombre que se asigna a una definición a fin de poder referirse a ella de forma única. Usamos identificadores para nombrar constantes, variables, procedimientos, segmentos, tipos de datos definidos por el usuario y etiquetas de código. Los identificadores pueden tener una longitud máxima de 247 caracteres. No pueden comenzar con un dígito y no pueden usarse como nombres las palabras reservadas. Aunque pueden usarse algunos caracteres especiales (como _ y $) es mejor evitarlos si no se requieren. Los operandos pueden expresarse en diferentes modos de direccionamiento, por ejemplo de forma inmediata o mediante el uso de contenedores (operandos en registros o en memoria). Existen diferentes tipos de datos, esncialmente Enteros. Por defecto estos tipos son: BYTE (8 bits), WORD (16 bits), DWORD (32 bits), QWORD (64 bits) y TBYTE (80 bits). Mediante la directiva Dx podemos definir variables de memoria de un tipo de datos x, donde x ( Mem8 db ? ; Define la variable tipo byte sin inicialización). Se puede tratar secuencias de unidades de datos del mismo tipo como arreglos. Por ejemplo, se pueden tratar secuencias de bytes como cadenas. Página 22 Prof. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I 3.4 Los Chips de Apoyo 3.4.1 El temporizador del sistema 8253-5 El temporizador del sistema 8253-5 implementa las funciones de base de tiempo requeridas por la computadora para marcar el inicio del ciclo de refrescamiento de la memoria RAM y el contador de tiempo real de la máquina. El chip en realidad contiene 3 temporizadores internos accedidos mediante canales, cada uno con una función específica: 3.4.2 Canal 0: Provee soporte para implementar el reloj de tiempo real, interrumpe al CPU cada 55ms. Canal 1: Apoya los ciclos de DMA. Está programado para solicitar una transferencia DMA cada 15.2 s. El DMA responde con un ciclo de refrescamiento de memoria. Canal 2: Soporte a la interfaz del disquete y el speaker de audio.Se puede usar para grabar tonos en una tape o activar el speaker para implementar alarmas auditivas, música rudimentaria y otros sonidos. Note que a partir de la PC XT, se suprimió el soporte a disquete. El controlador de DMA El controlador de DMA permite mejorar la velocidad de transferencia de datos desde los dispositivos de almacenamiento masivo hacia la memoria. Las transferencias por DMA en la PC original son al menos 4 veces más rápidas que las dirigidas por programas. El 8237-5 que se empleó en la PC original, tenía las siguientes características: Cuatro canales de DMA independientes Registros de direcciones y conteo de 16 bits Cuatro tipos de transferencia: MM, MIO, IOIO e IOM. Esquema de prioridades programable Condiciones de sincronización y terminación programables. En la IBM PC, sin embargo, se limitaba la flexibilidad del chip por cuanto las transferencias requerían ser entre M e IO. Además, dado que los registros de direcciones eran de 16 bits y no de 20, se requerían tres registros de 4 bits para completar las direcciones de 20 bits del 8086. Estos registros se denominaron de ‘página’. Un efecto limitante de esta característica fue que las trasferencias no se podían realizar entre fronteras de página que eran de 64KBytes cada una. Finalmente, en la PC el DMA Chip se programó en el modo de ‘transferencia simple’ que obliga al controlador a liberar el bus del sistema después de cada transferencia, limitando la tasa de frecuencia máxima soportada a 422 kHz. Prof. José Díaz Chow Página 23 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . Los canales del DMA en la IBM PC daban soporte a las siguientes tareas: Canal 0: Ciclos de refrescamiento de memoria. Canal 1: No usado. Canal 2: Soporte al disquete. Canal 3: Soporte al disco duro. La prioridad de cada canal es inversa a su identificación (Canal 0 es el de máxima prioridad). 3.4.3 El Controlador programable de Interrupciones (PIC) El soporte a las interrupciones de la PC está dado por el 8086 a través de dos líneas de control: NMI e INTR. El pin NMI es disparado por flanco y normalmente se usa para notificar situaciones severas como fallo de memoria o de energía. INTR se emplea para las interrupciones del hardware regulares. Las interrupciones regulares pueden ser enmascaradas, es decir, deshabilitadas mediante el apagado de la bandera de interrupciones (instrucción CLI) y habilitadas encendiendo dicha bandera (STI). En la IBM PC, existen 3 fuentes para NMI: Error de paridad de Memoria, Error de paridad del canal de E/S y la interrupción del 8087. Para lidiar con las múltiples fuentes de INTR, se emplea el Controlador programable de interrupciones (PIC) en la PC. El 8259A es un chip que permite controlar por esquema de prioridades hasta 8 líneas de solicitud de interrupciones. En las PC AT ya se brinda soporte a 16 interrupciones mediante la característica de conexión en cascada del PIC. En la IBM PC, la IRQ 0 estaba asignada al reloj de tiempo real, la 1 al teclado, la 3 y 4 a los puertos de comunicación; la 5 al disco duro, la 6 al disquete y la 7 a la impresora. Nuevamente la mayor prioridad se aplica al IRQ de identificador menor. Bus de Direcciones/Datos/Control de la CPU INTA* INTA* INT Esclavo 8259A Control IRQ8 IRQ10 IRQ12 IRQ14 IRQ9 IRQ11 IRQ13 IRQ15 INT Master 8259A IRQ0 IRQ2 IRQ4 IRQ6 IRQ1 IRQ3 IRQ5 IRQ7 Bus ISA (AT) Organización de dos PIC en cascada en el sistema PC AT Página 24 Prof. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I 3.5 La entrada y salida estándar. 3.5.1 El video de la PC El video en la PC se obtiene gracias a un adaptador gráfico que genera las señales de video y un monitor que las presenta en una pantalla. Existen básicamente dos modos generales de video en la PC: el Modo carácter o texto y el modo gráfico. En el contexto de este curso, solamente consideraremos el modo texto, a las funciones más básicas y simples de video. 3.5.1.1 La pantalla La pantalla de la PC en modo texto representa una matriz de caracteres organizados en filas y columnas. El modo de video de texto más conocido es el de 25 filas por 80 columnas. El primer carácter en la esquina superior izquierda de la pantalla tiene la posición fila 0, columna 0 (0,0). El carácter en la esquina inferior izquierda tiene la posición (24,0). El de la esquina superior derecha (0,79) y el de la inferior derecha es la (24, 79). La pantalla del monitor puede presentar los datos que se escriben en un buffer de video que es un área de memoria a la que tiene acceso el programador. Esta área de memoria de video está organizada en páginas, de la cual solo una se muestra a la vez. Esto que permite escribir varias pantallas de video directamente en memoria y luego intercambiar entre ellas para hacer cambios rápidos de contenido en la pantalla. Cada carácter pintado en la pantalla se representa por dos bytes en la memoria. Uno almacena los atributos de visualización y el otro el código ASCII del carácter. Los atributos pueden ser: Color de frente, color de fondo, intensidad y parpadeo. 3.5.1.2 Procesamiento básico de pantalla En este curso abordaremos brevemente las funciones más básicas de procesamiento en pantalla proporcionadas por algunas funciones de la interrupción 10H de la BIOS: Limpiar la pantalla, posicionar el cursor, pintar un carácter con y sin atributo. Finalmente estudiaremos como escribir una cadena completa mediante el servico 09H de la interrupción de servicios del sistema del DOS, int 21H. Prof. José Díaz Chow Página 25 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . En términos generales, la Int 10H espera que la función a ejecutar se escriba en el registro AH y en AL los parámetros básicos. Si la cantidad de parámetros crece, emplea los otros registros generales para completarlos. Por ejemplo, BH y BL sirven regularmente para definir ya sea atributo en modo texto o el número de la página de video a afectar. CX y DX para coordenadas de la ventana (CH, CL: Fila, Columna de la esquina superior izquierda; DH, DL: Fila, Columna de la esquina inferior derecha). Borrar la pantalla La función 6H de la int 10H permite definir una ventana rectangular y deslizar su contenido. Esto puede emplearse para borrar la pantalla. El siguiente código limpia la pantalla completa: Mov Mov Mov Mov Mov Int ah, al, bh, cx, dx, 10H 06h 00h 07h 0000h 184fh ;Selecciona función ; Limpiar toda la ventana seleccionada ; Blanco sobre negro. ; Esquina Sup. Izq: (0,0) ; Esquina Inf. Der: (24,79) Posicionar el cursor La función 02h de la Int 10H del BIOS permite posicionar el cursor en la pantalla. Según lo acostumbrado de escribe en AH la función (Ah2h). En BH se escribe el número de página (por defecto 0), y en DH, DL, la Fila, Columna de la posición a establecer para el cursor. Mov Mov Mov Mov Int ah, bh, dh, dl, 10H 02h 00h 05 12 ; Selecciona función ; Página por defecto. ; Posiciona el cursor en ; la posición (5,12) Escribir un carácter en la posición actual del cursor La función 09h de la Int 10H del BIOS permite escribir (y repetir) un carácter con un atributo determinado en la posicionar actual del cursor en la pantalla. La función 0Ah hace lo mismo pero sin considerar atributo (el carácter se escribe con el atributo actual). Como siempre, en AH se escribe la función (Ah09h | 0Ah). En Al se pone el carácter a escribir. En BL se escribe el atributo de video y en CX, la cantidad de veces a escribir el carácter en pantalla. Mov Mov Mov Mov Int Página 26 ah, al, bl, cx, 10H 09h ‘A’ 14h 01 ; ; ; ; Selecciona función escribe con atributo Escribir una A Atributo de color rojo sobre azul. Solo pintarla 1 vez Prof. José Díaz Chow A R Q U I T E C T U R A Mov Mov Mov Int ah, 0ah al, ‘A’ cx, 01 10H D E M Á Q U I N A S C O M P U T A D O R A S I I ; Selecciona función escribe sin atributo ; Escribir una A ; Solo pintarla 1 vez Despliegue de cadenas en pantalla con función del DOS La función 09h de la Int 21H del DOS permite desplegar una cadena completa. Esta cadena debe estar delimitada por el “guardián” del DOS, el carácter ´$´. Similar a las interrupciones del BIOS, la Int 21H requiere recibir la función en AH. La dirección de la cadena a desplegar se requiere en DX: .data Saludo db “Hola amigos,”, 01H, ‘$’ .code . . . Mov lea Int 3.5.2 ah, 09h dx, Saludo 21H ; Selecciona función de despliegue del DOS ; Dirección de inicio de la cadena La entrada estándar de la PC En la IBM PC y compatibles, se ha definido el teclado como el dispositivo de entrada estándar. El teclado es un dispositivo que presenta un conjunto de teclas en una disposición estándar. Cuando el usuario presiona una tecla, en realidad cierra un circuito al unir el contacto en la intersección de la fila y columna correspondiente a la tecla. Estas señales alimentan un codificador que genera un código de exploración del teclado en función de la posición de la tecla en la matriz. Por ejemplo, la tecla ESC que se encuentra en la esquina superior izquierda del teclado corresponde al código de exploración 1, F1 que le sigue es 2, y así en lo sucesivo. Además de generarse el código de exploración, el controlador del teclado, genera una interrupción de hardware. La BIOS trata esta interrupción llevando al Buffer del teclado el carácter correspondiente a la tecla pulsada pero ya en código ASCII. Por ejemplo, el ESC sería un 27. 3.5.2.1 Procesamiento básico de teclado En el contexto de este curso, exploraremos algunas de las funciones más básicas de teclado, empleando la interrupción 16H de la BIOS y el servicio 0AH del DOS. Prof. José Díaz Chow Página 27 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . Leer el siguiente carácter del teclado La función 00H de la Int 16H del BIOS, permiten esperar y leer el próximo carácter desde el teclado. Si no hay un carácter en el buffer, la función se queda esperando indefinidamente por la pulsación de un carácter. El carácter leído queda en AL. Cabe mencionar que si se pulsó un carácter especial, como las teclas de función, se generan dos bytes, el primero es un 0 y el segundo es la definición de la tecla. El siguiente código lee el próximo carácter del teclado: Mov Int ah, 00h 16H ; Selecciona función de lectura al, 27 ; Se tecleó ESC? . . . Cmp Comprobar si existe un carácter en el buffer del teclado Frecuentemente, no queremos esperar a que presionen un carácter sino, que queremos monitorear si se hizo de forma transparente. Esto nos lo permite la función 01h de la Int 16H del BIOS. Si se encontraba un carácter en el buffer, la función establece la bandera Z a 1 y retorna en AL el carácter en el buffer, pero no lo retira de allí. Habría que invocar la función 00h para hacerlo. El siguiente código muestra el uso de la función: leerCar: Mov Int jz Jmp HayCaracter : Mov Int ah, 01h 16H HayCaracter leerCar ; Selecciona función verificar ; Invoca a función ; Página por defecto. ah, 00h 16H ; Selecciona función leer ; lee el carácter en AL Leer una cadena completa desde el teclado El DOS nos provee una importante función o servicio que permite leer toda una cadena desde el teclado, poniendo a disposición nuestra todas las teclas de edición además (BackSpace, Delete, etc). Requiere la definición de un espacio de memoria en el área de datos donde especificar parámetros de la función y guardar la cadena leída. El ejemplo a continuación lee una cadena de un máximo de 20 caracteres desde el teclado. .data Página 28 Prof. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I ; Definición de la lista de parámetros ParLeer Label MaxLon db LonReal db Cadena db Byte 20 ? 20 dup(‘ ‘) .code mov ah, 0ah lea dx, ParLeer int 21h 3.5.3 ; Solicita función de lectura ; provee la dirección de la lista de par ; invoca al DOS Las interfaces estándares de la PC En la IBM PC original, las interfaces estándares que se definieron son la serie o de comunicaciones y la interfaz paralelo o de impresora. Con el desarrrollo de la tecnología y la expansión del uso de las computadoras en diversas áreas del conocimiento, se identificó el potencial y flexibilidad de tener estas interfaces que hacían innecesario a los productores de aplicaciones hardware nuevas, tener que desarrollar un módulo controlador de entrada salida en forma de una tarjeta de expansión. Sin embargo tales interfaces tienen ciertos limitantes debido a que su diseño original fue destinado a una aplicación en específico. Además, su velocidad de transferencia estaba limitada por la tecnología empleada. Con el objetivo de mejorar el soporte a aplicaciones varias mediante estas interfaces, en la PC se han ido introduciendo mejoras que mantienen la compatibilidad hacia atrás. Finalmente, el estándar USB, introducido primeramente en las computadoras Apple, fue acogido por los fabricantes de PC. Hoy día IBM basa su estrategia de conectividad con periféricos en USB. Los puertos seriales envían y reciben un bit de dato a la vez sobre una única línea de comunicación, por tanto toma al menos ocho pulsos o tiempos de bits transferir cada byte de dato sobre esta vía. Estas interfaces permite comunicación full-duplex con solamente tres líneas separadas, una para enviar, una para recibir y una señal común a tierra. La interfaz serial de la PC sigue el estándar RS-232-C de la EIA. Los puertos paralelos envían y reciben ocho bits de datos a la vez sobre ocho líneas separadas. Esto permite a los datos ser transferidos rápidamente, sin embargo, el cable requerido es más grueso debido al número de líneas individuales que debe contener. Los puertos paralelos son típicamente utilizados para conectar una PC a una impresora, sin embargo se han desarrollado una serie de aplicaciones que le permiten extender las tareas que este puerto ha realizado en la PC. Prof. José Díaz Chow Página 29 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . 3.6 El subsistema de almacenamiento. El subsistema de almacenamiento masivo o secundario nos provee de gran cantidad de espacio de almacenamiento, por lo general, permanente. Aunque por función este es identificable como parte de la memoria, por estructura, corresponde al sistema de entrada / salida por cuanto se implementa mediante dispositivos periféricos como discos magnéticos u ópticos o dispositivos de cintas. El acceso a la memoria principal es mediante palabras, sin embargo, al sistema de almacenamiento no podemos acceder de esa forma tan fina porque los tiempos de acceso son bastante menores que a la memoria principal y la cantidad de datos bastante mayores. Por tanto, el acceso al almacenamiento se organiza por bloques de bytes. Los discos magnéticos, que constituirán nuestro caso de estudio en este curso, organizan su espacio en base a la geometría del disco y se accede al mismo mediante ‘sectores’ que son normalmente, bloques de 512 bytes. Como estos bloques de datos se almacenan de manera permanente, es necesario implementar un mecanismo para poder acceder a ellos cuando se requiera. Para esto se implementó el concepto de archivo que permite tener una serie de bytes de información relacionada en una sola entidad de acceso al disco. Para la manipulación y administración de los archivos en una computadora se implementó el sistema de archivos. En este Curso nos centraremos en el sistema de archivos del MS-DOS, que a pesar de ser rudimentario, tiene todos los elementos necesarios para nuestro estudio. 3.6.1 La geometría del Disco El disco se organiza tanto lógicamente como en su formato físico en pistas y sectores. Una pista es un anillo de datos en la superficie del disco, concéntrico a su eje o centro. Las pistas se encuentran numeradas a partir del 00, la más externa. Un sector es un sector circular sobre tal pista. Los disquetes pueden tener una o dos caras en cambio en los discos duros, que en realidad se componen internamente por más de un disco, se contabilizan las cabezas lectoras (que equivale a la cantidad de caras en las que se escribe datos). Dado que el conjunto de pistas de todas las caras de todos los discos internos de un disco duro se acceden a la vez, se incide sobre una estructura tridimensional de datos, por lo cual, en estos discos no se denomina pista este elemento de la geometría, sino cilindro. Dado que los tamaños de los sectores se han estandarizado (normalmente a 512 bytes), es posible determinar el tamaño de un disco en base a su geometría o la geometría de su formato. Por ejemplo, un disquete de 720 Kb tiene la siguiente geometría: 2 caras * 80 pistas * 9 sectores/pista * 512 bytes/sector = 720 KBytes Página 30 Prof. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S Head 0 I I Head 2 Geometría y estructura de un disco duro Track Sec to r Geometría de un disquete 3.6.2 Estructura lógica del disco según DOS El MS-DOS, estructura el disco de manera lógica para dar soporte a su sistema de archivos. Primero, establece un número de sector lógico en vez de emplear la dirección física del sector (cabeza o lado, pista o cilindro, sector). El número lógico del sector se forma mediante un procedimiento simple: primero los sectores de la pista 0 de la cara 0, Prof. José Díaz Chow Página 31 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . luego secuencialmente a partir de allí, los de la pista 0 lado 1 y en lo sucesivo para todos los lados o cabezas. Segundo, para facilitar el acceso a los archivos, establece unidades de asignación o clusters. Tercero, define dos áreas en el disco: el área del sistema y el área de datos de usuario. En el área del sistema se encuentran estructuras de datos especiales que permiten el trabajo del sistema de archivo: Boot record, FATs y Directorio. Area de datos del usuario. Contiene los datos agropados en archivos Directorio Raiz. Contiene entradas describiendo archivos, volumen, nombres y subdirectorios. Primer sector del disco Boot area Jump Code Vendor Identification BIOS Parameter Block Segunda FAT Boot Code Primera FAT (File Allocation Table) contiene informatción de todos los clusters del area de datos de usuario Áreas lógicas del disco definidas por DOS Vamos a ejemplificar la ubicación física de estas estructuras con un caso de estudio simple: el disquete de 360K: Página 32 Side 0 Pista 0 Sector 1 Sector 2 Sector 3 Sector 4 Sector 5 Sector 6-9 Boot Record (sector de arranque) FAT 1 s1 (copia uno de la FAT) FAT 1 s2 FAT 2 s1 FAT 2 s2 Directorio Side 1 Pista 0 Sector 1…3 Directorio Prof. José Díaz Chow A R Q U I T E C T U R A 3.6.3 D E M Á Q U I N A S C O M P U T A D O R A S I I El sistema de archivos de DOS El MS-DOS establece un sistema de archivos, que en general se denomina FAT. La implementación de FAT requiere de dos estructuras de datos: El Directorio, donde se almacena una entrada por cada archivo en el disco y la FAT que implementa una lista enlazada con los clusters de datos que pertenecen al mismo cada archivo. Parte de la información en el directorio es el cluster de inicio, que nos permite referirnos de manera única a una entrada de la FAT, por cuanto esta tiene una entrada por cada cluster en el disco. Para darle flexibilidad al sistema de achivos, el directorio acepta entradas especiales que son a su vez directorios, permitiendo así toda una jerarquía de directorios con subdirectorios en una unidad o volumen de disco. La siguiente tabla muestra la estructura del Directorio raíz de un disquete: OFFSET Tamaño 0 8 8 3 Nombre ext 11 12 22 24 1 10 2 2 atributos …….. hora de creación / actualización Fecha de creación / actualizacion 26 28 2 4 cluster tamaño La FAT es una tabla que contiene información del siguiente cluster de datos del archivo. Existen tres versiones de FAT: FAT12, FAT16 y FAT32. Cada una indica la cantidad de bits que componen la entrada. Nótese particularmente la dificultad que encierra manipular FAT12, que es la que se implementa en los disquetes. Para acceder a una entrada de la FAT12 se requiere acceder solo 3 nibbles. Las implementaciones de esta han optado por multiplicar por 1.5 el número de cluster a acceder, eliminar el nibble sobrante y leer la parte correpondiente de la entrada. Hay que recordar además que la memoria esta organizada en little endian. Para acceder a los datos de un archivo, primero se localiza su entrada en el árbol de directorios. Ahora se obtiene la información del cluster inicial y se puede obtener los datos del primer bloque del disco. Acto seguido, de debe acceder a la entrada correspondiente al cluster en la FAT. Si el contenido de la entrada es el indicador de Prof. José Díaz Chow Página 33 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . Ultimo cluster (FFF, FFFF o FFFFFFFF, respectivamente), hemos completado nuestra tarea, sino, la entrada de la FAT leída tiene el número del siguiente cluster del archivo. Se trae ese cluster con el siguiente bloque de datos y luego se vuelve a consultar la FAT y así en lo sucesivo hasta dar con el último cluster del archivo. En el ejemplo a continuación, el directorio muestra que el primer cluster del Archivos es 6, con esta información nos referimos a la FAT y vemos que la entrada 6 nos indica que el siguiente cluster es el 7 y así al acceder el cluster 7, obtenemos el último cluster del archivo, indicado por el marcador FFF en la FAT12. Root Directory ArchivoX Cluster= 6 Cluster 2 0 3 0 4 5 5 FFFH 6 7 7 FFFH 8 0 Nótese que las entradas desocupadas de la FAT tienen valor 0. Note también que todo el procedimiento implementa en la FAT una lista enlazada, según se representa abajo: ArchivoX 6 7 0FFH X ≡ El código a continuación permite acceder a la entrada de la FAT12 . Requiere que en AX se haya escrito el número de cluster o entrada FAT a leer. Requisto: AX N° de cluster, FAT cargada en ES:00 GetFatEntry G1: GetFatEntry Página 34 Proc push si ; guardar el valor para restaurarlo push cx mov si, ax ; si N° de cluster shl si, 1 ; si N° de cluster * 2 add si, ax ; si N° de cluster * 3 shr si, 1 ; si N° de cluster * 3/2 = N° de cluster * 1.5 mov ax, es: [bx + si] ; lee dos bytes jnc G1 ; Shr puso en carry el lsb. Si NC, entonces es par mov cl, 4 ; Si impar, desplazar 4 posiciones a la derecha shr ax, cl and ax, 0FFH ; Si par, eliminar nibble más significativo pop cx pop si EndP Prof. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I 0 1 Entrada de FAT o cluster 20 (bytes 30 y 31) . . . 30 M1 L1 31 L2 H1 32 H2 M2 n L2 H1 M1 L1 H2 M2 L2 H1 Entrada de FAT o cluster 21 (bytes 31 y 32) Estructuración de la FAT12 Para acceder a los cluster en el disco, es importante saber la dirección física de los sectores del mismo si deseamos acceder mediante las funciones de la interrupción 13H de la BIOS o conocer el sector lógico para acceder mediante las interrupciones 25H y 26H del DOS. La INT 13H del Bios, accede sector por sector: Funciones: 02H – leer 03H – escribir 04H – verificar 05H – formatear pista 01H – estado del disco Int 25H: Lee un sector del disco Int 26H: Escribe en un sector al disco AL: drive (al que se desea acceder): 0=A Prof. José Díaz Chow Página 35 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . CX: cantidad de sectores DX: sector inicial DS: BX: memoria destino (buffer) 3.6.4 Acceso a archivos Sistema de archivo del DOS permite el acceso a los archivos mediante dos técnicas diferentes: El bloque de control de archivos (FCB) que permite tratar los archivos como secuencias de registros, y el método de cadena ASCIIZ. En esta última se define el path del archivo a abrir o crear. El método de FCB no será tema de nuestro estudio porque implica una serie de limitaciones en el manejo de los mismos. Estudiaremos el método ASCIIZ. Para abrir o crear un archivo con esta técnica se provee el path del archivo a la función del DOS 3CH (crear) o 3D (abrir). Esta retorna un andel o manejador del archivo en ax. Con este handle se puede manipular el archivo con las adecuadas funciones del DOS: 3FH (leer) y 40H (escribir), todas de la INT 21H. Es importante anotar que DOS define una serie de manejadores o handles de archivos predefinidos que siempre están abiertos: 0: entrada estándar 1: salida estándar 2: error 3: dispositivo auxiliar 4: impresora LPT 3.6.4.1 Ejemplo1: Crear y escribir en archivo. El ejemplo a continuación solicita nombres y crea con ellos un archivo de texto con el nombre NameFile.txt en el directorio donde se ejecuta la aplicación. .model small .Stack 64 ;------------------------------------------------------------.Data NamePar MaxLen NameLen NameRec ErrCode Handle FilePath Pregunta Página 36 Label db db db db dw db db Byte 30 ? 30 dup(' '), 0dh, 0ah 00 ? 'NameFile.txt', 0 'Siguiente Nombre? : ' ; ; ; ; ; ; Inicia lista longitud máxima longitud real Nombre ingresado Indicador de error Manejador del archivo Prof. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I Row db 01 Omsg db 'Error de apertura', 0dh, 0ah Wmsg db 'Error de escritura', 0dh, 0ah ;------------------------------------------------------------.Code ; Programa Principal Inicio Proc Far mov ax, @data mov ds, ax mov es, ax mov ax, 0600h Call ClrScr Call SetCursor Call Createfile Cmp ErrCode, 00 jz Seguir jmp Finalizar Seguir: Call GetName cmp NameLen, 00 jne Seguir Call CloseFile Finalizar: mov ax, 4c00h int 21h Inicio Endp ;------------------------------------------------------------Createfile CreateError: Createfile ; Crear el archivo Proc Near mov ah, 3ch mov cx, 00 lea dx, FilePath int 21h jc CreateError mov Handle, ax ret ; Crear archivo ; Normal lea dx, Omsg Call PrintErrMsg Ret EndP ;------------------------------------------------------------; Solicitar nuevo nombre a guardar en el archivo GetName Proc Near mov ah, 40h ; Función de escritura de registro mov bx, 01 ; Handle de la salida estándar mov cx, 20 ; Longitud del prompt lea dx, Pregunta ; Dirección del propmt int 21h ; Despliega prompt registro Prof. José Díaz Chow mov ah, 0ah lea dx, NamePar ; Función de lectura de teclado ; Dirección de la variable a contener el int 21h ; Lee desde el teclado Página 37 A R Q U I T E C T U R A D E M Á Q U I N A S GetName I I , C U R S O 2 0 0 4 . cmp NameLen, 00 jz GetOutGetName ; ¿Se escribió algo ? ; Si no, salir mov sub mov lea add neg add rep ; almacena en al el caracter blanco ; limpia ch ; cl <- Longitud del registro ; di <- Dirección del registro ; di <- posición del caracter siguiente al último ; Calculamos la cantidad de caracteres restantes ; del tamaño de 30 (deberìamos usar un EQU aquì) ; completa el resto de caracteres con blancos. al, 20h ch, ch cl, NameLen di, NameRec di, cx cx cx, 30 stosb call WriteRecord call HandleScrScroll GetOutGetName: C O M P U T A D O R A S ; Escribe el registro en el archivo. ; Ajusta la posición en pantalla. ret EndP ;------------------------------------------------------------; Maneja Scroll HandleScrScroll Proc Near cmp Row, 18h jae RowScr inc Row jmp PosCur RowScr: mov ax, 0601h call ClrScr PosCur: call SetCursor ret HandleScrScroll EndP ;------------------------------------------------------------;Escribe registro en archivo WriteRecord Proc Near mov ah, 40h ; Función de escritura de registro mov bx, Handle ; Handle del archivo mov cx, 32 ; Longitud del registro lea dx, NameRec ; Dirección del registro int 21h ; Escribe registro jnc GetOutWriteRec lea dx, Wmsg call PrintErrMsg mov Namelen, 00 GetOutWriteRec: ret WriteRecord EndP ; ¿Se escribió bien? Sí. Finalizar ; No: Escribir mensaje ; ;------------------------------------------------------------;Cierra el archivo CloseFile Proc Near mov NameRec, 1ah ; EOF call WriteRecord ; Escribe el fin de archivo mov ah, 3eh ; Función de cerrar archivo mov bx, Handle ; Handle del archivo int 21h ; Cierra ret CloseFile EndP ;------------------------------------------------------------;Limpia la pantalla ClrScr Proc near Página 38 Prof. José Díaz Chow A R Q U I T E C T U R A ClrScr D E mov bh, 1eh mov cx, 0000h mov dx, 184fh int 10h ret EndP M Á Q U I N A S ; ; ; ; C O M P U T A D O R A S I I Amarillo sobre azul Desde la esquina superior izquierda hasta la esquina inferior derecha. Interrupción BIOS de video. ;------------------------------------------------------------;Posicionar el cursor SetCursor Proc near mov ah, 02h ; Función de posicionar cursor mov bh, 00 ; Normal mov dh, Row ; Fila mov dl, 00 ; Columna int 10h ; Interrupción BIOS de video. ret SetCursor EndP ;------------------------------------------------------------;Imprime mensaje de error PrintErrMsg Proc near mov ah, 40h ; Función de escritura de registro mov bx, 01 ; Salida estandar mov cx, 21 ; Longitud del mensaje int 21h ; Escribe registro mov ErrCode, 01 ; Define código de error ret PrintErrMsg EndP ;------------------------------------------------------------;Fin del programa End Inicio 3.6.4.2 Ejemplo2: Abrir y leer un archivo existente Este otro ejemplo, muestra como abrir una archivo creado y desplegar su contenido. .model small .Stack 64 ;------------------------------------------------------------.Data ErrCode db 00 ; Indicador de fin Handle dw ? ; Manejador del archivo IOArea db 32 dup(' ') FilePath db 'NameFile.txt', 0 Row db 00 Omsg db 'Error de apertura', 0dh, 0ah Rmsg db 'Error de lectura ', 0dh, 0ah ;------------------------------------------------------------.Code ; Programa Principal Inicio Prof. José Díaz Chow Proc Far mov ax, @data mov ds, ax mov es, ax Página 39 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . mov ax, 0600h Call ClrScr Call SetCursor Call OpenFile Cmp ErrCode, 00 jnz Finalizar Seguir: Call LeeRegistro cmp ErrCode, 00 jnz Finalizar Call Despliega jmp Seguir Finalizar: Inicio mov ax, 4c00h int 21h Endp ;------------------------------------------------------------OpenFile ; Abrir el archivo Proc Near mov ah, 3dh mov al, 00 lea dx, FilePath int 21h jc Error mov Handle, ax ret ; Abrir archivo ; Normal Error: mov ErrCode, 01 lea dx, Omsg Call PrintErrMsg Ret OpenFile EndP ;------------------------------------------------------------; Lee próximo registro en el disco LeeRegistro Proc Near mov ah, 3fh ; Función de lectura mov bx, Handle ; Handle del archivo mov cx, 32 ; Longitud del registro lea dx, IOArea ; Dirección del buffer para registro int 21h ; Lee jc ErrorEnLectura ; ¿Error en lectura? cmp ax, 00 ; ¿Fin de archivo? je ErrorTermina cmp IOArea, 1ah ; ¿Caracter EOF? je ErrorTermina jmp Termina ErrorEnLectura: lea dx, Rmsg call PrintErrMsg ErrorTermina: mov ErrCode, 01 Termina: ret LeeRegistro EndP ;------------------------------------------------------------; Despliega registros Página 40 Prof. José Díaz Chow A R Q U I T E C T U R A Despliega Proc mov mov mov lea int cmp jae inc jmp RowScr: PosCur: Despliega D E M Á Q U I N A S C O M P U T A D O R A S I I Near ah, 40h bx, 01 cx, 32 dx, IOArea 21h Row, 18h RowScr Row PosCur ; ; ; ; ; Función de escritura Salida estandar Longitud del registro Dirección del buffer Escribe registro mov ax, 0601h call ClrScr call SetCursor ret EndP ;------------------------------------------------------------;Limpia la pantalla ClrScr Proc near mov bh, 1eh ; Amarillo sobre azul mov cx, 0000h ; Desde la esquina superior izquierda mov dx, 184fh ; hasta la esquina inferior derecha. int 10h ; Interrupción BIOS de video. ret ClrScr EndP ;------------------------------------------------------------;Posicionar el cursor SetCursor Proc near mov ah, 02h ; Función de posicionar cursor mov bh, 00 ; Normal mov dh, Row ; Fila mov dl, 00 ; Columna int 10h ; Interrupción BIOS de video. ret SetCursor EndP ;------------------------------------------------------------;Imprime mensaje de error PrintErrMsg Proc near mov ah, 40h ; Función de escritura de registro mov bx, 01 ; Salida estandar mov cx, 21 ; Longitud del mensaje int 21h ; Escribe registro mov ErrCode, 01 ; Define código de error ret PrintErrMsg EndP ;------------------------------------------------------------;Fin del programa End Inicio Prof. José Díaz Chow Página 41 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . 3.7 Programación en ensamblador con macros. Las macros son herramientas que nos permten simplificar la cantidad de código que se escribe. Se emplean para reusar código repetitivo en el programa. Las macros se expanden en tiempo de compilación y reemplazan todo el texto contenido en la macro en cada instancia donde se le invoca. 3.7.1 Definición de macro Las macros se definen mediante la directiva macro, y se completa con la directiva Ende, según se muestra en el ejemplo: INITZ Macro Mov ax, @data Mov ds, ax Mov es, ax EndM El programa fuente podría parecer así InitZ Macro Mov ax, @data Mov ds, ax Mov es, ax ende .model Small .Stack 64 .Data MyDato1 Start: db ‘Test de Macro’ .Code InitZ …. End Start Obviamente, esta macro no es muy útil por cuanto solo se inicializa una ves en el programa el ds. 3.7.2 Macros con parámetros Una mejora grande que permite dotar de versatilidad a las macros es la posibilidad de emplear paso de parámetros. Msg Página 42 macro Mensaje ; Esta macro despliega un mensaje Mov ah, 9 Lea dx, Mensaje Int 21h Prof. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I EndM Note el uso del parámetro Mensaje que en este caso debe ser una cadena definida con DB. Note también el uso de comentarios. El ensamblador obvia los comentarios al expandir la macro por defecto. 3.7.3 Uso anidado de macros Una macro puede incluir el llamado a otra macro en su definición: Dos21 Macro Funcion Mov ah, Funcion Int 21H EndM Disp Macro Char Mov dl, Char Dos21 2 EndM Note el llamado a Dos21 en la macro Disp. 3.7.4 Directiva LOCAL Las macros se pueden invocar en diferentes partes de un mismo código fuente. Si ellas definen etiquetas estas podrían colisionar al parecer repetidas. La directiva local permite enclaustrar un identificador al entorno de la macro evitando repeticiones. Al expandirlas el ensamblador genera el símbolo de reemplazo adecuado. MiMacro Etiqueta1: Etiqueta2: Macro P1, P2 Local Etiqueta1 Local Etiqueta2 … … EndM 3.7.5 Directivas Include y PURGE La directiva include permite incluir macros definidas en un archivo aparte de librería de macros en nuestro código fuente: Include c:\Asm\Lib\M1.lib Algunos ensambladores como masm, que hacen dos pasadas requieren los operadores de compilación condicional IF1..ENDIF a fin de no incluir dos veces el archivo. Prof. José Díaz Chow Página 43 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I , C U R S O 2 0 0 4 . Es probable que nuestro código fuente esté redefiniendo alguna macro de la librería o simplemente no la use. En ese caso, la directiva purge nos permite decirle al ensamblador que la omita. IF1 EndIf Include c:\Asm\Lib\M1.lib PURGE Dos21, Disp Página 44 Prof. José Díaz Chow