Sie sind auf Seite 1von 254

Ensamblador

por Emiliano Llano Daz

Ensamblador
Emiliano Llano Daz

El autor y Exa Ingeniera no estn afiliados a ningn fabricante. Se han realizado todos los esfuerzos posibles para proveer una informacin veraz y completa. Sin embargo, el autore no se hace responsables de omisiones, uso al que se destine la informacin o por infracciones a patentes u otros derechos de terceros que resulten. Derechos Reservados por el autor 2002. Derechos mundiales reservados. Ninguna parte de esta publicacin puede ser reproducida o almacenada en ningn medio de retransmisin, fotocopiado o reproduccin de ningn tipo, incluyendo pero no limitndose a fotocopia, fotografa, fax, almacenamiento magntico u otro registro, sin permiso expreso del autor y de la editorial. Compuesto totalmente en computadora por: Exa Ingeniera SA de CV Bajo 287-101 Col. Roma Mxico, D.F. 5564-10-11 5564-02-68 FAX 5264-61-08

ISBN 970-91050-0-0 SEP 10137/91


Registrado ante la SEP en la propiedad intelectual del autor

Impreso y hecho en Mxico. 1era edicin junio 2002.

Contenido
Contenido i Introduccin xiii Captulo 1 1 Interpretando el Contenido de la Memoria . . . . . . . . . . . . . . 5 Registros 9 Forma de Usar los Registros. . . . . . . . . . . . . . . . . . . . . 11 Banderas de Estado . . . . . . . . . . . . . . . . . . . . . . . . . 15 Memoria de Acceso Aleatorio 24 Puntos Importantes del Captulo 32 Captulo 2 33 .Direccionamiento Implcito . . . . . . . . . . . . . . . . . . . . 41 Direccionamiento directo a memoria 42 Direccionamiento Indirecto 42 Intrpretes 46 Compiladores 47 Puntos Importantes del Captulo 50 3. Sistemas Numricos 53

Ensamblador

Contando en el Sistema Binario 58 Conversin de Sistema Decimal a Binario 59 Suma y Resta en Sistema Binario 60 Multiplicacin y Divisin Binaria . . . . . . . . . . . . . . . . . 60 Complementos 66 Puntos Importantes del Captulo 71 Captulo 4 73 Las Reglas del Juego 74 Los Caracteres 75 Los Separadores 76 Los Identificadores 76 Palabras Reservadas 76 Comandos 79 Las Instrucciones del Ensamblador 81 Captulo 5 87 Respuesta de la UPC a una Interrupcin 90 Cdigo de Seleccin de un Dispositivo que Interrumpe 92 Inmediata 97 Directo 98 Base 98 Indice 99 Indice y base 100 Base y Desplazamiento (Directo o Inmediato) 101 Indice y Desplazamiento (Directo o Inmediato) 101

ii

Introduccin

Base, Indice y Desplazamiento (Directo o Inmediato) 101 Nmero de Bits en una Instruccin. . . . . . . . . . . . . . . . . 102 Puntos Importantes del Captulo . . . . . . . . . . . . . . . . . . 103 Captulo 6 105 Y Lgico (AND) 114 O Lgico (OR) 115 No Lgico 115 O Exclusivo Lgico (XOR) 115 Prueba Lgica (TEST) 116 Las Banderas 116 Complemento a 2 (NEG) 116 La instruccin OUT 117 La instruccin IN 117 Captulo 7 121 Corrimientos y Rotaciones 128 Corrimientos Lgicos (Rotaciones) 129 Corrimientos Aritmticos 130 Operaciones Aritmticas 131 Suma y Resta (ADD y SUB) 131 Decrementos 132 Multiplicacin y Divisin 132 Captulo 8 141 Manejo de la Pila 142 Guardando las Banderas 150

iii

Ensamblador

La Instruccin REP 152 La Direccin de la Operacin (CLD y STD) 152 Mover Cadenas (MOVSB y MOVSW) 152 REPE REPZ y REPNE REPNZ 154 Compara Cadenas (CMPSB y CMPSW) 154 Busca Carcter (SCASB y SCASW) 155 LODSB y LODSW 156 STOSB y STOSW 156 Captulo 9 163 El vdeo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 Ventanas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Pantallas de graficacin . . . . . . . . . . . . . . . . . . . . . . 168 Problemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 Captulo 10 183 Manejadores de Archivos 197 Captulo 11 207 La Asignacin de Memoria . . . . . . . . . . . . . . . . . . . . 207 Transfiriendo el Control a Ensamblador 208 Pasando Argumentos 208 Pascal y Ensamblador 208 C y Ensamblador 212 Ensamblador Residente 214 Apndice A. 219

iv

Introduccin

Las instrucciones del 80x86 . . . . . . . . . . . . . . . . . . . . 219 Errores comunes al ensamblar un programa . . . . . . . . . . . . 234 Apendice B 235 Interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 ndice 239

Introduccin
Por qu usar ensamblador?
Las razones para APRENDER ensamblador no son las mismas, en general, que las razones para USAR ensamblador. Una de las malas razones para querer usar ensamblador es porque se piensa que ejecutar mucho ms rpido que una secuencia en particular de un lenguaje de propsito general como Pascal, Fortran, C o hasta BASIC compilado. Aunque esto en general es verdadero, el tiempo y recursos invertidos en el desarrollo pueden al final no valer la pena con respecto a la ganacia de velocidad obtenida. Por otro lado, los lenguajes de alto nivel tienden a aislar al usuario de la mquina, en lo que radica su fuerza y su debilidad. La gran mayora de los lenguajes moderno de alto nivel proveen mecanismos para escribir secuencias en ensamblador, aunque algunos de forma torpe (PEEK y POKE de BASIC). Esto crea complicaciones en la implementacin y en el seguimiento y mantenimiento de programas elaborados de esta forma. Algunas veces el sistema o lenguaje hace muy poco por nosotros; por ejemplo, con el adaptador asncrono, el sistema provee mecanismos que quedan cortos de nuestra espectativa y deben ser irremediablemente mejorados o pagar las consecuencias en una comunicacin de alto nivel (redes, interfaces, etc.). Otras veces el sistema o lenguaje hace demasiado por nosotros; por ejemplo en el control de las teclas que conforman un teclado, donde previamente se han definido todas las secuencias que se generan al presionar una tecla.

vii

Ensamblador

Otras ms, se hace el trabajo exacto pero de una forma ineficiente no aceptable a ciertas aplicaciones, como en el caso del manejador de la pantalla que normalmente usan los canales oficiales para comunicarse con la electrnica que controla los dispositivos externos. Es en estas ocaciones donde el ensamblador acta con su mayor fortaleza: el control total de todos los elementos que conforman el sistema. Una parte crtica de un sistema es la ms suceptible de optimizarse va programacin en ensamblador. No deseamos hacer esto en trminos de eficiencia de programacin si se puede evitar con algn truco del lenguaje de alto nivel o alguna otra argucia; pero existen numerosos casos en los que se cae constantemente en la necesidad de hacerlo.La razn por la cual el ensamblador es entonces mejor que un lenguaje de alto nivel, es la misma por la que Pascal es mucho mejor para escribir un programa de nmina que Ensamblador: es mucho ms fcil de mantener y programar. Debemos dejar que los lenguajes de alto nivel hagan lo que saben hacer mejor y reconocer las ocaciones en las que debemos ensuciarnos las manos con ensamblador. Las razones para aprenderlo caen en la categora de una formacin completa e integral en las reas de cmputo de forma tal que se pueda decidir como jefe de proyecto o programador, en qu casos es mejor utilizar una herramienta y en qu otros utilizar otra. Como profesionista, se debe ser capaz de identificar una buena codificacin de una mala en ensamblador y poder sugerir caminos alternativos para las implementaciones de una solucin genrica apropiada al problema que se trata de resolver. Dividimos el aprendizaje del ensablador en fases o pasos que sugerimos seguir al pie de la letra: Fase 1 Conocer las herramientas de trabajo para crear aplicaciones en ensamblador. Fase 2 Conocer la arquitectura de la mquina en la que se pretende realizar la programacin. Fase 3 Conocer las instrucciones del lenguaje ensamblador de la mquina especfica en la que se aplicar. Fase 4 Conjuntar todos los elementos anteriores en programas de aplicacin que realicen cosas prcticas o tiles desde nuestro punto de vista.

viii

Introduccin

Fase 5 Actualizarse constantemente. En todo lo anterior aplicamos una palabra clave: Seleccin. Hay que ser selectivo en lo que se aprende y tener la capacidad de juzgar de antemano qu nos puede servir o no antes de emplear el esfuerzo y tiempo en aprenderlo aunque siempre se debe tener en cuenta que las necesidades, tecnologas y tendencias cambian constantemente el la computacin, por lo menos a lo que el presente y futuro cercano nos concierne. Trataremos de cumplir a lo largo de este libro la palabra selectividad y de llenar todos los objetivos planteados en esta introduccin.

Emiliano Llano Daz Septiembre 1995

ix

Captulo 1
1.1 Componentes Bsicos de un Sistema
Si examinamos las microcomputadoras actuales, vemos que aunque hay diferencias en el tamao fsico de los componentes, de los sistemas y entre dist intos ti pos de computadoras (mini computadoras, macrocomputadoras y computadoras personales o microcomputadoras), la arquitectura empleada en todos los casos es muy similar. Esto se debe al hecho de que las computadoras usan lgica binaria (de unos y ceros) y emplean el sistema binario en casi todos sus componentes, lo que exige un cierto tipo de estrategia para resolver los problemas derivados de esta seleccin.

Figura 1.1 Los componenetes de una computadora.

1-1

Ensamblador

Como se muestra en la figura 1.1, tenemos cinco partes principales de un sistema de cmputo que se encuentran de una forma u otra en todo sistema actual: 1. Unidad de Proceso Central (UPC o CPU en ingls). Que forma el cerebro de la computadora y, en general, controla todo el funcionamiento de los dems componentes. 2. Memoria. Dispositivo de almacenaje electrnico donde se guardan las instrucciones y datos necesarios para el funcionamiento del sistema. 3. Dispositivos de Entrada y Salida (E/S o I/O). Son el eslabn entre la mquina y el humano. Varan en complejidad y tipo de acuerdo a los requerimientos de procesamiento. 4. Interfases de Entrada/Salida. Son los dispositivos intermedios entre la UPC y los dispositivos de E/S y proveen los controles para que se puedan entender los dispositivos externos de E/S y la UPC. 5. Un programa. Controla todo lo anterior y da la secuencia de eventos que permiten que un sistema funcione como tal y adems pueda resolver problemas de procesamiento genrico para lo cual se construy el sistema en primer lugar. Las computadoras digitales usan la lgica digital para cumplir con cierta meta de procesamiento. Esta lgica digital o lgica binaria como tambin se le conoce, se basa en el hecho de que ciertos circuitos electrnicos pueden estar conduciendo electricidad o no (prendidos o apagados), estado que se determina por las caractersticas de operacin. Esto nos da pie a definir dos estados o condiciones bien diferenciados, mutuamente excluyentes y opuestos. Si contamos con un slo circuito digital que nos indique uno de los dos posibles estados, se dice de este circuito contiene un dgito binario (BInary digiT) o BIT de informacin. Este dgito se puede designar como prendido o apagado o ms comunmente 1 0 que corresponden a los nicos dgitos utilizados dentro de los sistemas actuales de computadoras digitales. Para sernos ms utiles, los bits se agrupan en palabras que contienen N nmero de bits de acuerdo al fabricante, modelo de computadora u otros factores, aunque todos coinciden en que son potencias de 2. La longitud

1-2

Componentes Bsicos de un Sistema ms comn de palabra en las microcomputadoras es de 8 bits que se nombra byte, de 16 bits, de 32 de 64 bits. Quiz el nico atributo que diferencia a las computadoras de otras mquinas es que se les puede decir qu deben hacer. Esto se logra con palabras que contienen patrones de bits que son significativos para la computadora. Este significado preciso se lo da el fabricante de computadoras y as, un patrn puede significar suma dos nmeros mientras que otro ligeramente distinto significar quiz guarda un resultado en una localidad especfica. El grupo de patrones definido por el fabricante forma lo que se llama el juego de instrucciones. La variedad de operaciones distintas que contiene este juego de instrucciones obedece a criterios de diseo del circuito. En general todo juego de instrucciones cuenta con operaciones aritmticas, de manipulacin de bits, de comparaciones, de entrada y salida, etc. mismas que analizaremos en detalle para un circuito especfico en los captulos siguientes. Todos los datos, tanto de instrucciones de programa como datos, son almacenados en una serie de circuitos conocidos como memorias pues tienen la particularidad de recordar la informacin contenida en ellos. Las memorias son organizadas como casilleros nicos en los que se guarda la informacin. Cada casillero o localidad de memoria tiene un identificador que lo hace distinto a cualquier otro casillero para propsitos de identificacin y de almacenamiento de informacin. A este identificador se le llama direccin y sin entrar en ms detalles hasta la siguiente seccin baste decir que la direccin es nica e irrepetible para evitar confusiones y que la capacidad del casillero forma la palabra de la computadora (nmero de bits que es posible almacenar en la memoria).

1.2 La Unidad de Proceso Central


Toda computadora tiene una especie de circuito de control genrico o UPC (central processing unit o CPU), que forma el cerebro de la mquina computadora. La UPC est formada por diferentes partes interconectadas entre s en forma tal que permite ciertas operaciones lgicas. Las computadoras de hace 10 aos requeran de un chass bastante grande para albergar los componentes de la UPC. Varias tarjetas bastante grandes que contenan cientos de circuitos interconectadas por cables del tamao de una manguera no era una vista extraa. Hoy en da, la UPC est contenida en unos pocos circuitos de alta integracin o en el

1-3

Ensamblador

caso de las microcomputadoras en uno solo. La microcomputadora, junto con unos cuantos circuitos externos, forman una computadora funcional. Los componentes del sistema de computacin deben de interconectarse de alguna forma. La manera en que se realicen las conexiones y cmo se haga la comunicacin, afecta las caractersticas de desempeo del sistema profundamente. En las primeras computadoras y en algunas de las actuales, la UPC se interconectaba con cada uno de los dispositivos externos a la UPC por medio de un cable separado. Este mtodo tiene la desventaja de que muchos cables (llamados buses) distintos deben ser controlados y se requiere de una cantidad considerable de circuitos. Para realizar la interconexin de forma ms econmica y para estandarizar la lgica de interfase necesaria, una tcnica muy popular consiste en interconectar a todos los sistemas externos a la UPC por medio de un slo juego de cables o bus de interconexin. El bus consiste en los cables necesarios para encontrar a los distintos componentes, controlarlos y transferir datos de y hacia ellos. En la figura 1.2 vemos el esquema de una unidad de procesamiento central. Se forma por la unidad aritmtica y lgica (UAL o ALU, arithmetic logic unit) encargada de las operaciones lgicas y aritmticas, la unidad de control encargada de la coordinacin general, una serie de registros donde se almacena informacin requerida por la UPC y la ALU de forma provisional y un bus de datos interno que interconecta a todas las unidades.

1-4

Componentes Bsicos de un Sistema

Figura 1.2 Esquema de una Unidad de Proceso Central.

La funcin principal de la UPC ser la de interpretar la informacin que reside en la memoria principal como instrucciones o datos y actuar de acuerdo a un plan determinado por el cdigo de la instruccin generando las operaciones necesarias de acuerdo a ese plan. Ningn programa puede ser ejecutado por la UPC si no reside antes, en forma parcial o total, en la memoria principal (descrita en la seccin siguiente).

1.2.1 Interpretando el Contenido de la Memoria


Los datos almacenados en la memoria pueden ser interpretados como: 1. Datos binarios puros 2. Datos codificados en binario 3. Un cdigo de carcter 4. Un cdigo de instruccin Estas cuatro categoras de interpretar datos pueden dividirse en dos ms genricas: datos e instrucciones. Los datos binarios puros, los datos codificados en binario y los caracteres codificados tienen una cosa en comn: son datos. El contenido de las palabras almacenadas en memoria puede ser usado por s solo para

1-5

Ensamblador

operaciones o combinado con otras palabras de memoria en formas dirigidas por un programa.

1.2.1.1 Datos binarios puros


Consideremos primero a los datos binarios puros que no estn sujetos a ninguna interpretacin. Es importante resaltar que podemos representar este tipo de datos en papel como un nmero binario, octal o hexadecimal (por sencillez) sin que tenga ningn impacto en el dato de la palabra. Por ejemplo, una palabra arbitraria de 16 bits, en la que es posible representar 216 combinaciones, puede ser: 11011011100010112=1556138=DB8B16 Se puede observar que la notacin en hexadecimal, adems de ser ms compacta, es mucho ms fcil de apuntar y recordar, tambin evita confusiones, como veremos en el siguiente captulo, por lo que la base 16 o hexadecimal es la preferida entre la gente dedicada a diseo lgico o programacin a nivel mquina.

1.2.1.2 Datos Codificados en Binario


El contenido de una palabra de memoria, interpretada como datos binarios puros, puede existir por s solo o ser vlido slo cuando se combina con otras palabras para formar un cdigo o un nmero mayor que sea utilizado con fines prcticos. No hay razn por la cual un dato binario no pueda formarse, por ejemplo con 2 o ms palabras; ms an, las palabras pueden no ocupar localidades continuas de memoria, aunque se prefiere por fines prcticos que as sea. La palabra puede tambin estar codificada de acuerdo a un cdigo establecido de antemano como puede ser exceso 3, BCD, nmeros con signo, etc. (todos ellos analizados en el captulo 2).

1.2.1.3 Cdigos de Caracteres


Una computadora no sera muy prctica si tuvisemos que meter cada uno de los datos como largas secuencias de unos y ceros o si las respuestas consistieran de nmeros o letras en una representacin binaria. Debe ser posible para la computadora el manejar todo tipo de texto y otra informacin no numrica.

1-6

Componentes Bsicos de un Sistema

Para que el manejo de texto sea completo debe de incluir al menos las 26 letras en minsculas y maysculas, los nmeros y una serie de signos especiales que usamos diariamente en nuestra comunicacin como son el punto, la coma, etc. En conjunto, los caracteres ms usados suman alrededor de 87. Una palabra de 7 bits es suficiente para su representacin pero es universalmente aceptada la codificacin utilizando 8 bits (ver captulo 2). En algunos sistemas con longitud de palabra de 8 bits, se usa el cdigo ASCII de 7 bits y el bit libre se utiliza para verificar errores en los datos por medio de un procedimiento llamado paridad. En otros sistemas se usa un cdigo de 8 bits ASCII y se agrega a la memoria un bit ms que sirve para la comprobacin de paridad. A este bit se le conoce como bit de paridad. La paridad consiste en una verificacin sencilla de errores en la que se agrega un bit al cdigo. La paridad puede ser: Par Impar El bit de paridad se cambia a 1 a 0 para que el nmero de bits 1 de una palabra sea siempre par o impar, segn el tipo de paridad que se haya escogido. Si el tipo de paridad que se escoge es par, el bit de paridad se limpia o fija para que el nmero total de unos de la palabra sea siempre par. Para clarificar el punto inclumos un ejemplo: Palabra a proteger con un bit de paridad: 1010101 Como el nmero de 1 de la palabra ya es par, el bit de paridad ser en este caso 0. Muchos esquemas muy elaborados son usados para verificar la consistencia de los datos y asegurarse que no contengan errores, an ms, existen algoritmos para determinar dnde estn los errores y tratar de corregirlos. Estas tcnicas de deteccin de errores no tienen que ver nada en particular con la arquitectura de las computadoras o la programacin en ensamblador y, por lo tanto, no se discuten aqu. Para mayor informacin consulte la bibliografa, en es pe cial el libro Telecomunicaciones y Teleproceso.

1-7

Ensamblador

1.2.1.4 Cdigo de Instrucciones


Las palabras de memoria hasta ahora analizadas son conformadas por informacin de un tipo u otro pero el contenido tambin puede ser interpretado como un cdigo solicitando una operacin que se requiere de la computadora. Considere el sencillo ejemplo de una suma binaria en donde solicitamos que la palabra almacenada en cierta rea de memoria sea sumada a otra contenida en otra rea distinta y que el resultado sea almacenado en una tercera rea. Los pasos necesarios para lograr esta suma seran: 1. Identificar la direccin de la primera palabra a sumar. 2. Transferir el contenido de la direccin a los registros provisionales de almacenamiento dentro de lo que forma la Unidad de Procesamiento Central. 3. Identificar la direccin de la segunda palabra a sumar. 4. Sumar el contenido de esta ltima palabra a la que se encontraba en los registros de la UPC, obtenida en el paso 2, por medio de la Unidad Lgica y Aritmtica (UAL). 5. Identificar la direccin de memoria donde el resultado se almacenar. 6. Transferir la suma almacenada en el registro adecuado de la UPC a la direccin obtenida en el paso 5. Ilustrar el concepto de un programa de computadora con estos seis sencillos pasos es slo el comienzo. Tendremos que responder a lo largo del libro a las preguntas: Cmo realiza la computadora las operaciones requeridas por los cdigos de instrucciones que conforman el programa? Qu es lo que la computadora demanda de la lgica externa para poder realizar su trabajo? Cmo se escribe un programa de computadora?

1-8

Componentes Bsicos de un Sistema

1.3 Componentes de la Unidad de Proceso Central


Si consideramos el sencillo programa de suma descrito en la seccin 1.2, podemos examinar algunos de los requerimientos internos a la UPC para poder satisfacer lo que se le solicita por medio del cdigo de instruccin SUMA.

1.3.1 Registros
Es necesario un almacenamiento provisional (o varios) donde guardar los nmeros para trabajar con ellos, as como un registro donde almacenar el resultado de las operaciones que llamamos acumulador y abreviaremos con A. En el acumulador podemos almacenar informacin tanto antes de operar con ella, como el resultado de las operaciones con los datos binarios. Por el momento y para simplificar las cosas consideremos que tenemos slo un acumulador y que ste es de 8 bits. Se requiere de este tipo de almacenamiento provisional por dos razones: 1. El contenido de la memoria slo se puede leer o escribir, no es posible operar sobre los registros de la memoria principal debido al diseo de las computadoras actuales. 2. Es posible tomar los datos directamente de memoria, operar sobre ellos y regresar el resultado otra vez a la memoria principal, pero una cantidad adicional importante e innecesaria de circuitos lgicos seran requeridos para esto, complicando el diseo, subiendo el costo y disminuyendo la rapidez de las operaciones como ser aparente segn avancemos en el libro. Para poder accesar una palabra de memoria, tanto para leer como para escribir su contenido, necesitamos tener su direccin y sta se almacena en un registro especial que llamaremos registro contador de datos (data counter register) que abreviaremos con sus siglas en ingls: DC. El tamao de este registro depende de la cantidad de memoria principal que la computadora pueda accesar directamente. En la figura 1.3 suponemos un registro contador de datos de 16 bits que nos da una capacidad de memoria de 65,536 palabras o 64K bytes (si la palabra es de 1 byte).

1-9

Ensamblador

Una computadora puede constar de ms de un registro de este tipo pero una vez ms, por simplicidad y por el momento, slo consideraremos uno. Necesitamos tambin un registro donde la instruccin sea contenida de forma que la UPC pueda hacer referencia a ese registro para ver de que instruccin, de las muchas de una computadora, se trata. A este tipo de registro se le denomina registro de instruccin (instruction register) que abreviaremos con I. La direccin de la memoria de la que traeremos la siguiente instruccin (es nuestro ejemplo la de SUMA) es almacenada en el llamado contador de programa (program counter) que abreviaremos con sus siglas en ingls: PC. El contador de programa es anlogo al de datos pero se asume que uno contiene la direccin de los datos en memoria y el otro la direccin de la siguiente instruccin en memoria. Para explicar un poco ms este punto: si la operacin SUMA consta de un cdigo de operacin que slo ocupa una palabra y le deben seguir dos palabras ms de memoria que contengan los datos a sumar, el apuntador a la siguiente instruccin debe actualizarse sumando tres localidades para que salte los datos y apunte efectivamente a la siguiente instruccin; de forma similar el contador de datos se actualizar sumando 1 al registro contador de programa y luego 1 ms para poder localizar el siguiente dato. Como se puede ver en la explicacin anterior, existe una diferencia conceptual grande entre el contador de programa y el contador de datos, pues mientras el contador de programa debe de incrementarse continuamente para encontrar la siguiente instruccin usando para ello la longitud en palabras de que consta la instruccin anterior, el contador de datos puede o no incrementarse de acuerdo a si la instruccin requiere de datos o no. Debe, por lo tanto, permitrsele gran flexibilidad al programador para poder modificar el registro contador de datos, mientras que, usualmente, al registro contador de programas no se tiene acceso ms que de forma indirecta.

1-10

Componentes Bsicos de un Sistema

Figura 1.3 Registros tpicos de una UPC.

1.3.2 Forma de Usar los Registros


Para poder comprender en su totalidad el uso de los distintos registro que forman parte de la UPC, realizaremos paso a paso una suma como se describe en el algoritmo de la seccin 1.1.2.4. Para realizar la suma asumiremos que la UPC puede interpretar 3 instrucciones sencillas: CARGA, SUMA y GUARDA. Cada una de estas instrucciones est definida de antemano rgidamente y se deben seguir los pasos que el fabricante explica. Supondremos que las instrucciones realizan estos pasos: SUMA: Toma el contenido de la direccin formada por el contenido de las siguientes dos palabras y smala a la que est en el Acumulador dejando el resultado en el Acumulador. Inventamos el cdigo de instruccin 30 hexadecimal que al ser encontrado por la UPC en una localidad de memoria sea interpretado como la instruccin SUMA. CARGA: Toma el contenido de la direccin formada por el contenido de las siguientes dos palabras y gurdala en el Acumulador. Inventamos el cdigo de instruccin 40 hexadecimal que al ser encontrado por la

1-11

Ensamblador

UPC en una localidad de memoria sea interpretado como la instruccin CARGA. GUARDA: Toma el contenido del Acumulador y guardalo en la direccin de memoria formada por el contenido de las siguientes dos palabras. Inventamos el cdigo de instruccin 50 hexadecimal que al ser encontrado por la UPC en una localidad de memoria sea interpretado como la instruccin GUARDA. Recuerde que el Contador de Programa debe de incrementarse continuamente para apuntar as a la siguiente direccin de memoria donde se almacena una instruccin o dato. Nuestro programa de suma sera entonces (las direcciones en hexadecimal): CARGA SUMA GUARDA E0E0 E0E1 E0E2

Notemos que aqu se introduce un nuevo concepto llamado mnemnico que nos auxilia en recordar qu realiza cada cdigo de instrucciones de la computadora en cuestin, pues en la palabra de memoria no se guarda las letras de la instruccin sino un simple cdigo que representa a la instruccin:
40 E0 E0 30 E0 E1 50 E0 E2

Recordemos a su vez, que cada nmero en hexadecimal tiene su equivalente en binario y a su vez, cada nmero en binario se resume en si hay corriente o no en cada uno de los circuitos que conforman el registro en cuestin, ya sea de memoria o interno a la UPC. Coloquemos estos cdigos en un mapa de memoria en una localidad arbitraria, por ejemplo en la direccin C000 hexadecimal (suponemos que tenemos una memoria total de 64K bytes por lo que bastan con 16 lneas de direccin, 16 bits binarios o 4 hexadecimales para conocer su localizacin). En la figura 1.4 colocamos de alguna forma nuestro programa en la memoria.

1-12

Componentes Bsicos de un Sistema

Figura 1.4 El manejo de los registros en un programa.

Podemos seguir paso a paso el contenido de los registros hasta ahora analizados en la siguiente secuencia:

1-13

Ensamblador

1. De una forma por ahora desconocida, el registro contador de programa o PC contiene la direccin de la primera instruccin: C0 00. 2. La UPC carga el contenido de la palabra de memoria apuntada por el PC al registro de instrucciones o I, en este caso el nmero 40 hexadecimal (CARGA), e incrementa en uno el contenido del registro PC. 3. El cdigo 40 que aparece en el registro de instrucciones hace que la lgica de la UPC realice dos pasos. Primero, el contenido de la palabra de memoria direccionado por el registro PC es trado de la memoria pero se almacena en el bit ms significativo del registro contador de datos (DC). La Unidad de Procesamiento Central incrementa posteriormente el contenido del PC en uno. El segundo paso consiste en traer el contenido de la palabra de memoria apuntado por PC y guardado en el bit menos significativo del registro DC. Ahora, se utiliza el contenido del registro DC como apuntador para traer la palabra de memoria indicada al registro acumulador (A). Una vez ms la UPC incrementa el contenido del registro PC en uno. Con esto la instruccin nmero 1 (CARGA) se completa. 4. Una vez terminada la instruccin anterior la UPC trae el contenido de la palabra de memoria direccionado por el registro PC e incrementa en uno este registro. Puesto que no le hemos dado ninguna otra instruccin especfica a la UPC, el contenido de la palabra que se trae de la memoria se almacena en el registro I para ser interpretado como una instruccin. 5. Algo muy similar al paso 3 sucede en esta etapa. El registro DC contiene ahora la direccin de la palabra de memoria a suma (E0 E1) y la UPC pasa el contenido de esta palabra y el del acumulador a la UAL para su suma, el resultado se almacena en el acumulador y el contador de programa se ha incrementado en 2 para quedar apuntando a la siguiente instruccin. 6. La ltima instruccin de nuestro pequeo programa es algo muy similar a la instruccin 1 pero en lugar de traer los datos de la direccin apuntada por el registro DC, se almacena en esa direccin.

1-14

Componentes Bsicos de un Sistema

1.3.3 Banderas de Estado


Muchas veces es necesario saber en detalle qu es lo que realiza la UAL para poder decidir si la operacin que se orden fue completada con xito o no o para tomar ciertas medidas con el resultado que nos entrega la UAL. A los registros especializados en decirnos el resultado de las operaciones se les llama registros de estado (estatus register) o banderas y consisten en una memoria de un bit que nos indica varias situaciones dentro de la UAL. Algunas de estas situaciones en las que las banderas son modificadas que nos son de inters se resumen en los siguientes puntos: 1. El resultado fue cero. 2. Hay un acarreo. 3. Hay signo en la operacin. 4. Hubo un desbordamiento en la operacin. 5. Indicador de paridad. 6. Si la operacin a realizar es suma o resta. 7. Acarreo a la mitad de los bits que forman la palabra. Aquellas instrucciones que afectan o no a las banderas de estado son cuidadosamente seleccionadas por el fabricante y varan de computadora a computadora.

1.4 Ejecucin de Instrucciones


Como en casi toda la lgica digital, la UPC es controlada por un reloj. Este reloj puede ser tan sencillo como una sola seal o una combinacin de varias seales de reloj requeridas por la UPC. La ejecucin de una instruccin puede ser dividida en dos partes principales: Traer la instruccin (fetch en ingls) Ejecutar la instruccin (ejecute en ingls)

1-15

Ensamblador

Si recordamos nuestro ejemplo ante rior de un programa, cada instruccin comienza con el cdigo que se carga en el registro de instruccin (I). A esta operacin le llamamos traer la instruccin (fetch). Durante la etapa donde se trae la instruccin, la UPC tiene que colocar el contenido del registro del contador de programa (PC) en el bus de direcciones junto con las seales necesarias para informar a la lgica exterior que se trata de una lectura a la palabra de memoria indicada por el contenido del bus de direcciones. Por lo que a la lgica externa concierne, esto se trata de una simple lectura. Mientras la lgica externa responde, la UPC usa su lgica interna para sumar 1 al contenido del registro PC. El contador de programas ahora apunta a la siguiente localidad de memoria de la que el cdigo de la instruccin se trajo. Una vez que el cdigo de instruccin se encuentra en el registro de instrucciones, dispara una serie de eventos controlados por la Unidad de Control que constituyen la ejecucin de la instruccin. En su forma ms sencilla, dos periodos de reloj son necesarios para ejecutar la instruccin. Uno de ellos marca el tiempo para traer la instruccin y el otro para ejecutarla. Si consideramos las interconexiones necesarias para esto necesitaremos hasta el momento por lo menos las siguientes: 1. Las lneas necesarias para la direccin de memoria. Por simplicidad consideraremos un diseo en el que se puedan accesar nicamente 65,535 localidades distintas de memoria 64K bytes para lo que se requiere de 16 lneas. En conjunto forman el llamado bus de direcciones. 2. Las lneas necesarias para leer o escribir informacin a la memoria. Una vez ms, por simplicidad, consideraremos un diseo de 8 bits de longitud de palabra por lo que se requieren de 8 lneas de datos que en conjunto forman el llamado bus de datos. 3. La alimentacin del circuito/circuitos que forma la UPC formado como mnimo con una lnea de voltaje y otra de tierra. 4. Las seales adecuadas para informar a la lgica externa que se trata de una lectura o escritura a la memoria.

1-16

Componentes Bsicos de un Sistema 5. La lnea del reloj. Mostramos en la figura 1.5 el diagrama parcial y esquematizado de un circuito de UPC.

Figura 1.5 Una microcomputadora con sus lneas externas.

Algunas veces se requieren de ms lneas que las que fsicamente permite el empaque. Se utiliza entonces una tcnica llamada multiplexin en la que las mismas interconexiones externas sirven para varios propsitos. Por ejemplo, si se requieren de 20 lneas de direccin y slo tenemos disponibles 14 conexiones, podemos mandar en el momento t la direccin parte baja por las 14 conexiones disponibles y las restantes 6 en el momento t+1 por las mismas interconexiones.

1.5 La Unidad de Control


La unidad de control se puede representar funcionalmente como una caja negra tal como en la figura 1.1, pero en realidad consiste de un gran nmero de elementos lgicos que pueden ser activados por una secuencia de seales habilitadoras. La IEEE define a la unidad de control como la parte de una computadora que lee las instrucciones en secuencia, vigila su aplicacin y genera los comandos y seales adecuadas para la Unidad Aritmtica y Lgica (UAL) y otros circuitos para su correcta aplicacin.

1-17

Ensamblador

La unidad de control puede utilizar otros elementos contenidos en la UPC. Por ejemplo, la UC puede utilizar el complementador de la Unidad Aritmtica y Lgica. Una seal nica de la Unidad de Control activa al complementador. Sin embargo, el complementar el contenido de una memoria provisional, aunque til, no nos sirve de mucho. Lo que s tiene vala es complementar el contenido del Acumulador y esto implica mover la informacin al complementador y una vez realizada la operacin, regresar el resultado al Acumulador. Complementar el contenido del Acumulador requiere entonces de 5 pasos: 1. Mover el contenido del Acumulador al Bus de Datos interno. 2. Mover el contenido del Bus de Datos al Complementador. 3. Activar la lgica del complementador. 4. Mover el contenido del Complementador al Bus de Datos interno. 5. Mover el contenido del Bus de Datos al Acumulador. A cada uno de estos 5 pasos se les llama microinstruccin. Cada microinstruccin es habilitada por una seal de la Unidad de Control. Si la Unidad de Control manda la combinacin de seales adecuadas, cualquier nmero de microinstrucciones pueden ser ejecutadas para responder a una macroinstruccin que es la respuesta aceptada de la Unidad de Procesamiento Central a un cdigo de una instruccin de lenguaje de mquina, muy similares a las ya descritas (SUMA, CARGA y GUARDA). Para complementar el contenido del Acumulador en nuestro ejemplo previo, la Unidad de Control requiri de 5 cdigos binarios que dispararon las seales de control apropiadas. La secuencia de cdigos binarios que residen en la Unidad de Con trol son llamados microprogramas y generar esta secuencia de cdigos binarios se le conoce como microprogramacin. Existe un paralelo muy cercano entre lo que es microprogramar y la programacin en lenguaje de ensamblador. Un microprograma se guarda como una serie de cdigos binarios dentro de la Unidad de Control. Un

1-18

Componentes Bsicos de un Sistema programa en ensamblador es guardado como una serie de cdigos binarios dentro de la memoria principal (RAM o ROM). Al programa en ensamblador se le conoce con el nombre de macroprograma y a cada macroinstruccin le corresponden uno o ms microprogramas dentro de la Unidad de Procesamiento Central que deben ser ejecutados para generar la respuesta esperada. Un microprograma guardado en la Unidad de Control tiene memoria para datos, que consiste en los registros de la UPC, ademas de almacenamiento interno a la misma Unidad de Con trol. Un macroprograma tambin tiene una rea de almacenamiento, ya sea provisional (RAM) o definitiva (ROM) como describimos en la siguiente seccin. La complejidad de las operaciones asociadas con una macroinstruccin es funcin direct a del tamao del microprograma que la macroinstruccin inicia. Pero existe el lmite impuesto por el tamao fsico que puede tener la Unidad de Control y esto se hace ms patente en las microcomputadoras, donde toda la UPC se encuentra contenida en un solo circuito. La Unidad de Control de cada computadora no es ms que un microprograma. Si se permite al usuario modificarlo se dice que la computadora es microprogramable. Si la Unidad de Control se disea como parte del diseo lgico de la computadora y forma parte inalterable de la Unidad de Procesamiento Central, entonces, la computadora no es microprogramable.

1.6 Unidad Aritmtica y Lgica


La Unidad Aritmtica y Lgica (UAL, en ingls ALU) que es parte de la Unidad de Procesamiento Central (UPC, Central Processing Unit CPU) es la seccin de la computadora que realiza las operaciones matemticas y lgicas en los datos de entrada procesados por el computador. Esta seccin de la mquina puede ser relativamente pequea consistiendo en quiz uno o dos circuitos de integracin a gran escala (LSI), formar parte de la propia UPC como en el caso de la microcomputadora o ser una serie considerable de circuitos lgicos de alta velocidad como en las macrocomputadoras o supercomputadoras. No importando el tamao y la complejidad de estos circuitos, las mquinas pequeas realizan generalmente las mismas operaciones lgicas y aritmticas usando los mismos principios que en las grandes

1-19

Ensamblador

mquinas. Lo que cambia es la velocidad de las compuertas lgicas y los circuitos utilizados; tambin, tcnicas especiales son utilizadas para realizar varias operaciones en paralelo. Aunque muchas funciones pueden ser realizadas por los UAL de las mquinas de hoy en da, las operaciones aritmticas bsicas (suma, resta, multiplicacin y divisin) continan siendo las operaciones ms utilizadas. Inclusive las especificaciones de una computadora nos dan evidencia de la naturaleza fundamental de estas operaciones: en cada mquina nueva se describen los tiempos requeridos para la suma y multiplicacin como caractersticas significativas. Es importante resaltar que existe, como ya se explic, otra parte de la computadora llamada Unidad de Control que dirige las operaciones del UAL. Todo lo que hace el UAL es sumar, restar, acarrear, etc. cuando se le provee de la secuencia correcta de las seales de entrada. Depende del elemento de control el proveer de estas seales as como es funcin de la unidad de memoria proveer a los elementos aritmticos de la informacin que usarn.

1-20

Componentes Bsicos de un Sistema

Figura 1.6 La Unidad Aritmtica y Lgica esquematizada.

1.7 La Memoria
La memoria de la computadora no est concentrada en un slo lugar; los dispositivos de almacenaje estn distribuidos en toda la mquina. En la parte ms interna encontramos a los registros de operacin que son registros utilizados por la unidad de control y la aritmtica de la computadora. Los clculos se realizan con los datos que se toman de estos registros, por ejemplo, la suma, multiplicacin y corrimientos son todos realizados en estos almacenamientos provisionales. El proceso actual de informacin se realiza en la localidad de estos registros. Viendo hacia afuera, la siguiente categora de registros de almacenamiento que encontramos es llamada memoria de alta velocidad, memoria interna o memoria principal. Esta seccin de la memoria de la computadora consiste en un conjunto de registros de almacenamiento, cada uno de los cuales es identificado con una direccin

1-21

Ensamblador

(localizacin de cada registro de memoria) que permite a la unidad de control, ya sea escribir o leer, de un registro en particular. Para que un programa (conjunto de instrucciones) pueda ser ejecutado es necesario que resida antes en esta memoria. Es deseable que la velocidad de operacin en esta seccin de la memoria de la computadora sea tan rpida como sea posible, puesto que la mayora de las transferencias de datos de y hacia la seccin de procesamiento de la informacin de la mquina ser a travs de la memoria principal; por esta razn los dispositivos de almacenamiento con un tiempo de acceso (tiempo que transcurre entre el momento que se solicita la informacin y el momento en que el dispositivo tiene una respuesta) rpido son generalmente elegidos para la memoria principal. Desafortunadamente los dispositivos disponibles en el momento, que son lo suficientemente rpidos para realizar esta funcin satisfactoriamente, no poseen la capacidad de almacenamiento que algunas veces es requerida ni un costo aceptable. Como resultado, memoria adicional, llamada memoria auxiliar o memoria secundaria, es agregada a la mayora de las mquinas. Esta seccin de la memoria de la computadora se caracteriza por un bajo costo por dgito almacenado, pero generalmente tiene una velocidad de operacin mucho menor que los registros de operacin o que la memoria principal. Esta seccin de la memoria es algunas veces designada como memoria de respaldo, pues su funcin es manejar cantidades de datos en exceso a las que pueden ser almacenadas en la memoria interna. Los dispositivos ms externos y ltimos de almacenamiento son usados para introducir informacin a la computadora del mundo externo y para guardar los resultados de la computadora para el usuario de la computadora. Este medio de almacenaje consiste generalmente en tarjetas perforadas (en desuso), cinta de papel perforada (en desuso), cintas magnticas o discos magnticos y las salidas de la mquina consisten generalmente en caracteres impresos ya sea en pantalla o en papel. Cada una de las divisiones de la memoria tiene ciertas caractersticas. Por ejemplo la importancia de velocidad es muy alta en los registros de operacin. Estos registros generalmente deben realizar operaciones a varias veces la velocidad de la memoria principal. La memoria principal tambin requiere grandes velocidades de operacin, pero como es deseable almacenar grandes cantidades de datos (de 600,000 a 109 bits)

1-22

Componentes Bsicos de un Sistema en esta seccin de la memoria, un compromiso entre el costo y la velocidad debe buscarse. El mismo tipo de compromiso se realiza en el caso de la memoria auxiliar en el que se almacenan entre 360,000 y 1015 bits, siendo muy caro utilizar los mismos dispositivos que para la memoria principal. Es importante darse cuenta al considerar la velocidad de operacin, que antes de que una palabra puede ser leda, es necesario localizarla. El tiempo para localizar y leer una palabra de memoria es llamado tiempo de acceso. El procedimiento para localizar informacin puede ser dividido en dos clases: Acceso Aleatorio Acceso Secuencial Los dispositivos de almacenaje que tiene acceso aleatorio son aquellos en los que la localizacin dentro del dispositivo puede ser seleccionada arbitrariamente sin seguir ningn orden y el tiempo aproximado de acceso es aproximadamente igual para cada una de las localidades de memoria del dispositivo. Los registros internos de trabajo o la memoria principal es un ejemplo de un dispositivo de almacenamiento de acceso aleatorio. Por otro lado los dispositivos de acceso secuencial necesitan ser recorridos en orden para llegar a cierta localidad de memoria, por lo que el tiempo de acceso varia de acuerdo a la localidad. Otra forma de subdividir los dispositivos de almacenaje es de acuerdo a si son dispositivos del tipo Dinmicos Estticos En los estticos, la informacin, una vez grabada en su localidad, no es olvidada o borrada por el tiempo en que el dispositivo tenga energa elctrica o la informacin no sea cambiada explcitamente. Como contraparte, en un dispositivo dinmico, una vez guardada la informacin en una localidad, sta se olvida en un tiempo finito, por lo que se debe recordar o refrescar constantemente.

1-23

Ensamblador

1.7.1 Memoria de Acceso Aleatorio


La memoria de una computadora se organiza en palabras de X longitud, cada una de ella ocupa una localidad o direccin predeterminada dentro de la memoria. Como se puede observar en la figura 1.7 una memoria dada se divide generalmente en N palabras donde N es una potencia de 2. Cada palabra tiene el mismo nmero de bits llamados la longitud de la palabra.

Figura 1.7 La memoria vista como arreglo lineal.

La direccin de los nmeros en la memoria corren consecutivamente comenzando con la direccin cero hasta la mxima que la computadora puede direccionar. Es importante entender la diferencia entre contenido de la memoria y la direccin de la memoria. Una memoria es como un gran gabinete que contiene tantos cajones como direcciones hay en memoria. En cada cajn hay una palabra y la direccin de la palabra est escrita en la parte externa del cajn. No removemos la palabra en una direccin cuando la movemos; nicamente cambiamos el contenido de la direccin cuando almacenamos o escribimos una nueva palabra. Desde el punto de vista externo, una memoria principal de alta velocidad es muy similar a una caja negra con un nmero de localidades o direcciones en las que los datos pueden ser almacenados o ledos. Cada direccin o localidad contiene un nmero fijo de bits

1-24

Componentes Bsicos de un Sistema binarios, y a este nmero se le llama longitud de la palabra de la memoria. Una memoria que contenga 4,096 localidades distintas de memoria, cada una de ellas capaz de almacenar 16 bits binarios, es llamada memoria de 16 bits 4,096 palabras o en el lenguaje vernculo de la computadora memoria de 4K 16 bits. Puesto que las memorias generalmente vienen en potencias de 2, el sufijo K significa en este caso 1,024 y no 103, como en el caso decimal, pues se entiende que las 2N localidades de memoria estn disponibles. Por ejemplo una memora de 16 bits de 216 palabras es llamada memoria de 64K 16 bits. Las memorias puede ser ledas (los datos pueden ser tomados de) o escritas (los datos son almacenados en la memoria). Las memorias en las que es posible leer y escribir son llamadas memorias de lectura y escritura y errneamente conocidas como RAM (Random Access Memory, memoria de acceso aleatorio) ya que las memorias de slo lectura (ver siguiente prrafo) tambin entran en esta clasificacin. A las memorias en las que solamente es posible leer y no permiten escritura son llamadas memorias de slo lectura o ROM (Read only memory). Una palabra de informacin binaria puede ser almacenada en grupos, por ejemplo 8 bits en unidades de memoria. Las entradas y salidas de estas unidades se encuentran interconectadas de forma que el grupo de bits binarios entre y salga de forma serial o secuencial (uno a la vez), o sean movidos en paralelo (todo el grupo a la vez). Cuando se trata de registros dentro de la UPC (CPU) los programadores usualmente los representan como pequeas cajas una junto a otra y dentro de ellas un cero o uno lgico que representa su contenido.

1.7.2 Direccin
Incrementando el nmero de unidades de memoria de almacenamiento podemos aumentar el nmero de bits disponibles. Pero un problema fundamental surge: Cmo poder accesar a cada una de las localidades sin confusin? La solucin es usar una forma de direccin. Podemos aplicar un nico grupo de dgitos binarios a una serie de lneas de seleccin y de esta forma una localidad nica queda disponible. En la figura 1.8 mostramos una memoria de semiconductores esttica tpica arreglada de forma que sus celdas puedan ser seleccionadas independientemente con un cdigo binario nico llamado palabra de direccin.

1-25

Ensamblador

Figura 1.8 La memoria y sus conexiones extrenas.

Una vez que la celda ha sido localizada, un 0 o un 1 puede ser escrito a la celda. Dentro del circuito las celdas se organizan en una matriz de x por y, con la mitad de las lneas de direccin localizando las coordenadas de y. Pero para nuestros propsitos es suficiente considerar a las celdas como una larga cadena y a la direccin como un selector de alguna forma de la celda correcta.

1.7.3 La Memoria de Slo Lectura


La memoria de slo lectura (ROM Read Only Memory) es un dispositivo de memoria utilizado para guardar informacin que no cambia. Hay una operacin inicial en que la informacin se graba en la memoria y posteriormente slo es posible leer de ella y no sobre escribir la informacin. Generalmente la informacin es puesta en su lugar por el fabricante del dispositivo. Es deseable, sin embargo, en muchas ocasiones poder grabar la informacin uno mismo en el dispositivo pues el costo de fabricar unos pocos ROMs es prohibitivo. Existen en el mercado una serie de circuitos que cumplen con esta caracterstica y que

1-26

Componentes Bsicos de un Sistema son programables: las memorias de slo lectura programables o PROM (pro gram ma ble read only mem ory)memoria de slo lectura programable. Estos circuitos permiten grabar la informacin una sola vez y de ah en adelante se comportan exactamente igual a un ROM. Si se realizan circuitos experimentales y son constantes los cambios de diseo de datos y programas en la etapa inicial o se requiere de la flexibilidad de poder borrar de vez en cuando el contenido de la memoria ROM y reprogramarla, se utilizan los circuitos de memoria de slo lectura programables y borrables o EPROM (erasable programmable read only memory). Estos circuitos pueden ser programados, tal como los PROM pero tienen una ventana de cuarzo en la parte superior del empaque por la que se puede borrar la informacin usando una luz ultravioleta. El atributo ms importante de la memoria ROM es que la informacin grabada en ella no se borra si el voltaje que requiere el circuito para funcionar es interrumpido. Tales memorias son conocidas como no voltiles. En contraste, casi todo tipo de memoria RAM es voltil. La memoria ROM tiene muchas aplicaciones en sistemas digitales. Puede ser usada, por ejemplo, para contener valores arbitrarios de una tabla de verdad. Cuando una tabla de verdad tiene muchas variables lgicas de entrada y salida y su realizacin requiere de un gran nmero de compuertas, puede ser econmicamente substituida por una memoria ROM. Se usa tambin en conversin de cdigos para despliegue numrico. Tiene una amplia aplicacin en clculo numrico donde se requiere de muchas operaciones que pueden ser substituidas por una bsqueda en tab las, tales como las funciones trascendentales, multiplicacin, divisin, logaritmos, etc. Pero principalmente guardan el programa que forma el Sistema Operativo de la mquina en cuestin.

1.8 Arquitectura de sistemas 80x86


Hemos escogido para presentar como ejemplo de la UPC al circuito 80486 de Intel. Esta seleccin obedece al hecho de que en Mxico, casi todas las computadoras personales se basan de una forma u otra en este circuito o en uno de la misma familia (todas las compatibles con IBM). Las microcomputadoras han encontrado su camino hacia muchas de las aplicaciones reservadas con anterioridad a la minicomputadora. El abaratamiento de los circuitos y su incesante popularidad ha dado nacimiento a circuitos muy avanzados. El circuito 80486 (y los de su familia) cuentan entre sus caractersticas con:

1-27

Ensamblador

Arquitectura interna de 32 bits (64 para P5 y P6) Soporta directamente 4 gigabytes (232) de memoria principal y 64 tetrabytes de memoria virtual (246) Aritmtica de 8, 16 y 32 bits con y sin signo, binario y decimal; incluye multiplicacin y divisin 14 palabras de registros de 32 bits divisibles en 16 u 8 bits cuatro de ellos Capacidad de acceso directo a memoria Soporte de coprocesadores (modelo SX, DX lo incluye) Operaciones con cadenas Soporta E/S por medio de mapa de memoria Los registros generales de la UPC han aumentado conforme los requerimientos de cmputo han evolucionado. En un circuito de este tipo encontramos 14 registros de 32 bits (de los cuales slo mencionaremos los 16 bits bajos):

1-28

Componentes Bsicos de un Sistema

Tabla 1.1 Registros Registros generales


AX BX CX DX acumulador base cuenta datos

Grupo de apuntadores e ndices


SP BP SI DI IP F apuntador del stack apuntador base apuntador fuente apuntador datos apuntador de instruccin banderas del sistema

Registros segmentos
CS DS ES SS segmento de cdigo segmento datos segmento extra segmento pilas

El grupo de registros generales consta de 32 bits al igual que los dems pero puede leerse en dos partes de 16 bits y a su vez la parte baja de 16 bits se puede leer en dos partes: una baja especificada con el sufijo L y una alta especificada con el sufijo H. Por ejemplo, el registro AX se puede dividir en AL y AH. Algunos de estos registros tienen usos especficos y algunas instrucciones requieren de ciertos registros:

1-29

Ensamblador

Tabla 1.2 Registros y su uso


REGISTRO AX AL AH BX CX CL DX SP SI DI IP OPERACION Multiplica o divide palabras Multiplica o divide bytes Multiplica o divide bytes Traduce Operaciones con cadenas o contador en lazos Rota o corre variable Multiplica o divide palabras Operaciones con la pila Operaciones con cadenas Operaciones con cadenas No es accesible ms que con saltos

El registro de banderas consta de 16 bits como se muestra en la tabla 1.3. Las decisiones de la computadora se basan muchas veces en el estado de estos bits.
Tabla 1.3 Banderas Bandera
OF DF IF TF SF ZF AF PF CF IOPL NT RF VM saturacin direccin (operacin con cadenas) habilita interrupciones trampa (ejecucin paso a paso) signo (resultado negativo) cero acarreo auxiliar pariedad (par) acarreo Nivel de privilegio para E/S (2 bits) tarea anidada Continua operacin Modo virtual

Funcin

Este circuito ve a la memoria como un grupo de unidades lgicas llamadas segmentos. Cada segmento puede ser de hasta 4 gigabytes, siendo los de 64K bytes de longitud para compatibilidad con modelos

1-30

Componentes Bsicos de un Sistema anteriores, y son controlados por los registros de segmentos, cada uno indicando el final del segmento en particular. Slo existe una restriccin con respecto a los segmentos: deben comenzar en un prrafo que es una direccin que es di visible exactamente entre 16. Para esto, los 4 bits menos significativos deben ser cero. Los segmentos pueden ser adyacentes, disjuntos, sin traslape o con traslape parcial o total. Si requerimos usar un registro como apuntador a memoria, necesitaremos sumar un desplazamiento para poder completar las 32 lneas de direccionamiento disponibles. Este desplazamiento se indica en la tabla 1.4.
Tabla 1.4 Uso del Desplazamiento
Tipo de referencia Traer instruccin Operacin con pila Segmento base por omisin CS SS Segmento base alterno Ninguno Ninguno CS ES SS CS ES SS Ninguno CS ES SS Desplazamiento IP SP direccin efectiva SI DI direccin efectiva

Vari ables (excepto los que DS siguen) Fuente cadena Destino cadena BP usado como registro base DS ES SS

El circuito cuenta con una cola de instrucciones donde el procesador va guardando las siguientes instrucciones a ejecutar disminuyendo con esto el ciclo de instruccin del tpico traer instruccin, decodificar instruccin y ejecutarla a slo dos pasos, pues mientras se interpreta la instruccin se trae la siguiente al mismo tiempo.

1.9 Resumen
Se introduce a los componentes de una UPC y se muestra como funciona est. Se mencionan y explican brevemente algunos componentes externos a la UPC en especial circuitos auxiliares como la memoria y sus clasificaciones. En este captulo introducimos el concepto de instruccin y su forma de interpretacin dentro de la UPC, los registros indispensables para el funcionamiento de la UPC y el ALU. Se introduce un circuito tpico de gran popularidad en Mxico y el mundo: el Intel 80x86.

1-31

Ensamblador

1.9.1 Puntos Importantes del Captulo


Un sistema se conforma por 5 componentes bsicos: UPC, memoria, dispositivos de E/S, interfases de E/S y un programa El juego de patrones definidos por el fabricante forman el juego de instrucciones. La UPC consta de la UAL, los registros, la unidad de control y un bus interno para interconexiones Dentro de la memoria son almacenados datos que luego se interpretan en la UPC, estos datos tienen muchas interpretaciones segn el programador y el diseador del circuito. Existe un registro especializado llamado de banderas de estado que nos indica varias condiciones dentro del la UPC. Para ejecutar las instrucciones es necesario traerlas de la memoria (fetch) y ejecutarlas (ejecute) esto se realiza en uno o variso ciclos de reloj que mide entonces la velocidad de ejecucin de la instrucciones. La unidad de control de una UPC puede o no programarse. La UAL ejecuta un conjunto de operaciones aritmticas y lgicas bsicas. La memoria puede dividirse en Interna, secundaria, ROM, RAM, dinmica, esttica y todas ellas son accesadas por medio de una direccin que identifica las distintas localidades que la conforman.

1.10 Bibliografa
Llano Emiliano Sistemas Digitales y Arquitectura de Computadoras. Unam 1993. Captulo 10 y 11.

1-32

Captulo 2
2.1 Otros lenguajes y el ensamblador
No se debe pasar por alto que un sistema de computacin, no importando la complejidad de los varios componentes electrnicos que lo formen, no es ms que un juguete caro a menos de que exista un propsito de su existencia y un programa que haga que este propsito se cumpla. Es este programa, formado por una serie de instrucciones precisas y arreglado en un orden lgico, que hace de la computadora una herramienta til. Existen muchos tipos de programas y de sistemas de programas, a los que en conjunto se conocen como Programas (software), en oposicin a los elementos mecnicos y electrnicos llamados en conjunto Hardware. Algunos de estos programas se usan para un tarea en particular como puede ser el caso de una nmina. Otros programas se usan para manejar los distintos puertos de entrada y salida de una computadora. La operacin tanto mecnica como lgica de los dispositivos externos al sistema por donde la informacin es introducida y entregada, es controlada directamente por estos programas. Existe an otro tipo de programas que realizan funciones muy especficas de computacin como realizar las funciones que la UAL no puede realizar o realiza muy despacio. Algunas veces se conoce a los programas como subrutinas pues forman parte de programas mucho ms grandes. Para un sistema de computacin dado, muchos programas pueden reunirse y guardarse en un sistema de almacenamiento externo tal como disco magntico flexible (medio muy comn), posteriormente se utiliza un programa que pueda extraer a los primeros del medio donde fueron almacenados y ejecutarlos. A este programa se le conoce como sistema operativo (operating sys-

2-33

Ensamblador

tem) y si se encuentra almacenado en un disco magntico se le llama sistema operativo de disco (disk operating system o DOS). La primera consideracin sera Cmo hacer que la computadora comience a funcionar? Aplicando la energa elctrica nicamente no es suficiente para hacer que la computadora comience a funcionar como el usuario desea. Debe existir un programa que haga la inicializacin del sistema y determine las metas a alcanzar para poder hacer que el sistema est en posibilidad de aceptar entradas de los dispositivos externos como pueden ser el teclado o los discos magnticos de almacenamiento. A este programa se le conoce como programa de arranque (start-up program). Usualmente se le conoce en ingls con el nombre de bootstrap o programa de arranque en fro (cold-start), los programas de arranque no necesariamente tienen que ser muy grandes. El procedimiento comn consiste en colocar en una localidad de memoria predefinida del tipo ROM, el pequeo programa de arranque. Toda computadora tiene una forma determinada de comenzar la ejecucin de un programa en una localidad especfica al aplicarles la energa elctrica, esta caracterstica se aprovecha para guardar en esa localidad el inicio del programa de arranque. El programa de arranque inicia una cadena de eventos que termina con la ejecucin en memoria principal de una parte del sistema operativo conocida como procesador de comandos que queda en todo momento activo para recibir rdenes posteriores de otros programas o del usuario directamente en una parte del sistema operativo llamado BIOS o sistema bsico de entrada y salida (Basic Input Output System). Lo que sucede a partir del punto en que el sistema operativo toma control de la Unidad de Proceso Central, vara de sistema a sistema pero el objetivo fundamental de este programa es coordinar las distintas operaciones del computador y llevar registro del estado de varios eventos tales como interrupciones, peticiones a dispositivos externos, etc. Una discusin a fondo de sistemas operativos queda fuera del alcance de este libro pero se puede consultar la bibliografa para ahondar en el tema.

2.2 Los Programas en la Memoria


Como hemos visto en la descripcin de la Unidad de Procesamiento Central y en especial de la Unidad de Control, la computadora slo es capaz de ejecutar una instruccin a la vez (en las arquitecturas tradicionales no incluyendo en esto arquitecturas en paralelo) por lo que

2-34

Otros Lenguajes y el Ensamblador

se requiere de una memoria donde guardar las instrucciones que forman el programa. La cantidad de memoria necesaria depende de la complejidad del programa y de la cantidad de datos que genere o use. La ejecucin del programa consiste en tomar una instruccin de la memoria principal e interpretarla en la Unidad de Control de la UPC. El registro de Contador de Programa (PC) es utilizado para ir llevando un apuntador de memoria de la siguiente instruccin a ejecutar. Como ya hemos visto, el PC se debe incrementar un poco antes de realizar la transferencia (fetch) de la siguiente instruccin en memoria al Registro de Instrucciones (I). Las instrucciones son utilizadas para especificar la secuencia lgica que debe ocurrir dentro del sistema de cmputo. Para usar una computadora debemos, por lo tanto, seleccionar primero los dispositivos que nos darn la capacidad lgica suficiente y posteriormente realizar la secuencia lgica que llenar nuestras necesidades. La secuencia lgica forma el programa y programar es crear estas secuencias. Nada nos impide crear estas secuencias lgicas en forma binaria y de alguna forma colocarlas en la memoria en las localidades escogidas y de hecho, las primeras computadoras eran programadas de esta forma: una secuencia de 1 y 0 era cuidadosamente codificada y luego introducida a la mquina por medio de alambres que cambiaban el contenido de la memoria (en las computadoras ms antiguas) o por medio de interruptores que se conectaban directamente a la memoria por medio del bus de datos (en la siguiente generacin). Pronto los programadores escogieron representar los cdigos de instrucciones en hexadecimal en lugar de binario para abreviar y facilitar su labor (es muchas veces ms fcil identificar un error en una secuencia de nmeros hexadecimales que en una cadena de unos y ceros) y luego buscar la forma en que la mquina trabajar ms ayudando a la conversin. Un cdigo escrito en un papel u otro medio, forma lo que llamamos cdigo fuente, este cdigo es introducido luego a la mquina y el programa que lo lee, lo convierte y coloca en su localidad de memoria, es llamado un editor y es la forma ms elemental de colocar los unos y ceros en donde deben estar. Estos unos y ceros colocados en la memoria principal y listos a ser interpretados como un programa, son llamados el cdigo objeto y no son ms que la representacin exacta de lo que en un

2-35

Ensamblador

principio tenamos en papel pero ahora colocado en la memoria de la computadora. Pronto se vio que el camino correcto consista en hacer el trabajo del programador ms fcil mientras que el de la mquina debera ser el ms difcil. Simplificar el trabajo del programador es una mejora sustancial en nuestro equipo. Llevando este razonamiento un paso ms all, Por qu no usar un lenguaje que sea ms sencillo de aprender, programar e introducir a la mquina que una secuencia de nmeros sin sentido ms que para el ms experto? La respuesta a esto, en nivel sistema de computadora, se encuentra en el lenguaje ensamblador que no es ms que convertir las instrucciones que entiende la Unidad de Proceso Central (lenguaje de mquina) en una serie de smbolos alfabticos y nmeros mucho ms convenientes para los programadores humanos. Los lenguajes ensambladores son, en una primera aproximacin, versiones simblicas y mucho ms fciles de leer de los lenguajes de programacin de mquinas computadoras. Al incrementarse el uso de las computadoras, los programas eran cada vez ms complejos y de mayor tamao y se reconoci la necesidad de construir los programas en unidades o mdulos ms pequeos e independientes. Estas caractersticas fueron pronto introducidas en los lenguajes ensambladores que permitieron que mdulos de programas escritos como unidades independientes fuesen integrados o ensamblados en uno ms grande, de ah el nombre de ensamblador. En la poca actual, casi todo tipo de computadora, sea grande o pequea, se vende con un lenguaje ensamblador y otros programas asociados que nos permiten introducir nuestras instrucciones a la memoria de la mquina. El lenguaje ensamblador es definido por el fabricante y es nico a cada modelo de UPC. Ocasionalmente, varios lenguajes ensambladores pueden existir para la misma mquina pero el programa que se encarga de colocar los unos y ceros en la memoria, debe entregar el mismo resultado: el programa objeto ejecutable por la computadora. Aunque algunos estndares para lenguaje ensamblador han sido propuestos, hay poca evidencia de que los fabricantes se apeguen a el, pero un patrn general ha emergido: Cada instruccin ocupa una lnea. Cada lnea se forma de cuatro campos: Etiqueta

2-36

Otros Lenguajes y el Ensamblador

Mnemnico Operando Comentario Cada lnea fuente de programa representa una lnea objeto traducida por el programa que se denomina ensamblador. El campo del mnemnico es el ms importante y es el nico campo obligatorio que aparece en cada lnea.
etiqueta operando mnemnico DC0,ADDR1 H"0F" SALIR comentario

LIM LMA AIA BZ resultado es cero SRA INC datos JMP byte SALIR AQUI

;carga direccin fuente en DC ;Carga palabra en acumulador ;quita 4 bits de la palabra ;salir de programa si el ;Guarda bits modificados ;Incrementa el contador de ;regresa a procesar siguiente ;siguiente instruccin

DC0 AQUI

Ntese que lo nico sagrado e inalterable son los cdigos binarios de las instrucciones; los mnemnicos del ensamblador pueden ser alterados siempre y cuando se reprograme al programa ensamblador para reconocerlos y hacer la traduccin adecuada. El campo de las etiquetas puede o no tener informacin y si la contiene, sirve al ensamblador para llevar apuntadores de sitios interesantes dentro del programa a los que seguramente queremos regresar. Estos sitios son apuntadores en memoria pues no tenemos forma de usar la direccin verdadera al no saber en qu lugar la pondr el ensamblador. La direccin en donde comienza a ensamblarse el programa depende de la longitud del sistema operativo, del tamao del ensamblador, de instrucciones especficas, etc. El campo de los operadores sirve para proveer informacin necesaria a la instruccin en caso de que exista. Por ejemplo, no podemos sumar un nmero al registro Acumulador si no indicamos en el campo de operando este nmero.

2-37

Ensamblador

Los comentarios pueden o no ir, pero su uso es casi obligatorio pues contiene informacin que nos hace ms fcil comprender qu es lo que hace el programa y en su caso modificar o dar mantenimiento a programas escritos por otra persona o por nosotros mismos hace tiempo. La informacin contenida en este campo es de vital importancia para el programador pero no influye en nada al resultado del ensamblador.

2.3 Conjunto de Instrucciones


El grupo de instrucciones usados por una Unidad de Procesamiento Central particular es conocido como conjunto de instrucciones. Cada fabricante incorpora un conjunto de instrucciones ligeramente distinto en cada UPC, de acuerdo al uso al que se destinar el producto. Algunos son muy sencillos consistiendo en un puado de instrucciones, mientras que otros son bastante complejos, con su total llegando a los varios cientos. Existen varios grupos de instrucciones, cada uno de ellos con un propsito especifico tales como: de entrada y salida de transferencia condicionales aritmticas de interrupcin etc. Usualmente se les da un nombre que es una abreviatura en la forma de un grupo de caracteres, claro que, como ya sabemos, todo esto llega finalmente a ser unos y ceros almacenados en una localidad de la memoria principal.

2.4 Ensambladores
Un programa sencillo como el mostrado en la seccin 1.3, no puede ser ensamblado tal como se present; es necesario informar al programa ensamblador de varios elementos antes de que pueda comenzar a realizar su trabajo. Por ejemplo, es necesario informarle en qu localidad de memoria queremos comenzar a ensamblar el programa.

2-38

Otros Lenguajes y el Ensamblador

Existen una clase de instrucciones llamadas directivas del ensamblador que no forman parte del lenguaje de la mquina pero proveen al ensamblador de informacin que no puede deducir por s mismo. Para poder armar las direcciones de las etiquetas que el programa contiene, es necesario especificar el origen del programa. Esto se logra con la directiva origen (ORG) que es la nica directiva obligatoria y necesaria. Para terminar el programa se usa la directiva fin (END) que informa al ensamblador que ya no siguen ms instrucciones. La directiva iguala (EQU) que nos hace ms fcil la labor de programar al asignar valores a variables para su uso posterior. Otra de las directivas muy usadas es la asignacin de una palabra o de dos palabras para asignar valores a variables (DB y DW) para su posterior uso. Se debe recordar que las abreviaciones de las directivas del ensamblador cambian de uno a otro y siempre se debe consultar el manual. Existen ensambladores bastante complejos que permiten toda una serie de comandos complicados que hacen ms sencillo el programar a nivel ensamblador. Nuestro programa, usando las directivas explicadas, quedara:
mascara AQUI ORG EQU LIM LMA AIA BZ SRA INC JMP END H"03FF" H"0F" DC0,ADDR1 mascara SALIR

;carga direccin fuente en DC ;Carga palabra en acumulador ;quita 4 bits de la palabra ;salir de programa si el resultado es ;Guarda bits modificados ;Incrementa el contador de datos ;regresa a procesar siguiente byte ;siguiente instruccin

cero DC0 AQUI

SALIR

Una vez definido el inicio y fin de un programa, el ensamblador puede llevar a cabo su trabajo y nos entregar una secuencia de nmeros hexadecimales que forman el programa objeto que correr directamente en la mquina tal como se muestra a continuacin (el programa se

2-39

Ensamblador

modific ligeramente para ser ejecutado en un procesador del tipo 80x86 y se le agregaron todas las directivas del ensambaldor necesarias para poder ensamblarlo):
Microsoft (R) Macro Assembler Version 5.00 4/15/93 06:30:48 Page 1-1 ;**************************************************************** ;Programa anterior modificado ligeramente para un procesador ;tipo 80x86 con resultado de un ensamble. ;Ntese todas las directivas agregadas al ensamblador ;**************************************************************** ;definiciones previas usadas en el programa 000F mascara EQU 0Fh ; 0000 datarea SEGMENT ; rea definicin direccin a convertir 0500 ORG 500h ; direccin de inicio de la zona de datos 0500 ???? addr1 DW ? 0502 datarea ENDS ;***************************************************************** 0000 ejemplo SEGMENT ;Programa ejemplo ; 0000 codigo PROC FAR 0100 ORG 100h ASSUME CS:ejemplo, DS:datarea, ES:ejemplo ; donde est el cdigo 0100 inicio: 0100 8D 1E 0500 LEA BX,addr1 carga dir fuente en reg auxiliar 0104 89 07 AQUI: MOV [BX],AX ;mover datos de dir a Acum 0106 25 000F AND AX,mascara ;quita 4 bits de la palabra 0109 74 05 JZ SALIR ;salir si el resultado es cero 010B 8B 07 MOV AX,[BX] ;Guarda bits en direccin ;apuntada por el registro BX 010D 43 INC BX ;Incrementa contador datos 010E EB F4 JMP AQUI ;regresa por siguiente byte 0110 SALIR: ;siguiente instruccin 0110 codigo ENDP ; 0110 ejemplo ENDS ;****************************************************************** END inicio Symbols-1 Segments and Groups:

2-40

Otros Lenguajes y el Ensamblador

Name Length DATAREA . . . . . . . 0502 EJEMPLO . . . . . . . . 0110 Symbols Name Type ADDR1 L WORD AQUI L NEAR 0104 CODIGO F PROC 0000 INICIO L NEAR 0100 MASCARA NUMBER SALIR L NEAR 0110 FILENAME TEXT ensambla 64 Source Lines 64 Total Lines 10 Symbols 51078 + 264170 Bytes symbol space free 0 Warning Errors 0 Severe Errors

Align Combine Class PARA NONE PARA NONE Value Attr 0500 DATAREA EJEMPLO EJEMPLO Length = 0110 EJEMPLO 000F EJEMPLO

2.5 Direccionamiento a Memoria


Aunque realicemos solamente operaciones con los registros internos a la UPC, eventualmente necesitaremos guardar la informacin en una localidad de memoria principal. Para realizar esta operacin, se debe proporcionar como operando una direccin de la que se traern o almacenarn datos. Las formas de especificar la direccin dentro de la instruccin pueden ser muy variadas pero contamos con tipos muy especficos como los que describimos a continuacin.

2.5.1 Direccionamiento Implcito


Una instruccin que usa el direccionamiento implcito, utiliza el contenido del registro contador de datos (DC) como direccin de memoria. Esto implica un proceso de dos pasos: Cargar la direccin de memoria requerida en el registro DC. Una instruccin sin operandos se ejecuta y sta utiliza al registro DC como un apuntador a memoria.

2-41

Ensamblador

2.5.2 Direccionamiento directo a memoria


Algunas instrucciones pueden especificar la direccin con la que trabajarn directamente en su operando; a stas se les conoce como instrucciones con direccionamiento directo a memoria. Toda computadora tiene instrucciones con un rango limitado de memoria en la que pueden actuar. Si todas las instrucciones de una computadora estn limitadas por esta restriccin, a la computadora se le conoce como paginada. Para formar la direccin final a la que la UPC direccionar, se usa la parte alta del Contador de Programas (PC)y se une a la direccin de pgina para formar la direccin efectiva. Este trmino se aplica a toda direccin de memoria que se calcule de alguna forma utilizando para ello la informacin provista por la misma instruccin. Los bits tomados del PC son llamados el nmero de pgina y los bits proporcionados por la instruccin forman la direccin dentro de la pgina. Combinando ambos tenemos la direccin efectiva. La imposicin ms severa impuesta por un esquema de pginas fijas es que el programa no puede referirse a otra pgina y los programas no pueden residir en los lmites de las pginas cruzndolas, por lo que el programador gasta mucho tiempo calculando las pginas y localidades de memoria para su programa. Un mtodo para eliminar algunas de las restricciones del direccionamiento de pginas, consiste en proveer a la computadora de una pgina base y un registro de apuntador de pgina que pueda ser alterado por el programa a su conveniencia. Una variacin del esquema anterior consiste en realizar saltos relativos al PC sumando un desplazamiento contenido en la instruccin, a esta variacin se le llama direccionamiento relativo.

2.5.3 Direccionamiento Indirecto


Una ltima variacin es la de usar una localidad de memoria que ser utilizada como direccin para encontrar los datos que queremos llevar o recuperar de la memoria. Este esquema es flexible y permite usar apuntadores para aplicar todas las tcnicas de programacin avanzada a las computadoras directamente (uso de apuntadores, colas, pilas, etc.).

2-42

Otros Lenguajes y el Ensamblador

2.6 Tipos de Instrucciones


A grandes rasgos las instrucciones pueden ser divididas en grupos muy genricos, una vez ms, depende del fabricante si incluye todos los tipos (o ms) o un subconjunto de ellos. La aplicacin final del producto dicta muchas veces el tipo de instruccin necesario y el superfluo. Aunque no exhaustiva, la siguiente clasificacin puede muy bien servir a nuestros propsitos: 1. Instrucciones que mueven datos. Incluyen instrucciones que mueven datos entre un registro y la memoria; entre dos registros e instrucciones inmediatas que cargan a los registros con un valor especificado en el operando de la instruccin. 2. Instrucciones aritmticas y lgicas. Son generalmente instrucciones que trabajan con dos operandos y realizan sumas, restas, multiplicaciones, divisiones, Y, O as como sumas y restas con acarreos. Las banderas generalmente se afectan con el resultado. 3. Corrimientos. Son de tres tipos: corrimientos, corrimientos aritmticos y corrimientos lgicos. En algunos casos la palabra se corre a travs de la bandera de acarreo. 4. Saltos y subrutinas. Incluyen saltos incondicionales, saltos condicionales basados en las banderas, llamadas a subrutinas y regresos de subrutinas. 5. Incrementos y decrementos de los registros y la memoria. Usualmente incrementan en la unidad la memoria o los registros para llevar una cuenta en lazos o para accesar a localidades contiguas de memoria. 6. Comparaciones y pruebas. Comparan dos operandos y modifican el registro de banderas de acuerdo al resultado o realizan pruebas sobre un operando. 7. Meter y sacar informacin de la pila (stack). Decrementan o incementan el registro de apuntador a la pila de acuerdo a la operacin realizada: empuja o saca. 8. Instrucciones con las banderas de estatus. Limpian o fijan alguna de las banderas del registro de banderas de la UPC antes de realizar alguna operacin. Habilitan o deshabilitan las interrupciones a la UPC.

2-43

Ensamblador

9. Instrucciones especiales. Todas las que no caigan dentro de las 8 anteriores como son las de entrada y salida, que algunos prefieren clasificar en un grupo extra y otras. Puesto que las instrucciones son distintas entre las computadoras, se discute cada grupo en general y a lo largo del libro daremos un ejemplo de microcomputadora y sus instrucciones. Otra clasificacin de las muchas existentes agrupa las instrucciones en 3 divisiones an ms genricas: 1. Instrucciones de transferencia de datos que mueven informacin (direcciones, valores de operandos, instrucciones, etc.) sin cambio de una parte de la computadora a otra. 2. Instrucciones de procesamiento de datos que transfieren datos realizando las operaciones necesarias requeridas. 3. Instrucciones de control de programa usadas para determinar el orden de ejecucin de las otras instrucciones.

2.7 Lenguajes de Alto Nivel


La programacin a nivel mquina es necesaria para que sta funcione, pero un usuario comn y corriente no puede invertir tanto tiempo en aprender a programar una computadora cuando su objetivo principal es la resolucin de problemas. Los lenguajes de alto nivel son la parte del sistema operativo (aplicaciones) con la que el usuario avanzado se familiarizar (se prefiere hoy en da las soluciones enlatadas en forma de programas de aplicacin con cierta programacin integrada: hojas de clculo, procesadores de palabras, comunicaciones, autoedicin, etc.). Para poder hacer que la computadora se comporte como queremos, debe haber una forma de comunicar nuestros deseos a la mquina. La mayora de las computadoras existentes tienen alguna forma de lenguaje desarrollado para ellas. Existen tantos lenguajes como existen computadoras y cada uno de ellos llena un sitio en especial aunque todos tienen en comn que tratan de ser de propsito general y fciles de usar. Aunque es verdad que las diferencias de cada mquina nos limitan en su forma de programarla en lenguaje ensamblador (u objeto), esto no se aplica en su gran mayora en los llamados lenguajes de alto nivel. Por

2-44

Otros Lenguajes y el Ensamblador

qu el nombre de alto nivel? Pues porque comparados con los primeros mtodos de programar una computadora son mucho ms potentes y flexibles. De los lenguajes de alto nivel ms conocidos y entre los ms viejos se encuentra el BASIC. Es el lenguaje de alto nivel ms usado y popular en los sistemas pequeos de computadoras (computadoras personales) y en muchos de los sistemas grandes. Debe su popularidad a la sencillez de su sintaxis y a que es muy sencillo aprenderlo no tomando ms que unas cuantas horas para poder realizar nuestro primer programa funcional. Esta misma sencillez del lenguaje BASIC, es su principal desventaja pues conforme las tcnicas de programacin han ido mejorando, se necesita cada vez de herramientas ms poderosas que llenen los requerimientos; han surgido as una serie de lenguajes que se substituyen unos a otros y cada uno clama ser la ltima y mejor herramienta para la programacin:
LENGUAJE FORTRAN COBOL SMALLTALK C SIMULA PASCAL C++ VISUAL BASIC USO programacin cientfica negocios objetos sistemas simulacin enseanza de tcnicas correctas de programacin interfases grficas y ventanas, objetos interfases grficas y ventanas, objetos

y muchsimos otros ms cada uno con sus mritos, ventajas y debilidades.

2.8 Intrpretes y Compiladores


No importando qu tan sofisticado sea el programa o el lenguaje en que est escrito, nuevamente llegamos al punto en que la UPC debe interpretarlo y ejecutarlo a la mxima velocidad posible. Esto implica traducir cada una de las instrucciones del lenguaje de alto nivel o ensamblador a unos y ceros que son colocados en las localidades precisas de memoria para que sean ejecutadas. Las dos formas existentes de traducir las lneas de cdigo de un lenguaje de alto nivel son usando programas intrpretes y programas compiladores.

2-45

Ensamblador

2.8.1 Intrpretes
Un programa intrprete toma el cdigo desarrollado por el usuario y escrito en un procesador de palabras o generalmente en un procesador de texto proporcionado por el mismo intrprete y al darle la orden de ejecutar un programa, traduce una a una las instrucciones del cdigo fuente a lenguaje de mquina. Esto tiene una serie de ventajas y desventajas: Ventajas: Muy fcil corregir errores y desarrollar programas pues en todo momento tenemos control sobre la ejecucin, podemos interrumpir, poner puntos de espera, preguntar el contenido de variables, ejecutar el programa paso a paso, etc. Fcil de entender y manejar; como no permite tantas opciones, no tenemos tantos comandos que aprender para controlar el proceso. Los errores se corrigen rpidamente y se ve de inmediato el resultado de estas correcciones. Las instrucciones del programa siempre estn a disposicin del usuario y ste puede modificarlas a su conveniencia.

Desventajas: Para la distribucin del programa terminado debemos incluir el intrprete y las instrucciones para usarlo adems de las instrucciones para usar el programa. No da flexibilidad pues no permite unir el programa con otros desarrollados en otros lenguajes. No es porttil de un ambiente a otro pues el intrprete usualmente es distinto de mquina a mquina a menos que se apegue estrictamente a un estndard. El proceso de traducir las instrucciones una a una lleva tiempo y si por cualquier causa es necesario ejecutar alguna instruccin que ya fue traducida, es necesario volver a traducirla una y otra vez. Se requiere de la memoria necesaria para poder ejecutar el intrprete, ms la memoria necesaria para el programa.

2-46

Otros Lenguajes y el Ensamblador

Como las instrucciones son interpretadas una a una, no es posible optimizar la traduccin pues no tenemos el concepto de programa completo sino de instruccin en instruccin. Si se quiere vender el programa final, se debe incluir cada una de las instrucciones permitiendo que el programa sea copiado y/o modificado ilegalmente las veces que se desee.

Por todas las razones expuestas, es muchas veces preferible utilizar un compilador (ver siguiente seccin) aunque algunas veces (si es posible) se prefiere desarrollar en un intrprete y entregar la versin final del programa en un compilador que aproveche las ventajas de estos programas.

2.8.2 Compiladores
Un programa compilador ejecutar el mismo programa que un intrprete, pero la accin se realiza de un modo distinto en cada caso. El compilador toma un programa fuente como una unidad y lo traduce a programa objeto en varios pasos dejando un programa ejecutable que ya no requiere de ningn otro programa para ejecutarse a excepcin del sistema operativo. El programa que entrega el compilador puede ejecutarse directamente desde el procesador de comandos del sistema operativo. Para que esto suceda, deben de existir varias condiciones: Que el programa fuente est libre de errores de sintaxis Que el programa fuente no tenga errores de ejecucin Que se le agregen al programa fuente todas aquellas rutinas que necesita para poder realizar su trabajo.

Para que todo esto se cumpla se requiere de un trabajo adicional por parte del usuario y un esfuerzo mucho mayor que en el uso de un intrprete. Es tal la popularidad de los sistemas de computacin y de los lenguajes, que las compaas que los fabrican han invertido mucho tiempo y dinero para entregar un producto que sea rpido y evite muchas de las penurias que se encontraban en los primeros compiladores comerciales. El ciclo de desarrollo de un programa con un compilador consiste en escribir el programa en un procesador de texto separado del programa y

2-47

Ensamblador

ejecutar el compilador; si no existen errores de sintaxis se procede a ligar con las libreras de funciones que el programa requiere durante su ejecucin; se ejecuta el programa objeto, si existe algn error, por pequeo que este sea, se repite todo el proceso. Como se ve en la descripcin anterior el proceso es minucioso, elaborado, complicado y tardado. Debe existir alguna ventaja en usar un compilador para que ste exista. La principal ventaja que se obtiene es la rapidez de ejecucin del programa final. Pero siguen existiendo ciertas ventajas y desventajas con respecto a un intrprete: Ventajas: Programa objeto muy rpido en su ejecucin (hasta 100 veces ms rpido que con un intrprete dependiendo de las instrucciones y otros factores). Se puede unir el programa con otros desarrollados en otros lenguajes por lo que tenemos acceso a una librera desarrollada por otros. Las instrucciones son traducidas una nica vez. No existen pedazos de cdigo con errores potenciales pues el programa se traduce como un todo y no instruccin a instruccin. Al traducir instruccin a instruccin puede ser que hayan pedazos del programa que nunca sean ejecutados en nuestras pruebas. Se puede optimizar el resultado final pues se conocen todas las referencias y todo lo que hace el programa en trminos de instrucciones. No se requiere de ningn programa auxiliar para poder ejecutar el producto terminado.

Desventajas: El ciclo de desarrollo es tardado: programacin, compilacin, ligar y ejecutar. Mientras que en el intrprete slo es un paso: ejecutar.

Como la nica desventaja aparente es la del desarrollo, los compiladores modernos ya incluyen un ambiente integral en el que se escribe el programa, se compila, liga y ejecuta en un slo paso utilizando la memoria para ello y slo se graba el programa final como un mdulo

2-48

Otros Lenguajes y el Ensamblador

ejecutable cuando el ciclo de desarrollo est completo y as lo solicitamos. Estos productos tratan de combinar las ventajas de un intrprete con las de un compilador y eliminar la mayora de las desventajas de los intrpretes.

2.9 Sistemas Operativos Avanzados


La evolucin de las computadoras sigue an un ritmo desenfrenado. Muchas cosas sorprendentes son realizadas con las computadoras y quedan an muchas ms por realizar: Computadoras gigantescas que realizan todas las transacciones de un banco incluyendo a sus cajeros automatizados; transacciones internacionales de computadora a computadora, etc; computadoras para las aerolneas que llevan los vuelos y reservaciones a nivel mundial; computadoras de trfico areo que llevan el control va radar de todos los vuelos que entran y salen de un aeropuerto y muchas aplicaciones ms. Puede usted imaginar la cantidad de potencia de cmputo requerido para esto y la complejidad de un sistema operativo y los programas necesarios para cumplir con el cometido asignado a la computadora? Todo esto puede ser atribuido al nacimiento de grandes e increiblemente complejos sistemas operativos, todos ellos no prcticos hace apenas unos cuantos aos. Hace poco tiempo el uso de ms de 64K bytes de memoria en un sistema personal era impensable e incosteable. Hoy son pocos los sistemas operativos que caben en esa cantidad de memoria. La tendencia sigue siendo hacia compartir los datos por lo que trminos como multitareas, multiusuario y multiproceso no sern del todo desconocidos en un futuro. La necesidad de velocidad es tanta que nuevas arquitecturas surgen como alternativas al uso de un slo procesador central: arquitectura paralela y redes neuronales son la tendencia tecnolgica del futuro.

2.10 Resumen
Una de las partes primordiales de un sistema de cmputo y sin el cual su funcionamiento no es posible es el de la programacin. Por medio de un programa podemos guiar todas las acciones de la electrnica para poder llegar a una aplicacin prctica y til.

2-49

Ensamblador

El aspecto de la programacin es muy extenso e incluye muchos temas complejos. Pero su aspecto fundamental se describe brevemente en este captulo. El sistema operativo (SO) forma la parte sobre la cual actuan todos los dems programas, todo requerimiento a la computadora es encauzado por el canal adecuado por medio de la parte de entrada y salida bsica del SO llamada BIOS. Todo programa para poder ser ejecutado debe residir en la memoria y debe ser puesto de alguna forma en ella en comandos que la UPC pueda entender e interpretar para lo cual se han desarrollado toda una serie de programas llamados intrpretes y compiladores que se encargan de esta labor.

2.10.1 Puntos Importantes del Captulo


Un programa de arranque inicia el sistema de cmputo y le permite funcionar. El procesador de comandos de un sistema operativo queda residente todo el tiempo para recibir rdenes de otros programas o del mismo usuario. Un programa consiste en una secuencia lgica de instrucciones y se conoce como programar a crear estas secuencias. El cdigo fuente consiste en las instrucciones que el programa ensamblador interpretar para crear un cdigo objeto. El cdigo objeto es el resultado de un ensamblador y consiste en el programa fuente interpretado y colocado en la memoria para su ejecucin. Toda Unidad de Procesamiento Central (UPC)consta de un juego de instrucciones definidas por el fabricante durante su construccin. Entre las formas de indicar una localidad o direccin de memoria contamos con: direccionamiento directo, implcito o indirecto. Las instrucciones que permite una UPC son clasificados de acuerdo a su funcin y existen varias de estas clasificaciones. Un intrprete traduce instruccin a instruccin un programa fuente mientras que un compilador lo hace todo de una vez.

2-50

Otros Lenguajes y el Ensamblador

2.11 Actividades
2.1 Investigue qu programa ensamblador viene junto con los circuitos basados en una UPC de Motorola, tales como los Apple. 2.2 Encuentre el conjunto de algunas instrucciones de una UPC 68000 de Motorola. 2.3 Haga un programa sencillo para multiplicar dos nmeros de 8 bits en lenguaje ensamblador inventado por usted. Use el registro Acumulador y dos auxiliares llamados B y C. No emplee una instruccin que haga directamente la multiplicacin.

2.12 Bibliografa
Llano Emiliano Sistemas Digitales y Arquitectura de Computadoras. Unam 1993. Captulo 13. Macro 86 Columbia Data Products, Inc. 1982. MPC Operations Guide Columbia Data Products, Inc. 1982.

2-51

3. Sistemas Numricos
Como matemtico, Laplace1 apreciaba enormemente el sistema numrico decimal. Comprenda que cientos de aos de esfuerzos mentales as como de buena suerte dieron como resultado el sistema que usamos y estaba en una posicin en la que poda apreciar sus ventajas. Nuestro presente sistema numrico provee a los matemticos modernos y cientficos con grandes ventajas sobre los usados por anteriores civilizaciones y es un factor importante de nuestro rpido avance. Puesto que las manos son la herramienta ms conveniente con la que la naturaleza nos dot, los seres humanos siempre hemos tendido a usarlas para contar. Es entonces natural y afortunado que nuestro sistema de contar se base en el nmero de dedos que tenemos. Sin embargo pas bastante tiempo antes de poder representar estos nmeros grficamente. Las primeras representaciones grficas encontradas consisten en marcas verticales y horizontales. El nmero 1 es un ejemplo de esto; es interesante hacer notar que el 2 consista de dos marcas horizontales unidas con una lnea y el 3 de tres marcas horizontales unidas (sistema arbigo). Los nmeros Romanos son un buen ejemplo de lneas usadas como base para nmeros (ver figura 3.1).

Pierre Simon marqus de Laplace (1749-1827). Astrnomo y matemtico francs que dio base cientfica a la Hiptesis de las Nebulosas. Entre sus trabajos matemticos ms notables se destaca el perfeccionamiento de la teora de las probabilidades.

3-53

Ensamblador

Figura 3.1 Comparacin de algunos sistemas de nmeros.

3-54

Sistemas Numricos

El sistema decimal ha sido tan aceptado y adoptado por nuestra civilizacin que rara vez consideramos la posibilidad de otros sistemas en uso. De todas formas, no es razonable pensar que un sistema basado en el nmero de dedos que tenemos en las manos sea el ms eficiente para usar en las mquinas que construimos. El hecho es que un sistema muy poco usado para otra cosa, pero muy sencillo, el sistema binario, ha probado ser el ms natural y eficiente para su uso en mquinas computadoras.

3.1 El Sistema Decimal


Nuestro sistema actual se forma por 10 smbolos distintos: 0, 1, 2, 3, ..., 9 llamados dgitos Arbigos. Con este esquema nos veramos forzados a detenernos en 9 o inventar otros smbolos para los dems nmeros si no fuese porque usamos una notacin de posicin. Un ejemplo de esto lo podemos encontrar en los nmeros romanos que son en esencia aditivos: III=I+I+I, XXV=X+X+V. Se requieren nuevos smbolos conforme la serie crece (X, M, C, etc.). As, se usa V en lugar de IIIII=5 la nica importancia en posicin en los nmeros Romanos es si un smbolo precede o antecede a otro (VI=6, IV=4). La torpeza de este sistema resalta en cuanto deseamos realizar cualquier operacin con dos nmeros, por ejemplo multiplicar XII por XIV (12x14). El clculo con nmeros Romanos es tan engorroso que los primeros matemticos se vieron forzados a usar casi exclusivamente el baco o tablas de contar y luego traducir el resultado a nmeros Romanos. Los clculos con papel y lpiz son tan increiblemente complicados en este sistema que la habilidad para hacerlo era muy apreciada entre los antiguos Romanos. La gran simplicidad y belleza de nuestro sistema decimal puede entonces apreciarse en detalle. Slo es necesario aprenderse 10 dgitos y el sistema de notacin de posicin para contar cualquier cantidad. Despus de aprender de memoria 10 tablas de multiplicar y de sumar as como aprender unas sencillas reglas, es posible realizar cualquier operacin aritmtica. Ntese la sencillez para realizar la operacin 12 por 14:
14 x 12 28 14 168

3-55

Ensamblador

El significado del nmero 168 puede notarse al decir la cantidad ciento s e s e n t a y o c h o . B s i c a m e nt e e l n me r o c o n s i s t e e n (1x102)+(6x101)+(8x100). La importancia es que el valor de cada dgito est determinado por su posicin. El 3 en 3000 vale distinto que el 3 en 30 y se denota al hablar diciendo tres mil o treinta (tres decenas). La regla general para representar cualquier nmero en notacin decimal es: (31) a1 10 n-1 + a2 10 n- 2 +K+ an = a1 a2 K an . donde n denota el nmero de dgitos a la izquierda del punto decimal. La base del sistema es definido como la cantidad de dgitos distintos usados en cada posicin en un sistema de notacin. El sistema decimal tiene base 10, esto significa que el sistema tiene 10 dgitos distintos para representar cualquier cifra (0, 1, 2, 3, ..., 9). La historia registra el uso de varias bases. El sistema quinario (base 5) prevalece entre los esquimales y los indios de Norte Amrica, la base doce an se usa en relojes, pies, docenas; el de base 60 (usado por los Babilonios) en segundos y minutos.

3.2 El Sistema Binario


El matemtico del siglo XVII, Leibnitz2, era un fantico del uso de la base 2 que slo usa los smbolos 0 y 1 para representar cifras. Puede parecer extrao que un matemtico eminente use un sistema tan sencillo, pero debe recordarse que en esa poca casi todos los matemticos eran tambin filsofos y religiosos. Su preferencia al sistema base dos se debi a razones mticas, el uno representando a la deidad y el cero a la nada. Cualesquiera fuesen las razones de Leibnitz para usar el sistema binario, en los ltimos aos se ha vuelto muy popular. Todas las computadoras modernas se construyen para operar usando el sistema binario o sistemas codificados en binario y todo indica que en un futuro cercano seguirn siendo construidas de esta forma.
2 Gottfired Wilhelm barn von Leibniz o Leibnitz (1646-1716). Filsofo y matemtico alemn tambin erudito en ciencia, historia y derecho. Desarroll el clculo infinitesimal sin conocer la obra de Newton en el mismo campo. Su filosofa se apoya fundamentalmente en la concepcin de un universo compuesto por un nmero infinito de unidades de fuerza espiritual o materia a la que llama mnadas.

3-56

Sistemas Numricos

Los componentes bsicos de las primeras computadoras eran los relevadores y contactos que son binarios por naturaleza pues slo pueden estar en dos estados posibles: cerrados (1) o abiertos (0). Los principales componentes de las computadoras actuales son los transistores similares a los usados en televisores y radios. La necesidad de un funcionamiento confiable llev a los diseadores a utilizar a los transistores en sus estados de corte y saturacin reduciendo as sus estados posibles a dos fcilmente identificables, conduciendo (1) o no (0). Una simple analoga puede realizarse entre estos dos estados y un foco de luz elctrica. En cierto momento el foco est prendido (transistor conduciendo) emitiendo luz o apagado (transistor no conduciendo). Aunque el foco est viejo y no produzca tanta luz, se puede decir con certeza si est prendido o apagado. Lo mismo sucede con un radio, si ste est viejo o con las pilas gastadas, hay que compensar subiendo el volumen pero por muy bajo que est, siempre se puede decir si est prendido o no. Debido al gran nmero de partes que forman una computadora, es altamente deseable utilizarlas de tal forma que los cambios en sus caractersticas no afecten el desempeo total del sistema. La mejor forma de lograr esto es usando los circuitos en su forma biestable (de dos estados posibles).

3-57

Ensamblador

3.2.1 Contando en el Sistema Binario


El mismo tipo de notacin de posicin que usamos en el sistema decimal es el que se usa en el sistema binario. Obsrvense los primeros 16 nmeros en el sistema binario:
Tabla 3.1 Conversin de Decimal a Binario Decimal 0 1 2 3 4 5 6 7 Binario 0 1 10 11 100 101 110 111 Decimal 8 9 10 11 12 13 14 15 Binario 1000 1001 1010 1011 1100 1101 1110 1111

Debe notarse que el sistema decimal usa potencias de 10 mientras que el binario potencias de 2 y en general el sistema n usar potencia n. Mientras que el nmero 35 en decimal equivale a 3 x 101 + 5 x 100, el mismo nmero en binario (35) se representa como 1000112 significa 1 x 25 + 0 x 24 + 0 x 23 + 0 x 22 + 1 x 21 + 1x20. Los siguientes ejemplos ilustran la conversin de una base a la otra, debe notarse que la potencia puede substituirse por potencia n para sistema n (por ejemplo 16 para sistema base hexadecimal u ocho para sistema octal). 111 = 1x2 2 + 1x21 + 1x2 0 = 4 + 2 + 1 = 7 1011 = 1x2 3 + 0x2 2 + 1x21 + 1x2 0 = 6 + 0 + 2 + 1 = 9 11011 = 1x21 + 1x2 0 + 0x2 -1 + 1x2 -2 + 1x2 -3 = 2 + 1 + 0 + . 1 1 3 + =3 4 8 8

Los nmeros fraccionarios se forman al igual que en el sistema decimal:

3-58

Sistemas Numricos

0135 = 1x10 -1 + 3x10 -2 + 5x10 -3 .

3.2.2 Conversin de Sistema Decimal a Binario


Existen muchos mtodos de conversin entre bases pero el primero y ms obvio es restar todas las potencias de la base al nmero en base 10 hasta que el resultado sea cero. En base 2 restaremos la potencia mayor de 2 del nmero; al restante se le aplica el mismo procedimiento hasta que el resultado sea cero. Para convertir 2510 a base 2 restaremos de 25 la potencia mayor de 2 que no exceda a 25, en este caso 24 quedando 25-16=9 del que restamos la siguiente potencia mayor (23=8) y as continuamos hasta que no tengamos nada que restar. El nmero queda como 24 + 23 + 20 11001. Un mtodo ms empleado para nmeros grandes es dividir entre la base y apuntar el residuo resultante de derecha a izquierda, volviendo a dividir el resultado entre la base hasta que el resultado sea cero. Por ejemplo 12510: 1252=62+1, 622=31+0, 312=15+1, 152=7+1, 72=3+1, 32=1+1, 12=0+1 tomando los residuos de derecha a izquierda: 11111012. En el caso de fracciones se debe dividir el nmero en dos partes, la entera en la que se aplica cualquiera de los mtodos antes expuestos y la fraccionaria. La conversin de fracciones a la base de inters se logra restando de sta las potencias negativas de la base hasta que no tengamos residuo o hasta la precisin que se requiera. Este primer mtodo es engorroso para fracciones grandes por lo que se prefiere multiplicar por la base y tomar lo que queda a la izquierda del punto para formar la fraccin y lo que queda a la derecha para volver a aplicar el procedimiento. Por ejemplo 0.437510 a base 2: 2x0.4375=0.8750, 2x0.8750=1.750, 2x0.750=1.50, 2x0.50=1.0 tomando los nmeros a la izquierda del punto decimal de izquierda a derecha tenemos que 0.437510=0.01112.

3-59

Ensamblador

3.2.3 Suma y Resta en Sistema Binario


La suma y resta en sistema binario son mucho ms sencillas de aprender que en cualquier otro sistema pues las reglas son muy sencillas. Para la suma tenemos que
0+0=0 0+1=1 1+0=1 1 + 1 = 0 y se lleva 1

Unos ejemplos bastan para comprender el procedimiento que es similar al decimal al que ya estamos acostumbrados:
101 110 1011 1111 11.01 10100 101.11 100011 1001.00

La resta tiene tambin reglas muy sencillas:


0-0=0 1-0=1 1-1=0 0 - 1 = 1 con un prstamo de 1

Y la forma de hacerla es similar al sistema decimal:


1001 -101 100 10000 -11 1101 110.01 -100.10 1.11

3.2.4 Multiplicacin y Divisin Binaria


La tabla de multiplicar usada por el sistema binario slo tiene cuatro reglas a diferencia de las 100 usadas para la multiplicacin en sistema decimal:
0x0=0 1x0=0 0x1=0 1x1=1

3-60

Sistemas Numricos

Slo es necesario copiar de nuevo el factor si se multiplica por 1 poner ceros si es por 0:
1100 x1010 0000 1100 0000 1100 1111000 1100110 x1000 1100110000

Nuevamente la divisin es sumamente sencilla:


01 = 0 11 = 1

A continuacin dos ejemplos de la divisin:


101 101 11001 101 001 101 100 110 101 100 111.01 11101.00

3.3 Representando Nmeros en Otras Bases


Hemos dicho ya que los nmeros en otras bases tienen tantos smbolos como la base de que se trate, esto es, en base dos tenemos dos smbolos distintos, en base 10, diez smbolos distintos para representar cualquier nmero. Pero qu smbolos usar para bases mayores que diez? Distintas culturas han empleado distintos smbolos para resolver este problema, pero actualmente la nica base usada mayor que la decimal es la base 16 o hexadecimal. Para representar nmeros en base 16 usamos los nueve smbolos ya conocidos 0, 1, 2, ..., 9 y agregamos las letras para representar al 10, 11, 12, 13, 14 y 15. As, la A representa al smbolo 10, B al smbolo 11, etc. Para convertir de base 10 a cualquier otra empleamos los mismos mtodos de la base dos, es decir dividiendo consecutivamente entre la

3-61

Ensamblador

base y anotando el residuo. Para el caso de base 16 dividiremos entre diecisis. Encontramos la equivalencia de un nmero en cualquier base con respecto a la decimal usando notacin de posicin y multiplicando por la base elevada a la potencia de la posicin menos la unidad: F09516 = (15 x 163) + (0 x 162) + (9 x 161) + (5 x 160) = 6158910 Como la base 16 es divisible entre la base dos, el sistema hexadecimal es una forma conveniente de representar en notacin corta al sistema binario evitando errores (con este mismo propsito se utiliz mucho tiempo la base 8). La forma de convertir de sistema hexadecimal a binario es sustituir cada uno de los smbolos usados en el nmero en hexadecimal por su equivalencia en binario: F09516 = 1111 0000 1001 01012 o cualquier nmero en binario dividiendo el nmero en grupos de 4 de derecha a izquierda y sustituyendo por su smbolo equivalente en base 16: 100010101102= 0100 0101 01102 = 45616 Para estas conversiones es conveniente tener una tabla a la mano:
Tabla 3.2 Distintas Representaciones de los Enteros del 0 al 15. Decimal Binario Hexadecimal BCD 00 0000 0 0000 0000 01 0001 1 0000 0001 02 0010 2 0000 0010 03 0011 3 0000 0011 04 0100 4 0000 0100 05 0101 5 0000 0101 06 0110 6 0000 0110 07 0111 7 0000 0111 08 1000 8 0000 1000 09 1001 9 0000 1001 10 1010 A 0001 0000 11 1011 B 0001 0001 12 1100 C 0001 0010 13 1101 D 0001 0011 14 1110 E 0001 0100 15 1111 F 0001 0101

3-62

Sistemas Numricos

3.4 Decimal Codificado en Binario (BCD)


Puesto que las computadoras construidas usando el sistema binario requieren de una menor cantidad de circuitos electrnicos y por lo tanto son ms eficientes que las mquinas que operan con otros sistemas numricos, el sistema binario es el sistema ms natural para una computadora y el de mayor uso actualmente. Por otro lado, el sistema decimal es el ms natural para nosotros. Todos los clculos que realizamos usualmente se realizan en el sistema decimal, pero deben ser convertidos por las computadoras de decimal a binario antes de realizar cualquier operacin. Debido a esto, muchas de las primeras computadoras usaban un sistema de codificacin decimal a binaria. En tal sistema, se usan grupos de dgitos binarios para representar cada uno de los 10 smbolos usados en el sistema decimal. Por ejemplo, uno de los cdigos ms obvios y naturales es usar un cdigo binario de pesos donde cada posicin representa un peso tal y como se muestra en la tabla 3.3
Tabla 3.3 Cdigo binario de pesos. Cdigo Binario Dgito Decimal
Peso

8421 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001

0 1 2 3 4 5 6 7 8 9

Ntese que son necesarios 4 dgitos binarios para cada smbolo decimal. Esto es ineficiente pues las combinaciones de 4 dgitos binarios son 24 = 16 de los que slo usamos 10 pero si usamos 3 dgitos 23 = 8 son insuficientes. Para simplificar la conversin de decimal a binario, es ms prctico codificar un nmero decimal d n-1 d n- 2 K d1 d 0 donde d i { 0, 1, ..., 9 } de la siguiente forma: Reemplace cada dgito decimal con su equivalente de 4 smbolos binarios tal como estn definidos en la tabla 2 anterior. El nmero resultante es llamado cdigo binario decimal, cdigo 8, 4, 2, 1 o

3-63

Ensamblador

simplemente BCD (Binary-coded decimal), y lo indicaremos con el sufijo BCD. As, tenemos que: 10001010101BCD = 45510 Hay que resaltar que el nmero resultante BCD y el binario son muy distintos. A cada uno de los dgitos binarios le llamamos bit (de binary digit). En la representacin BCD, cada segmento de 4 bits representa un slo dgito decimal cuyo peso es una potencia de 10. Unicamente 10 de los 16 posibles patrones de grupos de 4 bits son necesarios para la representacin BCD. Aunque el formato BCD claramente simplifica la conversin decimal, tiene la desventaja de requerir ms bits por cada nmero a representar. Usando 8 bits, el mayor nmero representable es 10011001BCD = 9910 mientras que en binario con el mismo nmero de bits tenemos: 111111112 = 25510 Otras de las desventajas es en las operaciones matemticas como la resta que normalmente se realizan usando el complemento del nmero (ver siguiente seccin). Para resolver estas desventajas se disearon otro tipos de cdigos. Uno de los primeros es el llamado de exceso 3 (excess 3) en el que para formar la equivalencia, primero se suma 3 al nmero decimal. Por ejemplo para representar al 4, primero sumamos 3, resultando 7 y luego usamos el BCD normal, que es 0111. El 0111 es el cdigo exceso 3 para el 4. Cambiando cada 0 por 1 y cada 1 por 0 formamos lo que se llama el complemento del nmero binario. Este procedimiento es usado para formar el complemento a 9 de un nmero decimal. Por ejemplo el complemento de 0100 (1 decimal en cdigo exceso 3) es 1011 u ocho decimal. El cdigo exceso 3 no es un cdigo de peso (de notacin), esto es, cada 1 no representa una potencia de 2 que podamos sumar para formar el nmero decimal. Un cdigo de peso en el que el complemento a 9 pueda ser formado complementando cada bit, es el cdigo 2, 4, 2, 1 representado en la tabla 4. Este cdigo se usa extensivamente en instrumentos y calculadoras electrnicas.

3-64

Sistemas Numricos

Tabla 4. Representaciones Alternas. Decimal Exceso 3 Complemento Cdigo a nueve 2, 4, 2, 1


Peso 2 4 21

00 01 02 03 04 05 06 07 08 09

0011 0100 0101 0110 0111 1000 1001 1010 1011 1100

1100 1011 1010 1001 1000 0111 0110 0101 0100 0011

0000 0001 0010 0011 0100 1011 1100 1101 1110 1111

3.5 Nmeros Negativos


Hasta el momento slo hemos trabajado con nmeros positivos (sin signo) pero el signo positivo o negativo es necesario para distinguir a los positivos de los negativos. Los nmeros sin signo se consideran como positivos y el signo de + es omitido. En una computadora los nmeros se almacenan en una memoria que tiene un nmero finito y fijo de posiciones. Cada posicin puede tomar un valor de 0 1 y es costumbre representar a los nmeros negativos reservando la ltima posicin de la izquierda para el signo. De esta forma, en una computadora que tenga longitudes de registro, llamadas palabras de 8 bits (8 bits equivalen generalmente a 1 byte) slo podran usarse 7 posiciones (128 nmeros distintos 2n-1) y la ltima para el signo. Por convencin se ha escogido utilizar un 1 para nmeros negativos y 0 para los positivos. De tal forma, -104 se representa por 11101000 y 104 como 01101000. A esta notacin se le llama notacin con signo. Las operaciones matemticas pueden realizarse en la misma forma que las operaciones manuales con nmeros decimales. El resultado de una operacin matemtica en una palabra de n bits requiere, tpicamente, que el resultado sea una palabra de n bits. Si el resultado completo es una palabra de n+1 bits, como en el caso de una suma, se dice que ha ocurrido un desbordamiento o saturacin (overflow). Un desborde se indica con una generacin extra de una seal que modifica una memoria de un bit cambindola de 0 a 1. En algunos casos la saturacin puede ser ignorada y considerar como resultado adecuado a

3-65

Ensamblador

los n bits de la palabra y en otros ser necesario tomar alguna accin correctiva.

3.5.1 Complementos
Aunque el cdigo de notacin con signo es la contraparte directa del cdigo decimal usado por los seres humanos, otra representacin binaria llamada de complementos es usada con frecuencia en computadoras digitales, principalmente porque simplifica la construccin de ciertas operaciones aritmticas. Existen dos tipos de complementos usados: 1. Complemento a la base. Se forma restando cada dgito de la cantidad al nmero de la base menos uno y luego agregando 1 al resultado as obtenido. Para el sistema decimal llamamos a esta forma complemento a diez, para el binario, complemento a dos. 2. Complemento a la base menos 1. Se forma restando a cada dgito de la cantidad al nmero de la base menos uno. Para el sistema decimal llamamos a esta forma complemento a nueve, para el binario, complemento a uno. Por ejemplo el complemento a diez de 8710 es 1310 (1210+110) y el de 2310 es 7710 (7610+110) mientras que el complemento a nueve de 8710 es 1210 y el de 7710 es 2210. En el sistema binario el complemento a dos de 101102 es 010102 y el de 110102 es 001102. El mtodo para encontrar el complemento en la base dos de cualquier cantidad consiste en sustituir todo 0 por 1 y todo 1 por 0, dependiendo del tipo de complemento se sumar 1 o no. La ventaja principal de usar complementos en sistemas digitales durante la suma o resta, es que todos los bits del nmero son tratados de forma uniforme y que la resta y suma son realizadas por el mismo circuito que slo suma y es mucho ms sencillo. Al usar la representacin por complementos la resta queda simplificada realizndose con sumas:

3-66

Sistemas Numricos

Complemento a la base
89 -23 66 11011 -10100 00011 89 +77 66 (el ltimo acarreo se descarta) 11011 +01100 100111 (el ltimo acarreo se descarta)

Complemento a la base menos uno


89 -23 66 89 +76 1 65 +1 (el ltimo acarreo se suma) 66 11001 +01001 1 00010 +1 (el ltimo acarreo se suma) 00011

11001 -10100 00011

3.6 Cdigo Grey y ASCII


Las secuencias de los nmeros binarios son naturales y generalmente se comprenden con facilidad pues siguen un patrn posicional tal como el sistema decimal. Podemos, sin embargo, representar a un nmero por una secuencia arbitraria de 1 y 0. Para evitar ambiguedad debemos sin embargo asignar a cada valor numrico una secuencia distintiva e individual. Los nmeros representados en otros sistemas que los naturales, son llamados cdigos puesto que se les debe asignar un cdigo (regla de asignacin) para determinar el valor numrico representado por la secuencia. Ya hemos analizado algunos cdigos utilizados en computacin e introducimos dos ms: el Grey reflejado y el ASCII. El cdigo ASCII (American Standard Code for Information Interchange, Cdigo Americano Estandard para el Intercambio de Informacin) es un esfuerzo de los diseadores para tener compatibilidad entre las distintas mquinas y aplicaciones. El cdigo se forma de 7 bits y

3-67

Ensamblador

el octavo se deja disponible para que el diseador juege con el, ya sea para comprobar por medio de paridad (explicada en los siguientes captulos) si no hay error de transmisin o manipulacin de datos o para expandir el juego de caracteres disponibles elevndolo de 27 (128) a 28 (256) (esto ltimo es lo que se realiza en las computadoras modernas). Las primeras 32 posiciones estn reservadas para carcteres de control y usualmente no se pueden desplegar o imprimir (hay formas de dar la vuelta a esto). Los dems se usan para las letras, los nmeros y toda una serie de smbolos utilizados. En Japn y otros pases donde se usa otro tipo de letras que no son las romanas, se utilizan hasta 2 bytes (16 bits o posiciones de unos y ceros) para que el cdigo pueda representar todas sus palabras. El usar este cdigo garantiza, en muchos casos, compatibilidad entre datos de distintas aplicaciones de forma que el resultado de un programa pueda ser ledo por otro con poco esfuerzo de nuestra parte.

3-68

Sistemas Numricos

Figura 3.2 Cdigo ASCII de 8 Bits.

En el cdigo Grey, los dos primeros nmeros son representados en forma natural, la siguiente serie de nmeros son encontrados de la forma especificada en la figura 3.2. Una imagen espejo se representa por la lnea de guiones entre los primeros dos nmeros (en la tabla de la izquierda) y que da lugar al punto de la reflexin. De ah en adelante un cero es aadido a la primera serie de nmeros y un 1 a la segunda. Repeticiones sucesivas del proceso de reflexin nos permiten hacer cualquier serie de nmeros. La caracterstica ms importante del cdigo Grey es que los nmeros cambian de uno a otro slo en un dgito. Por ejemplo notemos que del nmero 7 (0100) al 8 (1100) slo cambia el dgito en la posicin cuarta mientras que en la representacin binaria (7=0111, 8=1000) cambian 4

3-69

Ensamblador

dgitos. Encuentra aplicacin en un sin nmero de situaciones de la que daremos un breve ejemplo. Supongamos que tenemos una veleta que nos dar la direccin del viento en cualquier momento. Un circuito recibe la seal y la interpreta mandando el resultado a un computador que analizar los datos junto con muchos ms para dar un pronstico de tiempo. Si el circuito detecta que ms de un dgito cambia a la vez, podemos estar seguros de que hay un error en la transmisin o en el sensor y podemos descartar la lectura y esperar a la siguiente o dar la alarma para que la situacin se corriga.

Figura 3.3 Desarrollo del cdigo Grey.

3.7 Resumen
Los nmeros son la base de todas las representaciones formales que realizamos. Las bases distintas a la de diez han estado en uso durante mucho tiempo pero es la base 2 la nica distinta de 10 que actualmente usamos. Dada su sencillez, la base 2 se utiliza en las computadoras digitales actuales. Es importante entenderla y ser capaz de realizar operaciones sencillas fcilmente.

3-70

Sistemas Numricos

3.7.1 Puntos Importantes del Captulo


El sistema decimal es un sistema de posiciones en la que a cada sitio se le da un peso que equivale a potencias de 10. El sistema binario se usa extensivamente en computacin. Existen otras representaciones de nmeros usando unos y ceros que hacen ms fcil el tratamiento de nmeros dentro de la computadora como son el BCD, exceso tres, 2421 y complementacin. Los nmeros negativos se representan reservando un bit para el signo. El cdigo Grey y el ASCII son usados extensivamente en computacin.

3.8 Ejercicios
3.1 Convierta los siguientes nmeros a su equivalente binario: a) 3910, b) 1210, c) 12310 3.2 De los nmeros binarios obtenidos en el problema 3.1 encuentre su equivalente hexadecimal. 3.3 Convierta los nmeros del problema 3.1 a base 8 y base 4 (recuerde que la base 8 slo consta de 8 smbolos distintos 0 a 7, y la base 4 del 0 al 3). 3.4 Encuentre la equivalencia binaria de los siguientes nmeros: a) 3.12310, b) 0.437510, c) 1.110 3.5 Sume y luego reste en forma binaria 1210 + 1010. 3.6 Divida y multiplique en forma binaria 3101510. 3.7 Convierta los siguientes nmeros binarios a su complemento de 1 y de 2: a) 101112, b) 10012, c) 11112 3.8 Haga la siguiente resta usando complementos a 1 y a 2: 111012-110112

3-71

Ensamblador

3.9 Convierta los siguientes nmeros hexadecimales a binario: a) BCD16, b) 63516, c) FFF16 3.10 Una regla sencilla para multiplicar dos nmeros en cualquier base es multiplicar los dos nmeros en forma decimal. Si el producto es menos que la base, se toma tal cual; si es mayor que la base, divida en decimal entre la base y tome el residuo como el dgito menos significativo y el cociente como el ms significativo. Por ejemplo 26 x 26 = 46, 38 x 28 = 68; pero 26 x 46 = 86 y 68 = 1 y sobran 2 por lo que 26 x 46 = 126. Usando esta regla, multiplique: a) 27 x 47, b) 27 x 37, c) 54 x 44

3.8 Bibliografa
Llano Emiliano Sistemas Digitales y Arquitectura de Computadoras. Unam 1993. Captulo 3.

3-72

Captulo 4
4.1 Las herramientas
Existen una multitud de mtodos para codificar un programa en ensamblador. El primero y ms primitivo consiste en codificar directamente el programa por medio de una herramienta como DEBUG; veremos como esto es posible y por qu es un mtodo utilizado solamente para programas pequeos. El segundo mtodo consiste en utilizar un cdigo fuente en un procesador de palabras o cualquier otro editor que nos entregue como resultado cdigo ASCII y a continuacin ensamblar este cdigo para producir un cdigo ejecutable. Este mtodo es el ms corriente y conveniente, para llevarlo a cabo es necesario seguir los siguientes pasos: 1. Preparar el programa, su estructura, sus datos, mtodos de clculo, etc. Este paso previo se realiza generalmente en papel o en la multitud de programas disponibles para tal fin, como son Procesadores de Palabra, programas de Diagramas de Flujo, etc. 2. Codificar el programa en un editor o Procesador de Palabra que entregue cdigo ASCII como salida. Se puede utilizar desde el primitivo EDLIN, el editor de programas de PASCAL o C, hasta un sofisticado procesador de palabras basado en Windows. 3. Transformar el cdigo fuente en lenguaje de mquina por medio de un ensamblador (por ejemplo MASM). En est fase se corrigen los posibles errores de estructura y sintaxis del programa fuente.

4-73

Ensamblador

4. Ligar el programa si el ensamblador no lo hace por nosotros, esto es, agregar todas las rutinas externas a nuestro programa y que se requieran para su funcionamiento. 5. Verificar el funcionamiento del programa ejecutable entregado en el paso anterior. Aqu ser necesario corregir los errores de lgica y funcionamiento del programa ejecutable. Se puede utilizar el programa DEBUG o cualquier otro comercial para ejecutar el cdigo paso a paso, revisar los registros, etc. 6. Repetir la secuencia anterior a partir del paso 2 tantas veces como sea necesaria hasta obtener un cdigo limpio que ejecute segn las especificaciones originales. Como se ve de los pasos anteriores esto lleva mucho tiempo y consume muchos recursos de dinero y esfuerzo, por lo que el paso 1 es el ms importante y en el que debemos tardarnos ms para evitar tardarnos en los dems.

4.2 La Sintaxis
Como en todo lenguaje de programacin, hace falta respetar ciertas reglas. En esta seccin detallamos algunas de las reglas del ensamblador.

4.2.1 Las Reglas del Juego


El lenguaje ensamblador, como todos los dems, se forma de un juego de instrucciones separadas en lneas conteniendo cada una de ellas (como ya se vio en captulos precedentes) las siguientes partes: Un identificador opcional. Un mnemnico vlido que forme parte del juego de instrucciones del procesador. Un operando o varios, separados por comas si el mnemnico as lo requiere. Un comentario en relacin a la instruccin. Dentro del archivo fuente no se requiere de ninguna organizacin en especial pero se recomienda utilizar cuatro columnas para mantener la claridad del programa y hacernos la vida ms fcil.

4-74

Las Herramientas

4.2.2 Los Caracteres


El ensamblador reconoce un subconjunto de la secuencia de caracteres ASCII disponibles. Los caracteres vlidos son: Los caracteres del alfabeto a excepcin de los caracteres acentuados (se pueden usar en el campo de los comentarios). Los caracteres numricos. Los siguientes smbolos: + - * / = ( ) [ ] ; . ! , _ : @ $ espacio tabulador CR (retorno) LF (alimentacin de lnea) Los caracteres alfabticos maysculas son tratados exactamente como los minsculos:
MOV AX,0 = MoV Ax,0 INC BX = inc bx

pero ABC no es igual a abc An as, se recomienda seguir algn tipo de convencin propia y respetarla siempre. A partir de este momento en el libro se sigue la siguiente convencin: Los comentarios en espaol tratando de no emplear anglicismos ni modismos donde sea posible, siempre en minsculas y utilizando acentos y marcas diacrticas que hagan ms fcil su comprensin. Las etiquetas en espaol y siempre en minsculas. Las instrucciones y su operandos en maysculas siempre.
VRAI TRUE EQU EQU 1 1 ;Colocar flag en 1 ;set flag en uno

Aunque el segmento anterior puede ser muy claro para algunos, preferimos:
marca EQU verdadero (1) 1 ;Colocar bandera o indicador como

4-75

Ensamblador

Que creemos, es mucho ms claro para todo mundo a excepcin de algunos cuantos privilegiados que preferimos discriminar a lo largo del libro.

4.2.3 Los Separadores


Los diferentes elementos de un programa (instrucciones, identificadores, etc.) deben ser separados por lo menos con un espacio. Los operandos de una instruccin se separan entre ellos por medio de una coma y, en este caso, el agregar uno o ms espacios es opcional y se hace muchas veces slo por claridad:
MOV AX,0 MOV Ax, 0 MOV AX, MOV AX, 0

Son correctos pero


MOVAX, 0

es incorrecto pues no hay un espacio separador entre el mnemnico y el operador.

4.2.4 Los Identificadores


Los identificadores son los nombres definidos por el usuario para propsitos diversos. Representan una variable o una etiqueta o marca a la que probablemente, pero no necesariamente, har referencia el programa ms adelante. Los identificadores estn formados por una serie de caracteres el primero de los cuales debe de ser alfabtico, no puede contener espacios y no debe de exceder de 80 caracteres en total.

4.2.5 Palabras Reservadas


El ensamblador reconoce en tre cuatro categoras de palabras reservadas: Los mnemnicos del juego de instrucciones del procesador en cuestin. Las directivas del ensamblador en caso de que se use. El nombre de los registros del procesador en cuestin.

4-76

Las Herramientas

En caso de usar ensamblador, las palabras BYTE, WORD y DWORD. En ninguno de los casos pueden aparecer estas palabras como identificadores en un programa.

4.3 Editores
Podemos escribir y discutir largo y tendido sobre las grandes ventajas de un editor o procesador marca X sobre el marca Y, pero no tiene sentido la discusin cuando para lograr un programa fuente slo requerimos lo mnimo indispensable de un procesador: Que sea lo ms rpido posible de ejecutar. De ser posible que quede residente en memoria y an ms sin estorbar o robar memoria principal a la hora de ejecutar nuestro lenguaje de mquina. Que entrege como salida un archivo de cdigo ASCII sin caracteres extraos ni de control que el ensamblador no puede usar. En suma, se puede utilizar cualquier editor o procesador por sencillo o complicado que sea. Lo importante a resaltar aqu es que nos sintamos a gusto con l y que nos provea de herramientas que faciliten y no dificulten nuestro trabajo, ya de por si difcil. Habr gente que en este rengln se sienta en casa utilizando un editor primitivo como EDLIN o WORDSTART y gente que no pueda trabajar con algo menos que VENTURA. La eleccin depende de gustos y necesidades. Para nuestro gusto, un editor intermedio como EDIT de las versiones nuevas del sistema operativo MS-DOS (6.2 en adelante) que se incluye como parte de sus utileras, es suficiente para la mayora de los casos. Si se cuenta con algn editor residente en memoria como SIDEKICK contamos con algunas ventajas adicionales como son el tener siempre disponible el editor desde cualquier punto ya sea dentro de DEBUG, ejecutando el programa u otros. Seguramente con el nuevo advenimiento de sistemas operativos ms poderosos basados en ventanas e iconos, el panorama se modificar pero

4-77

Ensamblador

se debe recordar que ms nuevo y complicado no necesariamente quiere decir mejor.

4.4 Debug
En los siguientes captulos utilizaremos el programa DEBUG debido a que es un programa ms sencillo de usar en principio que MASM y nos pone en contacto ntimo con la mquina. Para teclear, probar y corregir un cdigo slo necesitamos ejecutar DEBUG mientras que para usar MASM se requiere de hasta 4 programas (editor, MASM, LINK y EXE2BIN). Al usar un programa como DEBUG nos ahorramos, por el momento, toda una serie de directivas del ensamblador que causan que el programa ejecutable crezca. Por ltimo, al usar DEBUG nos ponemos en contacto ntimo con la mquina. Tarde o temprano si se continua programando en ensamblador se requiere aprender a usar el DEBUG.
Tabla 4.1 DEBUG contra Ensamblador DEBUG Ensamblador

F c i l d e Difcil de ejecutar ejecutar No se Se agregan muchas lneas de cdigo al a g r e g a programa ejecutable nada al programa ejecutable M u y Nos aleja del funcionamiento interior de cercano a la la mquina mquina No es tan Muy verstil verstil Bueno para Bueno para programas grandes programas pequeos

Debug es prctico para modificar registros de la UPC, localidades de memoria, cargar, crear e iniciar programas. Para ejecutar DEBUG basta tenerlo en la memoria secundaria presente e invocarlo con la instruccin:
C>DEBUG

4-78

Las Herramientas

El guin que aparece a continuacin es el indicador de que DEBUG se encuentra en memoria activo y listo a recibir nuestros comandos.

4.4.1 Comandos
El DEBUG acepta toda una serie de comandos sencillos de una letra que describimos brevemente a continuacin: (Los argumentos entre parntesis cuadrados indican parmetros opcionales) ?. Despliega ayuda (en versiones nuevas de DEBUG). D[direccin]. Despliega, despliega la informacin de cierta rea de memoria en la pantalla (en hexadecimal). F[direccin inicial] [direccin final] [constante] E[direccin]. Introduce un programa usando cdigos hexadecimales o modifica una direccin colocando los nuevos cdigos hexadecimales. A[direccin]. Introduce un programa usando mnemotcnicos vlidos del juegos de instrucciones. G[direccin]. Ejecuta un programa en memoria. U[direccin inicial][,direccin final]. Desensambla un programa en memoria, esto es, convierte sus cdigos hexadecimal a mnemotcnicos. R[registro],. Visualiza o modifica registros de la UPC. Nnombre.extensin. Informa a Debug el nombre del programa que queremos recuperar o guardar. W. Escribe programa en memoria a disco, para esto es necesario haberle puesto nombre con el comando N e indicar su longitud (registro BX+CX) con el comando R Q. Salir del programa DEBUG. L. Carga un programa en memoria. Es preciso primero indicar qu programa queremos con el comando N. Otra alternativa es invocando el programa DEBUG [nombre programa con extensin].

4-79

Ensamblador

Ejercicio 4.1 Introduciremos un pequeo programa utilizando DEBUG y lo ejecutaremos:


C>DEBUG -E100

Introduzcamos esta serie de nmeros seguidos cada uno de la barra espaciadora: B2 1 B4 2 CD 21 CD 20. Al introducir el ltimo nmero hexadecimal presionemos la tecla de re torno en lugar de barra espaciadora. Verifiquemos: -D100 y ejecutemos: -G Ejercicio 4.2 Volvamos a introducir nuestro programa utilizando ahora los mnemotcnicos correspondientes. Por el momento no nos importa que significan. Termine cada lnea con Retorno.
-A100 MOV DL,1 MOV AH,2 INT 21 INT 20

El la ltima lnea presionamos Retorno para terminar con el programa y lo ejecutamos: -G Problema 4.1 Usando el manual de DEBUG averige cmo guardar su programa utilizando los comandos R, N, W. Ejecute ahora el programa desde el Sistema Operativo. Escoja un nombre que termine con la extensin .COM.

4-80

Las Herramientas

4.5 MASM
Para el uso de un ensamblador el primer paso consiste, como ya se mencion, en disear el programa en papel, a continuacin en pasarlo a un editor que entrega ASCII. Como ejemplo introduzcamos nuestro programa de la seccin anterior, para lo cual se requieren agregar otros comandos propios del ensamblador:
cara SEGMENT ASSUME CS:cara MOV DL,1 MOV AH,2 INT 21h INT 20h cara ENDS END

Se guarda el programa con cualquier nombre seguido de una extensin .ASM, por ejemplo PRUEBA.ASM. Ms adelante explicaremos las lneas adicionales. Lo siguiente es ensamblar el programa:
C>MASM prueba

El ensamblador pregunta por el nombre de tres archivos que por el momento ignoramos, menos el segundo (LST, listado) que dirigimos a la impresora con LPT1:. El siguiente paso es ligar el programa con las rutinas externas al programa o con otros programas pues el ensamblador slo nos entrega un archivo con extensin OBJ de objeto, cdigo que an no es ejecutable.
C>LINK prueba

Al final contaremos con un archivo llamado PRUEBA.EXE el ligador nos entrega un error que por el momento ignoramos pues no se especific el inicio de la pila en el programa. Finalmente convertimos el programa EXE a uno de tipo COM que explicaremos en la siguiente seccin:
C>EXE2BIN prueba prueba.com

4.5.1 Las Instrucciones del Ensamblador


El ensamblador cuenta con una serie de instrucciones para hacer ms fcil la tarea del programador. Estas instrucciones, conocidas como

4-81

Ensamblador

pseudo - instrucciones, no son parte del juego de instrucciones de ningn procesador en especial sino que sirven para indicar ciertas acciones al ensamblador. Analizaremos a continuacin algunas de las ms importantes.

4.5.1.1 Segmentos
La instruccin SEGMENT y ENDS informan al ensamblador en qu segmento se localiza el programa y deben contar con una etiqueta que defina el nombre. La pseudo instruccin ASSUME CS:nombre define el segmento donde se localiza el programa (definido con el registro CS, segmento de cdigo) Por qu el ensamblador no lo puede definir por s mismo? La razn no es clara pero es necesario incluir la pseudo instruccin.

4.5.1.2 END
Indica el fin del archivo de programa

4.5.1.3 Definiciones
Es necesario muchas veces definir variables, palabras, bytes, etc. para aclarar el significado de ciertas partes del cdigo. Entre las instrucciones para realizar esto tenemos EQU que asigna valores a etiquetas:
si escape EQU EQU 1 27 ;identificador si=1 ;identificador escape=27

El valor especificado puede ser tambin una asignacin completa evaluada al momento de ensamblar:
cinco seis definido) EQU EQU 2*2+1 cinco+1 ;asigna el valor a cinco de 5 ;asigna el valor de seis (cinco ya

Los nmeros pueden estar en binario (1011b), en hexadecimal (0AF2h) o en decimal (123 123d) slo es necesario colocar el identificador respectivo en cada nmero. En el caso de decimal no es necesario y en el caso hexadecimal, si comienza por letra, es necesario colocar un 0 para evitar que el ensamblador se confunda con una etiqueta.

4-82

Las Herramientas

Para la definicin de variables se utilizan las directivas DD, DB y DW. El comando DB define bytes que pueden tener un valor cualquiera entre 0 y 255 decimal:
estado xyz tipo Byte no_se tabla an tabla1 1,2,etc. tabla2 0,1,0,1,etc. DB DB DB DB DB DB 0 1,2,3 ? 5 DUP(?) 5 DUP(1,2,3,4,5) 10 DUP(0,1) ;define estado inicial ;define una zona de tres elementos ;un valor no definido an ;tabla de 5 elementos no definidos ;Tabla de 25 elementos inicializados a ;Tabla de 20 elementos inicializados a

La pseudo - instruccin DUP es opcional en operadores como DB, DW o DD y su propsito es hacer duplicado de sus argumentos. El nmero que precede a la instruccin indica cuntas veces se quiere hacer el duplicado. La directiva DW, de la misma forma que DB, define variables pero en este caso de 16 bits (una palabra o Word en ingls). El mismo caso sucede para DD que define palabras dobles o 32 bits. Estas directivas pueden tambin servir para cadenas de caracteres:
mensaje salta alarma DB DB DB Bienvenido a Ensamblador$ Salta la lnea,13,10,$ 07,Mensaje con sonido,$

Note que al final se agrega el signo de $ que indica el fin del mensaje y slo es necesario si se intenta desplegar la cadena en la pantalla.

4.6 Diferencia entre COM y EXE


Tanto los archivos tipo COM como EXE pueden ser cargados en la memoria principal y ejecutados Entonces por qu preferir uno sobre otro y cules son sus diferencias? Un archivo tipo COM es la forma ms fcil de guardar un programa ejecutable. Consiste nicamente de una serie de nmeros en binario que conforman el programa. No existe ninguna otra informacin adems del programa por lo que ocupa el menor espacio posible en memoria secundaria. Los archivos tipo EXE contienen un encabezado que contiene informacin variada requerida para funcionar, lo que hace que

4-83

Ensamblador

el programa sea un poco ms grande. Si el programa objeto es de 100 bytes, el archivo COM ser de 100 bytes, mientras que el EXE tiene una longitud mnima de 640 bytes, aun cuando el programa se forme de 1 slo byte. Puesto que son ms pequeos y compactos, los programas COM son ejecutados ms rpido. Un programa del tipo COM puede utilizar una instruccin del tipo INT 20 para terminar su ejecucin, mientras que los EXE requieren de una instruccin tipo RET. Por otro lado existen desventajas en usar archivos tipo COM: No pueden ocupar ms de 64K bytes de memoria (la longitud de un segmento) lo que puede ser desventaja para un programa muy grande. No pueden ser ligados con otros archivos restando flexibilidad al lenguaje. El propsito del programa LINK es el de unir varios programas en uno slo ejecutable lo que acarrea toda una serie de ventajas en sistemas grandes. No pueden usar con facilidad distintos segmentos de memoria, mientras que en los tipo EXE esto se realiza sumamente fcil. Se requiere de un paso extra, si usamos ensamblador, para convertir del tipo EXE a COM al tener que usar EXE2BIN. Considerando todo esto es preferible comenzar con archivos tipo COM y luego evolucionar a los del tipo EXE.

4.7 Otros
Existen en el mercado otras herramientas profesionales para la programacin en ensamblador. Incluimos tres herramientas de la categora Shareware en un disco de 3 1/2" que pueden sernos de utilidad, en especial cuando no contamos con ninguna otra para practicar. Recuerde que si el programa resulta til es muy conveniente registrarse con el autor. Recibe uno el derecho legal a usarlo, actualizaciones, manuales, etc. Vale la pena mencionar el programa Language Window (Shareware) que coloca una tabla del juego de instrucciones 80286 en la memoria y puede ser activado en cualquier momento.

4-84

Las Herramientas

4.8 Esqueleto de Programa en Ensamblador


Presentamos el esqueleto que sugerimos sea usado para ensamblar programas.
;nombre del programa ;con descripcin ;y variables utilizadas ;autor, fecha, versin ;;definiciones con la instruccin EQU ;SEGMENT STACK ;define la pila 20 DUP(pila) ;con la palabra pila ENDS ;SEGMENT ;define segmento de datos ;datos aqu con DB (datos DB

pila DB pila datos hola$) datos

ENDS ;prognom SEGMENT ;define segmento de cdigo ;principal PROC FAR ;parte principal del programa ASSUME CS:prognom, DS:datos comienzo: ;aqu programa principal ;prepara pila para el regreso PUSH DS ;salva el viejo segmento de datos SUB AX,AX ;coloca cero en AX PUSH AX ;y gurdalo ;prepara DS con segmento actual MOV AX,datos ;direccin del segmento de datos MOV DS,AX ;y guarda en registro DS ;La parte principal programa va aqu RET ;regresa al S.O. principal ENDP ;subr1 PROC NEAR ;define una subrutina ;Aqu va la subrutina subr1 ENDP ;prognom ENDS ;fin del segmento de cdigo ;END comienzo ;fin del ensamble

4-85

Ensamblador

Se debe hacer notar aqu la incializacin del segmento de pila en cuya memoria reservada se coloca la palabra pila muchas veces, de esta forma es muy claro donde comienza la pila para propsitos de espulgar el programa y nos damos inmediatamente cuenta del contenido modificado de la pila.

4.9 Resumen
Se introduce y comentan sobre las principales herramientas para ensamblar un programa: DEBUG y MASM. Estos programas son sencillos de usar pero a su vez constan de una serie de comandos que deben ser aprendidos antes de poder utilizarlos en toda su capacidad. En este captulo se establecen las reglas que sern utilizadas a lo largo del libro.

4.10 Bibliografa
Llano Emiliano Sistemas Digitales y Arquitectura de Computadoras. Unam 1993. Mercier Philippe Assembleur Facile. Marabout 1992, Alleur Blgica. Varios Macro 86. Columbia Data Products Inc. USA 1986.

4-86

Captulo 5
5.1 Entrada/Salida
La transferencia de datos entre la lgica que forma parte del sistema de computadora y aquella que est ms all de ste, se conoce en general como entrada/salida o E/S (input/output o I/O). Se incluye dentro del mbito del sistema a toda la lgica que se haya diseado para trabajar en conjuncin con la UPC. Toda aquella que no caiga dentro de esta clasificacin se le conoce como externa. La interfase entre el sistema de computacin y la lgica externa debe estar claramente definida; debe proveer de facilidades para transferir datos, adems de las seales de control que identifiquen a todos los eventos que ocurren. Hay muchas formas en las que un sistema puede transferir datos hacia el exterior; pero todos estn includos en las siguientes tres categoras: 1) E/S Programada. En este caso todas las transferencias de datos entre la computadora y el exterior son controladas por la computadora o para ser ms precisos por un programa corriendo en la computadora. Existir un protocolo bien definido en el que la computadora hace conocer a la lgica externa que los datos estn disponibles en una localidad de memoria fija de donde sta los puede tomar, o bien, la computadora indicar de alguna forma a la lgica externa que est esperando que ponga informacin en ciertas localidades de memoria para poder accesarlas. La caracterstica clave de la Entrada/Salida

5-87

Ensamblador

Programada es que la lgica externa hace exactamente lo que se le dice que haga. 2) E/S por Interrupcin. Las interrupciones son una forma que tiene la lgica externa para forzar a la computadora a poner atencin y suspender lo que est haciendo para atender a las necesidades de la lgica externa. 3) Acceso Directo a Memoria. Esta es una forma de transferir datos entre la memoria interna y los dispositivos externos sin involucrar a la Unidad de Procesamiento Central en la lgica de la transferencia.

5.2 Entrada/Salida Programada


Los datos son transferidos entre el sistema de computacin y la lgica externa, en cualquier direccin, por medio de un puerto de entrada y salida. Un puerto de entrada y salida consiste en un puerto con memoria de entrada y salida (buffer) conectado a las lneas de datos del bus del sistema y a las interconexiones que accesan a la lgica externa. Cuando la lgica externa transmite datos al sistema de cmputo, lo hace presentando los datos en las conexiones del puerto de entrada y salida, por lo que este mismo puerto almacena provisionalmente estos valores. El puerto de entrada y salida no puede estar comunicndose constantemente con las lneas del bus de datos, puesto que estas lneas pueden estar llevando informacin de o hacia la memoria. Si las conexiones del puerto de entrada y salida se comunicaran permanentemente con el bus de datos, cada vez que la lgica externa presentase datos a las conexiones de entrada y salida, los datos se propagaran por las lneas del bus de datos con consecuencias imprevisibles. La UPC debe, por lo tanto seleccionar un puerto de E/S y leer el contenido del puerto en la misma forma que lo hace de una direccin de memoria. Como los datos se leen de los puertos de E/S tal como si se tratase de una localidad de memoria, a esta forma de transferencia de E/S se le conoce tambin como E/S de mapa de memoria (memory mapped I/O). Este tipo de esquema permite a la computadora utilizar las mismas instrucciones poderosas de lectura y escritura tanto para localidades de memoria como para los puertos de Entrada/Salida. Por ejemplo, se pueden realizar operaciones aritmticas directamente con los puertos sin necesidad de almacenar los datos en memorias provisionales.

5-88

Lgica ms all de la UPC

Normalmente existe ms de un dispositivo externo por lo que debe de haber ms de un puerto de entrada y salida. Una forma rudimentaria, pero muy utilizada en sistemas pequeos, de obtener uno o ms puertos de entrada y salida consiste en dividir las lneas de direccin de la UPC entre la memoria y los puertos. Por ejemplo, si tomamos una lnea de direccin cualquiera de un sistema de microcomputadora y escogemos que cuando su valor sea 0 accese a la memoria y que cuando ste sea 1 accese a los puertos de entrada y salida, tendremos dividida la memoria en dos reas bien diferenciadas, una de las cuales nos sirve para comunicarnos con los dispositivos externos y la otra con la memoria principal. La penalidad pagada cuando una lnea de direccin es utilizada para seleccionar el buffer de un puerto de entrada y salida, es que el mapa de memoria se reduce automticamente a la mitad, lo que en la mayora de los sistemas de medios a grandes es un precio muy severo a pagar, solamente para seleccionar un puerto. Un mtodo preferido es agregar a la UPC ms lneas que controlen la transferencia de y hacia los puertos de entrada y salida. Desafortunadamente la transferencia a ciegas de datos de un sistema de computacin y la lgica externa, no siempre provee la suficiente capacidad de entrada y salida. Las siguientes caractersticas no existen en este sistema: 1.- El sistema de cmputo debe decir a la lgica externa cuando los datos han sido colocados en el buffer de entrada y salida y por lo tanto estn listos para ser ledos; de la misma forma la lgica externa debe de indicar a la computadora cuando ha colocado datos en el buffer de entrada y salida, y stos pueden ser ledos. 2.- Tanto la computadora como la lgica externa deben de tener alguna forma de informarse entre ellas la naturaleza de los datos que van a intercambiar. Claramente los datos que se estn transfiriendo pueden ser sujetos a varias interpretaciones, por ejemplo pueden ser datos puros binarios, algn cdigo que identifique alguna operacin a ejecutarse; pueden ser parte de una direccin o una direccin completa. Cuando la computadora transmite seales a la lgica externa como un medio para identificar eventos o datos se refiere a estas seales como controles de entrada y salida. La misma informacin viajando en sentido

5-89

Ensamblador

opuesto, esto es de la lgica externa hacia la computadora, se le conoce como estado de entrada y salida. La lgica externa no puede controlar a la computadora, slo puede enviar informacin de su estado para que la computadora la interprete. Los sistemas de computacin usualmente tienen toda una serie de controles de entrada y salida as como lneas de estado que son separadas y distintas de los puertos de entrada y salida. Las computadoras usualmente asignan uno o ms puertos de entrada y salida para funcionar como conductores del control y del estado, mientras que otros puertos de entrada y salida son los encargados de transferir los datos. Es solamente la forma en que la UPC interpreta los datos que hacen la diferencia entre informacin de datos, control o estado de los dispositivos.

5.3 Entrada/Salida por Interrupcin


Casi todas las UPC tienen una lnea por la cual la lgica externa puede solicitar atencin inmediata. A sta se le conoce como seal de peticin de interrupcin puesto que por medio de ella la lgica externa pide sea interrumpido lo que se est haciendo y se le preste atencin. Ntese que aunque nos hemos referido a la lgica externa entregando datos, el flujo de informacin bien puede ser en el sentido contrario. De hecho, nada nos dice que una salida o entrada de datos tenga que suceder despus de una interrupcin, bien pueden ser seales de control las que se transmitan. El propsito de la interrupcin es informar a la UPC que suspenda lo que est haciendo, procese los datos que se estn transmitiendo desde el puerto de E/S y reanude lo que suspendi. La caracterstica ms importante de toda esta serie de eventos es que son asncronos e impredecibles.

5.3.1 Respuesta de la UPC a una Interrupcin


En su forma ms elemental, la Unidad de Proceso Central puede responder a una interrupcin cargando en el registro Contador de Programa (PC) la direccin inicial del programa que atiende a la interrupcin pero esto nos deja con dos preguntas:

5-90

Lgica ms all de la UPC

Qu pasa con el programa que est en ejecucin? De dnde obtiene la UPC la direccin del programa que la lgica externa necesita que se ejecute?

El programa que se est ejecutando en memoria tiene informacin almacenada en los registros de la UPC que puede ser importante: el acumulador (A), el Contador de Programa (PC), el Contador de Datos (DC) y otros registros existentes en la UPC. Si el nuevo programa a ejecutar no tiene algn mecanismo de guardar toda esta informacin, se corre el riesgo de no poder volver a ejecutar el programa que estaba en primer lugar. Si guardamos los valores de los registros con slo restituirlos a los registros correspondientes, en especial el Contador de Programa, podemos regresar al sitio en el que suspendimos la ejecucin. Una interrupcin no se reconoce hasta terminar con la instruccin que se est ejecutando, por lo que el registro de Instruccin (I) es quiz el nico que no importe su valor pues inmediatamente es substituido por la instruccin prxima a ejecutarse. Existen dos formas de guardar la informacin necesaria para poder volver al punto donde se interrumpe un programa antes de comenzar el que atiende a la interrupcin: 1) La ejecucin de un microprograma almacenado en la Unidad de Control que automticamente guarda los registros por nosotros en un rea predeterminada de memoria. A esta rea de memoria reservada se le llama Pila (Stack) (en algunos diseos se guardan en un juego de registros paralelos). 2) Dejar que el programador ejecute primero una rutina de servicio a la interrupcin que se encarge de almacenar los datos de los registros en un lugar seguro.

Al final de la ejecucin del programa de interrupcin, no importando que mtodo est disponible, se deben realizar los pasos en orden contrario para restaurar los registros correspondientes y volver al sitio del programa donde ste fue interrumpido. Ahora consideremos la forma de obtener la direccin donde se ejecutar la rutina que atiende a la interrupcin. Si se trata de un slo caso,

5-91

Ensamblador

podemos considerar el tener una direccin de memoria fija que sepa de antemano la UPC, pero en el caso de mltiples puertos de entrada y salida esto resulta un poco imprctico. Considere la forma en que la UPC responde a una interrupcin: 1) Manda la seal de aceptacin de la interrupcin. 2) Guarda de forma automtica todos los registros o permite al usuario guardarlos de alguna manera. 3) Mueve el contenido del vector de interrupciones que manda el puerto de E/S, al Contador de Programa para comenzar a ejecutar un programa en otra localidad de memoria. 4) Realizar los pasos en sentido contrario para regresar al punto del programa donde ste fue interrumpido. Utilizar un vector de interrupciones que forme la direccin en memoria donde se encuentra el programa que atiende a la interrupcin, proporcionado por el dispositivo que interrumpe, nos permite tener gran flexibilidad al momento de definir nuestras rutinas. En forma funcional podemos comparar una interrupcin con una subrutina de un lenguaje de alto nivel.

5.3.2 Cdigo de Seleccin de un Dispositivo que Interrumpe


Otro de los esquemas muy utilizados consiste en exigir que el dispositivo que interrumpe a la UPC mande un cdigo que identifique qu puerto de E/S es el que interrumpe. Si se manda un cdigo de seleccin del dispositivo, podemos entonces accesar a una tabla en memoria que nos d el vector de direccin de interrupcin que cargaremos al Contador de Programa para ejecutar la rutina de interrupcin. Para esto se exige un poco ms de la lgica externa pues debe ser capaz de almacenar su cdigo de seleccin; existen para esto en el mercado varios tipos de circuitos programables de interfase de E/S (PIO, PIA, etc.) La secuencia de eventos es como sigue: 1. La lgica del dispositivo externo crea una seal de peticin de interrupcin que transmite a la UPC.

5-92

Lgica ms all de la UPC

2. Cuando la UPC est lista a dar servicio a la interrupcin, responde con una seal de aceptacin. 3. Al recibir la seal del procesador, la lgica del dispositivo externo coloca un cdigo de identificacin (de X nmero de bits) en el bus de datos del sistema. La UPC recibe los datos y los interpreta como un cdigo de identificacin que usa para armar la direccin donde se encuentra localizado el programa que atiende a la interrupcin en cuestin. 4. Siguiendo un protocolo especificado por el sistema, el dispositivo externo coloca ahora sus datos a travs del puerto de entrada y salida para que ste lo transmita al bus del sistema cuando se le solicite. Generalmente se pueden deshabilitar las interrupciones con alguna instruccin del juego de instrucciones que lo permita, pero existe otro tipo de interrupciones que exigen el mximo de atencin y no pueden esperar. A este tipo de interrupciones con tan alta prioridad se les conoce como no mascarillables y no pueden ser deshabilitadas. Generalmente se reserva esta lnea de muy alta prioridad a eventos tales como falla inminente de energa o un error del sistema que impide que ste pueda seguir trabajando, tal como un error de memoria.

5.4 Acceso Directo a Memoria


Como ya se observ en las secciones precedentes, el objetivo de la mayora de las operaciones de entrada y salida es la transferencia de datos entre los dispositivos externos y la UPC. Ya sea la E/S programada o la de interrupciones, se requiere de la participacin activa de la UPC, esto es, la ejecucin de instrucciones para leer o escribir tanto a los dispositivos externos como a la memoria interna (principal). Esto puede no ser tan rpido como se piensa para ciertos procesos que requieren de extremada velocidad como es el caso de la transferencia del contenido de memoria a la pantalla de visualizacin (CRT) o de y hacia la memoria de almacenamiento masivo como son los discos flexibles y duros de un sistema. Una vez ms, la solucin consiste en substituir los programas por electrnica que realice la misma funcin pero a ms velocidad. La solucin lgica consiste en disear una computadora de propsito especfico que se dedique exclusivamente a la transferencia de datos de y hacia la memoria. A tal circuito se le conoce como dispositivo de Acceso Directo a Memoria o por su siglas en ingls como DMA.

5-93

Ensamblador

Una discusin completa del tema queda fuera del rango que pretende abarcar este libro por lo que, una vez ms, referimos al lector interesado a la bibliografa para ms detalles del tema.

5.5 Realizacin en la Familia Intel


Los procesadores de la familia Intel, 80x86 y Px, no escapan a estas imposiciones de servicio y requieren de un esquema complejo de interrupciones y de acceso directo a memoria. Una de las caractersticas interesantes de este circuito es que contiene dentro de su juego de instrucciones una instruccin que nos permite simular una interrupcin por medio de programa (instruccin INT). Aunque contar con una instruccin que simule las interrupciones por programa pueda sonar extrao e innecesario en un principio, baste saber que los diseadores pasan muchas horas diseando y programando la realizacin de rutinas eficientes para muchas de las operaciones que se realizan dentro de un sistema de cmputo. Tener acceso a estas rutinas nos da gran flexibilidad y facilidad de programacin como veremos en los siguientes captulos. La lista de interrupciones y sus funciones es enorme y hay libros dedicadas a ellas. Para nuestros propsitos usaremos algunas cuantas que iremos describiendo en cada caso.

5.6 Formas de Direccionamiento


Como ya se ha mencionado, las instrucciones especifican los siguientes elementos dentro de una UPC: La operacin a realizar (suma, mueve datos, resta, etc.) Los elementos a manipular en la UPC, ya sea en la memoria o en los registros de trabajo. Para acceder a una informacin en la memoria, la UPC debe saber su direccin y su longitud. Existen distintas posibilidades de presentacin de una localidad de memoria. Analizaremos en detalle cada forma de direccionamiento pues se encuentran en casi todas las instrucciones a utilizar.

5-94

Lgica ms all de la UPC

Es importante resaltar que en ninguna instruccin (generalmente) se permite como operandos dos direcciones de memoria. Ilustraremos nuestros ejemplos con la instruccin mover (MOV, move) que es una instruccin que se encuentra en el juego de instrucciones de toda UPC. Esta instruccin se encarga del movimiento de datos de la memoria a los registros, de los registros a la memoria, de la memoria a la memoria o entre registros dependiendo de sus argumentos y del procesador que se trate. La forma general de esta instruccin es:
MOV destino, fuente

pero nada nos indica que no pueda ser exactamente al revs. El diseador tiene en esto la ltima palabra. Dentro del sistema Intel se sigue la primera convencin y la instruccin tiene cinco formas:
MOV MOV MOV MOV MOV registro, constante memoria, constante registro, memoria memoria, registro registro, registro

Ntese que no hay forma de mover entre localidades de memoria sin pasar antes por un registro. Las constantes o localidades de memoria pueden estar definidas con etiquetas si se usa un ensamblador, lo que facilita enormemente la tarea de llevar el control de estas localidades o constantes (revise pseudo instruccin ASSUME y EQU en capitulo anterior). Por el funcionamiento del procesador que estamos analizando, la direccin se divide en segmento+direccin dentro del segmento representado como: Segmento:Desplazamiento Recuerde que el registro por omisin para datos es siempre DS (segmento de datos) de forma tal que en lugar de usar
MOV MOV AX,DS:[BX] AX,DS:[SI+2]

se usa

5-95

Ensamblador

MOV MOV

AX,[BX] AX,[SI+2]

Como siempre existen excepciones que confirman la regla: Si se usa el registro BP (apuntador base), el segmento por omisin ser SS (segmento de pila). Si el programador decide usar un segmento alterno. Este se debe especificar en la instruccin:
MOV AX,CS:[BX]

La direccin efectiva o real se forma en los sistemas 80x86 desplazando 4 bits a la izquierda el contenido del registro de segmento y luego agregando el contenido del registro especificado. Si hablamos de 16 bits nos da un nmero de 20 bits (FFFFFF hexadecimal) para la direccin 1 Megabyte de memoria directa. Para las aplicaciones actuales est memoria es insuficiente por lo que se usa memoria virtual para tratar de mantener la compatibilidad con diseos anteriores a la vez que se trata de empujar el estandard a nuevas dimensiones, empantamiento que tarde o temprano tendr que romperse y crear una nueva generacin independiente. Resumiendo:
segmento 0000 (desplazado 4 bits a la izquierda) + registro direccin efectiva de 20 bits

Presentamos en la tab la 5.1 un resumen de los tipos de direccionamiento.

5-96

Lgica ms all de la UPC

Tabla 5.1 Formas de Direccionamiento Inmediata Directa Base Indice Indice y base registro valorinmediato registrodireccin de memoria registroDS:[BX] o SS:[BP] registroDS:[SI] o DS:[DI] registro[BX][SI], [BX][DI], [BX+SI], [BP][SI], [BP][DI] o [BP+SI]

Base y registroident.[BX], ident.[BP] o Desplazam [BX+constante] iento (Directo o Inmediato) Indice y Desplazam iento (Directo o Inmediato) Base, Indice y Desplazam iento (Directo o Inmediato) registro ident.[SI], ident.[DI] o [SI+constante]

registroident.[BX][SI], ident.[BX][DI], ident.[BP][SI], ident. [BP][DI]

5.6.1 Inmediata
RegistroValor inmediato El contenido de un registro es inicializado por un valor inmediato o una constante. Ejemplos:
MOV AH,12 MOV BX,1 ;AH12, AL no es afectado, ; el movimiento es de 8 bits (1 byte) ;BX1, tanto BL como BH se afectan,

5-97

Ensamblador

; movimiento de 16 bits (1 palabra)

El nombre del registro indica el nmero de bits implicados en la operacin (L o H de 8 bits=1 byte, X de 16 bits=1 palabra)

5.6.2 Directo
Registrodireccin de memoria El contenido de un registro es sustituido por el contenido de la zona de memoria apuntada por el identificador. La operacin puede ser de 8 16 bits y si los dos operandos no coinciden, se genera un error al ensamblar. Ejemplos:
;define los apuntadores a memoria Ident1 DB 2 Ident2 DW 5 Ident3 DB ? ;Operaciones de memoria a un registro MOV AH,ident1 MOV BX,ident2 ;Operaciones de registro a memoria MOV ident1,CH MOV AH,ident2 registro de 8 bits ;apuntador de 1 byte ;apuntador de 2 bytes=1 palabra ;define una zona de 1 byte ;AH2 (8 bits) :BX5 (16 bits) ;ident1CH (8 bits) ;ERROR, operacin de 16 bits a un

5.6.3 Base
RegistroDS:[BX] RegistroSS:[BP] Inicializa un registro con el contenido del rea de memoria situada en la direccin DS:[BX]. En este caso [BX] representa el contenido de la zona de memoria cuya direccin est contenida en BX. La operacin puede ser de 8 16 bits. Quedar esto ms claro con los siguientes ejemplos:
MOV MOV de la Ident1 Ident2 DB DW 2 5 ;direccin DS:0008 ;Define una zona de 1 byte :Define una zona de 2 bytes BX,8 AX,[BX] ;BX8 ;AXcontenido de la zona de memoria

5-98

Lgica ms all de la UPC

MOV MOV direccin

BX,OFFSET ident2 AX,[BX]

;BXDesplazamiento de ident2 ;AXde la zona de memoria a la ; DS:ident2 (ident2=5)

En las dos lneas precedentes obsrvese que la pseudo instruccin OFFSET indica un desplazamiento a partir de la variable. Como la variable contiene 2 se indica un desplazamiento de 2 bytes, el propio de IDENT1 (2), el de IDENT2 parte alta (0) y finalmente el de IDENT2 parte baja (5). Una forma alternativa de este direccionamiento es con el uso del registro BP con el apuntador de segmento SS:
MOV MOV BP,0AFFFh AX,[BP] ;AXcontenido de la zona de memoria ; apuntado por SS:BP (afff)

5.6.4 Indice
RegistroDS:[SI] RegistroDS:[DI] Este modo de direccionar se utiliza generalmente para las cadenas de caracteres o para aislar un elemento de una tabla o matriz. Generalmente el segmento utilizado es DS salvo en las excepciones que resaltaremos en ejemplos.
MOV SI,0 MOV AX,[SI] direccin DS:0 MOV DI,0 MOV [DI],AH DS:0contenido de AH ;AXcontenido de la memoria en la

;Zona memoria apuntado por

5-99

Ensamblador

5.6.5 Indice y base


RegistroDS:[BX][SI] RegistroDS:[BX][DI] RegistroDS:[BX+SI] RegistroSS:[BP][SI] RegistroSS:[BP][DI] RegistroSS:[BP+SI] Este tipo de direccionamiento utiliza BX y SI o DI, la base o segmento es DS. Es posible usar tambin la notacin [BX+SI], [BX+DI].
MOV MOV MOV BX,2 SI,5 AH,[BX][SI]

;AHcontenido de la direccin de ;memoria DS:7 (BX+SI)

Se habla de un segmento base puesto que frecuentemente se utiliza para referenciar los elementos de una tabla, de ah el nombre de base (del inicio de la tabla):
tabla DB MOV MOV 20 DUP(?) BX,OFFSET tabla SI,2 ;define tabla de 20 elementos ;BXdireccin base de la tabla ;Se va a leer el tercer elemento de la ;(siendo el primero 0) ;AH3er elemento de la tabla ;Apuntar al noveno elemento de la tab;AL9no elemento de la tabla

tabla MOV MOV la MOV AL,[BX][SI] AH,[BX][SI] SI,8

La segunda forma del direccionamiento ndice y base es el que utiliza a BP y SI o DI como apuntador donde SS es el segmento base por omisin.
MOV MOV MOV BP,2 SI,5 AH,[BP][SI]

;AH contenido de la memoria a ; la direccin SS:[BP+SI] (SS:5+2)

5-100

Lgica ms all de la UPC

5.6.6 Base y Desplazamiento (Directo o Inmediato)


RegistroDS:ident.[BX] RegistroSS:ident.[BP] RegistroDS:ident.[BX+constante] Una combinacin de los precedentes tipos de direccionamiento (elementos dentro de una tabla).
Ident1 DW MOV MOV 5 DUP(?) BX,2 AX,ident2[BX] ;Zona de 10 bytes (5 palabras) ;AX3er elemento de la tabla Ident2

5.6.7 Indice y Desplazamiento (Directo o Inmediato)


Registroident.[SI] Registroident.[DI] Registro[SI+constante] Otra combinacin de los precedentes (elemento dentro de un registro).
MOV MOV SI,4 AX,[SI+1] ;AXcontenido de la zona de memoria ;apuntado por DS:4+1

5.6.8 Base, Indice y Desplazamiento (Directo o Inmediato)


Registroident.[BX][SI] Registroident.[BX][DI] Registroident.[BP][SI] Registroident.[BP][DI] Registro[BX+SI+ident.] Este tipo de direccionamiento complicado es utilizado para direccionar a estructuras (elemento dentro de un registro que est dentro de una base de datos).
Ident1 DB MOV MOV MOV 2 ;Zona de 1 byte BX,5 SI,4 AX,ident1[BX][SI+1] ;AXcontenido de la zona de memoria

5-101

Ensamblador

; apuntado por DS:2+5+4+1

5.6.9 Nmero de Bits en una Instruccin


Si una direccin de memoria como [BX+1] aparece como operando, el circuito 80x86 debe saber si va a manipular a 1 2 bytes en dicha direccin. Hemos dicho que si el segundo operando lo forma un registro, ste define por completo el tipo de operacin con lo que respecta al nmero de bytes. Pero existen ciertos casos donde los operandos de la operacin no permiten intuir el nmero de bytes lo que provoca un mensaje de error al ensamblar. Por ejemplo en los siguientes casos:
MOV INC MOV [BX+1],4 [DI] [SI+2],1

Se debe de completar la instruccin como sigue: Para el caso de 1 byte


MOV INC MOV BYTE PTR [BX+1],4 BYTE PTR [DI] BYTE PTR [SI+2],1

Para los operaciones del tipo palabra


MOV INC MOV WORD PTR [BX+1],4 WORD PTR [DI] WORD PTR [SI+2],1

Donde BYTE PTR se refiere a Apuntador de Byte y WORD PTR a Apuntador de Palabra.

5.7 Resumen
Hemos dicho que un sistema de cmputo slo debe de contar con la UPC y la memoria principal. Aunque esto es estrictamente cierto, la funcionalidad del circuito sera casi nula. Es necesario, entonces, agregar toda una serie de circuitos y dispositivos que hagan que el diseo sea funcional y prctico para el que lo usa.

5-102

Lgica ms all de la UPC

La interfase a estos dispositivos y circuitos se realiza por medio de los puertos de Entrada/Salida. Es por estos puertos que la computadora se comunica y recibe informacin del mundo externo. Los diseos de las computadoras modernas toman en cuenta esta variable y tratan de integrarla dentro del circuito resultante.

5.7.1 Puntos Importantes del Captulo


La transferencia de datos entre el sistema de cmputo y el mundo externo se le conoce como Entrada y Salida (E/S o I/O). La E/S se puede dividir en Programada, por Interrupciones y Acceso Directo a Memoria (DMA). La E/S programada es conocida tambin como E/S de mapa de memoria pues se divide el mapa de memoria entre memoria y dispositivos de E/S. Para evitar dividir el mapa de memoria se prefiere agregar ms lneas de control a la UPC que seleccionen entre la memoria y los dispositivos de E/S. La E/S por Interrupcin solicita al sistema su atencin por medio de una lnea la atencin. Si la UPC es interrumpida debe de realizar una secuencia ordenada antes de atender a la interrupcin y esto incluye entre otras cosas el preservar el contenido de los registros. El dispositivo externo que interrumpe debe proporcionar un cdigo de dispositivo o un vector de interrupciones que es la direccin donde se encuentra el programa que atiende al dispositivo. El DMA consiste en guardar o leer datos de la memoria principal sin la intervencin de la UPC. Para esto, es necesario generar todas las seales que requiere la memoria y que en condiciones normales genera la propia UPC. Existen varias formas de componer una instruccon:directa, base, ndice y las combinaciones de las anteriores.

5-103

Ensamblador

5.8 Instrucciones Analizadas


INT, MOV

5.9 Problemas
5.1 Justifique la decisin de los diseadores de conservar el esquema de memoria real de slo 1 megabyte en lugar de los 4 gigabytes accesables por los modelos 386, 486, P5 y P6. 5.2 Ensamble todos los pedazos de cdigo en el ensamblador agregando las pseudo instrucciones necesarias y depure hasta no obtener ningn error. No importa que el programa no tenga sentido y que no se pueda ver el resultado. 5.3 Intente ahora introducir los pedazos de cdigo desde DEBUG. Ahora s podemos ver los resultados de las transferencias utilizando las instrucciones adecuadas del programa DEBUG. 5.4 Investigue las mejoras de diseo de las siguientes generaciones: 486 a P5, P5 a P6.

5.10 Bibliografa
Llano Emiliano Sistemas Digitales y Arquitectura de Computadoras. Unam 1993. Captulo 12 y 14. Mercier Philippe Assembleur Facile. Marabout 1992, Alleur Blgica. Captulo 1.

5-104

Captulo 6
6.1 Ms sobre Interrupciones
Todos los diseos de computadoras incluyen la previsin de interrupciones electrnicas. Lo novedoso del circuito 80x86 es la inclusin de estas mismas interrupciones electrnicas pero dentro del juego de instrucciones del circuito lo que permite el acceso a las utileras diseadas cuidadosamente (algunas no tanto) que hacen que el programar en ensamblador se simplifique. La instruccin de interrupcin (INT realiza dentro del la UPC todos los pasos de una interrupcin generada por un dispositivo de E/S y transfiere la ejecucin del programa principal a la subrutina de interrupcin apuntada por la direccin encontrada en el vector de interrupciones que se pasa como argumento de la instruccin. Los vectores de interrupcin se encuentran en las localidades bajas de memoria, de la direccin 00000h a la 00400h (1Kbyte), formando as 256 vectores de interrupcin cada uno de 32 bits (segmento:direccin). Por ejemplo si empleamos la instruccin INT 20, informamos a la UPC que se transfiera control a la subrutina cuya direccin encontramos en la localidad 20*4=80 decimal 40h. Se debe seguir la convencin de byte menos significativo primero, esto es, byte bajo de direccin, byte alto de direccin, byte bajo de segmento, byte alto de segmento. Una lista completa de las interrupciones se encuentra en la seccin de ROM del manual IBM Personal Computer Technical Reference. Para pasar parmetros a la subrutina de interrupcin se utilizan los registros, cada uno de ellos con una funcin distinta segn el caso. El

6-105

Ensamblador

llamar a una interrupcin hace que el procesador guarde la direccin de regreso (CS e IP) junto con las banderas en la pila. Afecta tambin a las banderas IF (bandera de interrupcin) y TF (bandera de trampa o paso a paso). Ejemplo 6.1. Ilustraremos aqu el punto con un breve ejemplo ya considerado en el captulo 4 seccin 4.4.1. En ese punto no se explic la funcin del programa, pero aqu ya tenemos todos los elementos necesarios para comprender su funcin y colocar los comentarios:
MOV MOV pantalla INT INT sor 20h 21h ;Funcin de despliegue ;Regresa control a programa superviDL,1 AH,2 ;Valor ASCII a desplegar ;Despliega un carcter ASCII en la

Dando por resultado que el programa despliegue una cara feliz en un punto x de la pantalla, sobre el cual por el momento no tenemos control, y regrese al programa supervisor, en este caso, DEBUG. En este punto es necesario introducir el programa de nuevo a la computadora usando DEBUG. Hemos pues aprendido el vector de interrupciones que los diseadores del ROM de IBM utilizaron para definir la interrupcin de la pantalla (21h) y la de fin de programa que llama (20h). Si consultamos la tabla del captulo 3 de cdigos ASCII, podemos ahora variar el carcter a desplegar modificando la primera instruccin.

6.2 Saltos Incondicionales (JMP)


Qu pasara si en lugar de una cara feliz queremos muchas? Requerimos pues de introducir una nueva instruccin: JMP. Esta instruccin salta a la localidad de memoria que se le in dica a continuacin como argumento. Si empleamos el ensamblador podemos usar direcciones simblicas definidas previamente:
Aqui: MOV MOV INT JMP DL,1 AH,2 21h aqui

6-106

Explorando el Ensamblador

Si se emplea el DEBUG se debe de especificar la direccin:


-a100 MOV MOV INT JMP DL,1 AH,2 21 0100

Desensamble el programa para asegurarse de que lo tecle bien:


-u100,106 1649:0100 B201 1649:0102 B402 1649:0104 CD21 1649:0106 EBF8 MOV DL,1 MOV AH,2 INT 21 JMP 0100

Al ejecutar el programa (-g) la pantalla se llena inmediatamente de caras felices. Para interrumpir el programa presionamos la tecla de CTRL y la de BREAK a la vez. Esto genera una interrupcin de teclado que al ser atendida reconoce la secuencia de teclas e interrumpe el programa regresando control al programa supervisor. Los saltos pueden ser incondicionales o condicionales y a su vez dividirse en tres tipos: Cortos. La direccin est representada en 8 bits, por lo que cae entre las direcciones comprendidas a -128 y +127 bytes de la direccin de donde se realiza el salto. Cercanos. Se representa en 16 bits por lo que van dentro del mismo segmento a -32,767 +32,768 bytes de distancia. Lejanos. A otro segmento. Se representan por 32 bits y los registros IP y CS son modificados. De ndice. Pueden ser cortos o cercanos y toman la forma de JMP registro o JMP memoria. Se usan en general para salto indirecto usando como apuntador un ndice contenido en un registro o en una localidad de memoria:
Salta DW DW DW DW MOV JMP uno dos tres cuatro BX,escoge Salta[BX] ;define tabla de etiquetas

;Coloca en BX la opcin ;Salta a Uno si escoge=0

6-107

Ensamblador

uno: dos:

;a Dos si escoge=1, etc. ;instrucciones para opcin Uno ;instrucciones para opcin Dos, etc.

Trataremos por el momento con saltos incondicionales. Observemos detenidamente los cdigos que nos entrega el programa DEBUG: B201, B402, CD21, EBF8. Por deduccin podemos inferir que B2 corresponde el nmero hexadecimal a la instruccin MOV, CD el de INT y EB al de JMP. Pero por qu en la instruccin JMP el programa coloca F8 en lugar de la direccin 100 que es a la que estamos saltando para continuar con la ejecucin del programa? Recordemos que estamos saltando a unas cuantas instrucciones atrs y por lo tanto es un salto corto definible en 1 byte. Si se tratase de un salto hacia adelante de 8 bytes, el cdigo correspondera a EB08, pero ste es un salto hacia atrs y por lo tanto negativo de 8 bytes que corresponde a F8.

6.3 Incrementando Registros y Memoria (INC)


Podemos introducir una nueva variante al programa dejando que despliege toda la serie de caracteres ASCII en lugar de uno slo:
MOV MOV INT INC JMP DL,00 AH,02 21 DL 0102

Lo que nos lleva a una nueva instruccin: INC. Esta instruccin incrementa un registro o la memoria en una unidad. La bandera CF no es afectada nunca por esta operacin pero s las banderas de cero y saturacin (ZF, SF) son modificadas de acuerdo al resultado. Ejemplos:
INC INC INC INC BX AL variable tabla[BX] ;Operacin de 2 bytes ;Operacin de 1 byte ;Incrementa una direccin ;Incrementa un elemento de una tabla

Recuerde que en nuestro programa muestra se realiza una operacin de 1 byte y el nmero mximo que se obtiene es de FFh 255 la siguiente operacin de incremento regresa el contador a 0 y vuelve a comenzar la cuenta.

6-108

Explorando el Ensamblador

Ejercicio. 5.2 Deje ejecutar el programa por un tiempo aleatorio e interrumpa. Visualice el contenido de los registros utilizando la instruccin r del DEBUG.

6.4 Lazos (LOOP)


Nuestro programa va mejorando pero an falta mucho para lograr el control deseado. Una nueva mejora sera controlar el nmero de veces que el programa pasa por un conjunto de operaciones. Si modificamos el programa de la siguiente manera podemos lograrlo:
MOV MOV MOV INT INC LOOP INT CX,0100 DL,00 AH,02 21 DL 0105 20

Se introduce un nuevo elemento de programacin: la instruccin LOOP. Est instruccin realiza un salto condicional a la direccin indicada mientras un contador, en el registro CX, no cumpla con cierta condicin. En este caso la condicin es: No saltar cuando CX=0. Esta instruccin no afecta a las banderas pero si decrementa el registro CX de forma automtica. ATENCION: Si el contador CX se encuentra en cero, la instruccin LOOP decrementa al registro antes de realizar la comparacin por lo que recorreremos el cdigo 256 veces! Se puede usar la instruccin de salto condicional JCXZ (Jump if CX zero, salta si CX es cero) antes de entrar al lazo:
JCXZ repite: ... LOOP no_entra: repite ;no entrar al lazo no_entra ;prueba CX ;instrucciones del lazo

Note que en este caso al estar usando DEBUG, la primera instruccin introduce en CX un contador de 256 decimal.

6-109

Ensamblador

Ejercicio 5.3 Agregar las lineas necesarias para ensamblar con MASM y ensamble. Utilice pseudo instrucciones especficas para los contadores y direcciones. La instruccin LOOP tiene dos variantes: LOOPE. Realiza el lazo mientas CX<>0 y ZF=1 LOOPNE. Realiza el bucle mientras CX<>0 y ZF=0 Se debe tener cuidado con las banderas pues un cdigo aparentemente correcto a primera vista no funcionar:
MOV cadena Busca: CMP AL,[SI] almacenada en AL INC SI comparar LOOPNE busca ;Compara con una cadena ;Prepara para la siguiente cadena a ;Busca hasta encontrar cadena SI,OFFSET cadena ;En SI lleva el apuntador a una

La instruccin CMP compara las dos cadenas y modifica las banderas de acuerdo al resultado (ver siguiente seccin), pero la siguiente instruccin es una operacin aritmtica que vuelve a modificar las banderas, en este caso la que ms nos interesa, la bandera de cero (ZF) por lo que LOOPNE no puede salir del bucle nunca.

6.5 Saltos Condicionales y Comparaciones


Existen muchos casos en programacin en los cuales no nos es suficiente un salto incondicional a una direccin predeterminada, sino que deseamos saltar slo si se cumple alguna condicin previa. Para estos casos, los diseadores del circuito proveen de los saltos condicionales que pueden ir desde unos cuantos hasta una gran variedad como en los diseos modernos. Todos los saltos condicionales dependen de las banderas para hacer sus pruebas por lo que es necesario modificarlas de alguna forma (con alguna instruccin) antes de hacer la prueba de salto. La instruccin preferida es CMP:
CMP CMP Registro,Constante Memoria,Constante

6-110

Explorando el Ensamblador

CMP CMP CMP

Registro,Memoria Memoria,Registro Registro,Registro

La operacin realiza una resta sin modificar ni el destino ni la fuente pero s modificando las banderas de acuerdo al resultado. Por ejemplo:
MOV CMP AH,5 AH,6 ;-AH+6

AH=05h=0000 0101 1111 1011 en complemento a 2. 1111 1011+0000 0110 = 1 0000 0001 por lo que las banderas modificadas sern: OF=0 (no hay desbordamiento), SF=0 (ltimo bit del byte o signo), ZF=0 (el resultado es diferente a 0) y CF=1 (puesto que hay un acarreo). Se debe poner cuidado en operaciones indefinidas:
CMP [BX],1 ;Operacin indefinida

Se define poniendo el tipo de apuntador:


CMP CMP BYTE PTR [BX],1 ;Del tipo Byte -[BX]+1 BYTE WORD [BX],1;Del tipo Word (2 bytes) -[BX]+1

El juego de instrucciones del circuito 80x86 nos ofrece una amplia gama de saltos condicionales divididos en tres categoras genricas: Comparacin de banderas Comparacin entre nmeros sin signo Comparacin entre nmeros con signo Para la comparacin de banderas, todas las instrucciones toman la forma J.. identificador donde J.. en el mnemnico de la instruccin e identificador es una etiqueta o direccin localizada en un intervalo de +128 a -127 bytes de distancia.

6-111

Ensamblador

Tabla 6.1 Comparacin de Banderas Instruccin Condicin Significado Salta si ZF=1 (Jump if Zero) JZ Salta si ZF=1 (Jump if Equal) JE Salta si ZF=0 (Jump if Not Zero) JNZ Salta si ZF=0 (Jump if Not Equal) JNE Salta si CF=1 (Jump if Carry) JC Salta si CF=0 (Jump if Not Carry) JNC Salta si SF=1 (Jump if Sign) JS Salta si SF=0 (Jump if Not Sign) JNS Salta si OF=1 (Jump if Overflow) JO Salta si OF=0 (Jump if Not Overflow) JNO

Sabemos que en las comparaciones aritmticas sin signo la bandera CF=1 indica un desbordamiento de capacidad. Si comparamos dos nmeros A y B con la instruccin CMP (-A+B) y encontramos un desbordamiento, esto nos indica que A<B puesto que el complemento a 2 de A es un nmero positivo muy grande que al sumarse a B nos da un desbordamiento. De la misma forma si A>B no habr desbordamiento y si A=B el indicador de cero (ZF) ser 1.
Tabla 6.2 Comparacin de Nmeros sin Signo
Salta si A>B Instruccin JNBE o JA (Jump if not Below or Equal,, Jump if Above) JNB, JAE o JNC (Jump if Not Below, Jump if Above or Equal, Jump if Not Carry) JBE o JNA (Jump if Below or Equal, Jump if Not Above or Equal) JB, JNAE o JC (Jump if Below, Jump if Not Above or Equal,, Jump if Carry) JE o JZ (Jump if Equal, Jump if Zero) JNE o JNZ (Jump if Not Equal, Jump if Zero) Valor de la bandera CF=0 y ZF=0

A>=B

CF=0

A<=B

(CF=1 y ZF=1) o (CF<>ZF) CF=1

A<B

A=B

ZF=1

A<>B

ZF=0

6-112

Explorando el Ensamblador

A diferencia del grupo anterior, los siguientes saltos condicionales toman en cuenta operaciones con signo.

Tabla 6.3 Comparacin de Nmeros con Signo


Salta si A>B Instruccin JG o JNLE (Jump if Greater, Jump if Not Less or Equal) JGE o JNL (Jump if Greater or Equal, Jump if Not Less) JNG o JLE (Jump if Not Greater, Jump if Less or Equal) JNGE o JL (Jump if Not Greater or Equal, Jump if Less) JE o JZ (Jump if Equal, Jump if Zero) JNE o JNZ (Jump if Not Equal, Jump if Not Zero) Valor de la bandera (ZF=0 y OF=SF)

A>=B

SF=OF

A<=B

(ZF=0 y SF=OF) o (ZF=1 y SF=OF) o (ZF=0 y SF<>OF) (SF<>OF)

A<B

A=B

ZF=1

A<>B

ZF=0

En un ejemplo notaremos la importancia de seleccionar un grupo u otro:


MOV CMP JB AH,0FFh AH,0 sigue ;Compara FF con 0 ;Comparacin sin signo ;Salta si menor

La instruccin JB no provocar el salto pues 255 no es inferior a 0.


MOV CMP JL AH,0FFh AH,0 sigue ;Compara FF con 0 ;Comparacin con signo ;Salta si menor

En este caso si hay un salto pues -1 (0FFh en aritmtica con signo) es menor que 0. Todos los saltos condicionales dentro del juegos de instrucciones del circuito 80x86 son saltos cortos, esto es, a -127 +128 bytes de distancia y no modifican las banderas. Por lo que si se requiere un salto largo se debe de emplear un truco, en lugar de:

6-113

Ensamblador

JL ... ... ... sigue:

sigue ;Serie de instrucciones ;que dan ms de 128 bytes ;(error sealado por el ensamblador)

Usaremos:
JGE JMP sigue1: ... sigue: sigue1 sigue ;Instruccin contraria a JL ;Serie de instrucciones ;que dan ms de 128 bytes

6.6 Operaciones Lgicas (AND, OR, NOT, XOR, TEST, NEG)


Existen cierto tipo de instrucciones muy prximas a la lgica de la mquina, en especial a las que realiza la UAL, que permiten manipular los bits individuales de maneras extraas y muy prcticas. Todas tienen las siguientes combinaciones posibles:
Mnemnico Mnemnico Mnemnico Mnemnico Mnemnico Registro, Valor Memoria, Valor Registro, Memoria Memoria, Registro Registro, Registro

Donde Registro es un registro interno de trabajo de 8 16 bits, Valor es una constante o valor y Memoria es una direccin de memoria o apuntador a una. Todas las operaciones lgicas son realizadas bit a bit.

6.6.1 Y Lgico (AND)


La primera que analizaremos es la operacin Y (AND) que nos entrega un 1 si los dos operadores son 1 y un 0 si cualquiera de ellos es cero. Se utiliza muy a menudo para aislar ciertos bits de un byte o para poner en cero ciertos bits de un byte. Una de las aplicaciones menos utilizadas de la operacin Y Lgica es obtener el residuo de una resta:
Calcule el residuo de 29/8 00001 1101 (29) 0000 0111 (divisor-1=7)

AND

6-114

Explorando el Ensamblador

0000 0101 (residuo de 5)

Cuando se trata de eliminar ciertos bits y otros no, se le nombra al operador de Y Lgico mascarilla. Un cero en la mscara nos dar por resultado un cero y un uno conserva el valor original del operando:
AND bits 1 y 2 AND 4 AX,0FBh ;Usa mascarilla para eliminar bits 2 y AX,6 ;Usa mascarilla (6) para conservar

Ejercicio 6.2 Diga cuales de las siguientes instrucciones son incorrectas y por qu.
AND AND 6,AX AX,BH

6.6.2 O Lgico (OR)


La operacin O (OR) da por resultado un 1 si cualesquiera de los dos operadores es un uno. La mascarilla en este caso sirve para forzar ciertos bits a 1 lgico. Ejercicio 6.3 Diga cuales de las siguientes instrucciones son incorrectas y por qu.
OR OR OR AX,0104h 014h,AX BH,AX

6.6.3 No Lgico
En este caso la operacin da por resultado el contrario de lo que tenamos en un principio; esto es, si hay un 1 tendremos un 0 y si hay un cero un 1. La operacin toma la forma
NOT NOT Registro Memoria

6.6.4 O Exclusivo Lgico (XOR)


Esta operacin da por resultado un 1 si los bits son diferentes y un 0 si son iguales. Un uso comn de la instruccin XOR es para colocar rpidamente un registro en cero:
XOR AX,AX ;Coloca AX en cero

Puede utilizarse tambin para invertir (complementar) uno o ms bits con una mascarilla:

6-115

Ensamblador

XOR

AH,6

;Complementa bits 1 y 2 de AH

Esta instruccin es muy usada en programas grficos donde se desea pasear una figura por un fondo sin destruir ste.

6.6.5 Prueba Lgica (TEST)


La prueba lgica es el equivalente a la operacin Y (AND) sin modificar los operadores pero alterando las banderas de acuerdo al resultado. Es comparable a la operacin CMP para comparaciones lgicas.

6.6.6 Las Banderas


En todas las operaciones lgicas se modifican las banderas, a excepcin de la operacin TEST que es una prueba no destructiva, de la siguiente forma: Las banderas CF (acarreo) y OF (saturacin) siempre son cero puesto que las operaciones no son aritmticas. El indicador AF (auxiliar) queda indeterminado y no se usa. Los indicadores SF (signo), ZF (cero) y PF (paridad) se modifican de acuerdo a los operadores. La operacin NO (NOT) es una excepcin a lo anterior pues no modifica las banderas.

6.6.7 Complemento a 2 (NEG)


Con esta operacin realizamos la negacin de cada uno de los bits de un byte o palabra y luego la suma de 1 (el complemento a 2) en un slo paso. Las formas permitidas de la operacin son:
NEG NEG Registro Memoria

Como ejemplos tenemos:


MOV NEG NEG AX,5 AX AX ;AX=-5 ;AX=5

Nuevamente hay que tener cuidado con los operadores indeterminados:

6-116

Explorando el Ensamblador

NEG NEG NEG

[BX] BYTE PTR [BX] WORD PTR [BX]

;Es byte o palabra? ;byte ;palabra

6.7 El Mundo Externo: IN y OUT


La UPC pasa una gran parte del tiempo comunicndose con los dispositivos externos o atendiendo sus demandas por medio de las rutinas de interrupcin. El ensamblador da el control de todos estos recursos al programador y permite funciones que en lenguajes de alto nivel es muy difcil o imposible realizar. Para ilustrar el punto supongamos que queremos controlar con precisin la forma en que la bocina de nuestra computadora personal emite sonidos (ampliaremos el concepto en captulos subsecuentes). Para poder controlar el mundo externo necesitamos introducir las instrucciones IN y OUT. Estas instrucciones son la nica forma en que un lenguaje en ensamblador puede comunicarse con un puerto externo y son muy comunes en todos los circuitos de microcomputadoras.

6.7.1 La instruccin OUT


Esta instruccin enva un byte o una palabra a un puerto.
OUT OUT Puerto, AL Puerto, AX ;enva byte a puerto ;enva palabra a puerto

El nmero de puerto puede ser enviado tambin al registro DX:


MOV OUT identificado por DX DX,puertonum DX,AL ;el nmero de puerto a DX ;enva contenido de AL al puerto

La instruccin no afecta ninguna bandera.

6.7.2 La instruccin IN
Al contrario de la instruccin OUT, IN recibe un byte o palabra de un puerto externo:
IN IN AX Puerto, AL Puerto, AX ;recibe byte de puerto y coloca en AL ;recibe palabra de puerto y coloca en

El nmero de puerto puede ser enviado tambin al registro DX:


MOV DX,puertonum ;el nmero de puerto a DX

6-117

Ensamblador

IN DX,AL por DX y coloca en AL

;recibe byte de puerto identificado

La instruccin no afecta ninguna bandera.

Introduzcamos el siguiente programa desde DEBUG:


IN AND XOR OUT MOV LOOP JMP AL,61 AL,fc AL,2 61,AL CX,140 10b 104

Asegrese de las instrucciones con el comando U y antes de ejecutar salve el programa


-nsonido.com -rbx BX 0000 : -rcx CX 0000 :f -w Writing 000F bytes

El programa no puede interrumpirse una vez que se ejecuta pero es ilustrativo de ciertos conceptos que redondean este captulo. No podemos utilizar la instruccin de interrupcin puesto que los diseadores no pensaron que fuese importante contar con una rutina de interrupcin para la bocina. Comentemos ahora el programa:
bocina EQU 61h ;puerto que controla la bocina quita EQU 0fch ;mscara para quitar bits 0 y 1 ;el bit 0 controla un oscilador que queremos apagar y el bit 1 se conecta a una compuerta ;que genera el pulso que se enva a la bocina alterna EQU 02h ;mscara para alternar bit 1 ;y generar sonido pulsante retraso EQU 140h ;retraso para poder escuchar el sonido IN AL,bocina ;

6-118

Explorando el Ensamblador

AND sigue: XOR OUT MOV repite: LOOP JMP

AL,quita AL,alterna bocina,AL CX,retraso repite sigue

;apaga oscilador y compuerta ;apaga y prende la compuerta ;marca la frecuencia ;pierde el tiempo ;repite el proceso

Ejercicio 6.4 Introduzca el programa anterior en MASM agregando todas las pseudo instrucciones que vengan al caso. Ejercicio 6.5 Vare el retraso y comente sobre el resultado.

6.8 Resumen
Las interrupciones forman el trabajo principal y el cuello de botella de la UPC. El circuito de INTEL nos permite tener acceso a las mismas rutinas de interrupcin diseadas por los fabricantes del SO dandonos muchas ventajas. Los saltos dentro de un segmento de cdigo de programa pueden dividirese en incondicionales y condicionales y a su vez los incondicionales dependiendo el signo. Las mscaras son patrones de bits que nos permiten eliminar ciertas secuencias de un byte que no nos interesan. Las instrucciones de IN y OUT nos permiten tener acceso de forma directa a los dispositivos externos.

6.9 Instrucciones Analizadas


INT, JMP, INC, LOOP, JCXZ, LOOPE, LOOPNE, CMP, JZ, JE, JNZ, JNE, JC, JNC, JS, JNS, JO, JNO, JNBE, JA, JNB, JAE, JBE, JNA, JB, JNAE, JG, JNLE, JGE, JNL, JNG, JLE, JNGE, JL, AND, OR, NOT, XOR, TEST, NEG, IN, OUT.

6.9 Problemas
6.1 Averigue algunas de las interrupciones prcticas dentro del sistema operativo MS-DOS.

6-119

Ensamblador

6.2 Utilice las interrupciones aprendidas en su ventaja modificando el programa del ejercicio 6.1. 6.3 Modifique el programa del ejercicio 6.1 para que limpie la pantalla y luego coloque una cara sonriente en la mitad de la pantalla.

6.10 Bibliografa
Mercier Philippe Assembleur Facile. Marabout 1992, Alleur Blgica. Barden William Jr. How to Program Microcomputers. Sams & Company 1987. Lafore Robert Assembly Language Primer for the IBM PC. The Waite Group 1992. IBM Personal Computer Technical Reference.

6-120

Captulo 7
7.1 El Sistema Operativo
En todo sistema de cmputo existe una relacin ntima entre los programas en ensamblador y el sistema operativo (SO) que se ejecuta en la computadora. En los sistemas personales el sistema operativo reside principalmente en el disco ya sea duro o flexible y recibe el nombre de DOS(Disk Operating System). Como ya sabemos el propsito principal del SO es administrar a otros programas, mantendindolos en reas especficas de memoria secundaria para su almacenamiento o en memoria principal para su ejecucin. Provee las funciones bsicas de impresin, despliegue, almacenaje, etc. A todas estas funciones slo se puede acceder en su nivel ms bajo a travs del lenguaje ensamblador. En un principio la persona que se deba entender con el SO deba tener un ntimo conocimiento de la mquina. Por ejemplo, si se deseaba guardar un archivo en disco flexible, se deba saber al detalle dnde se localizaba cada byte en el disco, el tiempo que tarda en dar una revolucin, cuanto tarda el motor de pasos en llegar a una pista determinada, etc. Como se puede imaginar, los programas se convertan en programas muy largos y complejos. Si por cualquier causa cambiaban los dispositivos, todo deba de ser reescrito. Si el SO de todas formas deba de tener rutinas de manejo de todos los dispositivos conectados a la mquina. Por qu no hacer las rutinas del SO accesibles a los otros programas? La idea detrs del SO cae dentro de esta pregunta. De esta forma si se desea escribir un carcter a la pantalla no se debe saber ya nada del circuito que la controla sino nicamente la

7-121

Ensamblador

informacin de la rutina que lo puede hacer y cmo decirle qu queremos hacer. De esta forma, al llamar una rutina del SO, nuestra tarea se convierte de una de extrema complejidad a una de moderada a poca dificultad. Todas estas rutinas de control de perifricos residen en una memoria ROM que forma parte del BIOS de la computadora y a la que podemos tener acceso de forma ilimitada. Analizaremos a lo largo del capitulo diversas utileras del BIOS que nos sern de utilidad posteriormente.

7.2 El Teclado
La rutina de interrupcin que atiende al teclado es la 21h entrando con el registro AH en 1 y regresando en AL al carcter ledo. El uso de las teclas CTRL y BREAK interrumpe la rutina. Ejercicio 7.1 Introduzca los siguientes ejemplos usando DEBUG. No olvide revisar el registro AL para ver el cdigo ASCII de la tecla que se presion.
MOV INT INT AH,1 21 20

Se puede utilizar un salto incondicional para introducir una oracin completa:


MOV INT JMP AH,1 21 100

Mientras estamos en la rutina de interrupcin del teclado podemos revisar las funciones de edicin que la rutina nos proporciona como es el borrado de caracteres, el empleo de teclas de control, etc. Se puede obligar a la rutina del teclado a guardar la informacin en una memoria intermedia. Para esto es necesario pasar como parmetro 0Ah en el registro AH y en los registros DS:DX la direccin de la memoria intermedia de almacenaje (buffer) en cuyo primer byte debemos guardar el mximo nmero de caracteres a leer del teclado. La rutina nos regresa en el segundo byte de la memoria de almacenaje el nmero de caracteres ledos del teclado.

7-122

El Mundo Exterior

Ejercicio 7.2 Introduzca y ejecute el siguiente programa en DEBUG:


MOV MOV INT INT DB DX,109 AH,a 21 20 20

Examine el resultado con la instruccin D. Ejercicio 7.3 Convierta el programa del ejercicio 7.2 a MASM aadiendo las pseudo instrucciones requeridas. No olvide inicializar el registro de segmento de datos (DS) con la direccin apropiada usando SEGMENT.

7.3 La Pantalla
Para desplegar una serie de caracteres podemos utilizar la rutina 21h nuevamente pero ahora colocamos en el registro AH un 9 y en DS:DX colocamos el inicio de la cadena a desplegar terminada por un signo de pesos ($). Ejercicio 7.4 Introduzca el siguiente programa en DEBUG a partir de la direccin 0100.
MOV MOV INT INT DB DX,109 AH,9 21 20 Ejemplo de cadena impresa$

Ejercicio 7.5 Introduzca el programa del ejercicio 7.4 pero con las pseudo instrucciones requeridas para el ensamblador MASM. No se olvide de inicializar el segmento DS de donde se toma la direccin de la cadena a desplegar. Unamos las funciones aprendidas para realizar un programa que haga eco a la pantalla de lo que se teclea. Sabemos ya que para que la funcin de despliegue sepa donde termina la cadena sta debe de finalizar con $ por lo que en este sencillo programa nosotros debemos de introducirlo:
MOV MOV INT DX,116 AH,a 21

7-123

Ensamblador

MOV MOV MOV MOV INT INT DB

DL,a AH,2 DX,118 AH,9 21 20 30

El programa anterior en MASM:


;Programa que acepta caracters del teclado y hace eco a la pantalla ;No olvide terminar la cadena de caracteres con $ teclado EQU 0Ah ;funcin del teclado pantalla EQU 02h ;funcin de la pantalla lf_cr EQU 0Ah ;alimentacin de lnea muestra EQU 09h ;funcin de despliegue dos EQU 21h ;Llamada del SO fin EQU 20h ;Termina y vuelve al SO ; datos SEGMENT memoria DB 20 ;20 bytes para memoria de teclado ; a partir de esta localidad datos ENDS ; programa SEGMENT ASSUME CS:programa ;informa a MASM dnde estamos ASSUME DS:datos ;y dnde est el buffer ORG 0100h ;fija el origen a direccin 100 inicio: MOV DX,OFFSET memoria ;direccin de buffer MOV AH,teclado INT dos ;interrupciones varias MOV DL,lf_cr ;agrega alimentacin de lnea MOV AH,pantalla INT dos ;interrupciones varias MOV DX,OFFSET memoria+2 ;salta primeros 2 bytes de buffer de teclado MOV AH,muestra ;despliegua en pantalla INT dos INT fin ;termina y regresa a SO ; programa ENDS

7-124

El Mundo Exterior

;****************************************************************** END inicio

Aparentemente ms complicado pero mucho ms fcil de entender y mantener.

7.4 La Impresora
Como para las funciones anteriores, esta vez usamos la interrupcin 21h, pero enviamos un 5 en el registro AH y en DL el carcter a imprimir. En el siguiente ejemplo mostramos una forma muy primitiva de enviar una cadena a la impresora.
MOV MOV INT MOV MOV INT MOV INT MOV MOV INT INT DB DL,[122] AH,05 21 DL,[123] AH,05 21 DL,[124] 21 DL,[125] AH,05 21 20 si,0d,0a

Claro que una mejor versin es inmediata usando direccionamiento indirecto:


MOV MOV MOV MOV INT INC LOOP INT DB CX,40 BX,111 DL,[BX] AH,05 21 BX 0106 20 Un mensaje a imprimir de 40 caracteres,0d,0a

Que para el MASM queda:


;Programa para impresin de caracteres imprime EQU cuenta EQU a imprimir 05h 40 ;funcin de impresora ;Lleva la cuenta de la cadena

7-125

Ensamblador

dos EQU 21h ;Llamada del SO fin EQU 20h ;Termina y vuelve al SO ; datos SEGMENT cadena DB Mensaje de 40 caracteres,0Dh,0Ah datos ENDS ; programa SEGMENT ASSUME CS:programa ;informa a MASM dnde estamos ASSUME DS:datos ;y dnde estn los datos ORG 0100h ;fija el origen a direccin 100 inicio: MOV CX,cuenta MOV BX,OFFSET cadena ;direccin de mensaje ciclo: MOV DL,[BX] ;direccin carcter a imprimir MOV AH,imprime INT dos ;interrupciones varias INC BX ;apunta a siguiente carcter LOOP ciclo ;y v a imprimirlo INT fin ;termina y regresa a SO ; programa ENDS ;****************************************************************** END inicio

Presentamos a continuacin un programa para mandar cdigos de control a la impresora:


MOV MOV MOV MOV INT INC LOOP INT DB CX,2 BX,0111 DL,[BX] AH,05 21 BX 0106 20 1b,E

Observe que en la ltima lnea definimos el carcter de control para modo enfatizado de una impresora EPSON o compatible y puede ser sustitudo por cualquier otro cdigo.

7-126

El Mundo Exterior

7.5 Los Corrimientos y Operaciones Aritmticas


Comenzamos esta seccin con un sencillo programa que convierte un nmero en binario a dgitos hexadecimales en su equivalente ASCII y lo despliega en la pantalla. Integraremos finalmente el programa en uno slo que convierte de decimal a hexadecimal:
;Programa para convertir binario a hexadecimal (ASCII) muestra EQU 02h ;funcin de despliegue cuenta EQU 4 ;Lleva cuenta de # dgitos mascara EQU 0Fh ;Mscara 4 bits extrema derecha ascii EQU 30h ;Equivalente de hexadecimal a ASCII nueve EQU 3Ah ;9 en ASCII a_f EQU 7h ;Convierte dgito A-F en ASCII dos EQU 21h ;Llamada del SO fin EQU 20h ;Termina y vuelve al SO ; programa SEGMENT ;inicio de segmento ASSUME CS:programa ;informa a MASM dnde estamos ORG 0100h ;fija el origen a direccin 100 inicio: MOV CH,cuenta ;nmero de dgitos rota: MOV CL,cuenta ;cuenta a 4 bits ROL BX,CL ;desplaza dgito a la izq. MOV AL,BL ;y pasa a reg. AL AND AL,mascara ;quita dgitos de la izq. ADD AL,ascii ;convierte a ASCII CMP AL,nueve ;Es mayor que 9? JL despliega ;Despliega si ente 0 y 9 ADD AL,a_f ;el dgito est entre A y F despliega: MOV DL,AL ;Coloca ASCII en DL MOV AH,muestra ;Funcin de despliegue INT dos ;Llama a DOS DEC CH ;Terminamos con los 4 dgitos? JNZ rota ;Si an no se termina INT fin ;Regresa a SO ; programa ENDS

7-127

Ensamblador

;****************************************************************** END inicio

Si el programa se ejecuta desde el sistema operativo no se obtendr nada pues el registro BX (de donde se toman los datos) est vaco. Para ver su utilidad y comprender los nuevos conceptos es necesario ejecutarlo desde DEBUG y llenar el registro BX con el comando r. Ejercicio 7.6 Ejecute el programa desde DEBUG dando varios valores a BX y observando el resultado. Antes de explicar el funcionamiento de este programa introduzcamos los corrimientos, rotaciones y las operaciones aritmticas:

7.5.1 Corrimientos y Rotaciones


Este tipo de instrucciones desplazan los bits de un byte o palabra hacia la izquierda o derecha. Estas son operaciones comunes para encuadrar un byte con respecto a un valor o para eliminar los bits superfluos, algo similar a las mscaras en las operaciones lgicas como Y, O, etc. Se dividen en tres grupos: Desplazamientos Aritmticos o corrimientos sin signo Desplazamientos Aritmticos o corrimientos con signo. Rotaciones La UAL slo es capaz de realizar un nmero bsico y limitado de operaciones: Complemento a unos (inversin de bits) Complemento a dos (negacin) Suma Desplazamientos Rotaciones Operaciones Lgicas (Y, O, O Exclusiva) Recordemos que si recorremos un registro en todos sus bits hacia la izquierda el equivalente es multiplicar por 2: 0000 0001 = 1 decimal

7-128

El Mundo Exterior

0000 0010 = 2 decimal (corrimiento de 1 bit) 0000 0100 = 4 decimal (corrimiento de 2 bits) principio que funciona en cualquier base: 1d con un corrimiento de 2 posiciones a la izquierda equivale a 100d o multiplicar 2 veces por la base. De la misma forma un corrimiento hacia la derecha equivale a dividir entre la base, en este caso 2: 0000 1000 = 8 decimal 0000 0100 = 4 decimal (corrimiento de 1 bits) 0000 0010 = 2 decimal (corrimiento de 2 bits) pero ocurre un problema importante con los nmeros que tienen signo: 0000 1000 = 8d -> 1111 1000 (complemento a 2 1111 0111+1) realizemos -8/2 0111 1100 = 124d en lugar de -4 Note que es importante en este caso inyectar a la izquierda el signo para obtener el resultado correcto 1111 1100 = -4 para lo cual se usan corrimientos aritmticos con signo. Todas las operaciones de corrimiento y rotaciones toman la forma
Mnemnico Mnemnico Mnemnico Mnemnico Registro,1 Memoria,1 Registro,CL Memoria,CL

Donde Registro es un registro de 8 o 16 bits, Memoria es una localidad de memoria o una direccin y 1 es el valor inmediato de uno.

7.5.1.1 Corrimientos Lgicos (Rotaciones)


ROR destino,cuenta, Rota a la derecha byte o palabra pasando por el acarreo.

7-129

Ensamblador

RCR destino,cuenta, Rota a la derecha a travs del acarreo byte o palabra ROL destino,cuenta, Rota a la izquierda byte o palabra pasando por acarreo RCL destino,cuenta, Rota a la izquierda a travs del acarreo byte o palabra

7.5.1.2 Corrimientos Aritmticos


SHR destino,cuenta, Corrimiento lgico a la derecha de byte o palabra pasando por acarreo SAR destino,cuenta, Corrimiento aritmtico a la derecha de byte o palabra agregando el signo y pasando por acarreo SHL/SAL destino,cuenta, Corrimiento a la izquierda de byte o palabra pasando por acarreo Todos los corrimientos quedan ilustrados en la figura 7.1

7-130

El Mundo Exterior

Figura 7.1 Corrimientos y rotaciones.

7.5.2 Operaciones Aritmticas


Las operaciones aritmticas son realizadas sobre los registros y son de 8, 16, o 32 bits que nos dan nmeros entre 0 y 65,535 en aritmtica sin signo. El circuito es capaz de realizar sumas, restas, multiplicaciones y divisiones pero estas dos ltimas operaciones las realiza en base a sumas por lo que son lentas, para sacar provecho de estas operaciones es necesario tener otro circuito dedicado a las operaciones matemticas que se llama coprocesador pues realiza el proceso en paralelo al procesador principal.

7.5.2.1 Suma y Resta (ADD y SUB)

7-131

Ensamblador

Las sumas y restas toman la forma de


Mnemnico Mnemnico Mnemnico Mnemnico Registro,Inmediato Memoria,Inmediato Registro,Memoria Registro, Registro

Donde Registro es un registro de 8 o 16 bits, Memoria es una localidad de memoria o una direccin e Inmediato es un valor. Si existe un desbordamiento, el bit del registro de banderas de acarreo es puesto en 1 lgico y las dems banderas (SF, CF, OF, ZF) se afectan de acuerdo al resultado. Recuerde el caso de los nmeros negativos y de que las operaciones pueden ser con signo o sin signo lo que puede dar por resultado sorpresas indeseables. La resta se logra sumando el complemento a dos del sustraendo. Existen las operaciones complementarias de suma (ADC) y resta (SBB) pero de doble precisin donde se agrega o quita el acarreo al resultado:
suma1 DD ? ;Nmero de 32 bits suma2 DD ? ;Nmero de 32 bits ;Suma los primeros 16 bits MOV AX,WORD PTR suma1 ;trabaja los primeros 16 bits bajos ADD AX,WORD PTR suma2 ;sumando los 16 bits bajos ;trabaja ahora los 16 bits altos agregando el acarreo si existe MOV DX,WORD PTR suma1+2 ;16 bits primeros altos ADC DX,WORD PTR suma2+2 ;suma siguientes 16 bits altos ;agregando acarreo

7.5.2.2 Decrementos
Esta instruccin decrementa en 1 un registro o localidad de memoria dando por resultado una operacin idntica a la de la resta pero sin afectar la bandera de acarreo (CF) por lo que se debe poner atencin si queremos realizar un salto condicional que dependa de este indicador.
DEC DEC Registro Memoria

7.5.2.3 Multiplicacin y Divisin

7-132

El Mundo Exterior

En el caso de la multiplicacin (MUL) y divisin (DIV) tenemos algo similar a la suma y resta. Es necesario una operacin para considerar el signo en caso de requerirlo (IMUL, IDIV). Estas operaciones usan registros especficos como se muestra en la figura 7.2.

Figura 7.2 Multiplicacin y divisin.

En el caso especfico de la divisin, es necesario prevenir, pues una divisin entre 0 o una cantidad muy pequea genera una interrupcin definida de antemano (al cargar el SO) que detiene el proceso general del SO y por ende de la mquina. La instruccin DIV no permite dividir un byte entre un byte ni una palabra entre otra palabra por lo que hay que proceder como sigue:
;divisin entre dos bytes

7-133

Ensamblador

MOV AL,dividendo CBW MOV BL,divisor DIV BL ;divisin entre dos palabras MOV AX,dividendo CWD (DX,AX) MOV BX,divisor DIV BX una palabra

;en AL el dividendo ;Convierte un byte en palabra (AH=0) ;en BL el divisor ;divisin de una palabra entre un byte ;en AX el dividendo ;Convierte palabra en doble palabra ;en BX el divisor ;divisin de una doble palabra entre

Para este punto debe de quedar claro el funcionamiento del programa introducido en la seccin an te rior e introducimos el siguiente complemento que conviete de un nmero decimal tomado del teclado a un binario en el registro BX.
;Convierte Decimal del teclado a binario, el resultado se queda en BX decbin SEGMENT ASSUME CS:decbin MOV BX,0 ;Limpia registro BX otro: MOV AH,1 ;entrada del teclado INT 21h ;llama a DOS SUB AL,30h ;ASCII a binario JL sale ;Salir si el #<0 CMP al,9d ;Es > a 9? JG sale ;Si es as, no es dgito CBW ;Convierte byte en AL a palabra en AX ;Multiplica nmero en BX por 10 XCHG AX,BX ;Cambia registros AX y BX MOV CX,10d ;Coloca 10 en CX MUL CX ;y multiplica por AX (AX*10) XCHG AX,BX ;Regresa # a BX ;Suma nmero en AX por el de BX ADD BX,AX ;suma dgito a # JMP otro ; y ve por otro sale: INT 20h ;Regresa a SO decbin ENDS END

Ejercicio 7.7 Introduzca el programa anterior en MASM y ejecute desde DEBUG para observar el resultado en el registro BX. Use la instruccin

7-134

El Mundo Exterior

T (trace) para seguir el flujo del programa paso a paso y anotar el estado de los registros que nos interesan tal como AX, BX y CX. Tendremos un problema al llegar a la instruccin INT pues nunca regresaremos al programa original, por lo que debemos sustituir la instruccin por una nueva que no hace nada: NOP. Esta instruccin ocupa un slo byte por lo que en este caso debemos usar 2 para sustituir a INT que ocupa 2 bytes. El programa DEBUG utiliza la siguiente simbologa para las banderas:
Tabla 7.1 Simbologa de DEBUG para las banderas
Bandera OF, saturacin DF, direccin IF, habilita interrupciones SF, signo ZF, cero AF, acarreo auxiliar PF, pariedad CF, acarreo En uno lgico En cero lgico

OV DN EI NG ZR AC PE CY

NV UP DI PL NZ NA PO NC

Ejercicio 7.8 Ejecute el programa DECBIN anterior pero ahora interrumpimos el flujo del mismo antes de ejecutar la ltima instruccin para poder analizar el registro BX. Para esto utilizamos el comando de DEBUG g pero seguido de una direccin lo que hace que se introduzca una pausa en lugares determinados (hasta 10). En nuestro caso el punto antes de la interrupcin 20h es 11b: g 11b.

7.6 Procedimientos o Subrutinas


En muchos casos se requiere, por orden, dividir el programa en segmentos lgicos independientes uno de otro pero a la vez que estos segmentos estn disponibles para su uso por otros segmentos del programa. Se resuelve esto, al igual que en los lenguajes de alto nivel, con los procedimientos o subrutinas que pueden ser llamados desde cualquier parte de un programa. En el lenguaje ensamblador se define el inicio de una seccin de un programa con la pseudo instruccin PROC y su final con la pseudo instruccin ENDP. Los procedimientos pueden ser cortos o lejanos dependiendo de si se encuentran o no en el mismo segmento y se requiere de especificar en la instruccin con qu tipo estamos tratando:

7-135

Ensamblador

nombre segmento nombre

PROC PROC

NEAR FAR

;si se trata de uno en el mismo ;si se trata de uno en otro segmento

El nombre es el identificador del procedimiento con el cual haremos referencia posteriormente a esta subrutina. Para llamar a la subrutina o procedimiento se utiliza la instruccin CALL (llama) seguida de la direccin o identificador. La instruccin forza a que el procesador guarde la direccin de la siguiente instruccin que sigue a la de la llamada en un rea especial de datos llamada la pila que analizaremos en el siguiente captulo a fondo. Si es una llamada corta o cercana, slo se guarda el registro IP, si se trata de una llamada lejana, es necesario guardar tanto CS como IP. No es afectada ninguna badera por esta instruccin. Todo procedimiento debe de terminar con la instruccin RET para que el ensamblador sepa que termina la subrutina y debe regresa al programa que la llam. Esto implica devolver el valor del apuntador de programa anterior sacndolo de la pila. Una vez ms si es una llamda corta, toma una palabra de la pila y la restituye en IP, si es una llamada lejana, toma dos palabras de la pila, la primera para IP y la segunda para CS. La instruccin RET puede tener un parmetro auxiliar para ajustar el tamao de la pila al regresar. Analizaremos esto en detalle en el siguiente captulo. Finalmente integramos los dos programas ya vistos en uno general que convierte un nmero decimal a hexadecimal directamente del teclado:
;Convierte Decimal a Hexadecimal (DECHEX) ;(mximo de 65535d) dechex SEGMENT ASSUME CS:dechex ;Parte principal del programa que une a los otros 2 repite: CALL decbin ;Del teclado (base 10) a binario CALL crlf ;Agrega nueva lnea CALL binhex ;binario a hexadecimal y despliega CALL crlf ;Agrega nueva lnea JMP repite ;Vuelve a repetir ;

7-136

El Mundo Exterior

;Convierte Decimal del teclado a binario, el resultado se queda en BX decbin PROC NEAR MOV BX,0 ;Limpia registro BX otro: MOV AH,1 INT 21h SUB AL,30h ;ASCII a binario JL sale ;Salir si el #<0 CMP al,9d ;Es > a 9? JG sale ;Si es as, no es dgito CBW ;Convierte byte en AL a palabra en AX ;Multiplica nmero en BX por 10 XCHG AX,BX ;Cambia registros AX y BX MOV CX,10d ;Coloca 10 en CX MUL CX ;y multiplica por AX (AX*10) XCHG AX,BX ;Regresa # a BX ;Suma nmero en AX por el de BX ADD BX,AX ;suma dgito a # JMP otro ; y v por otro sale: RET decbin ENDP ; ;Convierte nmero binario en BX a hexadecimal y despliega binhex PROC NEAR MOV CH,4 ;nmero de dgitos rota: MOV CL,4 ;cuenta a 4 bits ROL BX,CL ;desplaza dgito a la izq. MOV AL,BL ;y pasa a reg. AL AND AL,0Fh ;quita dgitos de la izq. ADD AL,30h ;convierte a ASCII CMP AL,3Ah ;Es mayor que 9? JL despliega ;Despliega si ente 0 y 9 ADD AL,7h ;el dgito est entre A y F despliega: MOV DL,AL ;Coloca ASCII en DL MOV AH,2h ;Funcin de despliegue INT 21h ;Llama a DOS DEC CH ;Terminamos con los 4 dgitos? JNZ rota ;Si an no se termina RET ;Regresa binhex ENDP

7-137

Ensamblador

; ;Despliega una nueva lnea crlf PROC NEAR MOV DL,0Dh ;CR MOV AH,2 ;funcin de despliegue INT 21h ;llamada a DOS MOV DL,0Ah ;LF MOV AH,2 ;funcin de despliegue INT 21h ;llamada a DOS RET ;regresa de crlf crlf ENDP ;****************************************************************** dechex ENDS END

Introduzca el programa anterior en MASM y pruebe con varios nmeros. Para finalizar interrumpa presionando la tecla de CTRL y C al mismo tiempo. Ejercicio 7.9 Introduzca la pseudo instruccin PAGE como primera instruccin del programa y ensamble pero ahora usando el comando
MASM dechex, , lpt1:, dechex

Asegrese de tener la impresora prendida y con papel pues el resultado se pasar directamente a la impresora. As mismo hemos creado una referencia cruzada en un archivo de nombre DECHEX.REF que nos indica dnde se definieron todas las variables (con el signo #) y dnde son utilizadas todas ellas.

7.7 Resumen
Se analizan en este captulo distintas formas de aprovecharnos de las interrupciones de los diseadores del SO en nuestro beneficio. Se introducen conceptos de procedimientos y la forma de accesar dejando para el siguiente captulo la forma idnea de pasar parmetros a las subrutinas.

7-138

El Mundo Exterior

7.8 Instrucciones Analizadas


INT 20 (AH=9h, AH=0Ah, AH=5h), ROR, RCR, ROL, RCL, SHR, SAR, SHL, SAL, ADD, SUB, ADC, SBB, MUL, DIV, IMUL, IDIV, NOP, RET, CALL y las pseudo instrucciones PROC NEAR, PROC FAR, ENDP, PAGE.

7.9 Problemas
7.1 Analice el programa de conversin de decimal a hexadecimal en lo referente a las instrucciones de corrimiento. 7.2 Realice un cdigo como subrutina en el que se le pasan como parmetro la fecha en el registro AX dividida en da, mes, ao de la siguiente forma: El da de 1 a 31 (5 bits) El mes de 1 a 12 (4 bits) El ao en 7 bits y al que se le suma 1995 siempre Al recibir la llamada, la subrutina regresa el da en ASCII en el registro BX, el mes en ASCII en el registro AX y el ao en ASCII en CX y DX. El programa principal lo despliega en la pantalla o imprime.

7.10 Bibliografa
Mercier Philippe Assembleur Facile. Marabout 1992, Alleur Blgica. Morgan Christopher Bluebook of Assembly Languages Routines for the IBM. Olume Waite, New York 1984. Lafore Robert Assembly Language Primer for the IBM PC. The Waite Group 1992. IBM Personal Computer Technical Reference.

7-139

Captulo 8
8.1 La pila
En los primeros diseos de microcomputadoras surga el problema de que al atender las interrupciones generadas por los distintos dispositivos se requera preservar el contenido de varios registros en algn lugar. Algunos diseadores tomaron el camino de dejar al programador la tarea de reservar un rea de memoria para tal fin y de asegurar que los registros fueran restaurados antes de volver al programa principal. Otros se aseguraron de que esto sucediera siempre al incorporar una serie de registros paralelos donde se guardaba automticamente el contenido de todos los registros de la UPC. Pronto se vio que la primera opcin, con algunas variantes, era el camino adecuado y el ms conveniente para proporcionar toda la flexibilidad al programador y dejar que l decida cundo y cmo deben guardarse los datos requeridos. Esto da gran libertad pero a la vez complica las cosas al tener que ser extremadamente cuidadoso con el manejo de esta rea reservada de memoria llamada pila. Para poder implementar el uso de pilas, es requisito indispensable agregar nuevos registros o utilizar los ya existentes de forma que permitan el control de dicha pila. En el circuito de Intel, el manejo de pilas se logra a travs del registro SS (stack segment o segmento de pila) junto con SP (stack pointer o apuntador de fin de pila) y BP (base pointer o apuntador base de pila). El uso de subprogramas plantea tambin la necesidad de pasar parmetros a estas subrutinas o procedimientos. Los tres mtodos preferidos son:

8-141

Ensamblador

En los registros. Limitado a unas cuantas variables. Por medio de variables. Mejor que el anterior, pero se requiere de la definicin estricta de muchas variables o el uso de archivos de almacenamiento externos creciendo mucho el programa. Usado cuando se requieren un gran nmero de variables. Usando la pila. Es el mtodo preferido y el ms utilizado cuando las variables van de pocas a regular en cantidad. La pila es usada en las microcomputadoras modernas para guardar el apuntador de memoria al llamar una rutina de interrupcin (INT o interrupcin externa) o un procedimiento del usuario (CALL). Sabemos ya que se necesitan de por lo menos 16 bits pues se requiere guardar IP en caso de una llamada cercana o CS e IP en el caso de una lejana.

8.1.1 Manejo de la Pila


Para el manejo de pila se usan las instrucciones PUSH que empuja valores de un registro o localidad de memoria a la pila y POP que saca valores de la pila restituyndolos en un registro o localidad de memoria. La pila en este circuito es una pila del tipo FIFO (first in first out), es decir, el primero que entra es el primero que sale (PEPS). Un ejemplo de un programa completo donde se requiere utilizar la pila para guardar el contador que a su vez es utilizado en otra subrutina ilustrar el punto:
;Sonido de Motor de Automvil ruido SEGMENT principal PROC FAR ASSUME ORG 100h inicio: MOV CX,10d otro: PUSH CX CALL disparo CALL silencio POP CX

CS:ruido ;Define inicio de programa

;nmero de repeticiones ;guarda la cuenta en la pila ;Sonido de disparo ;Y guarda silencio ;Recupera el contador de ;disparos de la pila LOOP otro ;repite hasta terminar INT 21h ;Regresa a DOS principal ENDP ;fin programa principal ;

8-142

La Pila

;Subrutina para hacer un sonido breve disparo PROC NEAR MOV DX,140h ;valor inicial de la espera MOV BX,3Fh ;cuenta inicial IN AL,61h ;lee el puerto de sonido AND AL,11111100b ;quita bits 0 y 1 sonido: XOR AL,2 ;Cambia bit 1 de AL OUT 61h,AL ;Salida a puerto de sonido ; ; Genera nmero aleatorio ADD DX,9248h ;Suma de patrn pseudo aleatorio MOV CL,3 ;Prepara a rotar 3 bits ROR DX,CL ;Rota 3 bits MOV CX,DX ;Coloca en CX espera: LOOP espera ;ciclo de espera ; DEC BX ;fu suficiente? JNZ sonido ;Salta si an no se acaba AND AL,11111100b ;Quita bits 0 y 1 OUT 61h,AL ;Manda al puerto de sonido RET ;Regresa de la subrutina disparo ENDP ; ;Retraso ligero (aumentar o disminuir segn modelo) silencio PROC NEAR MOV CX,0FFFFh ;cuenta de silencio repite: LOOP repite MOV CX,0FFFFh ;cuenta de silencio repite1: LOOP repite1 RET ;Regresa silencio ENDP ;****************************************************************** ruido ENDS ;fin de cdigo END inicio ;fin de ensamble

Para comprender el funcionamiento de la pila, ejemplificaremos analizando la pila con una llamada a una subrutina donde se pasan los parmetros en la pila.
;pasa a la pila los parmetros PUSH DS PUSH DX CALL rutina

8-143

Ensamblador

En este punto recalquemos que la cima de la pila se encuentra en donde est la ltima direccin del ltimo byte empujado a la pila. En el momento que el procedimiento rutina recibe el control la pila se encuentra en el siguiente estado:
100 98 96 94 92 valor de DS valor de DX valor de CS valor de IP

SP

cima de la pila

El subprograma no podr leer los datos de DS y DX que nos interesan pues el procesador empuja automticamente los valores de CS e IP (en este caso de una llamada lejana) hacia la pila. Es menester entonces, el ajustar el apuntador de la pila BP para que apunte al rea de inters siguiendo los siguientes pasos: 1. Salvar el valor actual de BP en la pila (PUSH BP). 2. Inicializar BP al mismo valor que SP (MOV BP,SP).
100 98 96 94 92 90 SP valor de DS valor de DX valor de CS valor de IP valor de BP BP+8 BP+6 BP+4 BP+2 BP

Los parmetros estn disponibles ahora con un simple ajuste del apuntador.
MOV MOV AX,[BP+6] BX,[BP+8] ;mueve el valor de DX a AX ;mueve el valor de DS a BX

Cuando el subprograma termine, deber informar al procesador por medio de la instruccin RET n que se ajuste la pila de acuerdo a los movimientos realizados de forma tal que pueda recuperar CS e IP para volver al punto de ejecucin anterior, siendo n el nmero de bytes a ajustar. Ilustramos este ltimo punto con un ejemplo completo paso a paso. Contamos con una pila inicial de 50 elementos (100 bytes) definidos en la seccin de pila del programa. Las cifras a la izquierda son los

8-144

La Pila

desplazamientos dentro del segmento SS definido tambin al inicio del programa as como los valores de SP y BP que coinciden:
SP 98 96 94 92 BP ..... ..... ..... ..... cima de la pila

El programa requiere del uso posterior de CX por lo que se empuja a la pila:


PUSH CX

98 96 94

BP,SP

valor de CX ..... ..... .....

cima de la pila

Si empujamos tambin el valor de DS (PUSH DS) tendremos:


98 96 94 92 BP SP valor de CX valor de DS ..... ..... cima de la pila

El programa x llama en este punto al subprograma y pasando los parmetros BX y DX en la pila:


PUSH PUSH CALL BX DX y

;llama a subrutina lejana y

98 96 94 92 90 88

BP

valor de CX valor de DS valor de BX valor de DX CS de x IP de x

SP

cima de la pila

8-145

Ensamblador

En este punto el programa y tiene el control y requiere del registro BP (es la regla general de uso de la pila). No hay forma de saber si el programa anterior usa o no BP por lo que tambin es regla general guardarlo en la pila y comenzar a usarlo desde ese momento:

PUSH MOV

BP BP,SP

;salva registro BP ;BP recibe el valor de SP

Lo que nos deja con la pila en el siguiente estado:


98 96 94 92 90 88 86 valor de CX valor de DS valor de BX valor de DX CS de x IP de x BP de x

(parmetro 1) (parmetro 2)

BP,SP

Desde este momento podemos consultar entonces los parmetros de la pila que se requieren y se encuentran en BP+8 (parmetro 1) y BP+6 (parmetro 2) puesto que todos los elementos de la pila requieren de 2 bytes. La subrutina y puede usar la pila para salvaguardar los valores que requiere ms tarde para su uso. Si se requiere usar algn registro, primero se empuja a la pila para asegurarse de que el programa que llama no pierda sus registros de trabajo. Supongamos en este momento que se llama a la subrutina z pasndole los parmetros AX y BX:
PUSH PUSH MOV MOV PUSH PUSH CALL AX BX AX,1 BX,1 AX BX z ;guarda registro de subrutina x ;guarda registro de subrutina x ;inicializa valor para subrutina z ;inicializa valor para subrutina z ;guarda registro en la pila ;guarda registro en la pila ;llama subrutina lejana z

Las primeras instrucciones de la subrutina z sern para ajustar la pila y asegurarse el acceso a ella:
PUSH MOV BP BP,SP ;Guarda registro BP ;inicializa pila para subrutina z

8-146

La Pila

Con lo que tenemos en la pila:


98 96 94 92 90 88 86 84 82 80 78 76 74 72 valor de CX valor de DS valor de BX valor de DX CS de x IP de x BP de x valor de AX valor de BX Parmetro 1 Parmetro 2 CS de y IP de y BP de y

(parmetro 1) (parmetro 2)

(salvado por y) (salvado por y) (transmitido por y) (transmitido por y)

BP,SP

(salvado por z)

La subrutina z puede a su vez consultar los parmetros 1 y 2 que manda la subrutina y (BP+6 y BP+8) y al regresar debe sacar el valor de BP de la pila (POP BP) para asegurar el comportamiento de la misma:
98 96 94 92 90 88 86 84 82 80 78 76 74 72 valor de CX valor de DS valor de BX valor de DX CS de x IP de x BP de x valor de AX valor de BX Parmetro 1 Parmetro 2 CS de y IP de y BP de y

(parmetro 1) (parmetro 2)

BP

(salvado por y) (salvado por y) (transmitido por y) (transmitido por y)

SP

(salvado por z)

En este momento la subrutina z informa al procesador que ya termin su tarea (RET) y ste toma los valores de la parte alta de la pila (en SP y SP+2) y reinicializa CS e IP lo que regresa el control a la subrutina y. Existe otra forma de la instruccin RET: RET n (ya mencionada) en la que se ajusta la pila por medio del registro SP agregndole un valor n (entero). El valor de n es conocido en el momento de la programacin pues sabemos el nmero de parmetros pasados a la subrutina. Podemos entonces deducir el nmero de parmetros de la pila y colocar el valor correcto de n. En este

8-147

Ensamblador

caso el valor es 4 pues se pasaron 2 parmetros y cada uno ocupa 2 bytes (2*2 bytes = 2 parmetros)
RET ;regresa sin ajuste de la pila

98 96 94 92 90 88 86 84 82 80 78 76 74 72

BP

valor de CX valor de DS valor de BX valor de DX CS de x IP de x BP de x valor de AX valor de BX Parmetro 1 Parmetro 2 CS de y IP de y BP de y

(parmetro 1) (parmetro 2)

SP

(salvado por y) (salvado por y) (transmitido por y) (transmitido por y)

(salvado por z)

RET bytes

;regresa con ajuste de la pila en 4

98 96 94 92 90 88 86 84 82 80 78 76 74 72

BP SP

valor de CX valor de DS valor de BX valor de DX CS de x IP de x BP de x valor de AX valor de BX Parmetro 1 Parmetro 2 CS de y IP de y BP de y

(parmetro 1) (parmetro 2)

(salvado por y) (salvado por y) (transmitido por y) (transmitido por y)

(salvado por z)

En este punto la subrutina y recupera los valores empujados en la pila en orden inverso del almacenaje antes de volver a la rutina que llama (x).

8-148

La Pila

POP POP POP

BX AX BP

y regresa ajustando a su vez la pila en 4 unidades (2 parmetros):


RET 4

98 96 94 92 90 88 86 84 82 80 78 76 74 72

BP SP

valor de CX valor de DS valor de BX valor de DX CS de x IP de x BP de x valor de AX valor de BX Parmetro 1 Parmetro 2 CS de y IP de y BP de y (parmetro 1) (parmetro 2)

(salvado por y) (salvado por y) (transmitido por y) (transmitido por y)

(salvado por z)

A su vez la rutina x recupera sus valores empujados en la pila:


POP POP DS CX

y la pila vuelve a su estado inicial (en lo que respecta a los apuntadores):


SP 98 96 94 92 90 88 86 84 82 80 78 76 74 72 BP valor de CX valor de DS valor de BX valor de DX CS de x IP de x BP de x valor de AX valor de BX Parmetro 1 Parmetro 2 CS de y IP de y BP de y (parmetro 1) (parmetro 2)

(salvado por y) (salvado por y) (transmitido por y) (transmitido por y)

(salvado por z)

8-149

Ensamblador

Como conclusin es un buen hbito colocar en la pila los registros o datos que sern utilizados por algn subprograma antes de llamarlo y una vez que termina la llamada, ajustar la pila y recuperar los valores de la pila:
prueba PROC NEAR PUSH AX PUSH BX .... POP BX POP AX RET ENDP ;tanto AX como ;BX sern utilizados ;instrucciones del subprograma ;recupera los valores ;de AX y BX de la pila

prueba

Se aconseja tambin especificar al inicio del subprograma por medio de comentarios cules son los registros que se pasan como parmetros y cules sern eventualmente destruidos:
Lee PROC NEAR ;Leer un carcter del teclado ;regresa el AL el cdigo ASCII ;destruye AL al llamarse MOV AH,1 INT 21h RET lee ENDP

;servicio de lectura de teclado ;lee un carcter

8.1.2 Guardando las Banderas


Existen dos instrucciones especiales para colocar las banderas en la pila, una la opuesta de la otra: POPF y PUSHF. Estas instrucciones no contienen ningn operando. Se puede usar esta instruccin cuando se requiere de realizar operaciones intermedias antes de utilizar un salto condicional o cualquier otra operacin que utilice las banderas para operar:
PUSHF ;Guarda las banderas MOV AX,2 ADD AX,3 ;operacin que modifica banderas POPF ;recupera las banderas

8-150

La Pila

8.2 Manejo de Cadenas


En la mayora de las aplicaciones informticas, el tratamiento de cadenas de caracteres es particularmente importante. Es tan comn que los procesadores modernos integran una serie de instrucciones para realizar estas operaciones de forma eficiente. Las operaciones de cadenas pueden ser utilizadas para otras operaciones para las cuales no fueron planeadas pero son muy eficientes como es el caso de mover pginas completas de texto o imgenes a la memoria de donde el controlador de video toma su informacin para desplegar en la pantalla. En este tipo de operaciones intervienen dos operandos en distintas reas de memoria: 1. Cadena Fuente. Siempre en un segmento apuntado por DS y usando como apuntador a la cadena el registro SI (Source Index). 2. Cadena Destino. Siempre en un segmento apuntado por ES y usando como apuntador a la cadena el registro DI (Destination Index). Las operaciones se realizan carcter a carcter y es posible realizarlas con otras operaciones que ya conocemos aunque de forma un poco torpe e ineficiente:
Texto1: DB Un texto cualquiera Texto2: DB Otro texto Texto3: DB 20 DUP(?) ;inicializacin PUSH DS POP ES MOV SI,OFFSET texto1 MOV DI,OFFSET texto2 ;Estamos listo a comparar las dos cadenas MOV AL,[SI] MOV AH,[DI] CMP AH,AL ;aqu la lgica de las comparaciones ;

;zona de 20 caracteres

;ESDS ;SIdireccin del texto1 ;DIdireccin del texto2 ;ALU de Un text... ;AHO de Otro te... ;Compara las cadenas

8-151

Ensamblador

;Transferir de un rea a otra: MOV SI,OFFSET texto2 ;SIdireccin del texto2 MOV DI,OFFSET texto3 ;DIdireccin del texto3 MOV AL,[SI] MOV [DI],AL ;aqu la lgica que controla los contadores, el inicio, el fin, etc.

8.2.1 La Instruccin REP


El modificador REP (de REPeat, repite) causa que la instruccin siguiente sea repetida hasta que el registro CX sea cero. REP se usa con un grupo de tres instrucciones: MOVS (Move String, mueve cadena), SCAS (Scan String, busca cadena) y CMPS (Compare String, compara cadena). Las banderas afectadas dependen de la operacin. Para que este comando funcione, debemos colocar de antemano el nmero de repeticiones en el registro CX para lo cual entre muchas otras posibilidades, podemos utilizar una pseudo instruccin del ensamblador:
texto largo DB EQU MOV Una cadena de longitud x $-texto ;calcula longitud de texto CX,largo ;en CX la longitud de la cadena

8.2.2 La Direccin de la Operacin (CLD y STD)


El resultado de las operaciones de cadenas es manipular dos de ellas de forma que una resida en el segmento DS:SI y la otra en ES:DI. Existen dos posibilidades para ajustar el contador de forma que comience por el principio de la cadena o por el final. La instruccin CLD (Clear Direction Flag, Limpia bandera de direccin) indica al procesador que los registros SI y DI sern incrementados despus de cada instruccin de manejo de cadenas mientras que la instruccin STD (Set Direction Flag, Fija bandera de direccin) indica que los dos registros sern decrementados.

8.2.3 Mover Cadenas (MOVSB y MOVSW)


La instruccin MOVS se usa despus de la instruccin REP y mueve una cadena de una localidad a otra de la memoria. La cadena fuente es apuntada por SI y reside en el segmento DS, mientras que el destino es apuntado por DI y reside en el segmento extra (ES).

8-152

La Pila

Cada vez que la instruccin MOVS se ejecuta suceden 3 cosas: 1. SI es incrementado (o decrementado dependiendo de la bandera de direccin) ya sea en uno o dos bytes dependiendo si es transferencia de palabra o byte. 2. DI se incrementa (o decrementa dependiendo de la bandera de direccin) ya sea en uno o dos bytes dependiendo si es transferencia de palabra o byte. 3. CX es decrementado. Si llega a cero la transferencia termina. En esta operacin no se modifica ninguna bandera. Mostramos un pedazo de cdigo que mueve 40 letras x de su rea de memoria fuente a su memoria destino. No es un programa completo pero es ilustrativo.
;*************************************************** datos SEGMENT fuente DB 40 DUP(x) datos ENDS ;*************************************************** extra SEGMENT destino DB 40 DUP(?) extra ENDS ;*************************************************** ASSUME DS:datos ASSUME ES:extra MOV AX,datos ;direccin del segmento fuente MOV DS,AX ;en registro DS MOV AX,extra ;direccin del segmento destino MOV ES,AX ;en registro ES MOV SI,OFFSET fuente ;direccin de la fuente MOV DI,OFFSET destino ;direccin del destino CLD ;bandera de direccin hacia adelante MOV CX,40 ;cuenta en CX REP MOVS ;Mueve toda la cadena

Como se ve en el ejemplo anterior hay muchos registros que inicializar, pero una vez que se logra esto, el trabajo es sencillo y lleva 2 instrucciones escritas en una sola lnea (la ltima). Ejercicio 8.1 Complete el programa anterior con todas las instrucciones y pseudo instrucciones faltantes y ejecute.

8-153

Ensamblador

La instruccin REP MOVS reemplaza al siguiente grupo de instrucciones repetidas CX veces:


MOV MOV INC INC AL,DS:[SI] ES:[DI],AL SI DI

8.2.4 REPE REPZ y REPNE REPNZ


Estas instrucciones se utilizan slo junto con las operaciones de comparacin y bsqueda de cadenas (siguientes dos secciones) y sealan la terminacin de dichas operaciones cuando el registro CX llega a cero o se localiza la cadena.
REPE (Repite while equal, repite mientras igual) repite la operacin CMPS o SCAS mientras CX sea distinto de cero o el resultado de una

comparacin cause que la bandera de cero sea limpiada (no cero) como resultado que dos palabras o bytes no sean iguales. Las banderas afectadas dependen de la operacin y el resultado de sta.
REPNE (Repite while not equal, repite mientras no igual) repite la operacin CMPS o SCAS mientras CX sea distinto de cero o el resultado de una comparacin cause que la bandera de cero sea fijada (cero) como resultado de que dos palabras o bytes sean iguales. Las banderas afectadas dependen de la operacin y el resultado de sta.

8.2.5 Compara Cadenas (CMPSB y CMPSW)


La instruccin CMPS se usa despus de la instruccin REPE o REPNE y compara una cadena de una localidad a otra de la memoria. La cadena fuente es apuntada por SI y reside en el segmento DS, mientras que el destino es apuntado por DI y reside en el segmento extra (ES). Cada vez que la instruccin CMPS se ejecuta suceden 3 cosas: 1. SI es incrementado (o decrementado dependiendo de la bandera de direccin) ya sea en uno o dos bytes dependiendo si es transferencia de palabra o byte.

8-154

La Pila

2. DI se incrementa (o decrementa dependiendo de la bandera de direccin) ya sea en uno o dos bytes dependiendo si es transferencia de palabra o byte. 3. CX es decrementado. Si llega a cero la transferencia termina o: A. REPE. Si la cadena fuente es distinta de la destino. B. REPNE. Si la cadena fuente es igual a la destino. En esta operacin se modifican las banderas de acuerdo a la comparacin realizada (AF, CF, OF, PF, SF, ZF). La instruccin REPE CMPS reemplaza al siguiente grupo de instrucciones repetidas CX veces:
otro: MOV MOV CMP JPZ INC INC JMP salta: AL,DS:[SI] AH,ES:[DI] AL,AH salta SI DI otro

8.2.6 Busca Carcter (SCASB y SCASW)


La instruccin SCAS se usa despus de la instruccin REPE o REPNE y compara una cadena de una localidad al registro AL (en caso de byte o AX en caso de palabra). La cadena fuente es apuntada por DI y reside en el segmento extra (ES). Se usa esta instruccin para buscar un carcter dentro de una cadena. Cada vez que la instruccin SCAS se ejecuta suceden 2 cosas: 1. DI se incrementa (o decrementa dependiendo de la bandera de direccin) ya sea en uno o dos bytes dependiendo si es transferencia de palabra o byte. 2. CX es decrementado. Si llega a cero la transferencia termina o: A. REPE. Si la cadena fuente es distinta al contenido de AL (o AX).

8-155

Ensamblador

B. REPNE. Si la cadena fuente es igual al contenido del registro AL (o AX).

En esta operacin se modifican las banderas de acuerdo a la comparacin realizada (AF, CF, OF, PF, SF, ZF). La instruccin REPE SCAS reemplaza al siguiente grupo de instrucciones repetidas CX veces:
otro: MOV CMP JPZ INC JMP salta: BL,ES:[DI] AL,BL salta DI otro

8.2.7 LODSB y LODSW


Este grupo de instrucciones cargan el contenido de una localidad de memoria por DS:SI al registro AL o AX segn el tipo de operacin. Despus de la operacin el registro SI es incrementado o decrementado (de acuerdo a la bandera de direccin) de forma automtica en 1 2 bytes. El uso de los repetidores (REP, REPE, REPNE) no tienen sentido en este caso.

8.2.8 STOSB y STOSW


Estas instrucciones pasan el contenido del registro AL o AX, segn el tipo de operacin, a la localidad de memoria apuntada por DS:SI. Despus de la operacin el registro SI es incrementado o decrementado (de acuerdo a la bandera de direccin) de forma automtica en 1 2 bytes. Con el repetidor REP, nos puede servir para llenar un rea de memoria con un valor conocido. Por ejemplo:
;Inicializa una zona de 10 caracteres con 0 MOV CX,0Ah ;cuenta 10 MOV AL,0 ;valor a traspasar REP STOSB ;repite 10 veces la operacin

8-156

La Pila

Mostramos en el siguiente programa el uso de las instrucciones REPE y CMPS para buscar una llave introducida por el usuario dentro de una frase y decidir si sta o no. Una cosa importante a notar en este programa es el uso de segmentos que se traslapan en el caso del segmento de datos (DS) y el segmento extra (ES), lo que hace un poco ms sencillo el manejo de la programacin pues no es necesario acordarse de los segmentos fuentes y destino sino hacer referencia a una misma rea de memoria en este caso llamada DATOS.

;BUSCA ;El usuario introduce una llave y a continuacin ;una frase, el programa decide si la llave se encuentra en la frase muestra EQU 9h ;funcin de despliegue teclado EQU 0Ah ;funcin del teclado dos EQU 21h ;interrupcin de DOS ;****************************************************************** pila SEGMENT STACK;define la pila DB 20 DUP(pila ) ;palabra pila y 4 blancos pila ENDS ;****************************************************************** datos SEGMENT ;define segmento de datos ora_max DB 127d ;long. mxima de frase ora_real DB ? ;long. real introducida oracion DB 127d DUP(?) ;espacio para 127 caracteres llav_max DB 20d ;long. mxima de llave llav_real DB ? ;long. real introducida llave DB 20d DUP(?) ;espacio para 20 caracteres mens1 DB 0Dh,0Ah,Llave a buscar: $ mens2 DB 0Dh,0Ah,Frase: $ mens3 DB 0Dh,0Ah,No se encontro $ mens4 DB 0Dh,0Ah,Si se encontro $ datos ENDS ;****************************************************************** Busca SEGMENT ;segmento del cdigo principal PROC FAR ;parte principal del programa ASSUME CS:busca,DS:datos,ES:datos ; Inicio: ;guarda la valores para el regreso PUSH DS ;segmento de datos viejo SUB AX,AX ;forma rpida de poner 0 en AX

8-157

Ensamblador

PUSH AX ;guarda en pila (DS:0) ; ;DS apunta ahora a nuestro segmento de datos MOV AX,datos ;direccin del segmento de datos MOV DS,AX ;hacia el registro DS ; ;ES apunta ahora a nuestro segmento extra MOV AX,datos ;direccin del segmento de datos MOV ES,AX ;hacia registro ES la_llave: ;pide llave y coloca en memoria MOV DX,OFFSET mens1 ;direccin mensaje MOV AH,muestra ;y prepara a mostrar INT dos ; ;Toma llave y guarda MOV DX,OFFSET llave_max ;direccin de llave MOV AH,teclado ;toma llave de teclado INT dos ; frase: ;pide la frase y gurdala MOV DX,OFFSET mens2 ;direccin mensaje MOV AH,muestra ;y prepara a mostrar INT dos ; ;Toma frase y guarda MOV DX,OFFSET ora_max;direccin frase MOV AH,teclado ;toma frase de teclado INT dos ; ;Busca la llave en la frase ;SI apuntador a la llave ;DI apuntador a la frase ;BX apuntador a inicio de frase ;DX long. frase - long. llave + 1 ;CX long. de la frase ; CLD ;bsqueda hacia adelante MOV AL,ora_real ;long. frase SUB AL,llav_real ;- long. llave JL no_esta ;si long. llave>long. frase

8-158

La Pila

CBW ;cambia byte a palabra MOV DX,AX ;poner en DX INC DX ;+1 MOV BX,OFFSET oracion ;BX apunta a inicio frase ; compara: MOV DI,BX ;lugar donde comienza comparacin MOV SI,OFFSET llave ;SI inicio de llave MOV AL,llav_real ;toma long. llave CBW ;convierte a palabra MOV CX,AX ;y guarda en CX REPE CMPSB ;repite hasta CX=0 o no se encuentre carcter JZ si_esta ;no encontramos nada INC BX ;avanza apuntador a sig. carcter de frase DEC DX ;Acabamos? JZ no_esta ;si, no est JMP compara ;no, continua siguiente ; si_esta: ;encontramos llave MOV DX,OFFSET mens4 ;direccin mensaje MOV AH,muestra ;prepara a mostrar INT dos JMP la_llave ;Ve por otra llave y frase ; no_esta: ;no se encontr llave MOV DX,OFFSET mens3 ;direccin mensaje MOV AH,muestra ;prepara a mostrar INT dos JMP la_llave ;Ve por otra llave y frase RET ; principal ENDP ;fin de programa principal busca ENDS ;fin del segmento END inicio ;fin del programa

Una vez que la llave y la oracin han sido aceptadas, el programa procede a las comparaciones. Usa el registro BX como apuntador a los caracteres de la frase. La comparacin comienza desde el primer carcter. Asumamos que la llave tiene una longitud de tres caracteres, requerimos

8-159

Ensamblador

de comparar la llave con los primeros tres caracteres de la frase de la siguiente forma: 1. El registro SI apunta a las letras de la llave. 2. El registro DI apunta a las letras de la frase. 3. El registro CX lleva la cuenta del nmero de letras de la llave. La instruccin CMPB se repite hasta que CX es cero o la comparacin falla. Para no buscar en toda la frase y hacer que el programa sea ms rpido, slo se busca en (longitud de la frase - longitud de la llave + 1) caracteres sin necesidad de llegar al final. Afortunadamente la interrupcin del teclado (0Ah) regresa la longitud de lo que el usuario tecle en la localidad inmediatamente despus a la memoria reservada para dicha entrada, en este caso, en la localidad llav_real y ora_real. Es necesario empujar DS a la pila pero tambin un cero para poder regersar al segmento adecuado de datos y que el programa lo sepa (segemento de datos en DS:0).

8.3 Resumen
Se introduce en este captulo el manejo de la pila, siempre importante en los diseos actuales de computadoras y programas. Se analizan adems, las instrucciones de manejo de cadenas particulares a este circuito y la forma de usarlas en nuestra ventaja en tareas sencillas como la del ltimo programa presentado en el captulo.

8.4 Problemas
8.1 Convierta el programa BUSCA de forma tal que no se usen las instrucciones especiales de manejo de cadenas en la comparacin. 8.2 Programe un algoritmo desde DEBUG que llene las localidades de memoria de la 200h a la 2FFh con un 0. 8.3 Averige si el circuto MOTOROLA tiene instrucciones similares a las presentadas en este captulo para manejo de pila y de cadenas.

8-160

La Pila

8.5 Instrucciones Analizadas


PUSH, POP, RET n, POPF, PUSHF, REP, CLD, STD, MOVS, MOVSB, MOVSW, CMPS, CMPSB, CMPSW, REPE, REPZ, REPNE, REPNZ, SCAS, SCASB, SCASW, LODS, LODSB, LODSW, STOS, STOSB, STOSW

8.6 Bibliografa
Revista PC Magazine EU nmeros de 1983. Mercier Philippe Assembleur Facile. Marabout 1992, Alleur Blgica. Barden William Jr. How to Program Microcomputers. Sams & Company 1987. MASM 86 Columbia Data Products, EU 1986. IBM Personal Computer Technical Reference.

8-161

Captulo 9
9.1 El Vdeo
Durante el desarrollo de las microcomputadoras hubo que tomar varias decisiones con respecto a los componentes que forman el sistema y a la forma de interactuar entre ellos. Muchas de estas decisiones, buenas o malas, an nos siguen persiguiendo con el fantasma de la compatibilidad. Los caracteres que se despliegan en la pantalla funcionaban en un principio como una serie de cdigos ASCII que se mandaban al manejador de la pantalla uno a uno y ste se encargaba de todo lo dems. Esto funciona muy bien en los confines del despliegue de letras, pero una vez que el usuario y los diseadores exigen ms de la pantalla, este esquema es inadmisible. El siguiente paso consiste en reservar un rea de memoria para cada localidad grfica de la pantalla llamada PIXEL (Picture Element, Elemento de Pantalla). Utilicemos de inmediato el programa DEBUG para averiguar a qu nos referimos:
C>CLS C>DEBUG -d b800:0 fa

Notaremos que en la columna de la derecha (caracteres ASCII) estn localizadas las letras C>DEBUG, Hemos localizado el rea de memoria reservada para la pantalla de video! Esta pantalla va de la direccin B800:0000 a la B800:0F9F (4000 bytes) y se forma por dos bytes por localidad.

9-163

Ensamblador

Pero qu significa el 07h que aparece a la izquierda de cada carcter? Hemos tambin localizado el byte de atributo de cada pixel de la pantalla. Desde DEBUG juguemos con los atributos:
C>DEBUG -rds DS 08F1 :b800 -e0

Introduciendo la secuencia 41, F0, 42, 87, 43, F (Recuerde introducir usando la barra espaciadora y terminar usando la tecla de RETORNO) que da por resultado ABC (cdigos 41,42 y 43) pero en distintos atributos en la parte superior del video (cdigos F0, 87 y 0F). El manejo del video se puede hacer tambin utilizando las rutinas de la interrupcin 10h que el fabricante del BIOS (IBM, Phoenix, etc.) dise:
;Limpia la pantalla: Servicio 06h de la interrupcin 10h del BIOS cls PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX MOV AH,6 ;Funcin de movimiento de pantalla MOV AL,0 ;Cdigo para limpiar pantalla MOV CH,0 ;rengln izq. sup. MOV CL,0 ;columna izq. sup. MOV DH,24 ;rengln inf. derecho MOV DL,79 ;columna inf. derecha MOV BH,7 ;Byte de atributo del carcter INT 10 ;llamada al ROM POP DX POP CX POP BX POP AX RET cls ENDP

El siguiente programa usa de la misma forma la interrupcin 10h:


;Posiciona cursor en columna AL, rengln AH ;Servicio 02h de la interrupcin 10h ;Parmetros de entrada: AL y AH ;Parmetros de salida : Ninguno

9-164

El Video

;Registros destruidos : Ninguno IR_A_XY PROC NEAR PUSH BX PUSH DX MOV DX,AX MOV AH,2 MOV BH,0 INT 10h POP DX POP BX RET ir_a_XY ENDP

;en DH el rengln, en DL la columna ;servicio 2 de la ;pgina cero de la ;interrupcin 10h

9.2 Ventanas
Las rutinas del ROM de una computadora IBM o compatible permiten el manejo de ventanas dentro de la pantalla, as como de varias pginas de video para animaciones rpidas y distintos trucos programticos. Esta caracterstica es muy utilizada en los programas modernos integrados y ambientes en el que el manejo de las ventanas es la base. Mostraremos a continuacin cmo colocar una ventana sencilla en la pantalla de 20 columnas de ancho y 9 renglones de alto colocada en la mitad de la pantalla:
;Ventana: demostracin del uso de ventanas ;NO utilice el ENTER para terminar una lnea ventana SEGMENT ASSUME CS:ventana ; ;limpia pantalla MOV AH,6 ;Funcin de movimiento de pantalla MOV AL,0 ;Cdigo para limpiar pantalla MOV CH,0 ;rengln izq. sup. MOV CL,0 ;columna izq. sup. MOV DH,24 ;rengln inf. derecho MOV DL,79 ;columna inf. derecha MOV BH,7 ;Byte de atributo del carcter INT 10h ;llamada al ROM ;

9-165

Ensamblador

, colocar el cursor en las coordenadas adecuadas a la ventana coloca: MOV DH,16 ;rengln MOV DL,30 ;columna MOV AH,2 ;servicio 2 de la MOV BH,0 ;pgina cero de la INT 10h ;interrupcin 10h MOV CX,20d ;cuenta a 20 ; ; acepta la entrada del teclado 20 veces tecla: MOV AH,1 ;funcin del teclado INT 21h CMP AL,3 ;Si CTRL C JZ salida ;termina LOOP tecla ;sigue hasta agotar CX ; ;mueve pantalla hacia arriba MOV AH,6 ;funcin de mover MOV AL,1 ;Nmero de lneas MOV CH,8 ;Rengln sup. izq. MOV CL,30 ;Columna sup. izq. MOV DH,16 ;rengln inf. derecho MOV DL,50 ;Columna inf. derecha MOV BH,7 ;Atributo normal INT 10h ;llamada a int. video JMP coloca salida: INT 20h ; ventana ENDS END Ejercicio 9.1 Convierta el programa anterior en uno modular usando llamadas a subrutinas (CALL) en lugar de las secuencas de cdigo insertadas para: 1. limpiar pantalla, 2. colocar cursor y 3. mover rengln hacia arriba (Scroll).

El siguiente cdigo llena la pantalla con cierto carcter predeterminado y aprovecha que ya sabemos la direccin del rea de memoria donde se guardan los datos de la pantalla.
;Llena: llena la pantalla con un carcter ;Define el segmento de video

9-166

El Video

SEGMENT AT 0B800h DB 800h DUP(?) ;tamao de la pantalla (2048 bytes) video ENDS ;********************************************************** codigo SEGMENT llena PROC FAR ASSUME CS:codigo ASSUME DS:video PUSH DS ;guarda el segmento viejo SUB AX,AX ;AX en cero PUSH AX ;segmento DS:0 ; ;apunta a segmento de video MOV AX,video MOV DS,AX ; ;coloca carcter con atributo normal MOV AX,0701h MOV BX,0 ;inicio de pantalla MOV CX,0F9Fh ;cuenta ; ;llena la pantalla otro: MOV [BX],AX ;inserta carcter INC BX ;incrementa contador en INC BX ;2 bytes LOOP otro RET ; llena ENDP codigo ENDS END

video

En el programa anterior remarquemos que no es posible regresar al SO usando una interrupcin (20h) puesto que el programa modifica el segmento de datos por lo que primero se debe salvar este segmento y por ltimo regresar con la instruccin RET.
Ejercicio 9.2 Modifique el programa anterior (llena) para usar la instruccin MOVS en lugar del lazo utilizado.

9-167

Ensamblador

Ejercicio 9.3 Utilizando el ejemplo del programa LLENA, modifique ahora el programa VENTANA para agregar un recuadro a la ventana. Utilice las instrucciones de movimientos de cadenas.

9.3 Pantallas de Graficacin


Poco a poco ha habido una evolucin en los dispositivos que conforman los sistemas de cmputo, mientras ms avanza la tecnologa y los productos se vuelven populares por demanda o por baja de costos los diseadores estn presionados a mejorar da a da. De la sencilla pantalla de despliegue de caracteres en modo monocromtico, se pasa a mejores resoluciones, ms detalle (nmero de pixels), y ms colores. De 320 x 200 pixels a color se evoluciona pasando por 640 x 200 16 colores hasta el estandar actual de 1200 x 480 en 16 millones de colores en los cuales se obtiene resolucin casi fotogrfica. Todo lo anterior desemboca en requerimientos ms y ms grandes de memoria pues el manejo de cada pixel requiere entonces de ms bytes para especificar sus atributos y colores de los posibles de seleccionar, siendo comn hasta 2M bytes y ms en los controladores modernos Al ejecutarse el sistema operativo, ste despierta en modo de texto y es la obligacin del programa que utiliza los servicios del sistema operativo de cambiar este modo. Una posibilidad es el comando MODE del SO o cualquier utilera proporcionada por los fabricantes de los dispositivos controladores de video, pero la operacin debe realizarse manualmente. La alternativa es entonces automatizar el proceso dentro del programa que as lo requiera. Para lograr esto se requiere de dos pasos: 1. Alterar algunos bits de un byte especial que reside en memoria llamado bandera del equipo. 2. Informar al BIOS del ROM que se ha modificado dicha bandera. Al prender el equipo, el SO reconoce por medio de los interruptores de la mquina, qu tipo de equipo est conectado en ese momento y guarda la informacin en un byte localizado en la direccin absoluta 00410h. Si se

9-168

El Video

quiere engaar al SO es necesario modificar los bits de esa localidad, en nuestro caso especial nos interesan los bits 4 y 5: 00 tarjeta de color 40 x 25 caracteres 10 tarjeta de color 80 x 25 caracteres 11 tarjeta monocromtica 80 x 25 caracteres La interrupcin 10h maneja esto por nosotros con distintas alternativas de las que slo investigaremos 3: 80 x 25 caracteres monocromticoal llamar con AL=2, AH=0. 640 x 200 pixel monocromtico llamar con AL=6, AH=0. 320 x 200 pixels de color llamar con AL=4, AH=0. Presentamos un corto programa que realiza esto precisamente:
;MODO: cambia el modo de la pantalla a ;M=monocromtico ;A=Alta resolucin 640 x 200 monocromtico ;C=Baja resolucin 320 x 200 color tecla EQU 1h ;entrada del teclado muestra EQU 9h ;despliegue en pantalla dos EQU 21h ;llamada a DOS ; ;Define el segmento de la bandera de video rom SEGMENT AT 040h ORG 10h ;direccin del byte bandera DW ? rom ENDS ;************************************************ ;Define segmento de cdigo modo SEGMENT ASSUME CS:modo ASSUME DS:modo ORG 100h inicio: MOV DX,OFFSET mens ;direccin del mensaje MOV AH,muestra ;prepara a desplegar INT dos ; ;escoge la bandera del equipo

9-169

Ensamblador

ASSUME DS:rom MOV AX,rom MOV DS,AX ; ;Toma la letra del usuario y escoge la opcin MOV AH,tecla ;entrada del teclado INT dos ;llama a DOS CMP AL,m ;monocromtico JE mono CMP AL,a ;alta resolucin JE alta_res CMP AL,c ;color JE color JMP inicio ; ;coloca en monocromtico mono: MOV AX,bandera ;bandera del equipo AND AX,11001111b ;quita los bits del video OR AX,00110000b ;y coloca bits de monocromtico MOV bandera,AX ;regersa a su lugar MOV AL,2 ;80 columnas en Blanco y Negro MOV AH,0 ;funcin de modifica equipo INT 10h ;llama a rutina de video JMP salida ;finaliza ; ;coloca en alta resolucin alta_res: MOV AX,bandera ;bandera del equipo AND AX,11001111b ;quita los bits del video OR AX,00100000b ;y coloca bits de 640 x 200 MOV bandera,AX ;regersa a su lugar MOV AL,6 ;640 x 200 en Blanco y Negro MOV AH,0 ;funcin de modifica equipo INT 10h ;llama a rutina de video JMP salida ;finaliza ; ;coloca en color 320 x 200 color: MOV AX,bandera ;bandera del equipo AND AX,11001111b ;quita los bits del video MOV bandera,AX ;regresa a su lugar MOV AL,4 ;320 x 200 color MOV AH,0 ;funcin de modifica equipo

9-170

El Video

INT 10h ;llama a rutina de video ; salida: INT 20h ;salir ; mens db 13,10 db Teclee m para 80 x 25 monocromtico,13,10 db a para 640 x 200 monocromtico,13,10 db c para 320 x 200 color,13,10 db Seleccin: $ ; modo ENDS END inicio

El programa anterior debe ser ensamblado en un archivo del tipo COM (usando EXE2BIN) y slo puede ser usado en equipos con tarjeta CGA, EGA, VGA, SVGA o UVGA. El program hace uso de la pseudo instruccin SEGMENT AT que forza al segmento en una direccin explicita conocida de antemano. Otra cosa importante es que como deseamos un programa tipo COM, hemos forzado los datos en un slo segmento y no en segmentos separados como en ejemplos anteriores, la nica excepcin a esto es con el uso de la pseudo instruccin SEGMENT AT explicada en el parrfo anterior. Establecemos en este momento la siguiente regla:
REGLA. Se puede tener ms de un segmento en un archivo COM si este segmento es definido de antemano con la pseudo instruccin SEGMENT AT.

La forma de accesar la pantalla cambia tambin pues ahora se requiere de 320 x 200 (en baja resolucin color) 64,000 bytes localidades de memoria para guardar la informacin de los pixels por lo que se escogi asignar 2 bits de un byte para cada localidad lo que nos da una posibilidad de 4 combinaciones para cada pixel y 4 pixel por byte (16,000 localidades) en las siguientes combinaciones: 00 negro 01 amarillo 10 azul 11 blanco

9-171

Ensamblador

Experimentaremos un poco con el color y DEBUG una vez que ya tenemos el programa MODO ensamblado. Como primer paso necesitamos cambiar el modo de la pantalla a color resolucin baja (320 x 200) usando nuestro programa MODO escogiendo la opcin C y de ah entrar a DEBUG y cambiar el segmento al de la pantalla:
C>DEBUG -rds DS 08F1 :b800

En este punto intentemos lo siguiente:


-f0 400 55

Con lo que logramos que aparezcan una docena de rayas amarillas en la parte superior del monitor. El color depende del monitor que estemos usando y del ajuste del mismo. Lo que hemos logrado con el comando f es llenar las primeras 400h localidades del segmento de memoria con la constante 55h 01010101b, el cdigo amarillo para cada uno de los 4 pixeles de cada byte. Por qu si llenamos las primeras 400h localidades de memoria de video obtenemos entonces reas en blanco de la pantalla? La memoria de video para color se divide en dos partes: De las localidades 0000h a la 1F3Fh (7,999 bytes) para las lneas pares (0,2,4, etc.) De las localidades 2000h a la 3F3Fh (7,999 bytes) para las lneas impares (1,3,5, etc.) Probemos otros colores:
-f 400 800 aa -f0 800 c00 ff

Y llenemos ahora las lneas impares:


-f 2000 2400 55 -f 2400 2800 aa -f 2800 2c00 ff Ejercicio 9.4

Experimente en este punto con distintos cdigos y vea el

resultado.

9-172

El Video

Como se puede suponer, es un poco difcil tratar de mantener el control de las dos reas de memoria para grficar un punto o lnea de un lugar a otro. Para evitarnos este problema podemos usar una rutina del ROM que hace todo el trabajo: AH = 12h DX = nmero de rengln del punto a desplegar CX = nmero de la columna del punto a desplegar AL = color del punto

En el siguiente programa evitaremos el uso de esta interrupcin y disearemos el programa de forma tal que deba resolver todo lo relacionado a los colores, bancos y pixels de cada byte. El programa opera usando las teclas 0,1,2 y 3 para definir el color del pixel y las flechas para definir la direccin de dibujo del mismo. A su vez, hace uso de la interrupcin 16h del teclado que nos regresa el cdigo de cada tecla presionada. Desgraciadamente las teclas como maysculas, bloqueo de nmeros, etc. no tienen cdigo, para eso se requiere del llamado a la interrupcin 16h con AH=2 lo que regresa una bandera con los distintos estados de las teclas presionadas en el registro AX de acuerdo a la siguiente tabla: bit 0 Tecla de maysculas derecha presionada bit 1 Tecla de maysculas izquierda presionada bit 2 Tecla de control presionada bit 3 Tecla de alterno presionada bit 4 Tecla de bloque de desplazamiento activada bit 5 Tecla de bloque numrico activada bit 6 Tecla de bloqueo de maysculas activada bit 7 Tecla de insertar activa

;LINEAS Rutina para dibujo de linea en la pantalla utilizando ;las flechas para la direccion ;Se requiere de monitor de color y de usar antes ;el programa MODO de este mismo captulo (opcin c) arriba EQU 48H ; flecha hacia arriba

9-173

Ensamblador

abajo EQU 50H ; flecha hacia abajo derecha EQU 4dH ; izquierda EQU 4bH ; escape EQU 1bH ; tecla de ESC ;************************************************ video SEGMENT AT 0B800H ; define segmento extra apuntando a pantalla wd_buff LABEL WORD v_buff LABEL BYTE video ENDS ;************************************************ linea SEGMENT ; define el segmento de codigo ; principal PROC FAR ; parte principal del programa ASSUME cs:linea,es:video inicio: ; direccion inicial de ejecucin ; prepara stack para regreso PUSH ds ; guarda segmento de datos viejos SUB AX,AX ; cero en AX PUSH AX ; y guarda en pila(segmento DS:0) ; prepara ES con el segmento de video MOV AX,video ; direccion del segmento de video MOV ES,AX ; pasarlo a ES ; limpia pantalla usando el ROM MOV AH,6 ; usa corrimiento hacia arriba MOV AL,0 ; cdigo para limpiar pantalla MOV CX,0 ; punto superior izq.=0,0 MOV DL,79 ; punto inf izq en MOV DH,24 ; 79,24 INT 10H ; llama a rutina de ROM ; el apuntador a la pantalla est en CX, DX ; rengln de 0 a 200d en DX ; columna de 0 a 320d en CX ; ; posiciona en centro de pantalla para comenzar MOV DX,100d ; nmero de renglones/2 MOV CX,160d ; columnas/2 ; ; lee el teclado para obtener el dgito que se est presionando lee_tecla: MOV AH,0 ; funcin del teclado sin eco INT 16H ; llama a dos CMP AL,escape ; si es ESC JZ salida ; termina

9-174

El Video

CMP AL,33H ; si es mayor que 3 (ASCII) JG grafica ; no es color CMP AL,30H ; si es menor que cero (ASCII) JL grafica ; no es color ; nmero entre 0 y 3, es un color, defnelo AND AL,3 ; quita 5 bits superiores MOV BL,AL ; guarda en BL JMP lee_tecla ; toma siguiente caracter ; encuentra hacia a donde ir y grafica siguiente punto grafica: MOV AL,AH ; poner cdigo de bsqueda en AL CMP AL, arriba JNZ no_arriba ; salta si no es hacia arriba DEC DX ; si es hacia arriba resta lnea no_arriba: CMP AL,abajo JNZ no_abajo ; salta si no es hacia abajo INC DX ; si hacia abajo, resta lnea no_abajo: CMP AL,derecha JNZ no_derecha INC CX no_derecha: CMP AL,izquierda JNZ prendelo DEC CX ; llama a subrutina de grfica que requiere color en AL, ; rengln en DX y columna en CX prendelo: MOV AL,BL ;retrasa CALL graf_punto ; lee puerto B en AL JMP lee_tecla ; mascarilla los 2 bits ms bajos salida: RET ; regresa a dos principal ENDP ; final de parte principal de programa ; graf_punto PROC NEAR ; subrutina de graficacin en pantalla ; resolucin media, 320 x 200 en color ; entra con : ; coordenada x en CX, coordenada y en DX ; color en AL(0=apagado, 1,2,3=colores) PUSH BX ; salva BX,columna,renglon y color PUSH CX

9-175

Ensamblador

PUSH DX PUSH AX ; multiplica rengln x # de bytes por rengln ; (80 pero como ya fue mult. por 2 usar 40) PUSH DX ; salva reng. para par/non MOV AL,40 ; bytes/reng./2 AND DX,0FEh ; quita bit de non/par MUL DL ; AX tiene ahora la dir. del reng. ; ver si hay que sumar 2000H para segundo banco de memoria ; si el rengln es impar POP DX ; trae nmero original de reng. TEST DL,1 ; probar bit 0 para par/non JZ par ; salta a pares ADD AX,2000H ; suma para apuntar a 2do banco de mem. par: MOV BX,AX ; salvar reng. en BX ; sumar dir de columna a rengln PUSH CX ; salvar columna SHR CX,1 ; correr a izq. para SHR CX,1 ;no matar bits de color ADD BX,CX ; sumar a dir. en BX ; usar los bits de pos. para poner color y mascara en pos. correcta POP CX ; recupera columna AND CX,3 ; guarda bits de pos. INC CX ; corrimiento gratis POP AX ; trae color MOV DL,0FCh ; DL mascara 11,11,11,00 corre: ; AL color 00,00,00,cc ROR AL,1 ; corre color ROR AL,1 ; 2 bits a la derecha ROR DL,1 ; corre mascarilla 2 bits ROR DL,1 ; a la derecha LOOP corre ; hacerlo el # de veces de pos. de bits ; contenido del byte, mascarilla todo menos color y OR con bits de color AND [v_buff + BX],DL ; mascarilla OR [v_buff + BX],AL ;OR con el color POP DX ; restaura rengln POP CX ; restaura columna POP BX ; restaura BX y RET ; regresa graf_punto ENDP ; linea ENDS ; fin de segmento

9-176

El Video

;***************************************************** ; END inicio ; fin de ensamble

Se introduce la pseudo instruccin LABEL BYTE, LABEL WORD y LABEL DWORD que define o redefine una localidad como tipo byte, palabra o palabra doble. Recordemos que las pseudo instrucciones DB y DW reservan y apartan las localidades de memoria necesarias segn la definicin realizada, a diferencia de stas, LABEL slo informa al ensamblador qu tipo de localidad es la que sigue o precede sin reservar localidades de memoria y es sumamemte usada cuando se necesita definir una misma rea como de dos o ms tipos diferentes. Se requiere de este tipo de instrucciones pues el ensamblador es muy rgido con la definicin de tipos y no es posible cambiar al vuelo el tipo de datos. El dibujar lneas horizontales y verticales es muy sencillo pero en diagonal se vuelve un poco ms complejo requiriendo de ms pasos para definir qu pixeles encender y cules no. Presentamos un programa en el que al introducir una secuencia de 5 nmeros (x1, y1, x2, y2, color) realiza la lnea utilizando el algoritmo de Bresenham.
Ejercicio 9.5 Investigar en qu consiste el algoritmo de Bresenham para dibujar una lnea entre dos puntos en una pantalla.

El programa que sigue se basa en este algoritmo y en las interrupciones del ROM para graficar una lnea recta entre dos puntos. El programa debe de ser ejecutado como tipo EXE (no usar EXE2BIN) y se debe cambiar la pantalla a color 320 x 200 antes de usarse. Una vez en el programa, ste espera 5 parmetros desde el teclado introducidos con ENTER: x1,y1: coordenadas del punto inicial x2,y2: coordenadas del punto final color: el color para la lnea al introducir el litimo dato el programa grafica la lnea y espera otros 5 datos.
;BRESENHAM: dibujo de una lnea recta entre dos puntos de la pantalla ;use el programa MODO para cambiar a pantalla de color 320 x 200 ;Acepta 5 parmetros (x1,y1), (x2,y2) y color (1,2,3,4,0) datos SEGMENT delta_x DW ? ;|x2-x1| delta_y DW ? ;|y2-y1|

9-177

Ensamblador

mitad_y LABEL WORD ;|y2-y1|/2 mitad_x DW ? ;|x2-x1|/2 cuenta DW ? ;eje largo x1 DW ? ;coordenada 1 y1 DW ? ;coordenada 1 x2 DW ? ;coordenada 2 y2 DW ? ;coordenada 2 color DW ? ;color de 0 a 4 de 0 a 1 datos ENDS ;fin de datos ; bresen SEGMENT ;segmento de cdigo prog PROC FAR ;parte principal del programa ASSUME CS:bresen,DS:datos inicio: ;direccin inicial ;guarda la pila para el regreso PUSH DS SUB AX,AX PUSH AX ; limpia pantalla usando el ROM MOV AH,6 ; usa corrimiento hacia arriba MOV AL,0 ; cdigo para limpiar pantalla MOV CX,0 ; punto superior izq.=0,0 MOV DL,79 ; punto inf izq en MOV DH,24 ; 79,24 INT 10H ; llama a rutina de ROM n_linea: CALL decbin ;pide x1 MOV x1,BX CALL decbin ;pide y1 MOV y1,BX CALL decbin ;pide x2 MOV x2,BX CALL decbin ;pide y2 MOV y2,BX CALL decbin ;pide el color MOV color,BX CALL linea ;dibuja la lnea JMP n_linea ;vuelve por otros datos prog ENDP ; ; linea PROC NEAR ;rutina para dibuhar la lnea ;encuentra |y2-y1| resultado en delta_y MOV AX,y2 ;toma y2

9-178

El Video

SUB AX,y1 ;resta y1, resultado en AX ;Si delta_y es + SI=1, si - SI=-1 MOV SI,1 ;bandera positiva JGE guarda_y ;manten si positivo MOV SI,-1 ;poner bandera en negativo NEG AX ;saca valor absoluto guarda_y: MOV delta_y,AX ;guarda valor de |y2-y1| ;encuentra |x2-x1| resultado en delta_x MOV AX,x2 ;toma x2 SUB AX,x1 ;resta x1, resultado en AX ;Si delta_x es + DI=1, si - DI=-1 MOV DI,1 ;bandera positiva JGE guarda_x ;si positivo manten MOV DI,-1 ;si negativo pon bandera NEG AX ;y saca valor absoluto guarda_x: MOV delta_x,AX ;guarda valor de |x2-x1| ;Encuentra si pendiente > o < que 1 CMP AX,delta_y ;compara las deltas JL c_pend ;pendiente>1 CALL pend_1 ;pendiente<=1 JMP fin c_pend: CALL pend ;pendiente>1 fin: RET linea ENDP ; pend_1 PROC NEAR ;pendiente < 1 ;Calcula |x2-x2|/2 MOV AX,delta_x ;toma |x2-x2| SHR AX,1 ;divide entre 2 MOV mitad_x,AX ;y guarda ;Inicia valores MOV CX,x1 ;toma x1 MOV DX,y1 ;toma y1 MOV BX,0 ;inicializa BX MOV AX,delta_x ;fija la cuenta a MOV cuenta,AX ;|x2-x1| punto: CALL graf_punto ;grafica un punto ADD CX,DI ;inc/dec de X ADD BX,delta_y ;+|y2-y1| en BX CMP BX,mitad_x ;compara con |x2-x1|/2

9-179

Ensamblador

JLE SUB ADD dcuenta:

dcuenta BX,delta_x DX,SI

;no modificar inc/dec de Y ;BX-|x2-x1| ;incrementa o decrementa Y

DEC cuenta ;Terminamos? JGE punto ;an no RET pend_1 ENDP ; pend PROC NEAR ;pendiente > 1 MOV AX,delta_y ;toma |y2-y1| SHR AX,1 ;divide entre 2 MOV mitad_y,AX ;y guarda ;Inicia valores MOV CX,x1 ;toma x1 MOV DX,y1 ;toma y1 MOV BX,0 ;inicializa registro BX MOV AX,delta_y ;toma |x2-x1| MOV cuenta,AX ;y guarda en cuenta punto2: CALL graf_punto ;grafica punto ADD DX,SI ;incrementa o decrementa Y ADD BX,delta_x ;BX+|x2-x1| CMP BX,mitad_y ;compara con |y2-y1|/2 JLE dcuenta2 ;no incrementar o decrementar X SUB BX,delta_y ;BX-|y2-y1| ADD CX,DI ;incrementa o decrementa X dcuenta2: DEC cuenta ;Se termin la lnea? JGE punto2 ;an no RET pend ENDP ; graf_punto PROC NEAR PUSH BX ;guarda registros PUSH CX PUSH DX PUSH AX PUSH SI PUSH DI ;Rutina de ROM para graficar punto requiere de: ;DX=rengln, CX=columna, AL=color MOV AX,color

9-180

El Video

MOV AH,12d ;funcin de graficar punto INT 10h ;Rutina del BIOS POP DI ;Regresa registros POP SI POP AX POP DX POP CX POP BX RET graf_punto ENDP ; key_in EQU 1h doscall EQU 21H ; decbin PROC NEAR ;Ver captulo 6 ;Acepta decimal de teclado, regresa ;binario en registro BX MOV BX,0 ;Limpia registro BX otro: MOV AH,key_in ;entrada del teclado INT doscall ;llama a DOS SUB AL,30h ;ASCII a binario JL sale ;Salir si el #<0 CMP al,9d ;Es > 9? JG sale ;Si es as, no es dgito CBW ;Convierte byte en AL a palabra en AX ;Multiplica nmero en BX por 10 XCHG AX,BX ;Cambia registros AX y BX MOV CX,10d ;Coloca 10 en CX MUL CX ;y multiplica por AX (AX*10) XCHG AX,BX ;Regresa # a BX ;Suma nmero en AX por el de BX ADD BX,AX ;suma dgito a # JMP otro ; y ve por otro sale: RET decbin ENDP ; bresen ENDS ;fin de segmento principal ; -

9-181

Ensamblador

END

inicio

;fin de programa

9.4 Resumen

9.5 Instrucciones Analizadas


SEGMENT AT, LABEL BYTE, LABEL WORD

9.6 Problemas
9.1 Modifique el programa BRESENH de forma que salte un rengln despus de aceptar cada parmetro. 9.2 Modifique el programa BRESENH de forma que acepte alguna tecla que usted defina para terminar la ejecucin. 9.3 Modifique el programa BRESENH para que limpie la pantalla despues de la graficacin de cada lnea.

9.7 Bibliografa
Revista PC Magazine EU nmeros de 1993. Mercier Philippe Assembleur Facile. Marabout 1992, Alleur Blgica. Barden William Jr. How to Program Microcomputers. Sams & Company 1987. MASM 86 Columbia Data Products, EU 1986. IBM Personal Computer Technical Reference. Apndice A

9-182

Captulo 10
10.1 Archivos
Por razones histricas y de compatibilidad con sistemas anteriores y con versiones viejas, el MS-DOS proporciona acceso a lectoras de disco de varias formas: Acceso secuencial a registros Acceso aleatorio a registros Acceso aleatorio a bloques Manejadores de archivo (file handles) En el ltimo esquema se especifica el nombre del archivo y la interrupcin regresa un nmero de manejador que a partir de ese momento sirve para accesar los datos del archivo. Analizaremos brevemente en las siguientes secciones cada uno de los mtodos e ilustraremos con breves programas.

10.2 Acceso Secuencial


El primer paso para el acceso a los datos de un archivo es guardar el nombre junto con otra informacin en un rea de memoria preestablecida llamada Bloque de Control de Datos (File Control Block o FCB). El segundo paso consiste en especificar un lugar en memoria donde se guardan los datos de las lecturas y escrituras al disco y esta rea se llama Area de Transferencia de Datos (Data Transfer Area o DTA). El tercer paso es abrir el archivo y el cuarto y ltimo sera cerrar el archivo una vez que los datos han sido ledos o escritos a l.

10-183

Ensamblador

La interrupcin utilizada para el manejo de archivo es la 21h con distintos servicios solicitados por medio de datos en el registro AH. El primer servicio que veremos es el de abrir un archivo y corresponde al servicio 0Fh. Este servicio exige que el archivo ya exista por lo que lo creamos primero ya sea desde el sistema operativo copiando desde el teclado (consola) o usando un procesador de palabras.
Funcin de abrir un archivo, Servicio 0Fh de la interrupcin 21h
Registros: AH=0Fh DS=Direccin del Segmento del FCB DX=Desplazamiento de la direccin del FCB (El nombre del archivo con su extensin deben estar ya en el FCB) Regresa: AL=00 AL=FF FCB el archivo se encontr y abri El archivo no existe # de disco,tamao de registro,fecha,tamao archivo,# bolque,etc.

Practiquemos a abrir un archivo desde DEBUG: Primero creamos el archivo copindolo desde el teclado:
C>COPY CON prueba.txt ejemplo de informacin^Z 1 files(s) copied C>DEBUG -a100 MOV DX,5C MOV AX,0F INT 21 INT 20

Pero an no hemos especificado el nombre del archivo, sin embargo colocamos un nmero (5C) que corresponde al lugar donde estar el nombre del archivo. DEBUG comienza siempre en la direccin 100h del segmento correspondiente. Qu hay en las localidades del 00h al FFh? Estas localidades forman parte del Prefijo del Segmento del Programa y dentro de ste, el FCB ocupa las localidades del 5Ch al 7Ch (en los accesos aleatorios es hasta 80h) seguido del DTA de la direccin 80h a la FFh.

10-184

El Acceso a Disco

El prefijo del segmento del programa de DEBUG consiste, en este caso, mayoritariamente en informacin que el SO y el programa requieren saber de un archivo en particular, por ejemplo los 2 primeros bytes a partir de la direccin 0 son la INT 20h, los siguientes 2 el tamao de la memoria disponible, los 6 siguientes en la direccin del despachador de DOS, los 4 siguientes en la dirrecin donde los programas terminan, los siguientes dos en la direccin de salida para una interrupcin por teclado (IP), etc. Esta estructura se muestra en detalle en el apndice E del libro IBM Personal Computing Disk Operating System. El siguiente paso consiste en especificar el nombre del archivo que queremos abrir. Dejemos que DEBUG nos ayude y usemos el comando N, pero primero llenemos algunas localidades con un valor conocido como por ejemplo 22.
-f 40 7f 22 -nprueba.txt

y comprobemos con D.
-d0

Veremos que los bytes a partir del 5Ch han sido modificados y contienen ahora el nombre del archivo PRUEBA.TXT que DEBUG coloc ah. Ejecutemos ahora nuestro programa con G. Si desplegamos de nuevo la direccin 0 (D0) nos encontramos que todo el panorama del FCB ha cambiado y muestra nueva informacin de acuerdo a la siguiente tabla:

10-185

Ensamblador

Tabla 10.1 El FCB


SO=datos llenados por el SO al abrir el archivo usuario=datos proporcionados por el usuario 0 5C Nmero de disco SO 1 5D 2 5E 3 5F nombre del archivo usuario 4 60 5 61 6 62 7 63 8 64 9 65 10 66 extensin archivo usuario 11 67 12 68 bloque actual SO 13 69 14 6A tamao registro SO 15 6B 16 6C tamao archivo (bajo) SO 17 6D 18 6E tamao archivo (alto) SO 19 6F 20 70 fecha SO 21 71 22 72 23 73 24 74 25 75 Uso del SO SO 26 76 27 77 28 78 29 79 30 7A 31 7B 32 7C registro actual usuario 33 7D # reg. aleatorio (bajo) usuario 34 7E 35 7F # reg. aleatorio (alto) usuario 36 80

Expliquemos brevemente las localidades ms relevantes: En la direccin 5C encontramos ahora un 02 que corresponde al disco C, en la 6A encontramos ahora 80h (128d) que es el tamao

10-186

El Acceso a Disco

del registro que el sistema operativo toma por omisin pues es el tamao estandard para archivos secuenciales. En las localidades 6C hasta la 6F se encuentra el tamao del archivo y en este caso es de 16h (22d) bytes. Recuerde que se especifica primero byte alto, byte bajo, palabra alta, palabra baja. La fecha se encuentra almacenada en las localidades 70h y 71h y en nuestro caso encontramos el nmero 09h 1Fh nuevamente en el orden invertido (1Fh 09h 0001 1111 0000 1001) con la siguiente convencin: A. Los primeros 5 bits corresponden al da. Por ejemplo 01001 da 9. B. Los siguientes 4 bits al mes. Por ejemplo 1000 mes 8. C. Los ltimos 7 bits al ao que se deben sumar a 1980. Por ejemplo 0001111, 15d que corresponde a 1995. De las localidades 72h a 7Bh se encuentra la direccin donde est almacenado fsicamente el archivo, es un poco complicado y no lo tocaremos en este momento.

Una vez que el archivo fue abierto, podemos proceder a leer su informacin. El servicio 14h de la interrupcin 21h nos permite leer secuencialmente de un archivo:
Funcin de lectura secuencial,INT 21h servicio 14h
Registros: AH=14h DS=Direccin del Segmento del FCB DX=Desplazamiento de la direccin del FCB (El nombre del archivo con su extensin, bloque actual, registro actual y el tamao del registro deben estar ya en el FCB) Regresa: AL=00 AL=01 AL=02 AL=03 registro del archivo leido exitosamente fin de archivo,no hay datos en el registro DTA muy pequeo,fin de transferencia fin de archivo

Desde DEBUG metamos ahora el siguiente programa:

10-187

Ensamblador

MOV MOV INT MOV INT INT

DX,5C AH,0F 21 AH,14 21 20

;direccin del FCB ;abrir archivo ;llama a DOS ;servicio de lectura ;llama a DOS ;vuelve a DEBUG

Antes de ejecutar el programa llenemos con la instruccin f las localidades 80h a FFh con un valor conocido. Estas localidades forman el Area de Transferenmcia de Datos (Data Transfer Area o DTA) y es el lugar en memoria de donde se toman los datos para escribir en un archivo o se toman los datos del archivo y se colocan en ese sitio. Esto es: El rea de transferencia de datos (DTA) es el lugar provisional en memoria donde un registro de archivo es almacenado en su camino de o hacia el disco duro o flexible. En la localidad 7Ch debemos colocar de antemano el nmero de registro a leer pero en este caso el archivo es tan pequeo que con el primer registro basta. Usando el comado E7C pongamos un cero en esa localidad. Ejecutemos ahora el programa y revisemos con el comando D las localidades de la 80h a la FFh; encontramos el texto que contienen nuestro archivo muestra. Al terminar el programa, esta localidad se incrementa en 1 pues ahora debe apuntar al siguiente registro por lo que una segunda ejecucin del programa nos dara el siguiente registro, esto es, una lectura secuencial. Pasemos ahora a un programa ms sofisticado de lectura secuencial. Para que este programa funcione, el archivo debe terminar con un smbolo de fin de archivo (EOF, 1Ah) que la mayora de los procesadores colocan de forma automtica:
; ;SECUENCI: Lee un archivo ASCII y presntalo en la pantalla ;ejecutar junto con el nombre del archivo ; dos EQU 21h ;llamada al SO abre EQU 0Fh ;llamada al SO lee EQU 14h ;llamada al SO muestra EQU 2h ;llamada al SO fcb EQU 5Ch ;llamada al SO eof EQU 1Ah ;llamada al SO

10-188

El Acceso a Disco

; datos SEGMENT ORG 7Ch regnum DB ? ;nmero de registro ORG 80h dato DB 80h DUP(?) ;rea DTA datos ENDS ; secuencial SEGMENT ;programa principal ; prog PROC FAR ASSUME CS:secuencial,DS:datos inicio: ;Salva segmentos para el regreso PUSH DS ;salva DS SUB AX,AX ;0 en AX PUSH AX ;coloca 0 en la pila ;Abre el archivo y coloca registrro en 0 MOV DX,fcb ;poner direccin de FCB dentro del segmento MOV AH,abre ;servicio de apertura INT dos ;de la interrupcin 21h MOV regnum,0 ;primer registro en 7Ch ;lee registro en forma secuencial lee_reg: MOV DX,fcb ;apunta al FCB MOV AH,lee ;servicio de lectura de INT dos ;la interrupcin 21h ;muestra el registro que se encuentra en DTA MOV CX,80h ;nmero de caracteres MOV BX,0 ;inicializa el apuntador imprime: MOV DL,[dato+BX] ;toma carcter CMP DL,eof ;Llegamos al final de archivo? JE salir ;si, salir MOV AH,muestra ;no, muestra INT dos INC BX ;incrementa el contador LOOP imprime ;realiza 80h veces JMP lee_reg ;y ve por otro registro del archivo salir: RET ;termina y regresa a DOS prog ENDP

10-189

Ensamblador

secuencial ENDS END

inicio

El programa requiere del nombre del archivo que queremos leer y ver en la pantalla como parmetro del programa: SECUENCI LEEME.TXT, el SO se encarga entonces de llenar el FCB con los datos del archivo (en este caso LEEME.TXT), algo similar al comando N de DEBUG. Otra cosa a notar es el manejo del registro DS y ES que el sistema operativo, por tratarse de un archivo tipo EXE, inicializa con los datos del mismo programa apuntando a los segmentos adecuados. Existe tambin un traslape de 1 byte entre el FCB y el DTA en la direccin 80h. En el caso de acceso secuencial no hay problema pues el byte no es usado. Pero en el caso de acceso aleatorio se debe tener cuidado de no perderlo por lo que muchas veces se prefiere mudar el rea de DTA a otro lado. En nuestro siguiente programa introducimos las funciones de crear un archivo y de escribir a l conjuntamente:
; ;GUARDA: toma datos del teclado y guarda en un archivo ; dos EQU 21h ;llamada al SO crear EQU 16h ;crear archivo escribe EQU 15h ;despliega carcter cierra EQU 10h ;cierra archivo mem_prov EQU 0Ah ;memoria para el teclado fcb EQU 5Ch ;rea de control de archivo cr EQU 0Dh ;ASCII de RETORNO lf EQU 0Ah ;ASCII de ALIMENTA LINEA ; datos SEGMENT ORG 7Ch regnum DB ? ORG 80h dato DB 80h DUP(?) ;rea DTA datos ENDS ; guarda SEGMENT

10-190

El Acceso a Disco

prog PROC FAR ASSUME CS:guarda,DS:datos inicio: ;Guarda segmentos para regresar en paz PUSH DS ;salva DS SUB AX,AX ;colcoa 0 en AX PUSH AX ;y empuja a la pila ;crea archivo, coloca contador de registro en 0 MOV DX,fcb ;FCB en DX MOV AH,crear ;servicio de Crea archivo INT dos ;de DOS MOV regnum,0 ;0 en direccin 7Ch (nmero de registro) ;limpia memoria llenando con retorno de lnea otra_linea: MOV BX,0 ;apuntador de caracteres MOV CX,80h ;cuenta de caracteres borra: MOV [BX+dato],cr ;CR en zona de datos INC BX ;incrementa apuntador LOOP borra ;repite 80h veces ;Toma lnea del teclado MOV dato-2,78 ;long. mxima de lnea MOV DX,OFFSET dato-2 ;direccin de DTA MOV AH,mem_prov ;acepta del teclado una lnea INT dos CMP dato-1,1 ;si no hay caracteres JLE salir ;salir del programa ;inserta alimentacin de lnea MOV BL,dato-1 ;coloca cuenta de caracteres aceptados MOV BH,0 ;en registro BH MOV [dato+BX+1],lf ;inserta alimentacin de lnea ;escribe registro al archivo en modo secuencial MOV DX,fcb ;FCB en DX MOV AH,escribe ;escribe en secuencia INT dos JMP otra_linea ;y acepta otra lnea ;Cierra el archivo y sal a DOS salir: MOV DX,fcb ;FCB en DX MOV AH,cierra ;funcin de cerra archivo INT dos RET prog ENDP

10-191

Ensamblador

; guarda ENDS END inicio

Los datos se introducen al programa lnea a lnea terminando con RECuando introducimos un RETORNO unicamente el programa cierra el archivo y regresa el controla al SO. Se han introducido dos nuevas funciones en el programa como se resumen en las siguientes tablas:
TORNO.

10-192

El Acceso a Disco

Funcin de Crear un Archivo,INT 21h servicio 16h


Registros: AH=16h DS=Direccin del Segmento del FCB DX=Desplazamiento de la direccin del FCB (El nombre del archivo con su extensin deben estar en el FCB) Regresa: AL=00 AL=FF archivo creado exitosamente no hay espacio para crear archivo

Se debe tener cuidado con la funcin pues si el archivo ya exista se borra, dejndolo con longitud 0.
Funcin de Escritura Secuencial,INT 21h servicio 15h
Registros: AH=15h DS=Direccin del Segmento del FCB DX=Desplazamiento de la direccin del FCB (El nombre del archivo con su extensin, bloque actual, registro actual y el tamao del registro deben estar en el FCB) Regresa: AL=00 AL=01 AL=02 registro del archivo escrito exitosamente el disco est lleno DTA muy pequeo, fin de transferencia

En la escritura secuencial, la interrupcin se encarga de incrementar el nmero de registro por nosotros dejndolo apuntando al siguiente. Si el registro no es lo suficientemente grande como para llenar un rea del disco llamada sector, es colocado en una memoria temporal por el SO. De ah es tomada cuando la longitud del sector es excedida o hasta que se cierra el archivo guardando la informacin en ese momento presente en el archivo. Un sector tiene una longitud de 512 bytes y es la unidad bsica de almacenamiento en archivos.
Ejercicio 10.2 Agregue al programa GUARDA una rutina que mande a la pantalla un CR y LF por cada lnea introducida.

10-193

Ensamblador

Ejercicio 10.3 Agrege las instrucciones necesarias para que el programa GUARDA nos advierta con un mensaje el nombre del archivo y nos solicite

que comencemos a teclear. Agrege otra rutina para dar instrucciones especficas para el uso del programa.
Ejercicio 10.4 Si el programa GUARDA,

usuario no proporcion un nombre de archivo al que el programa despliegue un mensaje de error y

salga de inmediato. En los ejercicios anteriores use definiciones de mensajes en el rea de datos de forma similara a:

mensaj1

DB

Comience a introducir datos:$

para posteriormente llamar:


MOV DX,OFFSET mensaj1 CALL despliega

10.3 Acceso Aleatorio


Una segunda forma de leer los registros de un archivo es de forma aleatoria, esto es, sin ningn orden en especfico. Una razn por la que los accesos aleatorios son ms fciles de manejar es debido a que en los accesos secuenciales se requieren de tres bytes: El primero en la direccin 7Ch para especificar el nmero de registro a leer o escribir. El segundo y tervero en las direcciones 68h y 69h para especificar el nmero de bloque. Cuando 127d registros han sido escritos al archivo, el bloque debe entonces incrementarse y el contador de registros colocarse en 0. Aunque es posible en un programa de ensamblador, cuesta tambin bastante trabajo. En una lectura/escritura aleatoria, se controla slo el nmero de registro formado por 4 bytes que nos da un total muy grande de registros dentro de un archivo. El manejo de una palabra doble es directo con las instruccions

10-194

El Acceso a Disco

de ensamblador y el control se torna entonces sumamente sencillo y directo. La funcin de lectura de un registro aleatorio es muy similar a la de uno secuencial con la diferencia de que el contador no es incrementado de forma automtica. El programa debe encargarse de insertar el nmero adecuado de registro en la zona del FCB del archivo antes de cada lectura o escritura.
Funcin de Lectura Aleatoria,INT 21h servicio 21h
Registros: AH=21h DS=Direccin del Segmento del FCB DX=Desplazamiento de la direccin del FCB (El nombre del archivo con su extensin, el tamao del registro y el nmero de registro deben estar en el FCB) Regresa: AL=00 AL=01 AL=02 AL=03 registro del archivo leido exitosamente fin de archivo,no hay datos en el registro DTA muy pequeo,fin de transferencia fin de archivo

El programa que presentamos a continuacin lee un slo registro de cualquier parte de un archivo. El nombre del archivo se introduce como parte del comando para ejecutar el programa y el nmero de registro como primer dato del programa.
; ;LEEALEA: Lee registro en forma aleatoria de un archivo ; dos EQU 21h ;llamada al SO abre EQU 0Fh ;abre un archivo leer EQU 21h ;leer de un archivo aleatorio muestra EQU 2h ;despliega carcter tecla EQU 1h ;lee un carcter del teclado fcb EQU 5Ch ;rea de control de archivo eof EQU 1Ah ;ASCII de fin de archivo ; datos SEGMENT

10-195

Ensamblador

ORG 7Dh ;registro aleatorio aleatorio1 DW ? ;registro parte baja aleatorio2 DW ? ;registro parte alta ORG 80h dato DB 80h DUP(?) ;rea de transferencia de datos datos ENDS ; leealea SEGMENT prog PROC FAR ASSUME CS:leealea,DS:datos inicio: ;Guarda segmentos para regresar en paz PUSH DS ;salva DS SUB AX,AX ;colcoa 0 en AX PUSH AX ;y empuja a la pila ;abre el archivo MOV DX,fcb ;FCB en DX MOV AH,abre ;servicio de Abre archivo INT dos ;de DOS ;Toma # registro del teclado y coloca en FCB MOV ah,tecla ;funcin del teclado INT dos SUB AL,30h ;convierte de ASCII a binario CBW ;convierte a palabra MOV aleatorio1,AX ;coloca en FCB MOV aleatorio2,0 ;y 0 en parte alta ;Lee registro del archivo MOV DX,fcb ;en DX el FCB MOV AH,leer ;lee de forma aleatoria INT dos ;Muestra el registro del rea de transferencia (DTA) MOV CX,80h ;# de caracteres en CX (contador) MOV BX,0 ;Inicializa apuntador a_pantalla: MOV DL,[dato+BX] ;toma carcter CMP DL,eof ;Se lleg al final? JE salir ;si, salir MOV AH,a_pantalla ;no, despliega en pantalla INT DOS INC BX ;ajusta el apuntador LOOP muestra ;lazo de 80h veces salir: RET ;regresa a DOS prog ENDP

10-196

El Acceso a Disco

; leealea ENDS END inicio

Para conservar el programa sencillo slo se aceptan nmeros del 0 al 9 que se convierten de ASCII a binario restando 30h y la regin del DTA se deja en su lugar (direccin del 7Dh al 80h) aunque existen posibles conflictos en la localidad 7Dh que resolvemos moviendo un cero despues de llenar la DTA y antes de leer un registro. El escribir a un registro secuencial sigue la misma mecnica que la lectura por lo que no nos entretendremos con ello. La nica recomendacin es no tratar de leer un registro que no existe y escribir slo sobre registros que ya existen.

10.4 Manejadores de Archivos


A partir de la versin 2.0 de MS-DOS se prefiere que el manejo de archivos, sus FCB y DTA sean realizados por el mismo sistema operativo. Al usar estos servicios de las interrupciones proporcionadas por los diseadores del SO, nos encontramos con tres diferencias principales: 1. No hay FCB. Los parmetros varios del FCB han sido absorbidos por el SO y ya no son visibles al usuario, por lo que ya no es necesario preocuparse de ellos. El nombre del archivo se reemplaza por nombre + extensin + camino completo seguido de un byte en cero y se le denomina ASCIIZ por el cero adicional. 2. No hay Registros. Al igual que el FCB, los registros desaparecen y son sustituidos por el nmero de bytes que queremos leer/escribir/accesar de un archivo. 3. Manejo por medio de manijas. Las manijas son nmeros de control de 16 bits que nos permite manejar el archivo por una referencia simblica en lugar de por nombre. Otra mejora sustancial en el mtodo de acceso a archivos es el manejo uniforme de errores, siempre que una funcin genere un error, la bandera de acarreo se fija (podemos probar la condicin con un salto condicional

10-197

Ensamblador

JC) y el registro AX contiene el nmero de error de acuerdo a la siguiente tabla:


Decimal Hexadecimal
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12

Error
Nmero de Funcin Invlida Archivo no encontrado Camino no encontrado Demasiados archivos abiertos Acceso denegado (atributo o cdigo de acceso equivocados) Manija invlida Bloques de control de memoria destrudos Memoria insuficiente Bloque de direccin de memoria invlido Ambiente invlido Formato invlido Cdigo de acceso invlido Datos invlidos no se usa Disco invlido Intento de remover el directorio actual No es el mismo dispositivo No hay ms archivos

Al abrirse el archivo se le asigna un cdigo de acceso que determina si el archivo es de slo lectura (cdigo 0), de slo escritura (cdigo 1) o de lectura y escritura (cdigo 2). De la misma manera se le asigna un atributo en un byte: bit 0. Slo lectura. bit 1. Archivo oculto. bit 2. Archivo de sistema. bit 3. No es archivo sino etiqueta de volumen.

10-198

El Acceso a Disco

bit 4. No es archivo sino subdirectorio. bit 5. Indica que es un archivo. El atributo de un archivo se puede cambiar usando el servicio 43h de la funcin 21h y se usa el registro CX para fijar el atributo. Presentamos a continuacin las distintas funciones para leer, escribir, crear, abrir, cerrar, etc. un archivo con manijas y un programa que integra algunas de estas funciones como ejemplo:

Funcin de Abrir Archivo,INT 21h servicio 3Dh


Registros: AH=3Dh DS=Direccin del Segmento de cadena ASCII+0 DX=Desplazamiento de la direccin de cadena ASCII+0 AL=Cdig o de (0=lectura,1=escritura,2=lectura/escritura) Regresa: Bandera de acarreo 0 si no hay error, 1 si hay error (CF) AX AL=02 manejador de archivo o cdigo de error DTA muy pequeo,fin de transferencia (los errores posibles son 2,,4,,5 y 12) Acceso

10-199

Ensamblador

Funcin Lee de Dispositivo o Archivo,INT 21h servicio 3Fh


Registros: AH=3Fh BX=Manejador de archivo CX=Nmero de bytes a leer DS=Direccin del Segmento de la memoria de datos DX=Desplazamiento dentro de la memoria de datos Regresa: Bandera 0 si no hay error de acarreo (CF) AX # de bytes leidos, 0 si fin de archivo o cdigo de error (posiblemente 5 6)

Funcin Crear un Archivo,INT 21h servicio 3Ch


Registros: AH=3Ch DS=Direccin del Segmento de la cadena ASCII+0 DX=Desplazamiento dentro del segmento de la cadena ASCII+0 CX=atributo del archivo Regresa: Bandera 0 si no hay error de acarreo (CF) AX manejador de archivo si no hay error o cdigo de error (posiblemente 3,4 6)

10-200

El Acceso a Disco

Funcin Escribe a Dispositivo o Archivo,INT 21h servicio 40h


Registros: AH=40h BX=Manejador de archivo CX=Nmero de bytes a escribir DS=Direccin del Segmento de la memoria de datos DX=Desplazamiento dentro de la memoria de datos Regresa: Bandera 0 si no hay error de acarreo (CF) AX # de bytes escritos o cdigo de error (posiblemente 5 6)

Funcin Cierra Archivo,INT 21h servicio 3Eh


Registros: AH=3Eh BX=Manejador de archivo Regresa: Bandera 0 si no hay error de acarreo (CF) AX cdigo de error si es que lo hay (posiblemente 6)

10-201

Ensamblador

Funcin Posiciona Apuntador de Lectura/Escritura,INT 21h servicio 42h


Registros: AH=42h AL=00 Mover desde el inicio los bytes que seale CX:DX AL=01 Mover apuntador desde la localidad actual+bytes sealados por CX:DX AL=02 Mover apuntador a fin de archivo+bytes sealados por CX:DX, si 0 regresa tamao del archivo BX=Manejador de archivo CX=Nmero de bytes de desplazamiento dentro del archivo (parte alta) DX=Nmero de bytes de desplazamiento dentro del archivo (parte baja) Regresa: Bandera 0 si no hay error de acarreo (CF) DX AX apuntador a la nueva posicin (parte alta) apuntador a la nueva posicin (parte baja) o cdigo de error (posiblemente 1 6)

; ;CREAARCH: Crea un archivo con manijas y escribe en l ; llama_dos EQU 21h ;servicios varios de DOS datos SEGMENT ;Define segmento de datos nombre DB 50 ;nombre de archivo DB ? ;bytes leidos DB 50 DUP(?) ;mem. prov. del nombre registro DB 80 ;long. del registro DB ? ;bytes leidos DB 80 DUP(80) ;mem. prov. del registro manija DW ? ;almacenamiento de manija ;zona de mensajes del programa mensj1 DB 0Dh,0Ah,Nombre del archivo con todo y camino:,0Dh,0Ah,$ mensj2 DB 0Dh,0Ah,0Dh,0Ah,Datos: (termine con ENTER),0Dh,0Ah,$

10-202

El Acceso a Disco

mensje DB Error $ crlf DB 0Dh,0Ah,$ ;nueva lnea datos ENDS ;fin del segmento de datos ; creaarch SEGMENT ;segmento de cdigo ; principio PROC FAR ;proceso principal ASSUME CS:creaarch,DS:datos inicio: ;Guarda segmentos para regresar en paz PUSH DS ;salva DS SUB AX,AX ;coloca 0 en AX PUSH AX ;y empuja a la pila MOV AX,datos ;apunta a nuestros datos MOV DS,AX ;y coloca en segmento MOV DX,OFFSET mensj1 ;primer mensaje MOV AH,09h ;funcin de despliegue INT llama_dos MOV DX,OFFSET nombre ;direccin nombre MOV AH,0Ah ;toma del teclado INT llama_dos MOV DX,OFFSET crlf ;agraga nueva lnea MOV AH,09h ;funcin de despliegue INT llama_dos MOV BL,nombre+1 ;toma # bytes leidos MOV BH,0 ;ajusta al palabra MOV [nombre+BX+2],0 ;y agrega un cero (ASCIIZ) ;Crea el archivo con los datos proporcionados MOV DX,OFFSET nombre+2 ;direccin del nombre MOV CX,0 ;atributo de archivo normal MOV AH,3Ch ;funcin crear archivo INT llama_dos MOV manija,AX ;toma la manija de AX JC error ;si hay un error, salir ;toma el contenido del archivo del teclado MOV DX,OFFSET mensj2 ;primero un mensaje MOV AH,09h ;funcin de despliegue INT llama_dos otra_linea: MOV DX,OFFSET registro ;direccin del registro MOV AH,0Ah ;funcin de lectura del teclado INT llama_dos CMP registro+1,1 ;ver si hay caracteres

10-203

Ensamblador

JLE salir ;y si no salir ;Inserta salto de lnea al registro MOV BL,registro+1 ;coloca cuenta MOV BH,0 ;y ajusta BX MOV [registro+BX+2],0Dh ;agrega salto de lnea MOV [registro+BX+3],0Ah ;y nueva lnea ADD registro+1,2 ;ajusta al nuevo final MOV DX,OFFSET crlf ;encargarse de la pantalla MOV AH,09h ;funcin de despliegue INT llama_dos ;Escribe al archivo el registro MOV BX,manija ;coloca manija en BX MOV DX,OFFSET registro+2 ;direccin de mem. prov. MOV CL,registro+1 ;# de bytes a escribir MOV CH,0 ;y ajusta CX MOV AH,40h ;funcin de escritura a archivo INT llama_dos JC error ;si hay un error salir CMP AL,registro+1 ;Compara bytes escritos con los que solicitamos escribir JNE error ;si no son iguales hay un error JMP otra_linea ;vuelve por ms registros salir: ;Cierre el archivo y termina MOV BX,manija ;toma la manija MOV AH,3Eh ;funcin de cierre de archivo INT llama_dos JC error ;si hay un error, despliega RET ;termina normalmente error: ;maneja los errores MOV DX,OFFSET mensje ;el mensaje de error MOV AH,09h ;funcin de despliegue INT llama_dos MOV BX,manija ;toma el # de error CALL binhex ;convierte a hexadecimal y despliega JMP salir ;termina cerrando principio ENDP ; ;Subrutina para convertir de binario a hexadecimal y desplegar en pantalla ;# a convertir en BX binhex PROC NEAR MOV CH,4 ;nmero de dgitos rota: MOV CL,4 ;cuenta a 4 bits ROL BX,CL ;desplaza dgito a la izq. MOV AL,BL ;y pasa a reg. AL

10-204

El Acceso a Disco

AND AL,0Fh ;quita dgitos de la izq. ADD AL,30h ;convierte a ASCII CMP AL,3Ah ;Es mayor que 9? JL despliega ;Despliega si ente 0 y 9 ADD AL,7h ;el dgito est entre A y F despliega: MOV DL,AL ;Coloca ASCII en DL MOV AH,2h ;Funcin de despliegue INT llama_dos ;Llama a DOS DEC CH ;Terminamos con los 4 dgitos? JNZ rota ;Si an no se termina RET ;Regresa binhex ENDP ; creaarch ENDS ; END inicio

Aunque en el manejo de archivos con manija no se requiere de registros sino de bytes, algunas veces es conveniente dividir la longitud total de un archivo en registros de longitud fija que nos faciliten la tarea de encontrar informacin en cierto punto. Como funciones auxiliares de la interrupcin 21h no analizadas incluimos las siguientes Servicio 39h. Crear un directorio Servicio 56h. Renombre un archivo Servicio 41h. Borra un archivo Servicio 3Ah. Remueve un directorio Servicio 3Bh. Cambia a otro directorio Servicio 17h. Renombra directorio Todas ellas documentadas en el apndice D del manual IBM Personal Computer Disk Operating System

10-205

Ensamblador

10. Resumen

10. Problemas

10. Bibliografa
Revista PC Magazine EU nmeros de 1980-93. Barden William Jr. How to Program Microcomputers. Sams & Company 1987. MASM 86 Columbia Data Products, EU 1986. IBM Personal Computer Technical Reference. Apndice D Morgan L. Christopher Bluebook of Assembly Routines for the IBM PC The Waite Group USA 1987

10-206

Captulo 11
11.1 Interfase a otros Lenguajes
Como ya hemos visto a lo largo del libro, el ensamblador es ideal para problemas en los que se requiere de rapidez o de el acceso a todos los componentes del sistema sin restricciones. Pero por otro lado esa es su debilidad pues cuesta mucho trabajo y tiempo hacer programas en ensamblador. En el otro extremo del espectro se encuentran los lenguajes de alto nivel como PASCAL o C donde es fcil realizar los programas pero muchas veces no obtienen la rapidez necesaria o el acceso a los dispositivos requerido. La interfase se realiza con mucho mayor facilidad en los lenguajes compilados que en los interpretes pues el ligador se encarga de reunir los distintos archivos OBJ en un slo ejecutable uniendo las libreras y dems elementos necesarios para el funcionamiento del programa. El reunir dos objetos de distintos lenguajes tiene problemas especficos que analizaremos por separado en las siguientes secciones.

11.1.1 La Asignacin de Memoria


Usualmente cuando se utiliza un ejecutable realizado en lenguaje de alto nivel no existe el problema de donde poner en memoria el programa. El interprete o el compilador se encarga de asignar las localidades. Las cosas cambian cuando se unen con uno de ensamblador pues es necesario tomar en cuenta ms mdulos independientes. En el caso de un lenguaje compilado, el ligador desentraa las localidades requeridas y el problema se simplifica. En el caso de un

11-207

Ensamblador

interprete se requieren de ciertos trucos para encontrar como localizar el programa en memoria sin conflictos.

11.1.2 Transfiriendo el Control a Ensamblador


Una vez localizado en memoria o ligado en nuestro programa ejecutable surge el problema de transferir el control a nuestro programa en ensamblador para que realice su funcin y regrese su resultado al programa de lenguaje de alto nivel. El traspaso se realiza generalmente con una llamada lejana (FAR CALL) por lo que nuestros procedimientos en ensamblador deben de ser definidos como lejanos (PROC FAR). Otra diferencia importante es que no se requiere de guardar el segmento de datos en la pila pues es ahora el lenguaje de alto nivel el que se encarga de estos menesteres.

11.1.3 Pasando Argumentos


En la gran mayora de los casos se requieren de parmetros para que el programa de ensamblador haga su trabajo y a la vez regrese resultados al programa que lo llama. La informacin se pasa usualmente en forma de apuntadores (direcciones a las variables) que deben de ser resueltos en el programa de ensamblador. Se debe estar de antemano de acuerdo en los argumentos que se pasan entre los programas y se debe tambin establecer un protocolo estricto que se debe de seguir al pie de la letra para la interfase. En los interpretes debe de conocerse a fondo el rea de la pila donde el interprete almacena su variables de forma de poder pasar estas direcciones como argumentos. En el caso de los compiladores el paso es sencillo pues adems de colocar las direcciones de las variables en la pila, coloca el valor de estas variables tambin en la pila simplificando nuestra labor en ensamblador. En resumen si se planea un programa con muchas referencias a ensamblador es casi indispensable usar un lenguaje compilado que nos facilite la tarea de interfase y transmisin de argumentos entre uno y otro lenguaje.

11.1.4 Pascal y Ensamblador


El sistema de interfase de todos los lenguajes de alto nivel compilados a ensamblador siguen ms o menos los mismos lineamientos que consisten en los siguientes pasos:

11-208

Interfase a otros Lenguajes

11.1.4.1 Definir la funcin.


El ligador no puede unir mdulos incompatibles y que se declaren de forma incorrecta. Las funciones y datos en ensamblador deben de definirse como pblicas con la directiva PUBLIC. El modelo de PASCAL debe de definirse como grande (.MODEL LARGE)

11.1.4.2 Entrar a la funcin.


Se debe de comenzar la funcin con dos instrucciones:
PUSH MOV BP BP,SP

En esta secuencia se establece BP como el apuntador a la pila semipermanente para facilitar la referencia a los argumentos. Inicializar de esta forma el apuntador asegura que BP permanezca constante durante el proceso y se pueda hacer referencia a cada parmetro como un desplazamiento fijo de BP.

11.1.4.3 Apartar espacio para los datos locales (opcional)


Las funciones en ensamblador pueden usar la misma tcnica que las de alto nivel para apartar espacio en la pila para sus datos provisionales. Al decrementar SP en una cantidad par, aseguramos un espacio en la pila:
PUSH MOV SUB . . . MOV MOV BP BP,SP SP,4

;reserva 4 bytes (2 palabras) en la pila

WORD PTR [BP-2],0 ;primera palabra a 0 WORD PTR [BP-4],0 ;segunda palabra a 0

No se debe olvidar de incrementar SP antes de salir de la funcin para restaurar los apuntadores.

11.1.4.4 Conservar los valores de los registros


Se deben de conservar los valores de los registros SI, DI, SS y DS as como BP (ya guardado):

11-209

Ensamblador

PUSH MOV SUB PUSH PUSH PUSH PUSH . . .

BP BP,SP SP,4 SI DI SS DS

;reserva 4 bytes (2 palabras) en la pila

No se debe de olvidar de sacar los valores de la pila antes de regresar de la funcin.

11.1.4.5 Acceder parmetros


Considere la pila una vez realizado los pasos anteriores (x es el programa de alto nivel):
d d-2 d-4 d-6 d-8 d-10 d-12 d-14 d-16 d-18 d-20 d-22 d-24 Parmetro Parmetro ... ... CS de x IP de x BP de x espacio para datos locales espacio para datos locales SI de x DI de x SS de x DS de x Direccin alta

BP

(salvado por y) (reservado por y) (reservado por y) (salvado por y) (salvado por y) (salvado por y) (salvado por y)

SP

El nmero de los parmetros es predefinido y podemos asignarlo de la siguiente manera:


para1 para2 para3 EQU EQU EQU [BP+6] [BP+8] [BP+10] ;primer parmetro ;segundo parmetro ;tercer parmetro

11.1.4.6 Regresar valores (opcional)


El valor que se regresa se almacena en un registro y en general obedece a la siguiente convencin:

11-210

Interfase a otros Lenguajes

Si es de 1 byte en AL Si es de 2 bytes en AX Si es de 4 bytes en DX y AX

11.1.4.7 Salir de la funcin


Al terminar nuestra funcin y regresar al programa que llama se deben de realizar varios pasos: 1. Si se salvaron los registros SS, DS, SI o DI estos deben de restaurarse de la pila en orden inverso en el que fueron guardados 2. Si se asigno espacio para variables locales en la pila, el apuntador SP se debe de restaurar con la instruccin MOV SP,BP 3. Recuperar BP de la pila 4. Salir de la funcin con RET. Si se regresa a BASIC, FORTRAN o PASCAL agregar n a la instruccin RET para ajustar la pila al nmero de parmetros. Si se regresa a C, la funcin se encarga de ajustar la pila. Mostramos el siguiente ejemplo de PASCAL para llamar a una subrutina en la que se calcula A x 2B
PROGNAM prueba(entrada,salida); FUNCTION eleva(a,b:INTEGER):INTEGER; EXTERNAL; BEGIN WRITELN(5 x 2^5 es,eleva(5,5)); END.

Y la rutina en ensamblador es
codigo eleva SEGMENT BYTE PUBLIC ;define el segmento como pblico ASSUME CS:codigo PROC FAR PUSH BP MOV BP,SP MOV AX,[BP+8] ;argumento 1 en AX MOV CX,[BP+6] ;argumento 2 en CX SHL AX,CL ;AX=AX x 2CX POP BP RET 4 ;Ajusta la pila al salir ENDP ENDS

eleva codigo

11-211

Ensamblador

END

11.1.5 C y Ensamblador
Un programa en C puede llamar a uno en ensamblador tal como si se tratase de otro modulo o funcin escrita en C. Para tal propsito se den de seguir los siguientes pasos: 1. Declare los procedimientos en C como lejanos (FAR) 2. Observe las siguientes convenciones: a) Regrese con un simple RET sin tratar de ajustar la pila b) Los parmetros se colocan en la pila en el orden inverso en el que aparecen en la lista de la llamada. El primer parmetro se encuentra en la parte baja de memoria. c) Los parmetros se pasan por valor a excepcin de los arreglos que se pasan por referencia Incluya un signo de subrayado en frente de cada variable que se va a compartir con otros mdulos. Recuerde que C solo reconoce los primeros 8 caracteres y que a menos de que se especifique lo contrario, si importan las maysculas y minsculas.
EXTERN INT eleva(int,int); MAIN() { PRINTF(5 x 2^5 es %d\n,eleva(5,5)); }

Y la rutina en ensamblador es
codigo _eleva SEGMENT BYTE PUBLIC ;define el segmento como pblico ASSUME CS:codigo PROC FAR PUSH BP MOV BP,SP MOV AX,[BP+6] ;argumento 1 en AX MOV CX,[BP+8] ;argumento 2 en CX SHL AX,CL ;AX=AX x 2CX POP BP RET ;Salir sin ajustar la pila ENDP ENDS

_eleva codigo END

11-212

Interfase a otros Lenguajes

11.2 Programas Residentes


El uso de programas que terminan y quedan residentes en memoria (Terminate and Stay Resident, TSR) es una idea tan vieja como el del uso del sistema operativo. El primer programa que queda residente en memoria esperando nuestras ordenes es el interprete de comandos del mismo sistema operativo. Por qu no ir un poco ms all y extender el concepto a cualquier programa del usuario? La idea suena atrayente y es un mtodo efectivo de extender las funciones de un sistema operativo que no es multi-tareas ni re-entrante sin necesidad de modificarlo. El concepto bsico detrs de los programas residentes es el de crear una rutina (usualmente un programa corto de utilera), ejecutarla de forma que intercepte las rutinas de interrupcin que nos interesen y que ahora apunten a nuestro programa y de alguna forma pegarlo al SO para que este se entere de que ahora tiene una direccin distinta de terminacin y a partir de la cual la memoria principal queda libre para el usuario o los programas de aplicacin del usuario. El programa de esta forma residente puede entonces realizar su funcin ya sea de forma automtica (Interrupt Service Rutine, ISR) o a peticin nuestra (TSR). Existen varios problemas tcnicos para poder lograr que un programa residente ejecute bajo las ordenes del SO pero todos ellos pueden ser resueltos de una u otra forma. Los pasos bsicos de todo sistema que debe de quedar residente son: Conocer el tamao del programa que debe de quedar residente. Interceptar el vector de servicio que atiende a una interrupcin en particular por medio de la cual nuestro programa despertar y realizar la funcin para la cual fue diseado. Las ms comunes son las del teclado o las del reloj interno del sistema (tomadas de la Tabla de Vectores de Interrupcin). Al comenzar nuestro programa guardar todos los registros, banderas y segmentos para poder recuperarlos al salir. Al terminar nuestro programa, recuperar de la pila los registros, banderas y segmentos. Finalizar el proceso dejando el control a la rutina original de atencin a la interrupcin.

11-213

Ensamblador

En base a los lineamientos anteriores analizaremos algunos casos de programas residentes en las siguientes secciones. Cada da es menos la necesidad de programas residentes con los nuevos sistemas operativos que permiten las multi-tareas y que son re-entrantes pudiendo dejar en un rea de memoria el programa ejecutandose en el trasfondo y de libre acceso en cualquier momento. Sin embargo, el estudio de este caso es interesante y nos permite conocer un poco ms del desarrollo de los sistemas operativos. Todo programa que queda residente, por su propia naturaleza, viola algunas o todas las reglas de un programa que se comporta adecuadamente ante un sistema operativo. El programa intercepta los comandos dirigidos a otras rutinas y las modifica de acuerdo a su propsito por lo que puede causar ciertos conflictos si no es diseado con cuidado. Una regla para no violar los preceptos del sistema operativo y evitarse conflictos posteriores en el caso de cambio de versiones es no usar rutinas de interrupciones no documentadas y siempre usar los recursos del sistema a travs de las rutinas de interrupcin que el propio sistema operativo proporciona.

11.2.1 Ensamblador Residente


El SO utiliza una serie de apuntadores, llamados bloques de almacenamiento, que llevan la pista de la memoria que se asigna o quita de los programas que se ejecutan. Para cada programa que se ejecuta, estos apuntadores indican la direccin del prefijo del segmento del programa (Program Segment Prefix o PSP) y la longitud del programa en segmentos. De la misma forma, una bandera indica si se uso la memoria apuntada por el segmento de almacenamiento asignado al programa. El proceso se torna entonces sencillo, se requiere de averiguar la longitud del programa en prrafos, guardarla en el registro DX y llamar a la funcin 31h de la interrupcin 21h del SO (manten proceso) o a la interrupcin 27h (termina pero queda residente). Estas funciones se aseguran de que el programa quede residente conservando el bloque asignado de almacenamiento, el PSP del programa y el cdigo del programa en memoria.

11-214

Interfase a otros Lenguajes

Presentamos los siguientes programa en ensamblador que explota estas tcnicas, es menester estudiarlo con cuidado para entender el funcionamiento de una rutina que termina y queda residente.
; utileria para redireccionar impresora a pantalla ;*************************************************** dos_printer_io EQU 17h dos_video_io EQU 10h dos_function EQU 21h dos_terminate_resident EQU 27h get_vector EQU 35h set_vector EQU 25h cseg SEGMENT ASSUME CS:cseg,DS:cseg ORG 100h start: JMP initialize ;inicializa codigo video_io DD printer_interceptor PROC FAR ASSUME STI OR AH,AH JNZ pi2 MOV AH,14h PUSHF ASSUME interrupcion a pantalla CALL video_io pi2: MOV AH,128 desocupada IRET printer_interceptor ENDP initialize: MOV MOV MOV MOV INT MOV MOV BX,CS DS,BX AL,dos_video_io ;toma interrup de video AH,get_vector dos_function video_io,BX ; y guardalo para uso posterior video_io[2],ES ; guarda vector de video CS:cseg, DS:cseg ; pon interrupciones ; es una llamada a impresora? ;no, regresa ; atiENDe a pantalla ;empuja banderas para DS:NOTHING ;simular

;poner status de imp. en ;salta servicio a impresora

11-215

Ensamblador

MOV BX,CS ;reemplaza vector de impresora viejo MOV DS,BX ;con el que apunta a esta rutina MOV DX,OFFSET printer_interceptor MOV AL,dos_printer_io MOV AH,set_vector INT dos_function MOV BX,CS MOV DS,BX MOV DX,OFFSET initialize INT dos_terminate_resident ;termina quedando residente CSEG ENDS END START ; es necesario que este instalado el ANSI.SYS ; en CONFIG.SYS con DEVICE=ANSI.SYS TITLE Anti CTRL-PRINTSCREEN code_seg SEGMENT PARA PUBLIC code ASSUME CS:code_seg, DS:code_seg, ES:code_seg, SS:code_seg ORG 100h start: JMP screen ;limpia pantalla, ;definir prtscr como A y ^P como NO message DB 27,[2J DB 27,[0;114;65p DB 27,[16;66p DB $ PROC NEAR MOV DX,OFFSET message MOV AH,09h INT 21h INT 27h ENDP ENDS start

screen

screen code_seg END

Los programas del tipo TSR son una respuesta a la estructura de tarea nica del sistema operativo para intentar que mas de un programa funcione a la vez. En los programas anteriores debemos de diferenciar entre los programas del tipo residentes (TSR) y los del tipo ISR (Interrupt Service

11-216

Interfase a otros Lenguajes

Rutine). Estos ltimos no interactuan con el usuario, su labor es silenciosa pero de todas maneras til y muchas veces necesaria. Dentro de la categora de programas del tipo TSR encontramos a calculadoras, agendas, alarmas, macro conversores, etc. En general todo aquel programa que se active por alguna combinacion de teclas para ejecutarse. Dentro del ti po ISR encontramos relojes, pr ogramas de redireccionamieto, memorias cache, colas de impresion (Spooler), virus, etc. Recordemos que aunque los programas TSR e ISR redireccionan las interrupciones a sus propias rutinas, en general, no sustituyen estas rutinas de interrupcin por lo que al finalizar su tarea pasan el control a estas y envian la informacin sin cambio a su sucesor. En el caso de que la rutina si reemplace a la de interrupcin es necesario utilizar como final de la rutina la instruccin IRET en lugar de RET que seala el fin de una rutina de interrupcin.

11.3 Resumen

11.4 Problemas

11.5 Bibliografa
Revista PC Magazine EU nmeros de 1980-93. MASM 86 Columbia Data Products, EU 1986. IBM Personal Computer Technical Reference. Apndice D Morgan L. Christopher Bluebook of Assembly Routines for the IBM PC The Waite Group USA 1987 Tischer Turbo Pascal Internals Abacus USA 1990

11-217

Apndice A.
A.1 Las Instrucciones del 80x86

Tabla A.1 Registros Registros generales


AX BX CX DX acumulador base cuenta datos

Grupo de apuntadores e ndices


SP BP SI DI IP F apuntador del stack apuntador base apuntador fuente apuntador datos apuntador de instruccin banderas del sistema

Registros segmentos
CS DS ES SS segmento de cdigo segmento datos segmento extra segmento pilas

A-219

Ensamblador

Tabla A.2 Registros y su uso


REGISTRO AX AL AH BX CX CL DX SP SI DI IP OPERACION Multiplica o divide palabras Multiplica o divide bytes Multiplica o divide bytes Traduce Operaciones con cadenas o contador en lazos Rota o corre variable Multiplica o divide palabras Operaciones con la pila Operaciones con cadenas Operaciones con cadenas No es accesible ms que con saltos

A-220

Apndice A. Las Instrucciones

Tabla A.3 Banderas Principales Bandera


OF DF IF TF SF ZF AF PF CF IOPL NT RF VM saturacin direccin (operacin con cadenas) habilita interrupciones trampa (ejecucin paso a paso) signo (resultado negativo) cero acarreo auxiliar pariedad (par) acarreo nivel de privilegio para E/S (2 bits) tarea anidada continua operacin modo virtual

Funcin

A-221

Ensamblador

Figura A.1 Segmentos y su uso.

A-222

Apndice A. Las Instrucciones

Tabla A.4 Uso del Desplazamiento


Tipo de referencia Traer instruccin Operacin con pila Segmento base por omisin CS SS Segmento base alterno Ninguno Ninguno CS ES SS CS ES SS Ninguno CS ES SS Desplazamiento IP SP direccin efectiva SI DI direccin efectiva

Vari ables (excepto los que DS siguen) Fuente cadena Destino cadena BP usado como registro base DS ES SS

Tabla A.5 Formas de Direccionamiento


Forma Inmediato Registro Directo Localizacin de los datos En la misma instruccin En el registro En la localidad de memoria apuntada por el desplazamiento contenido en la instruccin

Indirecto de Registro En la localidad de memoria apuntada por el desplazamiento contenido en el registro Indexado o base En la localidad de memoria apuntada por la suma del ndice o registro base y el desplazamiento contenido en la instruccin

De base e ndice con La direccin de memoria se forma por la suma del contenido del registro base el contenido del registro ndice y un desplazamiento desplazamiento

A-223

Ensamblador

Figura A.2 Formas de direccionamiento.

Tabla A.6 Ventajas de la Memoria Segmentada


Lineal Se debe proporcionar toda la direccin Se limita el desarrollo futuro de memorias ms amplias No hay relocalizacin dinmica de programas No hay programacin modular No hay manejo de memoria por lo que la proteccin de sta no es fcil S hay relocalizacin dinmica de programas lo que permite multitareas Segmentada Se proporcionan las direcciones en dos o ms partes

A-224

Apndice A. Las Instrucciones

Tabla A.7 Formas de Direccionamiento y Localizacin de los Datos


MODO Inmediato Registro Directo Registro Indice o base LOCALIZACION En la instruccin En el registro EJEMPLO ADD CH,5F ADD BX,DX

En la localidad de memoria apuntada por el ADD variable,BX desplazamiento contenido en la instruccin En la localidad de memoria apuntada por el ADD CX,[BX] desplazamiento contenido en el registro En la localidad de memoria apuntada por la ADD [SI+6],AL suma del contenido del registro ndice o base y el desplazamiento contenido en la instruccin

Base e ndice con desplazamiento La direccin de memoria es la suma del ADD [BX+DI+5],DX contenido del registro base, ms el contenido del registro ndice y un desplazamiento

Dividimos las instrucciones en los siguientes grupos genricos: 1.- Movimientos de registros y datos 2.- Multiplicacin y divisin entre nmeros decimales 3.- Suma, resta 4.- Corrimientos 5.- Operaciones con cadenas 6.- Traduccin de bytes por tablas 7.- Interrupciones programables 8.- Lazos de programas 9.- Coordinar multiproceso y coproceso 10.- Prueba no destructiva de bits

A-225

Ensamblador

Tabla A.8 Instrucciones de Transferencia


Mnemnico MOV destino,fuente PUSH fuente POP destino PUSHF POPF XCHG op1,op2 LAHF SAHF IN acc,puerto OUT puerto,acc LEA destino,fuente LDS destino,fuente LES destino,fuente XLAT Descripcin de su operacin Mueve byte o palabra Empuja palabra a la pila Saca palabra de la pila empuja banderas a pila saca banderas de la pila intercambia el operador 1 con el operador 2 carga registro AH con las banderas guarda en las banderas lo que hay en el registro AH Carga en el acumulador con un byte o palabra del puerto Traspasa del contenido del acumulador hacia el puerto Carga direccin efectiva Carga apuntador en destino y registro DS Carga apuntador en destino y registro ES traduce byte

A-226

Apndice A. Las Instrucciones

Figura A.3 Multiplicacin y divisin.

A-227

Ensamblador

Figura A.4 Corrimientos y rotaciones.

A-228

Apndice A. Las Instrucciones

Figura A.5 Diagrama interno de una 80486.

A-229

Ensamblador

Tabla A.9 Instrucciones Aritmticas


Mnemnico ADD destino,fuente ADC destino,fuente SUB destino,fuente SBB destino,fuente INC destino DEC destino NEG destino CMP destino,fuente MUL fuente IMUL fuente DIV fuente IDIV fuente CBW CWD DAA DAS AAA AAS AAM AAD Descripcin de la Operacin Suma byte o palabra Suma byte o palabra con acarreo Resta byte o palabra Resta byte o palabra con prstamo Incrementa byte o palabra en 1 Decrementa byte o palabra en 1 Niega byte o palabra (complemento a 2) Compara byte o palabra Multiplica byte o palabra sin signo Multiplica enteros (byte o palabra) Divide byte o palabra sin signo Divide enteros (byte o palabra) cambia byte a palabra Cambia palabra a doble palabra Ajuste decimal para la suma Ajuste decimal para la resta Ajuste de ASCII para la suma Ajuste de ASCII para la resta Ajuste de ASCII para la multiplicacin Ajuste de ASCII para la divisin

A-230

Apndice A. Las Instrucciones

Tabla A.10 Operaciones Lgicas


Mnemnico NOT destino AND destino,fuente OR destino,fuente XOR destino,fuente TEST destino,fuente SHR destino,cuenta SAR destino,cuenta SHL/SAL destino,cuenta ROR destino,cuenta RCR destino,cuenta ROL destino,cuenta RCL destino,cuenta Descripcin de la Operacin Niega byte o palabra (complemento a 1) Operacin Y con byte o palabra Operacin O con byte o palabra Operacin O EXCLUSIVA con byte o palabra Prueba byte o palabra Corrimiento lgico a la derecha de byte o palabra Corrimiento aritmtico a la derecha de byte o palabra Corrimiento a la izquierda de byte o palabra Rota a la derecha byte o palabra Rota a travs del acarreo byte o palabra Rota a la izquierda byte o palabra Rota a la izquierda a travs del acarreo byte o palabra

Tabla A.11 Instrucciones de Transferencia


Mnemnico JMP destino Jcond destino LOOP destino LOOPE/LOOPZ destino LOOPNE/LOOPNZ destino JCXZ destino CALL destino RET (opcinalmente un valor) INT tipo INTO IRET Descripcin de la Operacin Salta a una localidad de memoria indicada en destino Vea tabla A.12 Lazo Lazo mientras Sea igual/Sea cero Lazo mientras No sea igual/No sea cero Salta si CX=0 Llama a una subrutina Regresa de una subrutina Interrupcin Interrupcin en caso de saturacin Regresa de una interrupcin

Tabla A.12 Saltos Condicionales

A-231

Ensamblador

Con signo JG/JNLE destino JGE/JNL destino JL/JNGE destino JLE/JNG destino JO destino JS destino JNO destino JNS destino Sin signo JA/JNBE destino JAE/JNB destino JB/JNAE destino JBE/JNA destino No importa el signo JC destino JE/JZ destino JP/JPE destino JNC destino JNE/JNZ destino JNP/JPO destino Acarreo Igual/Cero Pariedad/Pariedad par No acarreo No igual/No cero No pariedad/Pariedad non Arriba/No abajo o igual Arriba o igual/No abajo Abajo/No arriba o igual Abajo o igual/No arriba Mayor/no menor no igual Mayor o igual/No menor Menor/No mayor no igual Menor o igual/No mayor Saturacin Signo No saturacin No signo

Tabla A.13 Instrucciones para Manipular Cadenas


Mnemnico MOVSB/MOVSW CMPSB/CMPSW SCASB/SCASW LODSB/LODSW STOSB/STOSW Descripcin de la Operacin Mueve cadena de byte o palabra Compara cadena de byte o palabra Busca cadena de byte o palabra Carga cadena de byte o palabra Guarda una cadena de byte o palabra

Las instrucciones anteriores se utilizan con los siguientes prefijos: REP REPE/REPZ REPNE/REPNZ Repite Repite mientras sea Igual/Cero Repite mientras no sea Igual/Cero

A-232

Apndice A. Las Instrucciones

Tabla A.14 Registros Dedicados para Operaciones con Cadenas (Tabla A.13) Registro
SI DI ES CX AL/AX DF ZF

Operacin
Indice (desplazamiento) de cadena fuente Indice (desplazamiento) de cadena destino segmento de la cadena destino contador de repeticin valor de bsqueda, destino para LODS, fuente para STOS

0=autoincrementa DI y SI, 1=autodecrementa DI y SI


Indica fin de bsqueda/comparacin

Tabla A.15 Instrucciones de Control de Proceso Instruccin


STC CLC CMC STD CLD STI CLI HLT WAIT ESC LOCK NOP Fija bandera de acarreo Limpia bandera de acarreo Limpia bandera de complemento Fija bandera de direccin Limpia bandera de direccin Habilita interrupciones Deshabilita interrupciones Detener procesamiento hasta que se inicialice el circuito o haya una interrupcin externa Espera a que test (pata externa fsica del circuito) est en 1 Escapa a procesador externo (coproceso) Bloquea el bus durante la siguiente instruccin No hacer nada (para rellenar tiempos)

Accin

A-233

Ensamblador

A.2 Errores Comunes al Ensamblar un Programa


1.- Lgica invertida Ej. JC (Salta si est el acarreo) cuando se desea saltar cuando acarreo=0. 2.- Uso equivocado de direccionamiento Ej. MOV AX,var cuando queremos MOV AX,offset var. 3.- Empujar y no sacar de la pila. 4.- Usar un registro para valor temporal y llamar una subrutina que lo usa. 5.- Olvidar poner en CX el nmero de repeticiones cuando se entra a un lazo. 6.- Creer que una instruccin afecta a una bandera. 7.- Olvidar inicializar un registro. 8.- Olvidar el orden destino fuente. 9.- Contar mal los ciclos Ej. del area 100 a 103 debe haber 4 ciclos, no 3. 10.- Incrementar contadores de lazos en lugares equivocados, o no incrementarlos. 11.- Olvidar salvar registros y banderas en programas de manejo de interrupciones, lo que da por resultado bloqueos aleatorios. 12.- No poner espacio de pila suficiente en un programa, pues en el curso de este pueden ocurrir interrupciones y saturar la pila.

A-234

Apendice B
Interrupciones
S e r v i c i o Interrupcin Descripcin (AH=) 02h 01h 09h 21h 20h 21h 21h Despliega carcter en pantalla Regresa a programa supervisor Lee un carcter del teclado Muestra una cadena en pantalla Parmetros Regresa DL=carcter (ASCII) AL=carcter leido del teclado

DS:DX=direccin de la cadena terminada con $ DS:DX=direccin de memoria 1er byte memoria pro vi sional para contener la prov.=mximo # de carcters a cadena ser leidos 2do byte memoria prov.=# carcteres ledos

0Ah

21h

Lee cadena del teclado

05h 0Bh

21h 21h

Imprime carcter Verifica entrada estandard

DL=carcter a imprimir -

AL=FF hay un carcter esperando AL=00 no hay carcter esperando

00h

10h

Tipo de (color,mono,etc.) Tipo de cursor Posicin del cursor

d e s p l ie g u e

01h 02h 03h 04h 05h

10h 10h 10h 10h 10h

Lee posicin del cursor Lee posicin de la pluma de luz Selecciona pgina de video activa

B-235

Ensamblador

06h 07h 08h 09h

10h 10h 10h 10h

Desplaza pantalla hacia arriba Desplaza pantalla hacia abajo Lee atributo/carcter de pantalla Escribe atributo /carcter a pantalla Escribe carcter a pantalla Escoge paleta de color Dibuja un punto a pantalla Lee punto de pantalla Regresa estado de video Generador de carcteres Informacin del equipo bit 0 coprocesador bit 4,5 tipo de video bit 7,6 # lectoras de disco bit 9,10,11 #puertos RS-232 bit 13 joystick bit 14,15 #puertos paralelos

0Ah 0Bh 0Ch 0Dh 0Fh 10h -

10h 10h 10h 10h 10h 10h 11h

2Ah

12h 21h

Tamao de la memoria Pide fecha del sistema

AX=# bytes CX=ao (1980 a 2099) DH=mes (1 al 12) DL=da (1 al 31)

2Bh 2Ch

21h 21h

Fija fecha del sistema Pide hora del sistema

mismos que para la 2Ah -

CH=hora, CL=minuto D H = se g u n d o s , DL = 1 /1 0 0 segundos

2Dh 30h 38h

21h 21h 21h

Fija hora del sistema Pide versin de DOS Informacin del pas

mismos que para la 2Ch -

AX=versin

DX=Direccin de buffer de 34 Pas en buffer bytes DS=Direccin del Segmento del AL=00, el archivo se encontr y FCB abri DX=Desplazamiento de la AL=FF, El archivo no existe direccin del FCB

0Fh

21h

Abrir archivo con manija

B-236

Apndice B. Las Interrupciones

FCB, # de disco,tamao de registro,fecha,tamao archivo,# bolque,etc. (El nombre del archivo con su extensin deben de estar ya en el FCB) 4Eh 4Fh 21h 21h Busca primer archivo Busca siguiente archivo CS:DI=archivo a buscar CS:DI=archivo a buscar DTA 0B0h DTA 0B0h si AL=18 no se encontro

57h

21h

Fija/toma datos de fecha y hora de archivo

B-237

Introduccin

ndice
! 804861-27 A acceso aleatorio1-23, 10-194 acceso directo a memoria5-88 acceso secuencial1-23 acceso secuncial10-183 acumulador1-9 ADC7-132 ADD7-131 AND6-114 ASCII3-67 ASCIIZ10-197 asignacin de memoria11-207 ASSUME4-82 B BCD3-63 BIOS2-34 bit1-2, 3-64 Bresenham9-177 buffer5-88 bus1-4

239

Ensamblador

byte1-3, 3-65 BYTE PTR5-102 C C y ensamblador11-212 CALL7-136 carcteres de control3-68 CLD8-152 CMP6-110 CMPS8-152 cdigo fuente2-35 cdigo Grey3-67 cdigo objeto2-35 cdigos3-67 COM4-83 compilador2-45 complemento3-64 complemento a 13-66 complemento a 23-66 complemento a 93-64 conjunto de instrucciones2-38 contador de programa1-10 conversin binario-decimal3-58 conversin decimal-binario3-59

240

Introduccin

corrimientos7-128 CPU1-2 - 1-3, 1-19 D DB4-83 DD4-83 debug4-78 DEC7-132 desbordamiento3-65 direccin1-3, 1-25 direccin efectiva2-42 direccionamiento directo a memoria2-42 Implcito2-41 indirecto2-42 memoria2-41 relativo2-42 directivas de ensamblador2-39 DIV7-133 divisin en otros sistemas3-60 DMA5-88 DOS7-121 DTA10-183 DUP4-83

241

Ensamblador

DW4-83 E E/S1-2, 5-87 mapa de memoria5-88 E/S por interrupcin5-88 E/S programada5-87 END4-82 ENDP7-135 ENDS4-82 ensamblador2-36 entrada/salida5-87 EPROM1-27 EQU4-82 exceso 33-64 EXE4-83 F FCB10-183 H hardware2-33 hexadecimal3-61 I I/O1-2 IBM1-27

242

Introduccin

IDIV7-133 IMUL7-133 IN6-117 INC6-108 input/output5-87 instruccin1-8 INT5-94, 6-105 interfase a otros lenguajes11-207 intrprete2-45 interrupcin impresora7-125 no mascarillable5-93 pantalla7-123 teclado7-122 ISR11-213, 11-216 J JMP6-106 juego de instrucciones1-3 L LABEL BYTE9-177 LABEL DWORD9-177 LABEL WORD9-177 Leibnitz3-56

243

Ensamblador

lenguaje de mquina2-36 lenguajes de alto nivel2-44 LOOP6-109 LOOPE6-110 LOOPNE6-110 M macroinstruccin1-18 macroprograma1-19 manijas10-197 masm4-81 memoria1-2 memoria auxiliar1-22 memoria de alta velocidad1-21 memoria de lectura escritura1-25 memoria de respaldo1-22 memoria de slo lectura1-25 - 1-26 memoria de slo lectura programable y borrable1-27 memoria interna1-21 memoria no voltil1-27 memoria principal1-21 memoria secundaria1-22 memoria voltil1-27 microinstruccin1-18

244

Introduccin

microprograma1-18 microprogramacin1-18 mnemnico1-12 MOV5-95 MOVS8-152 MOVSB8-152 MOVSW8-152 MUL7-133 multiplexin1-17 multiplicacin en otros sistemas3-60 N NEG6-114 NOP7-135 NOT6-114 O OR6-114 OUT6-117 P PAGE7-138 paginacin2-42 palabra3-65 palabra de direccin1-25 paridad1-7

245

Ensamblador

paridad impar1-7 paridad par1-7 prrafo1-31 Pascal y ensamblador11-208 pila5-91, 8-141 PIXEL9-163 POP8-142 POPF8-150 PROC7-135 procesador de comandos2-34 programas2-33 programas residentes11-213 PROM1-27 PSP11-214 PUSH8-142 PUSHF8-150 R RAM1-25 RCL7-130 RCR7-130 registro1-9 registro contador de datos1-9 registro de estado1-15

246

Introduccin

registro de instruccin1-10 REP8-152 REPE8-154 REPNE8-154 REPNZ8-154 representacin con signo3-65 REPZ8-154 resta en otros sistemas3-60 RET7-136 ROL7-130 ROM1-25 - 1-26 ROR7-129 rotaciones7-128 rutina de servicio de interrupcin5-91 S SAL7-130 saltos cercanos6-107 saltos condicionales6-110 saltos cortos6-107 saltos de ndice6-107 saltos lejanos6-107 SAR7-130 saturacin3-65

247

Ensamblador

SBB7-132 SCAS8-152 SEGMENT4-82 SEGMENT AT9-171 SHL7-130 SHR7-130 sistema base dos3-56 sistema binario3-56 sistema decimal3-55 sistema notacional3-56 sistema operativo2-33 sistemas numricos3-53 software2-33 STD8-152 SUB7-131 suma en otros sistemas3-60 T TEST6-114 tiempo de acceso1-23 TSR11-213 U UAL1-19 unidad aritmtica y lgica1-19

248

Introduccin

unidad de control1-17, 1-20 unidad de memoria1-20 unidad de procesamiento central1-3, 1-19 UPC1-2 - 1-3, 1-19 V vector de interrupciones5-92 video9-163 W WORD PTR5-102 X XOR6-114

249

Das könnte Ihnen auch gefallen