P. 1
ensamblador

ensamblador

|Views: 50|Likes:

More info:

Published by: Alfredo Arizmende Barron on Aug 21, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

01/15/2013

pdf

text

original

Ensamblador

por Emiliano Llano Díaz

Ensamblador
Emiliano Llano Díaz

El autor y Exa Ingeniería ®no están afiliados a ningún fabricante. Se han realizado todos los esfuerzos posibles para proveer una información veraz y completa. Sin embargo, el autore no se hace responsables de omisiones, uso al que se destine la información 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 publicación puede ser reproducida o almacenada en ningún medio de retransmisión, fotocopiado o reproducción de ningún tipo, incluyendo pero no limitándose a fotocopia, fotografía, fax, almacenamiento magnético u otro registro, sin permiso expreso del autor y de la editorial. Compuesto totalmente en computadora por: Exa Ingeniería SA de CV ® Bajío 287-101 Col. Roma México, 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 México. 1era edición junio 2002.

Contenido
Contenido · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · i Introducción · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · xiii Capítulo 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 Capítulo · · · · · · · · · · · · · · · · · · 32 Capítulo 2 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 33 .Direccionamiento Implícito . . . . . . . . . . . . . . . . . . . . 41 Direccionamiento directo a memoria · · · · · · · · · · · · · · · · 42 Direccionamiento Indirecto · · · · · · · · · · · · · · · · · · · · 42 Intérpretes · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 46 Compiladores· · · · · · · · · · · · · · · · · · · · · · · · · · · · 47 Puntos Importantes del Capítulo · · · · · · · · · · · · · · · · · · 50 3. Sistemas Numéricos · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 53

i

Ensamblador

Contando en el Sistema Binario· · · · · · · · · · · · · · · · · · · 58 Conversión de Sistema Decimal a Binario · · · · · · · · · · · · · 59 Suma y Resta en Sistema Binario · · · · · · · · · · · · · · · · · · 60 Multiplicación y División Binaria . . . . . . . . . . . . . . . . . 60 Complementos · · · · · · · · · · · · · · · · · · · · · · · · · · · 66 Puntos Importantes del Capítulo · · · · · · · · · · · · · · · · · · 71 Capítulo 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 Capítulo 5 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 87 Respuesta de la UPC a una Interrupción· · · · · · · · · · · · · · · 90 Código de Selección 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

Introducción

Base, Indice y Desplazamiento (Directo o Inmediato) · · · · · · · 101 Número de Bits en una Instrucción. . . . . . . . . . . . . . . . . 102 Puntos Importantes del Capítulo . . . . . . . . . . . . . . . . . . 103 Capítulo 6 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 105 Y Lógico (AND) · · · · · · · · · · · · · · · · · · · · · · · · · 114 O Lógico (OR) · · · · · · · · · · · · · · · · · · · · · · · · · · 115 No Lógico · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 115 O Exclusivo Lógico (XOR) · · · · · · · · · · · · · · · · · · · · 115 Prueba Lógica (TEST) · · · · · · · · · · · · · · · · · · · · · · 116 Las Banderas · · · · · · · · · · · · · · · · · · · · · · · · · · · 116 Complemento a 2 (NEG) · · · · · · · · · · · · · · · · · · · · · 116 La instrucción OUT · · · · · · · · · · · · · · · · · · · · · · · · 117 La instrucción IN · · · · · · · · · · · · · · · · · · · · · · · · · 117 Capítulo 7 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 121 Corrimientos y Rotaciones · · · · · · · · · · · · · · · · · · · · 128 Corrimientos Lógicos (Rotaciones)· · · · · · · · · · · · · · · · 129 Corrimientos Aritméticos · · · · · · · · · · · · · · · · · · · · · 130 Operaciones Aritméticas · · · · · · · · · · · · · · · · · · · · · 131 Suma y Resta (ADD y SUB) · · · · · · · · · · · · · · · · · · · · 131 Decrementos · · · · · · · · · · · · · · · · · · · · · · · · · · · 132 Multiplicación y División· · · · · · · · · · · · · · · · · · · · · 132 Capítulo 8 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 141 Manejo de la Pila · · · · · · · · · · · · · · · · · · · · · · · · · 142 Guardando las Banderas · · · · · · · · · · · · · · · · · · · · · 150

iii

165 Pantallas de graficación . . . . . . . . . . . . . . . . . . 182 Bibliografía . . · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 219 iv . . . . . . . . . . . . . . .Ensamblador La Instrucción REP · · · · · · · · · · · · · · · · · · · · · · · · 152 La Dirección de la Operación (CLD y STD) · · · · · · · · · · · · 152 Mover Cadenas (MOVSB y MOVSW) · · · · · · · · · · · · · · 152 REPE ó REPZ y REPNE ó REPNZ · · · · · · · · · · · · · · · · 154 Compara Cadenas (CMPSB y CMPSW) · · · · · · · · · · · · · 154 Busca Carácter (SCASB y SCASW) · · · · · · · · · · · · · · · 155 LODSB y LODSW · · · · · · · · · · · · · · · · · · · · · · · · 156 STOSB y STOSW · · · · · · · · · · · · · · · · · · · · · · · · 156 Capítulo 9 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 163 El vídeo . . . . . 163 Ventanas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 Capítulo 10 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 183 Manejadores de Archivos · · · · · · · · · · · · · · · · · · · · · 197 Capítulo 11 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 207 La Asignación de Memoria . . . . . . . . . . . . . . . . . . 168 Problemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 Transfiriendo el Control a Ensamblador · · · · · · · · · · · · · · 208 Pasando Argumentos · · · · · · · · · · · · · · · · · · · · · · · 208 Pascal y Ensamblador· · · · · · · · · · · · · · · · · · · · · · · 208 C y Ensamblador · · · · · · · · · · · · · · · · · · · · · · · · · 212 Ensamblador Residente · · · · · · · · · · · · · · · · · · · · · · 214 Apéndice A. . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . 234 Apendice B · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 235 Interrupciones . . . . . . 235 Índice · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 239 v . . . . . . . . . . . . . . . . . . .Introducción Las instrucciones del 80x86 . . . . . . . . 219 Errores comunes al ensamblar un programa .

en lo que radica su fuerza y su debilidad. interfaces. que las razones para USAR ensamblador. el sistema provee mecanismos que quedan cortos de nuestra espectativa y deben ser irremediablemente mejorados o pagar las consecuencias en una comunicación de alto nivel (redes.Introducción ¿Por qué usar ensamblador? Las razones para APRENDER ensamblador no son las mismas.). por ejemplo. los lenguajes de alto nivel tienden a aislar al usuario de la máquina. aunque algunos de forma torpe (PEEK y POKE de BASIC). Aunque esto en general es verdadero. Fortran. vii . C o hasta BASIC compilado. con el adaptador asíncrono. 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. etc. Esto crea complicaciones en la implementación y en el seguimiento y mantenimiento de programas elaborados de esta forma. Algunas veces el sistema o lenguaje hace muy poco por nosotros. La gran mayoría de los lenguajes moderno de alto nivel proveen mecanismos para escribir secuencias en ensamblador. en general. Una de las malas razones para querer usar ensamblador es porque se piensa que ejecutará mucho más rápido que una secuencia en particular de un lenguaje de propósito general como Pascal. por ejemplo en el control de las teclas que conforman un teclado. Otras veces el sistema o lenguaje hace demasiado por nosotros. donde previamente se han definido todas las secuencias que se generan al presionar una tecla.

se debe ser capaz de identificar una buena codificación de una mala en ensamblador y poder sugerir caminos alternativos para las implementaciones de una solución genérica apropiada al problema que se trata de resolver. · Fase 4 Conjuntar todos los elementos anteriores en programas de aplicación que realicen cosas prácticas o útiles desde nuestro punto de vista. se hace el trabajo exacto pero de una forma ineficiente no aceptable a ciertas aplicaciones. No deseamos hacer esto en términos de eficiencia de programación si se puede evitar con algún truco del lenguaje de alto nivel o alguna otra argucia. Las razones para aprenderlo caen en la categoría de una formación completa e integral en las áreas de cómputo de forma tal que se pueda decidir como jefe de proyecto o programador.La razón por la cual el ensamblador es entonces mejor que un lenguaje de alto nivel. Como profesionista. como en el caso del manejador de la pantalla que normalmente usan los canales oficiales para comunicarse con la electrónica que controla los dispositivos externos. 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. pero existen numerosos casos en los que se cae constantemente en la necesidad de hacerlo. · Fase 3 Conocer las instrucciones del lenguaje ensamblador de la máquina específica en la que se aplicará.Ensamblador Otras más. Es en estas ocaciones donde el ensamblador actúa con su mayor fortaleza: el control total de todos los elementos que conforman el sistema. viii . es la misma por la que Pascal es mucho mejor para escribir un programa de nómina que Ensamblador: es mucho más fácil de mantener y programar. Una parte crítica de un sistema es la más suceptible de optimizarse vía programación en ensamblador. en qué casos es mejor utilizar una herramienta y en qué otros utilizar otra. 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. · Fase 2 Conocer la arquitectura de la máquina en la que se pretende realizar la programación.

por lo menos a lo que el presente y futuro cercano nos concierne. 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. En todo lo anterior aplicamos una palabra clave: Selección. Trataremos de cumplir a lo largo de este libro la palabra selectividad y de llenar todos los objetivos planteados en esta introducción.Introducción · Fase 5 Actualizarse constantemente. Emiliano Llano Díaz Septiembre 1995 ix . tecnologías y tendencias cambian constantemente el la computación.

1 Los componenetes de una computadora. 1-1 . Esto se debe al hecho de que las computadoras usan lógica binaria (de unos y ceros) y emplean el sistema binario en casi todos sus componentes. la arquitectura empleada en todos los casos es muy similar.Capítulo 1 1. vemos que aunque hay diferencias en el tamaño físico de los componentes. Figura 1. macrocomputadoras y computadoras personales o microcomputadoras). lo que exige un cierto tipo de estrategia para resolver los problemas derivados de esta selección. de los sistemas y entre dist intos ti pos de computadoras (mini computadoras.1 Componentes Básicos de un Sistema Si examinamos las microcomputadoras actuales.

se dice de este circuito contiene un dígito binario (BInary digiT) o BIT de información. mutuamente excluyentes y opuestos. 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. · 3. Si contamos con un sólo circuito digital que nos indique uno de los dos posibles estados. Controla todo lo anterior y da la secuencia de eventos que permiten que un sistema funcione como tal y además pueda resolver problemas de procesamiento genérico para lo cual se construyó el sistema en primer lugar. controla todo el funcionamiento de los demás componentes.Ensamblador Como se muestra en la figura 1. Varían en complejidad y tipo de acuerdo a los requerimientos de procesamiento. Memoria. La longitud 1-2 . estado que se determina por las características de operación. Dispositivo de almacenaje electrónico donde se guardan las instrucciones y datos necesarios para el funcionamiento del sistema. en general. Interfases de Entrada/Salida. · 2. Este dígito se puede designar como prendido o apagado o más comunmente 1 ó 0 que corresponden a los únicos dígitos utilizados dentro de los sistemas actuales de computadoras digitales. modelo de computadora u otros factores. se basa en el hecho de que ciertos circuitos electrónicos pueden estar conduciendo electricidad o no (prendidos o apagados). Que forma el cerebro de la computadora y.1. Son el eslabón entre la máquina y el humano. Dispositivos de Entrada y Salida (E/S o I/O). los bits se agrupan en palabras que contienen N número de bits de acuerdo al fabricante. Un programa. aunque todos coinciden en que son potencias de 2. Esta lógica digital o lógica binaria como también se le conoce. Para sernos más utiles. · 4. tenemos cinco partes principales de un sistema de cómputo que se encuentran de una forma u otra en todo sistema actual: · 1. Unidad de Proceso Central (UPC o CPU en inglés). Las computadoras digitales usan la lógica digital para cumplir con cierta meta de procesamiento. Esto nos da pie a definir dos estados o condiciones bien diferenciados.

un patrón puede significar suma dos números mientras que otro ligeramente distinto significará quizá guarda un resultado en una localidad específica. 1. A este identificador se le llama dirección y sin entrar en más detalles hasta la siguiente sección baste decir que la dirección es única e irrepetible para evitar confusiones y que la capacidad del casillero forma la palabra de la computadora (número de bits que es posible almacenar en la memoria). de entrada y salida. de manipulación de bits. de comparaciones. son almacenados en una serie de circuitos conocidos como memorias pues tienen la particularidad de recordar la información contenida en ellos. etc. Hoy en día. La variedad de operaciones distintas que contiene este juego de instrucciones obedece a criterios de diseño del circuito. la UPC está contenida en unos pocos circuitos de alta integración o en el 1-3 . El grupo de patrones definido por el fabricante forma lo que se llama el juego de instrucciones.2 La Unidad de Proceso Central Toda computadora tiene una especie de circuito de control genérico o UPC (central processing unit o CPU).Componentes Básicos de un Sistema más común de palabra en las microcomputadoras es de 8 bits que se nombra byte. Quizá el único atributo que diferencia a las computadoras de otras máquinas es que se les puede decir qué deben hacer. La UPC está formada por diferentes partes interconectadas entre sí en forma tal que permite ciertas operaciones lógicas. de 32 ó de 64 bits. tanto de instrucciones de programa como datos. Cada casillero o localidad de memoria tiene un identificador que lo hace distinto a cualquier otro casillero para propósitos de identificación y de almacenamiento de información. Varias tarjetas bastante grandes que contenían cientos de circuitos interconectadas por cables del tamaño de una manguera no era una vista extraña. de 16 bits. Todos los datos. Las memorias son organizadas como casilleros únicos en los que se guarda la información. Esto se logra con palabras que contienen patrones de bits que son significativos para la computadora. En general todo juego de instrucciones cuenta con operaciones aritméticas. que forma el “cerebro” de la máquina computadora. Las computadoras de hace 10 años requerían de un chasís bastante grande para albergar los componentes de la UPC. mismas que analizaremos en detalle para un circuito específico en los capítulos siguientes. Este significado preciso se lo da el fabricante de computadoras y así.

Los componentes del sistema de computación deben de interconectarse de alguna forma. una técnica muy popular consiste en interconectar a todos los sistemas externos a la UPC por medio de un sólo juego de cables o bus de interconexión. Este método tiene la desventaja de que muchos cables (llamados buses) distintos deben ser controlados y se requiere de una cantidad considerable de circuitos. forman una computadora funcional.2 vemos el esquema de una unidad de procesamiento central. Se forma por la unidad aritmética y lógica (UAL o ALU. La manera en que se realicen las conexiones y cómo se haga la comunicación. 1-4 . En las primeras computadoras y en algunas de las actuales. controlarlos y transferir datos de y hacia ellos. una serie de registros donde se almacena información requerida por la UPC y la ALU de forma provisional y un bus de datos interno que interconecta a todas las unidades. El bus consiste en los cables necesarios para encontrar a los distintos componentes. La microcomputadora. afecta las características de desempeño del sistema profundamente. arithmetic logic unit) encargada de las operaciones lógicas y aritméticas. En la figura 1. junto con unos cuantos circuitos externos.Ensamblador caso de las microcomputadoras en uno solo. la UPC se interconectaba con cada uno de los dispositivos externos a la UPC por medio de un cable separado. Para realizar la interconexión de forma más económica y para estandarizar la lógica de interfase necesaria. la unidad de control encargada de la coordinación general.

1 Interpretando el Contenido de la Memoria Los datos almacenados en la memoria pueden ser interpretados como: · 1. los datos codificados en binario y los caracteres codificados tienen una cosa en común: son datos.2.Componentes Básicos de un Sistema Figura 1. en forma parcial o total. Ningún programa puede ser ejecutado por la UPC si no reside antes. Los datos binarios puros. La función principal de la UPC será la de interpretar la información que reside en la memoria principal como instrucciones o datos y actuar de acuerdo a un plan determinado por el código de la instrucción generando las operaciones necesarias de acuerdo a ese plan. Un código de carácter · 4.2 Esquema de una Unidad de Proceso Central. El contenido de las palabras almacenadas en memoria puede ser usado por sí solo para 1-5 . Un código de instrucción Estas cuatro categorías de interpretar datos pueden dividirse en dos más genéricas: datos e instrucciones. Datos binarios puros · 2. 1. en la memoria principal (descrita en la sección siguiente). Datos codificados en binario · 3.

1.2. Por ejemplo.1 Datos binarios puros Consideremos primero a los datos binarios puros que no están sujetos a ninguna interpretación. por lo que la base 16 o hexadecimal es la preferida entre la gente dedicada a diseño lógico o programación a nivel máquina. números con signo. aunque se prefiere por fines prácticos que así sea. etc. octal o hexadecimal (por sencillez) sin que tenga ningún impacto en el dato de la palabra. una palabra arbitraria de 16 bits. las palabras pueden no ocupar localidades continuas de memoria. (todos ellos analizados en el capítulo 2). 1. Debe ser posible para la computadora el manejar todo tipo de texto y otra información no numérica.3 Códigos de Caracteres Una computadora no sería muy práctica si tuviésemos que meter cada uno de los datos como largas secuencias de unos y ceros o si las respuestas consistieran de números o letras en una representación binaria.2. La palabra puede también estar codificada de acuerdo a un código establecido de antemano como puede ser exceso 3.1.1. como veremos en el siguiente capítulo.2. interpretada como datos binarios puros. 1. BCD. Es importante resaltar que podemos representar este tipo de datos en papel como un número binario.1. No hay razón por la cual un dato binario no pueda formarse.2 Datos Codificados en Binario El contenido de una palabra de memoria. más aún. además de ser más compacta.Ensamblador operaciones o combinado con otras palabras de memoria en formas dirigidas por un programa. puede ser: 11011011100010112=1556138=DB8B16 Se puede observar que la notación en hexadecimal. por ejemplo con 2 o más palabras. puede existir por sí solo o ser válido sólo cuando se combina con otras palabras para formar un código o un número mayor que sea utilizado con fines prácticos. en la que es posible representar 216 combinaciones. también evita confusiones. 1-6 . es mucho más fácil de apuntar y recordar.

aún más. Si el tipo de paridad que se escoge es par. en es pe cial el libro Telecomunicaciones y Teleproceso. La paridad puede ser: · Par · Impar El bit de paridad se cambia a 1 ó a 0 para que el número de bits 1 de una palabra sea siempre par o impar. por lo tanto. La paridad consiste en una verificación sencilla de errores en la que se agrega un bit al código. En algunos sistemas con longitud de palabra de 8 bits. el bit de paridad se limpia o fija para que el número total de unos de la palabra sea siempre par. los números y una serie de signos especiales que usamos diariamente en nuestra comunicación como son el punto. la coma. el bit de paridad será en este caso 0. no se discuten aquí. En otros sistemas se usa un código de 8 bits ASCII y se agrega a la memoria un bit más que sirve para la comprobación de paridad. 1-7 . etc. Muchos esquemas muy elaborados son usados para verificar la consistencia de los datos y asegurarse que no contengan errores. según el tipo de paridad que se haya escogido.Componentes Básicos de un Sistema Para que el manejo de texto sea completo debe de incluir al menos las 26 letras en minúsculas y mayúsculas. Para mayor información consulte la bibliografía. A este bit se le conoce como bit de paridad. Estas técnicas de detección de errores no tienen que ver nada en particular con la arquitectura de las computadoras o la programación en ensamblador y. se usa el código ASCII de 7 bits y el bit libre se utiliza para verificar errores en los datos por medio de un procedimiento llamado paridad. Para clarificar el punto incluímos un ejemplo: Palabra a proteger con un bit de paridad: 1010101 Como el número de 1 de la palabra ya es par. existen algoritmos para determinar dónde están los errores y tratar de corregirlos. En conjunto. Una palabra de 7 bits es suficiente para su representación pero es universalmente aceptada la codificación utilizando 8 bits (ver capítulo 2). los caracteres más usados suman alrededor de 87.

Identificar la dirección de memoria donde el resultado se almacenará. por medio de la Unidad Lógica y Aritmética (UAL). · 6. 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. · 4. Transferir la suma almacenada en el registro adecuado de la UPC a la dirección obtenida en el paso 5.1. Los pasos necesarios para lograr esta suma serían: · 1. obtenida en el paso 2. · 2. Sumar el contenido de esta última palabra a la que se encontraba en los registros de la UPC. Tendremos que responder a lo largo del libro a las preguntas: ¿Cómo realiza la computadora las operaciones requeridas por los códigos de instrucciones que conforman el programa? ¿Qué es lo que la computadora demanda de la lógica externa para poder realizar su trabajo? ¿Cómo se escribe un programa de computadora? 1-8 .2.4 Código de Instrucciones Las palabras de memoria hasta ahora analizadas son conformadas por información de un tipo u otro pero el contenido también puede ser interpretado como un código solicitando una operación que se requiere de la computadora. Identificar la dirección de la primera palabra a sumar. Identificar la dirección de la segunda palabra a sumar. · 3. Transferir el contenido de la dirección a los registros provisionales de almacenamiento dentro de lo que forma la Unidad de Procesamiento Central. Ilustrar el concepto de un programa de computadora con estos seis sencillos pasos es sólo el comienzo.Ensamblador 1. · 5.

· 2. 1. necesitamos tener su dirección y ésta se almacena en un registro especial que llamaremos registro contador de datos (data counter register) que abreviaremos con sus siglas en inglés: DC. El tamaño de este registro depende de la cantidad de memoria principal que la computadora pueda accesar directamente. Para poder accesar una palabra de memoria.3 suponemos un registro contador de datos de 16 bits que nos da una capacidad de memoria de 65. subiendo el costo y disminuyendo la rapidez de las operaciones como será aparente según avancemos en el libro. complicando el diseño. 1-9 . En el acumulador podemos almacenar información tanto antes de operar con ella. podemos examinar algunos de los requerimientos internos a la UPC para poder satisfacer lo que se le solicita por medio del código de instrucción SUMA. tanto para leer como para escribir su contenido.2. El contenido de la memoria sólo se puede leer o escribir. Es posible tomar los datos directamente de memoria.3.3 Componentes de la Unidad de Proceso Central Si consideramos el sencillo programa de suma descrito en la sección 1. En la figura 1. Se requiere de este tipo de almacenamiento provisional por dos razones: · 1.Componentes Básicos de un Sistema 1. no es posible operar sobre los registros de la memoria principal debido al diseño de las computadoras actuales. como el resultado de las operaciones con los datos binarios. así como un registro donde almacenar el resultado de las operaciones que llamamos acumulador y abreviaremos con A. Por el momento y para simplificar las cosas consideremos que tenemos sólo un acumulador y que éste es de 8 bits. pero una cantidad adicional importante e innecesaria de circuitos lógicos serían requeridos para esto. operar sobre ellos y regresar el resultado otra vez a la memoria principal.1 Registros Es necesario un almacenamiento provisional (o varios) donde guardar los números para trabajar con ellos.536 palabras o 64K bytes (si la palabra es de 1 byte).

de forma similar el contador de datos se actualizará sumando 1 al registro contador de programa y luego 1 más para poder localizar el siguiente dato. sólo consideraremos uno. Para explicar un poco más este punto: si la operación SUMA consta de un código de operación que sólo ocupa una palabra y le deben seguir dos palabras más de memoria que contengan los datos a sumar. por lo tanto. El contador de programa es análogo al de datos pero se asume que uno contiene la dirección de los datos en memoria y el otro la dirección de la siguiente instrucción en memoria. el contador de datos puede o no incrementarse de acuerdo a si la instrucción requiere de datos o no. mientras que. 1-10 . Necesitamos también un registro donde la instrucción sea contenida de forma que la UPC pueda hacer referencia a ese registro para ver de que instrucción. por simplicidad y por el momento. al registro contador de programas no se tiene acceso más que de forma indirecta. se trata. Debe. el apuntador a la siguiente instrucción debe actualizarse sumando tres localidades para que salte los datos y apunte efectivamente a la siguiente instrucción. de las muchas de una computadora. Como se puede ver en la explicación anterior. usualmente. A este tipo de registro se le denomina registro de instrucción (instruction register) que abreviaremos con I. La dirección de la memoria de la que traeremos la siguiente instrucción (es nuestro ejemplo la de SUMA) es almacenada en el llamado contador de programa (program counter) que abreviaremos con sus siglas en inglés: PC. pues mientras el contador de programa debe de incrementarse continuamente para encontrar la siguiente instrucción usando para ello la longitud en palabras de que consta la instrucción anterior. existe una diferencia conceptual grande entre el contador de programa y el contador de datos.Ensamblador Una computadora puede constar de más de un registro de este tipo pero una vez más. permitírsele gran flexibilidad al programador para poder modificar el registro contador de datos.

SUMA y GUARDA.Componentes Básicos de un Sistema Figura 1. Inventamos el código de instrucción 40 hexadecimal que al ser encontrado por la 1-11 . Para realizar la suma asumiremos que la UPC puede interpretar 3 instrucciones sencillas: CARGA.1. realizaremos paso a paso una suma como se describe en el algoritmo de la sección 1. Cada una de estas instrucciones está definida de antemano rígidamente y se deben seguir los pasos que el fabricante explica.3 Registros típicos de una UPC.2.2 Forma de Usar los Registros Para poder comprender en su totalidad el uso de los distintos registro que forman parte de la UPC.3. 1. Inventamos el código de instrucción 30 hexadecimal que al ser encontrado por la UPC en una localidad de memoria sea interpretado como la instrucción SUMA.4. CARGA: Toma el contenido de la dirección formada por el contenido de las siguientes dos palabras y guárdala en el Acumulador. Supondremos que las instrucciones realizan estos pasos: SUMA: Toma el contenido de la dirección formada por el contenido de las siguientes dos palabras y súmala a la que está en el Acumulador dejando el resultado en el Acumulador.

Ensamblador UPC en una localidad de memoria sea interpretado como la instrucción CARGA. Nuestro programa de suma sería entonces (las direcciones en hexadecimal): CARGA SUMA GUARDA E0E0 E0E1 E0E2 Notemos que aquí se introduce un nuevo concepto llamado mnemónico que nos auxilia en recordar qué realiza cada código de instrucciones de la computadora en cuestión. 16 bits binarios o 4 hexadecimales para conocer su localización). GUARDA: Toma el contenido del Acumulador y guardalo en la dirección de memoria formada por el contenido de las siguientes dos palabras. Inventamos el código de instrucción 50 hexadecimal que al ser encontrado por la UPC en una localidad de memoria sea interpretado como la instrucción GUARDA. Coloquemos estos códigos en un mapa de memoria en una localidad arbitraria. por ejemplo en la dirección C000 hexadecimal (suponemos que tenemos una memoria total de 64K bytes por lo que bastan con 16 líneas de dirección. cada número en binario se resume en si hay corriente o no en cada uno de los circuitos que conforman el registro en cuestión. 1-12 . que cada número en hexadecimal tiene su equivalente en binario y a su vez. pues en la palabra de memoria no se guarda las letras de la instrucción sino un simple código que representa a la instrucción: 40 E0 E0 30 E0 E1 50 E0 E2 Recordemos a su vez.4 colocamos de alguna forma nuestro programa en la memoria. ya sea de memoria o interno a la UPC. En la figura 1. Recuerde que el Contador de Programa debe de incrementarse continuamente para apuntar así a la siguiente dirección de memoria donde se almacena una instrucción o dato.

Componentes Básicos de un Sistema Figura 1. Podemos seguir paso a paso el contenido de los registros hasta ahora analizados en la siguiente secuencia: 1-13 .4 El manejo de los registros en un programa.

el contenido de la palabra que se trae de la memoria se almacena en el registro I para ser interpretado como una instrucción. Puesto que no le hemos dado ninguna otra instrucción específica a la UPC. La última instrucción de nuestro pequeño programa es algo muy similar a la instrucción 1 pero en lugar de traer los datos de la dirección apuntada por el registro DC. Primero. Ahora. el registro contador de programa o PC contiene la dirección de la primera instrucción: C0 00. Una vez terminada la instrucción anterior la UPC trae el contenido de la palabra de memoria direccionado por el registro PC e incrementa en uno este registro. Una vez más la UPC incrementa el contenido del registro PC en uno. Con esto la instrucción número 1 (CARGA) se completa. · 2. · 4. se almacena en esa dirección. Algo muy similar al paso 3 sucede en esta etapa.Ensamblador · 1. e incrementa en uno el contenido del registro PC. el resultado se almacena en el acumulador y el contador de programa se ha incrementado en 2 para quedar apuntando a la siguiente instrucción. · 6. De una forma por ahora desconocida. El registro DC contiene ahora la dirección 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. · 3. El código 40 que aparece en el registro de instrucciones hace que la lógica de la UPC realice dos pasos. La Unidad de Procesamiento Central incrementa posteriormente el contenido del PC en uno. en este caso el número 40 hexadecimal (CARGA). · 5. el contenido de la palabra de memoria direccionado por el registro PC es traído de la memoria pero se almacena en el bit más significativo del registro contador de datos (DC). se utiliza el contenido del registro DC como apuntador para traer la palabra de memoria indicada al registro acumulador (A). La UPC carga el contenido de la palabra de memoria apuntada por el PC al registro de instrucciones o I. 1-14 . 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.

Si la operación a realizar es suma o resta. Hay un acarreo. Hubo un desbordamiento en la operación. · 5. 1. Hay signo en la operación. Indicador de paridad.3. Aquellas instrucciones que afectan o no a las banderas de estado son cuidadosamente seleccionadas por el fabricante y varían de computadora a computadora.Componentes Básicos de un Sistema 1. El resultado fue cero. Algunas de estas situaciones en las que las banderas son modificadas que nos son de interés se resumen en los siguientes puntos: · 1. La ejecución de una instrucción puede ser dividida en dos partes principales: · Traer la instrucción (fetch en inglés) · Ejecutar la instrucción (ejecute en inglés) 1-15 . Acarreo a la mitad de los bits que forman la palabra. 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. · 3.4 Ejecución de Instrucciones Como en casi toda la lógica digital. · 2. · 4. la UPC es controlada por un reloj. · 7. · 6.3 Banderas de Estado Muchas veces es necesario saber en detalle qué es lo que realiza la UAL para poder decidir si la operación que se ordenó fue completada con éxito o no o para tomar ciertas medidas con el resultado que nos entrega la UAL. Este reloj puede ser tan sencillo como una sola señal o una combinación de varias señales de reloj requeridas por la UPC.

la UPC tiene que colocar el contenido del registro del contador de programa (PC) en el bus de direcciones junto con las señales necesarias para informar a la lógica exterior que se trata de una lectura a la palabra de memoria indicada por el contenido del bus de direcciones. El contador de programas ahora apunta a la siguiente localidad de memoria de la que el código de la instrucción se trajo. · 2. consideraremos un diseño de 8 bits de longitud de palabra por lo que se requieren de 8 líneas de datos que en conjunto forman el llamado bus de datos.Ensamblador Si recordamos nuestro ejemplo ante rior de un programa. Una vez que el código de instrucción se encuentra en el registro de instrucciones. la UPC usa su lógica interna para sumar 1 al contenido del registro PC. esto se trata de una simple lectura. Por simplicidad consideraremos un diseño en el que se puedan accesar únicamente 65. Las líneas necesarias para leer o escribir información a la memoria. dispara una serie de eventos controlados por la Unidad de Control que constituyen la ejecución de la instrucción. Mientras la lógica externa responde. Uno de ellos marca el tiempo para traer la instrucción y el otro para ejecutarla. Durante la etapa donde se trae la instrucción. En su forma más sencilla. Las líneas necesarias para la dirección de memoria. La alimentación del circuito/circuitos que forma la UPC formado como mínimo con una línea de voltaje y otra de tierra. Una vez más. por simplicidad. dos periodos de reloj son necesarios para ejecutar la instrucción. · 3. Las señales adecuadas para informar a la lógica externa que se trata de una lectura o escritura a la memoria. Si consideramos las interconexiones necesarias para esto necesitaremos hasta el momento por lo menos las siguientes: · 1.535 localidades distintas de memoria ó 64K bytes para lo que se requiere de 16 líneas. En conjunto forman el llamado bus de direcciones. cada instrucción comienza con el código que se carga en el registro de instrucción (I). Por lo que a la lógica externa concierne. 1-16 . A esta operación le llamamos traer la instrucción (fetch). · 4.

Por ejemplo. 1-17 . Algunas veces se requieren de más líneas que las que físicamente permite el empaque. si se requieren de 20 líneas de dirección y sólo tenemos disponibles 14 conexiones. podemos mandar en el momento t la dirección parte baja por las 14 conexiones disponibles y las restantes 6 en el momento t+1 por las mismas interconexiones.Componentes Básicos de un Sistema · 5. Figura 1. pero en realidad consiste de un gran número de elementos lógicos que pueden ser activados por una secuencia de señales habilitadoras. La línea del reloj. Se utiliza entonces una técnica llamada multiplexión en la que las mismas interconexiones externas sirven para varios propósitos. 1. vigila su aplicación y genera los comandos y señales adecuadas para la Unidad Aritmética y Lógica (UAL) y otros circuitos para su correcta aplicación. La IEEE define a la unidad de control como la parte de una computadora que lee las instrucciones en secuencia.5 el diagrama parcial y esquematizado de un circuito de UPC.5 La Unidad de Control La unidad de control se puede representar funcionalmente como una caja negra tal como en la figura 1. Mostramos en la figura 1.5 Una microcomputadora con sus líneas externas.1.

La secuencia de códigos binarios que residen en la Unidad de Con trol son llamados microprogramas y generar esta secuencia de códigos binarios se le conoce como microprogramación. Lo que sí tiene valía es complementar el contenido del Acumulador y esto implica mover la información al complementador y una vez realizada la operación. regresar el resultado al Acumulador. · 3. el complementar el contenido de una memoria provisional. Por ejemplo. A cada uno de estos 5 pasos se les llama microinstrucción. Mover el contenido del Acumulador al Bus de Datos interno. cualquier número de microinstrucciones pueden ser ejecutadas para responder a una macroinstrucción que es la respuesta aceptada de la Unidad de Procesamiento Central a un código de una instrucción de lenguaje de máquina. Si la Unidad de Control manda la combinación de señales adecuadas.Ensamblador La unidad de control puede utilizar otros elementos contenidos en la UPC. Mover el contenido del Complementador al Bus de Datos interno. muy similares a las ya descritas (SUMA. Complementar el contenido del Acumulador requiere entonces de 5 pasos: · 1. · 2. Mover el contenido del Bus de Datos al Acumulador. Existe un paralelo muy cercano entre lo que es microprogramar y la programación en lenguaje de ensamblador. · 4. la Unidad de Control requirió de 5 códigos binarios que dispararon las señales de control apropiadas. Mover el contenido del Bus de Datos al Complementador. Para complementar el contenido del Acumulador en nuestro ejemplo previo. la UC puede utilizar el complementador de la Unidad Aritmética y Lógica. no nos sirve de mucho. Activar la lógica del complementador. CARGA y GUARDA). aunque útil. Cada microinstrucción es habilitada por una señal de la Unidad de Control. Sin embargo. Una señal única de la Unidad de Control activa al complementador. · 5. Un 1-18 . Un microprograma se guarda como una serie de códigos binarios dentro de la Unidad de Control.

La Unidad de Control de cada computadora no es más que un microprograma. Central Processing Unit CPU) es la sección de la computadora que realiza las operaciones matemáticas y lógicas en los datos de entrada procesados por el computador. No importando el tamaño y la complejidad de estos circuitos. formar parte de la propia UPC como en el caso de la microcomputadora o ser una serie considerable de circuitos lógicos de alta velocidad como en las macrocomputadoras o supercomputadoras. La complejidad de las operaciones asociadas con una macroinstrucción es función direct a del tamaño del microprograma que la macroinstrucción inicia. la computadora no es microprogramable. Un microprograma guardado en la Unidad de Control tiene memoria para datos.6 Unidad Aritmética y Lógica La Unidad Aritmética y Lógica (UAL. ya sea provisional (RAM) o definitiva (ROM) como describimos en la siguiente sección. donde toda la UPC se encuentra contenida en un solo circuito. las máquinas pequeñas realizan generalmente las mismas operaciones lógicas y aritméticas usando los mismos principios que en las grandes 1-19 . Si se permite al usuario modificarlo se dice que la computadora es microprogramable. Pero existe el límite impuesto por el tamaño físico que puede tener la Unidad de Control y esto se hace más patente en las microcomputadoras. entonces. Un macroprograma también tiene una área de almacenamiento. en inglés ALU) que es parte de la Unidad de Procesamiento Central (UPC. Si la Unidad de Control se diseña como parte del diseño lógico de la computadora y forma parte inalterable de la Unidad de Procesamiento Central. ademas de almacenamiento interno a la misma Unidad de Con trol. Al programa en ensamblador se le conoce con el nombre de macroprograma y a cada macroinstrucción le corresponden uno o más microprogramas dentro de la Unidad de Procesamiento Central que deben ser ejecutados para generar la respuesta esperada. 1. Esta sección de la máquina puede ser relativamente pequeña consistiendo en quizá uno o dos circuitos de integración a gran escala (LSI). que consiste en los registros de la UPC.Componentes Básicos de un Sistema programa en ensamblador es guardado como una serie de códigos binarios dentro de la memoria principal (RAM o ROM).

Depende del elemento de control el proveer de estas señales así como es función de la unidad de memoria proveer a los elementos aritméticos de la información que usarán. también. como ya se explicó. Aunque muchas funciones pueden ser realizadas por los UAL de las máquinas de hoy en día. 1-20 . acarrear. otra parte de la computadora llamada Unidad de Control que dirige las operaciones del UAL. etc. restar. las operaciones aritméticas básicas (suma. cuando se le provee de la secuencia correcta de las señales de entrada. Todo lo que hace el UAL es sumar. multiplicación y división) continúan siendo las operaciones más utilizadas. Es importante resaltar que existe.Ensamblador máquinas. resta. Inclusive las especificaciones de una computadora nos dan evidencia de la naturaleza fundamental de estas operaciones: en cada máquina nueva se describen los tiempos requeridos para la suma y multiplicación como características significativas. técnicas especiales son utilizadas para realizar varias operaciones en paralelo. Lo que cambia es la velocidad de las compuertas lógicas y los circuitos utilizados.

Esta sección de la memoria de la computadora consiste en un conjunto de registros de almacenamiento. El proceso actual de información se realiza en la localidad de estos registros. la siguiente categoría de registros de almacenamiento que encontramos es llamada memoria de alta velocidad. Los cálculos se realizan con los datos que se toman de estos registros. En la parte más interna encontramos a los registros de operación que son registros utilizados por la unidad de control y la aritmética de la computadora. memoria interna o memoria principal. la suma. 1.Componentes Básicos de un Sistema Figura 1. Viendo hacia afuera. cada uno de los cuales es identificado con una dirección 1-21 . por ejemplo.6 La Unidad Aritmética y Lógica esquematizada. multiplicación y corrimientos son todos realizados en estos almacenamientos provisionales. los dispositivos de almacenaje están distribuidos en toda la máquina.7 La Memoria La memoria de la computadora no está concentrada en un sólo lugar.

Este medio de almacenaje consiste generalmente en tarjetas perforadas (en desuso). pero como es deseable almacenar grandes cantidades de datos (de 600. cintas magnéticas o discos magnéticos y las salidas de la máquina consisten generalmente en caracteres impresos ya sea en pantalla o en papel.Ensamblador (localización de cada registro de memoria) que permite a la unidad de control. por esta razón los dispositivos de almacenamiento con un tiempo de acceso (tiempo que transcurre entre el momento que se solicita la información y el momento en que el dispositivo tiene una respuesta) rápido son generalmente elegidos para la memoria principal.000 a 109 bits) 1-22 . Para que un programa (conjunto de instrucciones) pueda ser ejecutado es necesario que resida antes en esta memoria. Estos registros generalmente deben realizar operaciones a varias veces la velocidad de la memoria principal. Desafortunadamente los dispositivos disponibles en el momento. es agregada a la mayoría de las máquinas. Cada una de las divisiones de la memoria tiene ciertas características. cinta de papel perforada (en desuso). La memoria principal también requiere grandes velocidades de operación. Como resultado. que son lo suficientemente rápidos para realizar esta función satisfactoriamente. pero generalmente tiene una velocidad de operación mucho menor que los registros de operación o que la memoria principal. Es deseable que la velocidad de operación en esta sección de la memoria de la computadora sea tan rápida como sea posible. de un registro en particular. no poseen la capacidad de almacenamiento que algunas veces es requerida ni un costo aceptable. pues su función es manejar cantidades de datos en exceso a las que pueden ser almacenadas en la memoria interna. Los dispositivos más externos y últimos de almacenamiento son usados para introducir información a la computadora del “mundo externo” y para guardar los resultados de la computadora para el usuario de la computadora. Esta sección de la memoria es algunas veces designada como memoria de respaldo. puesto que la mayoría de las transferencias de datos de y hacia la sección de procesamiento de la información de la máquina será a través de la memoria principal. memoria adicional. Por ejemplo la importancia de velocidad es muy alta en los registros de operación. llamada memoria auxiliar o memoria secundaria. Esta sección de la memoria de la computadora se caracteriza por un bajo costo por dígito almacenado. ya sea escribir o leer.

la información. no es olvidada o borrada por el tiempo en que el dispositivo tenga energía eléctrica o la información no sea cambiada explícitamente. Es importante darse cuenta al considerar la velocidad de operación. por lo que el tiempo de acceso varia de acuerdo a la localidad.000 y 1015 bits. siendo muy caro utilizar los mismos dispositivos que para la memoria principal. El tiempo para localizar y leer una palabra de memoria es llamado tiempo de acceso. Los registros internos de trabajo o la memoria principal es un ejemplo de un dispositivo de almacenamiento de acceso aleatorio.Componentes Básicos de un Sistema en esta sección de la memoria. una vez grabada en su localidad. Por otro lado los dispositivos de acceso secuencial necesitan ser recorridos en orden para llegar a cierta localidad de memoria. Como contraparte. El mismo tipo de compromiso se realiza en el caso de la memoria auxiliar en el que se almacenan entre 360. El procedimiento para localizar información puede ser dividido en dos clases: · Acceso Aleatorio · Acceso Secuencial Los dispositivos de almacenaje que tiene acceso aleatorio son aquellos en los que la localización dentro del dispositivo puede ser seleccionada arbitrariamente sin seguir ningún orden y el tiempo aproximado de acceso es aproximadamente igual para cada una de las localidades de memoria del dispositivo. que antes de que una palabra puede ser leída. 1-23 . una vez guardada la información en una localidad. por lo que se debe recordar o “refrescar” constantemente. un compromiso entre el costo y la velocidad debe buscarse. ésta se olvida en un tiempo finito. es necesario localizarla. en un dispositivo dinámico. Otra forma de subdividir los dispositivos de almacenaje es de acuerdo a si son dispositivos del tipo · Dinámicos · Estáticos En los estáticos.

cada una de ella ocupa una localidad o dirección predeterminada dentro de la memoria. No removemos la palabra en una dirección cuando la movemos.7 La memoria vista como arreglo lineal. Figura 1. Desde el punto de vista externo. Cada dirección o localidad contiene un número fijo de bits 1-24 .Ensamblador 1. una memoria principal de alta velocidad es muy similar a una “caja negra” con un número de localidades o direcciones en las que los datos pueden ser almacenados o leídos. únicamente cambiamos el contenido de la dirección cuando almacenamos o escribimos una nueva palabra.7.7 una memoria dada se divide generalmente en N palabras donde N es una potencia de 2. En cada cajón hay una palabra y la dirección de la palabra está escrita en la parte externa del cajón. Es importante entender la diferencia entre contenido de la memoria y la dirección de la memoria. La dirección de los números en la memoria corren consecutivamente comenzando con la dirección cero hasta la máxima que la computadora puede direccionar. Como se puede observar en la figura 1.1 Memoria de Acceso Aleatorio La memoria de una computadora se organiza en palabras de X longitud. Una memoria es como un gran gabinete que contiene tantos cajones como direcciones hay en memoria. Cada palabra tiene el mismo número de bits llamados la longitud de la palabra.

Una memoria que contenga 4.Componentes Básicos de un Sistema binarios. 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).096 localidades distintas de memoria. Las memorias puede ser leídas (los datos pueden ser tomados de) o escritas (los datos son almacenados en la memoria). Una palabra de información binaria puede ser almacenada en grupos. pues se entiende que las 2N localidades de memoria están disponibles.7. es llamada “memoria de 16 bits 4. Podemos aplicar un único grupo de dígitos binarios a una serie de líneas de selección y de esta forma una localidad única queda disponible. 1-25 .096 palabras” o en el lenguaje vernáculo de la computadora “memoria de 4K 16 bits”. por ejemplo 8 bits en unidades de memoria. A las memorias en las que solamente es posible leer y no permiten escritura son llamadas memorias de sólo lectura o ROM (Read only memory).8 mostramos una memoria de semiconductores estática típica arreglada de forma que sus “celdas” puedan ser seleccionadas independientemente con un código binario único llamado palabra de dirección. 1. Puesto que las memorias generalmente vienen en potencias de 2. Las memorias en las que es posible leer y escribir son llamadas memorias de lectura y escritura y erróneamente conocidas como RAM (Random Access Memory. o sean movidos en paralelo (todo el grupo a la vez). Pero un problema fundamental surge: ¿Cómo poder accesar a cada una de las localidades sin confusión? La solución es usar una forma de dirección. Por ejemplo una memora de 16 bits de 216 palabras es llamada “memoria de 64K 16 bits”. y a este número se le llama longitud de la palabra de la memoria. cada una de ellas capaz de almacenar 16 bits binarios. como en el caso decimal.024 y no 103. Cuando se trata de registros dentro de la UPC (CPU) los programadores usualmente los representan como pequeñas cajas una junto a otra y dentro de ellas un cero o uno lógico que representa su contenido.2 Dirección Incrementando el número de unidades de memoria de almacenamiento podemos aumentar el número de bits disponibles. el sufijo K significa en este caso 1. memoria de acceso aleatorio) ya que las memorias de sólo lectura (ver siguiente párrafo) también entran en esta clasificación. En la figura 1.

sin embargo. Dentro del circuito las celdas se organizan en una matriz de x por y. Hay una operación inicial en que la información se graba en la memoria y posteriormente sólo es posible leer de ella y no sobre escribir la información. Pero para nuestros propósitos es suficiente considerar a las celdas como una larga cadena y a la dirección como un selector de alguna forma de la celda correcta.Ensamblador Figura 1. 1.7. un 0 o un 1 puede ser escrito a la celda. Generalmente la información es puesta en su lugar por el fabricante del dispositivo. con la mitad de las líneas de dirección localizando las coordenadas de y. en muchas ocasiones poder grabar la información uno mismo en el dispositivo pues el costo de fabricar unos pocos ROMs es prohibitivo.3 La Memoria de Sólo Lectura La memoria de sólo lectura (ROM Read Only Memory) es un dispositivo de memoria utilizado para guardar información que no cambia. Es deseable. Existen en el mercado una serie de circuitos que cumplen con esta característica y que 1-26 .8 La memoria y sus conexiones extrenas. Una vez que la celda ha sido localizada.

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).Componentes Básicos de un Sistema son programables: las memorias de sólo lectura programables o PROM (pro gram ma ble read only mem ory)memoria de sólo lectura programable. Estos circuitos permiten grabar la información una sola vez y de ahí en adelante se comportan exactamente igual a un ROM. Estos circuitos pueden ser programados. puede ser económicamente substituida por una memoria ROM. se utilizan los circuitos de memoria de sólo lectura programables y borrables o EPROM (erasable programmable read only memory). Cuando una tabla de verdad tiene muchas variables lógicas de entrada y salida y su realización requiere de un gran número de compuertas. casi todo tipo de memoria RAM es volátil. El atributo más importante de la memoria ROM es que la información grabada en ella no se borra si el voltaje que requiere el circuito para funcionar es interrumpido. Esta selección obedece al hecho de que en México. tales como las funciones trascendentales. para contener valores arbitrarios de una tabla de verdad. El abaratamiento de los circuitos y su incesante popularidad ha dado nacimiento a circuitos muy avanzados. por ejemplo. Pero principalmente guardan el programa que forma el Sistema Operativo de la máquina en cuestión. etc. Si se realizan circuitos experimentales y son constantes los cambios de diseño 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. división. En contraste. Puede ser usada. logaritmos. Se usa también en conversión de códigos para despliegue numérico. Las microcomputadoras han encontrado su camino hacia muchas de las aplicaciones reservadas con anterioridad a la minicomputadora.8 Arquitectura de sistemas 80x86 Hemos escogido para presentar como ejemplo de la UPC al circuito 80486 de Intel. 1. Tiene una amplia aplicación en cálculo numérico donde se requiere de muchas operaciones que pueden ser substituidas por una búsqueda en tab las. multiplicación. tal como los PROM pero tienen una ventana de cuarzo en la parte superior del empaque por la que se puede borrar la información usando una luz ultravioleta. Tales memorias son conocidas como no volátiles. El circuito 80486 (y los de su familia) cuentan entre sus características con: 1-27 . La memoria ROM tiene muchas aplicaciones en sistemas digitales.

En un circuito de este tipo encontramos 14 registros de 32 bits (de los cuales sólo mencionaremos los 16 bits bajos): 1-28 . 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 cómputo han evolucionado. binario y decimal.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) · Aritmética de 8. incluye multiplicación y división · 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. 16 y 32 bits con y sin signo.

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 instrucción banderas del sistema Registros segmentos CS DS ES SS segmento de código segmento datos segmento extra segmento pilas El grupo de registros generales consta de 32 bits al igual que los demás 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.Componentes Básicos de un Sistema Tabla 1. Algunos de estos registros tienen usos específicos y algunas instrucciones requieren de ciertos registros: 1-29 . el registro AX se puede dividir en AL y AH.

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 más 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. Cada segmento puede ser de hasta 4 gigabytes. Tabla 1. siendo los de 64K bytes de longitud para compatibilidad con modelos 1-30 .Ensamblador Tabla 1.3 Banderas Bandera OF DF IF TF SF ZF AF PF CF IOPL NT RF VM saturación dirección (operación con cadenas) habilita interrupciones trampa (ejecución paso a paso) signo (resultado negativo) cero acarreo auxiliar pariedad (par) acarreo Nivel de privilegio para E/S (2 bits) tarea anidada Continua operación Modo virtual Función Este circuito ve a la memoria como un grupo de unidades lógicas llamadas segmentos.

Se introduce un circuito típico de gran popularidad en México y el mundo: el Intel 80x86. sin traslape o con traslape parcial o total. decodificar instrucción y ejecutarla a sólo dos pasos.4. y son controlados por los registros de segmentos.Componentes Básicos de un Sistema anteriores. los 4 bits menos significativos deben ser cero. Este desplazamiento se indica en la tabla 1. Se mencionan y explican brevemente algunos componentes externos a la UPC en especial circuitos auxiliares como la memoria y sus clasificaciones.4 Uso del Desplazamiento Tipo de referencia Traer instrucción Operación con pila Segmento base por omisión CS SS Segmento base alterno Ninguno Ninguno CS ES SS CS ES SS Ninguno CS ES SS Desplazamiento IP SP dirección efectiva SI DI dirección 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 instrucción del típico traer instrucción. Tabla 1. disjuntos. pues mientras se interpreta la instrucción se trae la siguiente al mismo tiempo. Sólo existe una restricción con respecto a los segmentos: deben comenzar en un párrafo que es una dirección que es di visible exactamente entre 16.9 Resumen Se introduce a los componentes de una UPC y se muestra como funciona está. Para esto. los registros indispensables para el funcionamiento de la UPC y el ALU. necesitaremos sumar un desplazamiento para poder completar las 32 líneas de direccionamiento disponibles. cada uno indicando el final del segmento en particular. Los segmentos pueden ser adyacentes. Si requerimos usar un registro como apuntador a memoria. En este capítulo introducimos el concepto de instrucción y su forma de interpretación dentro de la UPC. 1. 1-31 .

1. · La UPC consta de la UAL. ROM. 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 según el programador y el diseñador del circuito.10 Bibliografía Llano Emiliano Sistemas Digitales y Arquitectura de Computadoras. · La UAL ejecuta un conjunto de operaciones aritméticas y lógicas básicas. · Existe un registro especializado llamado de banderas de estado que nos indica varias condiciones dentro del la UPC. Unam 1993. Capítulo 10 y 11.9.Ensamblador 1. RAM. interfases de E/S y un programa · El juego de patrones definidos por el fabricante forman el juego de instrucciones. secundaria. · 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 ejecución de la instrucciones. los registros. memoria. dinámica. estática y todas ellas son accesadas por medio de una dirección que identifica las distintas localidades que la conforman. · La memoria puede dividirse en Interna. dispositivos de E/S. · La unidad de control de una UPC puede o no programarse. 1-32 .1 Puntos Importantes del Capítulo · Un sistema se conforma por 5 componentes básicos: UPC.

posteriormente se utiliza un programa que pueda extraer a los primeros del medio donde fueron almacenados y ejecutarlos.Capítulo 2 2. Algunas veces se conoce a los programas como subrutinas pues forman parte de programas mucho más grandes. Otros programas se usan para manejar los distintos puertos de entrada y salida de una computadora. muchos programas pueden reunirse y guardarse en un sistema de almacenamiento externo tal como disco magnético flexible (medio muy común). Es este programa. en oposición a los elementos mecánicos y electrónicos llamados en conjunto Hardware. es controlada directamente por estos programas. a los que en conjunto se conocen como Programas (software). Algunos de estos programas se usan para un tarea en particular como puede ser el caso de una nómina. La operación tanto mecánica como lógica de los dispositivos externos al sistema por donde la información es introducida y entregada. Existe aún otro tipo de programas que realizan funciones muy específicas de computación como realizar las funciones que la UAL no puede realizar o realiza muy despacio. no es más que un juguete caro a menos de que exista un propósito de su existencia y un programa que haga que este propósito se cumpla. formado por una serie de instrucciones precisas y arreglado en un orden lógico. Para un sistema de computación dado. A este programa se le conoce como sistema operativo (operating sys- 2-33 . Existen muchos tipos de programas y de sistemas de programas.1 Otros lenguajes y el ensamblador No se debe pasar por alto que un sistema de computación. no importando la complejidad de los varios componentes electrónicos que lo formen. que hace de la computadora una herramienta útil.

A este programa se le conoce como programa de arranque (start-up program). Toda computadora tiene una forma determinada de comenzar la ejecución de un programa en una localidad específica al aplicarles la energía eléctrica. 2. Lo que sucede a partir del punto en que el sistema operativo toma control de la Unidad de Proceso Central. varía 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. El procedimiento común consiste en colocar en una localidad de memoria predefinida del tipo ROM. peticiones a dispositivos externos. los programas de arranque no necesariamente tienen que ser muy grandes. El programa de arranque inicia una cadena de eventos que termina con la ejecución 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 básico de entrada y salida (Basic Input Output System). la computadora sólo es capaz de ejecutar una instrucción a la vez (en las arquitecturas tradicionales no incluyendo en esto arquitecturas en paralelo) por lo que 2-34 . esta característica se aprovecha para guardar en esa localidad el inicio del programa de arranque. La primera consideración sería ¿Cómo hacer que la computadora comience a funcionar? Aplicando la energía eléctrica únicamente no es suficiente para hacer que la computadora comience a funcionar como el usuario desea.2 Los Programas en la Memoria Como hemos visto en la descripción de la Unidad de Procesamiento Central y en especial de la Unidad de Control. Usualmente se le conoce en inglés con el nombre de bootstrap o programa de arranque en frío (cold-start). etc.Ensamblador tem) y si se encuentra almacenado en un disco magnético se le llama sistema operativo de disco (disk operating system o DOS). Debe existir un programa que haga la inicialización 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 magnéticos de almacenamiento. el pequeño programa de arranque. Una discusión a fondo de sistemas operativos queda fuera del alcance de este libro pero se puede consultar la bibliografía para ahondar en el tema.

este código es introducido luego a la máquina y el programa que lo lee. Nada nos impide crear estas secuencias lógicas en forma binaria y de alguna forma colocarlas en la memoria en las localidades escogidas y de hecho.Otros Lenguajes y el Ensamblador se requiere de una memoria donde guardar las instrucciones que forman el programa. lo convierte y coloca en su localidad de memoria. La ejecución del programa consiste en tomar una instrucción de la memoria principal e interpretarla en la Unidad de Control de la UPC. Estos unos y ceros colocados en la memoria principal y listos a ser interpretados como un programa. Pronto los programadores escogieron representar los códigos de instrucciones en hexadecimal en lugar de binario para abreviar y facilitar su labor (es muchas veces más fácil identificar un error en una secuencia de números hexadecimales que en una cadena de unos y ceros) y luego buscar la forma en que la máquina trabajará más ayudando a la conversión. La secuencia lógica forma el programa y programar es crear estas secuencias. La cantidad de memoria necesaria depende de la complejidad del programa y de la cantidad de datos que genere o use. Las instrucciones son utilizadas para especificar la secuencia lógica que debe ocurrir dentro del sistema de cómputo. Para usar una computadora debemos. Un código escrito en un papel u otro medio. las primeras computadoras eran programadas de esta forma: una secuencia de 1 y 0 era cuidadosamente codificada y luego introducida a la máquina por medio de alambres que cambiaban el contenido de la memoria (en las computadoras más antiguas) o por medio de interruptores que se conectaban directamente a la memoria por medio del bus de datos (en la siguiente generación). es llamado un editor y es la forma más elemental de colocar los unos y ceros en donde deben estar. seleccionar primero los dispositivos que nos darán la capacidad lógica suficiente y posteriormente realizar la secuencia lógica que llenará nuestras necesidades. El registro de Contador de Programa (PC) es utilizado para ir llevando un apuntador de memoria de la siguiente instrucción a ejecutar. son llamados el código objeto y no son más que la representación exacta de lo que en un 2-35 . Como ya hemos visto. el PC se debe incrementar un poco antes de realizar la transferencia (fetch) de la siguiente instrucción en memoria al Registro de Instrucciones (I). por lo tanto. forma lo que llamamos código fuente.

en una primera aproximación. se encuentra en el lenguaje ensamblador que no es más que convertir las instrucciones que entiende la Unidad de Proceso Central (lenguaje de máquina) en una serie de símbolos alfabéticos y números mucho más convenientes para los programadores humanos. En la época actual. hay poca evidencia de que los fabricantes se apeguen a el. programar e introducir a la máquina que una secuencia de números sin sentido más que para el más experto? La respuesta a esto. Estas características fueron pronto introducidas en los lenguajes ensambladores que permitieron que módulos de programas escritos como unidades independientes fuesen integrados o ensamblados en uno más grande. sea grande o pequeña. versiones simbólicas y mucho más fáciles de leer de los lenguajes de programación de máquinas computadoras. Llevando este razonamiento un paso más allá. Simplificar el trabajo del programador es una mejora sustancial en nuestro equipo. varios lenguajes ensambladores pueden existir para la misma máquina pero el programa que se encarga de colocar los unos y ceros en la memoria. en nivel sistema de computadora. ¿Por qué no usar un lenguaje que sea más sencillo de aprender.Ensamblador principio teníamos en papel pero ahora colocado en la memoria de la computadora. El lenguaje ensamblador es definido por el fabricante y es único a cada modelo de UPC. de ahí el nombre de ensamblador. pero un patrón general ha emergido: · Cada instrucción ocupa una línea. Pronto se vio que el camino correcto consistía en hacer el trabajo del programador más fácil mientras que el de la máquina debería ser el más difícil. casi todo tipo de computadora. Aunque algunos estándares para lenguaje ensamblador han sido propuestos. Ocasionalmente. · Cada línea se forma de cuatro campos: Etiqueta 2-36 . se vende con un lenguaje ensamblador y otros programas asociados que nos permiten introducir nuestras instrucciones a la memoria de la máquina. debe entregar el mismo resultado: el programa objeto ejecutable por la computadora. los programas eran cada vez más complejos y de mayor tamaño y se reconoció la necesidad de construir los programas en unidades o módulos más pequeños e independientes. Al incrementarse el uso de las computadoras. Los lenguajes ensambladores son.

Otros Lenguajes y el Ensamblador

Mnemónico Operando Comentario Cada línea fuente de programa representa una línea objeto traducida por el programa que se denomina ensamblador. El campo del mnemónico es el más importante y es el único campo obligatorio que aparece en cada línea.
etiqueta operando mnemónico DC0,ADDR1 H"0F" SALIR comentario

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

;carga dirección 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 instrucción

DC0 AQUI

Nótese que lo único sagrado e inalterable son los códigos binarios de las instrucciones; los mnemónicos del ensamblador pueden ser alterados siempre y cuando se reprograme al programa ensamblador para reconocerlos y hacer la traducción adecuada. El campo de las etiquetas puede o no tener información 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 dirección verdadera al no saber en qué lugar la pondrá el ensamblador. La dirección en donde comienza a ensamblarse el programa depende de la longitud del sistema operativo, del tamaño del ensamblador, de instrucciones específicas, etc. El campo de los operadores sirve para proveer información necesaria a la instrucción en caso de que exista. Por ejemplo, no podemos sumar un número al registro Acumulador si no indicamos en el campo de operando este número.

2-37

Ensamblador

Los comentarios pueden o no ir, pero su uso es casi obligatorio pues contiene información que nos hace más fácil 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 información 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 puñado 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 propósito especifico tales como: · de entrada y salida · de transferencia · condicionales · aritméticas · de interrupción · 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 sección 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 máquina pero proveen al ensamblador de información 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 más instrucciones. La directiva “iguala” (EQU) que nos hace más fácil la labor de programar al asignar valores a variables para su uso posterior. Otra de las directivas muy usadas es la asignación 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 más sencillo el programar a nivel ensamblador. Nuestro programa, usando las directivas explicadas, quedaría:
mascara AQUI ORG EQU LIM LMA AIA BZ SRA INC JMP END H"03FF" H"0F" DC0,ADDR1 mascara SALIR

;carga dirección 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 instrucción

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 números hexadecimales que forman el programa objeto que correrá directamente en la máquina tal como se muestra a continuación (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. ;Nótese todas las directivas agregadas al ensamblador ;**************************************************************** ;definiciones previas usadas en el programa 000F mascara EQU 0Fh ; ———————————————————————————————— 0000 datarea SEGMENT ; área definición dirección a convertir 0500 ORG 500h ; dirección 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 código 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 dirección ;apuntada por el registro BX 010D 43 INC BX ;Incrementa contador datos 010E EB F4 JMP AQUI ;regresa por siguiente byte 0110 SALIR: ;siguiente instrucción 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 información en una localidad de memoria principal. Para realizar esta operación, se debe proporcionar como operando una dirección de la que se traerán o almacenarán datos. Las formas de especificar la dirección dentro de la instrucción pueden ser muy variadas pero contamos con tipos muy específicos como los que describimos a continuación.

2.5.1 Direccionamiento Implícito
Una instrucción que usa el direccionamiento implícito, utiliza el contenido del registro contador de datos (DC) como dirección de memoria. Esto implica un proceso de dos pasos: · Cargar la dirección de memoria requerida en el registro DC. · Una instrucción sin operandos se ejecuta y ésta utiliza al registro DC como un apuntador a memoria.

2-41

Toda computadora tiene instrucciones con un rango limitado de memoria en la que pueden actuar.2 Direccionamiento directo a memoria Algunas instrucciones pueden especificar la dirección con la que trabajarán directamente en su operando.5.).Ensamblador 2. Los bits tomados del PC son llamados el número de página y los bits proporcionados por la instrucción forman la dirección dentro de la página. a esta variación se le llama direccionamiento relativo. consiste en proveer a la computadora de una página base y un registro de apuntador de página que pueda ser alterado por el programa a su conveniencia. se usa la parte alta del Contador de Programas (PC)y se une a la dirección de página para formar la dirección efectiva. pilas. Para formar la dirección final a la que la UPC direccionará. Combinando ambos tenemos la dirección efectiva. colas.5. por lo que el programador gasta mucho tiempo calculando las páginas y localidades de memoria para su programa. Una variación del esquema anterior consiste en realizar saltos relativos al PC sumando un desplazamiento contenido en la instrucción. a la computadora se le conoce como paginada. etc. 2. Este término se aplica a toda dirección de memoria que se calcule de alguna forma utilizando para ello la información provista por la misma instrucción. Si todas las instrucciones de una computadora están limitadas por esta restricción. Un método para eliminar algunas de las restricciones del direccionamiento de páginas. a éstas se les conoce como instrucciones con direccionamiento directo a memoria. 2-42 . La imposición más severa impuesta por un esquema de páginas fijas es que el programa no puede referirse a otra página y los programas no pueden residir en los límites de las páginas cruzándolas. Este esquema es flexible y permite usar apuntadores para aplicar todas las técnicas de programación avanzada a las computadoras directamente (uso de apuntadores.3 Direccionamiento Indirecto Una última variación es la de usar una localidad de memoria que será utilizada como dirección para encontrar los datos que queremos llevar o recuperar de la memoria.

O así como sumas y restas con acarreos. Son de tres tipos: corrimientos.6 Tipos de Instrucciones A grandes rasgos las instrucciones pueden ser divididas en grupos muy genéricos. · 3. 2-43 . Instrucciones que mueven datos. Y. La aplicación final del producto dicta muchas veces el tipo de instrucción necesario y el superfluo. Habilitan o deshabilitan las interrupciones a la UPC. entre dos registros e instrucciones inmediatas que cargan a los registros con un valor especificado en el operando de la instrucción. Limpian o fijan alguna de las banderas del registro de banderas de la UPC antes de realizar alguna operación. Las banderas generalmente se afectan con el resultado. multiplicaciones. Incluyen saltos incondicionales. Son generalmente instrucciones que trabajan con dos operandos y realizan sumas. En algunos casos la palabra se corre a través de la bandera de acarreo. · 8. · 5. Corrimientos. depende del fabricante si incluye todos los tipos (o más) o un subconjunto de ellos. Incluyen instrucciones que mueven datos entre un registro y la memoria. Instrucciones con las banderas de estatus. Instrucciones aritméticas y lógicas.Otros Lenguajes y el Ensamblador 2. saltos condicionales basados en las banderas. Decrementan o incementan el registro de apuntador a la pila de acuerdo a la operación realizada: empuja o saca. Comparaciones y pruebas. · 7. divisiones. Comparan dos operandos y modifican el registro de banderas de acuerdo al resultado o realizan pruebas sobre un operando. restas. · 4. la siguiente clasificación puede muy bien servir a nuestros propósitos: · 1. Aunque no exhaustiva. Incrementos y decrementos de los registros y la memoria. · 2. Meter y sacar información de la pila (stack). Saltos y subrutinas. · 6. llamadas a subrutinas y regresos de subrutinas. una vez más. Usualmente incrementan en la unidad la memoria o los registros para llevar una cuenta en lazos o para accesar a localidades contiguas de memoria. corrimientos aritméticos y corrimientos lógicos.

Para poder hacer que la computadora se comporte como queremos. Los lenguajes de alto nivel son la parte del sistema operativo (aplicaciones) con la que el usuario avanzado se familiarizará (se prefiere hoy en día las soluciones “enlatadas” en forma de programas de aplicación con cierta programación integrada: hojas de cálculo. se discute cada grupo en general y a lo largo del libro daremos un ejemplo de microcomputadora y sus instrucciones. ¿Por 2-44 . 3.Ensamblador · 9. valores de operandos. procesadores de palabras. pero un usuario común y corriente no puede invertir tanto tiempo en aprender a programar una computadora cuando su objetivo principal es la resolución de problemas. comunicaciones. Otra clasificación de las muchas existentes agrupa las instrucciones en 3 divisiones aún más genéricas: – 1. debe haber una forma de comunicar nuestros deseos a la máquina. Puesto que las instrucciones son distintas entre las computadoras. Aunque es verdad que las diferencias de cada máquina nos limitan en su forma de programarla en lenguaje ensamblador (u objeto). Instrucciones de transferencia de datos que mueven información (direcciones. etc. La mayoría de las computadoras existentes tienen alguna forma de lenguaje desarrollado para ellas.7 Lenguajes de Alto Nivel La programación a nivel máquina es necesaria para que ésta funcione. Instrucciones de control de programa usadas para determinar el orden de ejecución de las otras instrucciones. etc. 2. que algunos prefieren clasificar en un grupo extra y otras.). Existen tantos lenguajes como existen computadoras y cada uno de ellos llena un sitio en especial aunque todos tienen en común que tratan de ser de propósito general y “fáciles de usar”. Todas las que no caigan dentro de las 8 anteriores como son las de entrada y salida. autoedición. esto no se aplica en su gran mayoría en los llamados lenguajes de alto nivel. instrucciones. Instrucciones de procesamiento de datos que transfieren datos realizando las operaciones necesarias requeridas.) sin cambio de una parte de la computadora a otra. Instrucciones especiales. – – 2.

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 programación: LENGUAJE FORTRAN COBOL SMALLTALK C SIMULA PASCAL C++ VISUAL BASIC USO programación científica negocios objetos sistemas simulación enseñanza de técnicas correctas de programación interfases gráficas y ventanas. Debe su popularidad a la sencillez de su sintaxis y a que es muy sencillo aprenderlo no tomando más que unas cuantas horas para poder realizar nuestro primer programa funcional. objetos interfases gráficas y ventanas. es su principal desventaja pues conforme las técnicas de programación han ido mejorando. ventajas y debilidades. 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.Otros Lenguajes y el Ensamblador qué el nombre de alto nivel? Pues porque comparados con los primeros métodos de programar una computadora son mucho más potentes y flexibles. Esta misma sencillez del lenguaje BASIC. 2. De los lenguajes de alto nivel más conocidos y entre los más viejos se encuentra el BASIC. nuevamente llegamos al punto en que la UPC debe interpretarlo y ejecutarlo a la máxima velocidad posible. Las dos formas existentes de traducir las líneas de código de un lenguaje de alto nivel son usando programas intérpretes y programas compiladores.8 Intérpretes y Compiladores No importando qué tan sofisticado sea el programa o el lenguaje en que esté escrito. objetos y muchísimos otros más cada uno con sus méritos. Es el lenguaje de alto nivel más usado y popular en los sistemas pequeños de computadoras (computadoras personales) y en muchos de los sistemas grandes. se necesita cada vez de herramientas más poderosas que llenen los requerimientos. 2-45 .

no tenemos tantos comandos que aprender para controlar el proceso. – – – – 2-46 . preguntar el contenido de variables. es necesario volver a traducirla una y otra vez. – – – Desventajas: – Para la distribución del programa terminado debemos incluir el intérprete y las instrucciones para usarlo además de las instrucciones para usar el programa. traduce una a una las instrucciones del código fuente a lenguaje de máquina. No da flexibilidad pues no permite unir el programa con otros desarrollados en otros lenguajes. más la memoria necesaria para el programa.Ensamblador 2. ejecutar el programa paso a paso. Fácil de entender y manejar. como no permite tantas opciones. Se requiere de la memoria necesaria para poder ejecutar el intérprete. El proceso de traducir las instrucciones una a una lleva tiempo y si por cualquier causa es necesario ejecutar alguna instrucción que ya fue traducida.8. Las instrucciones del programa siempre están a disposición del usuario y éste puede modificarlas a su conveniencia.1 Intérpretes Un programa intérprete toma el código desarrollado por el usuario y escrito en un procesador de palabras o generalmente en un procesador de texto proporcionado por el mismo intérprete y al darle la orden de ejecutar un programa. Los errores se corrigen rápidamente y se ve de inmediato el resultado de estas correcciones. poner puntos de espera. etc. Esto tiene una serie de ventajas y desventajas: Ventajas: – Muy fácil corregir errores y desarrollar programas pues en todo momento tenemos control sobre la ejecución. No es portátil de un ambiente a otro pues el intérprete usualmente es distinto de máquina a máquina a menos que se apegue estrictamente a un estándard. podemos interrumpir.

deben de existir varias condiciones: – – – Que el programa fuente esté libre de errores de sintaxis Que el programa fuente no tenga errores de ejecución Que se le agregen al programa fuente todas aquellas rutinas que necesita para poder realizar su trabajo. no es posible optimizar la traducción pues no tenemos el concepto de programa completo sino de instrucción en instrucción. 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 . es muchas veces preferible utilizar un compilador (ver siguiente sección) aunque algunas veces (si es posible) se prefiere desarrollar en un intérprete y entregar la versión final del programa en un compilador que aproveche las ventajas de estos programas. 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 ningún otro programa para ejecutarse a excepción del sistema operativo. 2. se debe incluir cada una de las instrucciones permitiendo que el programa sea copiado y/o modificado ilegalmente las veces que se desee.2 Compiladores Un programa compilador ejecutará el mismo programa que un intérprete.Otros Lenguajes y el Ensamblador – – Como las instrucciones son interpretadas una a una. Para que esto suceda. Es tal la popularidad de los sistemas de computación y de los lenguajes. El programa que entrega el compilador puede ejecutarse directamente desde el procesador de comandos del sistema operativo. Si se quiere vender el programa final. que las compañías que los fabrican han invertido mucho tiempo y dinero para entregar un producto que sea rápido y evite muchas de las penurias que se encontraban en los primeros compiladores comerciales. 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 intérprete.8. Por todas las razones expuestas. pero la acción se realiza de un modo distinto en cada caso.

complicado y tardado. La principal ventaja que se obtiene es la rapidez de ejecución del programa final. por pequeño que este sea. Se puede optimizar el resultado final pues se conocen todas las referencias y todo lo que hace el programa en términos de instrucciones. liga y ejecuta en un sólo paso utilizando la memoria para ello y sólo se graba el programa final como un módulo 2-48 . Se puede unir el programa con otros desarrollados en otros lenguajes por lo que tenemos acceso a una librería desarrollada por otros. Pero siguen existiendo ciertas ventajas y desventajas con respecto a un intérprete: Ventajas: – Programa objeto muy rápido en su ejecución (hasta 100 veces más rápido que con un intérprete dependiendo de las instrucciones y otros factores). se compila. ligar y ejecutar. Al traducir instrucción a instrucción puede ser que hayan pedazos del programa que nunca sean ejecutados en nuestras pruebas. Como la única desventaja aparente es la del desarrollo. si no existen errores de sintaxis se procede a ligar con las librerías de funciones que el programa requiere durante su ejecución. si existe algún error.Ensamblador ejecutar el compilador. los compiladores modernos ya incluyen un ambiente integral en el que se escribe el programa. – – – – – Desventajas: – El ciclo de desarrollo es tardado: programación. elaborado. Debe existir alguna ventaja en usar un compilador para que éste exista. compilación. Mientras que en el intérprete sólo es un paso: ejecutar. No existen pedazos de código con errores potenciales pues el programa se traduce como un todo y no instrucción a instrucción. Las instrucciones son traducidas una única vez. Como se ve en la descripción anterior el proceso es minucioso. No se requiere de ningún programa auxiliar para poder ejecutar el producto terminado. se repite todo el proceso. se ejecuta el programa objeto.

Hace poco tiempo el uso de más de 64K bytes de memoria en un sistema personal era impensable e incosteable. computadoras de tráfico aéreo que llevan el control vía radar de todos los vuelos que entran y salen de un aeropuerto y muchas aplicaciones más. 2. Por medio de un programa podemos guiar todas las acciones de la electrónica para poder llegar a una aplicación práctica y útil. 2-49 .Otros Lenguajes y el Ensamblador ejecutable cuando el ciclo de desarrollo está completo y así lo solicitamos. etc. ¿Puede usted imaginar la cantidad de potencia de cómputo 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. computadoras para las aerolíneas que llevan los vuelos y reservaciones a nivel mundial. 2.10 Resumen Una de las partes primordiales de un sistema de cómputo y sin el cual su funcionamiento no es posible es el de la programación. Hoy son pocos los sistemas operativos que caben en esa cantidad de memoria.9 Sistemas Operativos Avanzados La evolución de las computadoras sigue aún un ritmo desenfrenado. La tendencia sigue siendo hacia compartir los datos por lo que términos como multitareas. Estos productos tratan de combinar las ventajas de un intérprete con las de un compilador y eliminar la mayoría de las desventajas de los intérpretes. multiusuario y multiproceso no serán del todo desconocidos en un futuro. La necesidad de velocidad es tanta que nuevas arquitecturas surgen como alternativas al uso de un sólo procesador central: arquitectura paralela y redes neuronales son la tendencia tecnológica del futuro. todos ellos no prácticos hace apenas unos cuantos años. transacciones internacionales de computadora a computadora. Muchas cosas sorprendentes son realizadas con las computadoras y quedan aún muchas más por realizar: Computadoras gigantescas que realizan todas las transacciones de un banco incluyendo a sus cajeros automatizados.

2-50 . · El código fuente consiste en las instrucciones que el programa ensamblador interpretará para crear un código objeto.10.1 Puntos Importantes del Capítulo · Un programa de arranque inicia el sistema de cómputo y le permite funcionar. 2. 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 intérpretes y compiladores que se encargan de esta labor. · Las instrucciones que permite una UPC son clasificados de acuerdo a su función y existen varias de estas clasificaciones. · El código objeto es el resultado de un ensamblador y consiste en el programa fuente interpretado y colocado en la memoria para su ejecución. implícito o indirecto. · Toda Unidad de Procesamiento Central (UPC)consta de un juego de instrucciones definidas por el fabricante durante su construcción. · Entre las formas de indicar una localidad o dirección de memoria contamos con: direccionamiento directo.Ensamblador El aspecto de la programación es muy extenso e incluye muchos temas complejos. · El procesador de comandos de un sistema operativo queda residente todo el tiempo para recibir órdenes de otros programas o del mismo usuario. todo requerimiento a la computadora es encauzado por el canal adecuado por medio de la parte de entrada y salida básica del SO llamada BIOS. · Un intérprete traduce instrucción a instrucción un programa fuente mientras que un compilador lo hace todo de una vez. · Un programa consiste en una secuencia lógica de instrucciones y se conoce como programar a crear estas secuencias. Pero su aspecto fundamental se describe brevemente en este capítulo. El sistema operativo (SO) forma la parte sobre la cual actuan todos los demás programas.

MPC Operations Guide Columbia Data Products. Inc. No emplee una instrucción que haga directamente la multiplicación.11 Actividades 2. 2. Macro 86 Columbia Data Products.Otros Lenguajes y el Ensamblador 2. Use el registro Acumulador y dos auxiliares llamados B y C. Capítulo 13.3 Haga un programa sencillo para multiplicar dos números de 8 bits en lenguaje ensamblador inventado por usted. Unam 1993. tales como los Apple. 2. 1982.2 Encuentre el conjunto de algunas instrucciones de una UPC 68000 de Motorola. 2-51 . 2.1 Investigue qué programa ensamblador viene junto con los circuitos basados en una UPC de Motorola. 1982.12 Bibliografía Llano Emiliano Sistemas Digitales y Arquitectura de Computadoras. Inc.

Laplace1 apreciaba enormemente el sistema numérico decimal. Puesto que las manos son la herramienta más conveniente con la que la naturaleza nos dotó. Entre sus trabajos matemáticos más notables se destaca el perfeccionamiento de la teoría de las probabilidades. Es entonces natural y afortunado que nuestro sistema de contar se base en el número de dedos que tenemos. Las primeras representaciones gráficas encontradas consisten en marcas verticales y horizontales. El número 1 es un ejemplo de esto. es interesante hacer notar que el 2 consistía de dos marcas horizontales unidas con una línea y el 3 de tres marcas horizontales unidas (sistema arábigo). los seres humanos siempre hemos tendido a usarlas para contar. Sin embargo pasó bastante tiempo antes de poder representar estos números gráficamente. Los números Romanos son un buen ejemplo de líneas usadas como base para números (ver figura 3.3. Astrónomo y matemático francés que dio base científica a la Hipótesis de las Nebulosas. Sistemas Numéricos Como matemático. 3-53 . Nuestro presente sistema numérico provee a los matemáticos modernos y científicos con grandes ventajas sobre los usados por anteriores civilizaciones y es un factor importante de nuestro rápido avance. Comprendía que cientos de años de esfuerzos mentales así como de buena suerte dieron como resultado el sistema que usamos y estaba en una posición en la que podía apreciar sus ventajas. 1 Pierre Simon marqués de Laplace (1749-1827).1).

3-54 .Ensamblador Figura 3.1 Comparación de algunos sistemas de números.

C. es posible realizar cualquier operación aritmética. M. 9 llamados dígitos Arábigos.. se usa V en lugar de IIIII=5 la única importancia en posición en los números Romanos es si un símbolo precede o antecede a otro (VI=6.Sistemas Numéricos El sistema decimal ha sido tan aceptado y adoptado por nuestra civilización que rara vez consideramos la posibilidad de otros sistemas en uso. Los cálculos con papel y lápiz son tan increiblemente complicados en este sistema que la habilidad para hacerlo era muy apreciada entre los antiguos Romanos. etc. El cálculo con números Romanos es tan engorroso que los primeros matemáticos se vieron forzados a usar casi exclusivamente el ábaco o tablas de contar y luego traducir el resultado a números Romanos. 3. Después de aprender de memoria 10 tablas de multiplicar y de sumar así como aprender unas sencillas reglas. El hecho es que un sistema muy poco usado para otra cosa. 2. Con este esquema nos veríamos forzados a detenernos en 9 o inventar otros símbolos para los demás números si no fuese porque usamos una notación de posición. XXV=X+X+V. pero muy sencillo. no es razonable pensar que un sistema basado en el número de dedos que tenemos en las manos sea el más eficiente para usar en las máquinas que construimos.. 3. Así. Se requieren nuevos símbolos conforme la serie crece (X. el sistema binario. La torpeza de este sistema resalta en cuanto deseamos realizar cualquier operación con dos números.1 El Sistema Decimal Nuestro sistema actual se forma por 10 símbolos distintos: 0. IV=4). 1. Un ejemplo de esto lo podemos encontrar en los números romanos que son en esencia aditivos: III=I+I+I. por ejemplo multiplicar XII por XIV (12x14). Nótese la sencillez para realizar la operación 12 por 14: 14 x 12 28 14 168 3-55 . La gran simplicidad y belleza de nuestro sistema decimal puede entonces apreciarse en detalle. Sólo es necesario aprenderse 10 dígitos y el sistema de notación de posición para contar cualquier cantidad.). ha probado ser el más natural y eficiente para su uso en máquinas computadoras. De todas formas. ..

pies. era un fanático del uso de la base 2 que sólo usa los símbolos 0 y 1 para representar cifras. Su filosofía se apoya fundamentalmente en la concepción de un universo compuesto por un número infinito de unidades de fuerza espiritual o materia a la que llama mónadas. 2 Gottfired Wilhelm barón von Leibniz o Leibnitz (1646-1716). 3. 1. en los últimos años se ha vuelto muy popular. 2. . la base doce aún se usa en relojes. La importancia es que el valor de cada dígito está determinado por su posición. El sistema quinario (base 5) prevalece entre los esquimales y los indios de Norte América. 3. docenas. Cualesquiera fuesen las razones de Leibnitz para usar el sistema binario.. el uno representando a la deidad y el cero a la nada. Puede parecer extraño que un matemático eminente use un sistema tan sencillo. Su preferencia al sistema base dos se debió a razones míticas. donde n denota el número de dígitos a la izquierda del punto decimal. esto significa que el sistema tiene 10 dígitos distintos para representar cualquier cifra (0. Desarrolló el cálculo infinitesimal sin conocer la obra de Newton en el mismo campo. el de base 60 (usado por los Babilonios) en segundos y minutos. El sistema decimal tiene base 10. historia y derecho. 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). 9).2 +K+ an = a1 a2 K an . La historia registra el uso de varias bases. Leibnitz2. pero debe recordarse que en esa época casi todos los matemáticos eran también filósofos y religiosos. Filósofo y matemático alemán también erudito en ciencia. 3-56 .. 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 seguirán siendo construidas de esta forma.2 El Sistema Binario El matemático del siglo XVII. 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 número en notación decimal es: (31) a1 10 n-1 + a2 10 n. La base del sistema es definido como la cantidad de dígitos distintos usados en cada posición en un sistema de notación.Ensamblador El significado del número 168 puede notarse al decir la cantidad “ciento s e s e n t a y o c h o ” ..

3-57 . La mejor forma de lograr esto es usando los circuitos en su forma biestable (de dos estados posibles). Una simple analogía puede realizarse entre estos dos estados y un foco de luz eléctrica. se puede decir con certeza si está prendido o apagado. conduciendo (1) o no (0).Sistemas Numéricos Los componentes básicos de las primeras computadoras eran los relevadores y contactos que son binarios por naturaleza pues sólo pueden estar en dos estados posibles: cerrados (1) o abiertos (0). es altamente deseable utilizarlas de tal forma que los cambios en sus características no afecten el desempeño total del sistema. Aunque el foco esté viejo y no produzca tanta luz. hay que compensar subiendo el volumen pero por muy bajo que esté. Lo mismo sucede con un radio. siempre se puede decir si está prendido o no. La necesidad de un funcionamiento confiable llevó a los diseñadores a utilizar a los transistores en sus estados de corte y saturación reduciendo así sus estados posibles a dos fácilmente identificables. Debido al gran número de partes que forman una computadora. si éste está viejo o con las pilas gastadas. En cierto momento el foco está prendido (transistor conduciendo) emitiendo luz o apagado (transistor no conduciendo). Los principales componentes de las computadoras actuales son los transistores similares a los usados en televisores y radios.

2.1 Conversión 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 número 35 en decimal equivale a 3 x 101 + 5 x 100.1 Contando en el Sistema Binario El mismo tipo de notación de posición que usamos en el sistema decimal es el que se usa en el sistema binario. el mismo número en binario (35) se representa como 1000112 significa 1 x 25 + 0 x 24 + 0 x 23 + 0 x 22 + 1 x 21 + 1x20.Ensamblador 3. Obsérvense los primeros 16 números en el sistema binario: Tabla 3. 1 1 3 + =3 4 8 8 Los números fraccionarios se forman al igual que en el sistema decimal: 3-58 . 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). Los siguientes ejemplos ilustran la conversión de una base a la otra. 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 + .

El número queda como 24 + 23 + 20 ó 11001. 31ÿ2=15+1. En base 2 restaremos la potencia mayor de 2 del número. 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. 2x0.437510 a base 2: 2x0. 3ÿ2=1+1.750=1.Sistemas Numéricos 0135 = 1x10 -1 + 3x10 -2 + 5x10 -3 .8750=1.437510=0.750.50=1. al restante se le aplica el mismo procedimiento hasta que el resultado sea cero. 2x0. 15ÿ2=7+1. 1ÿ2=0+1 tomando los residuos de derecha a izquierda: 11111012.4375=0.01112. Por ejemplo 0. la entera en la que se aplica cualquiera de los métodos antes expuestos y la fraccionaria.2 Conversión de Sistema Decimal a Binario Existen muchos métodos de conversión entre bases pero el primero y más obvio es restar todas las potencias de la base al número en base 10 hasta que el resultado sea cero.0 tomando los números a la izquierda del punto decimal de izquierda a derecha tenemos que 0. 3-59 . 62ÿ2=31+0. 2x0. 7ÿ2=3+1. Este primer método 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 fracción y lo que queda a la derecha para volver a aplicar el procedimiento.2. 3. Para convertir 2510 a base 2 restaremos de 25 la potencia mayor de 2 que no exceda a 25. volviendo a dividir el resultado entre la base hasta que el resultado sea cero. Por ejemplo 12510: 125ÿ2=62+1.8750. Un método más empleado para números grandes es dividir entre la base y apuntar el residuo resultante de derecha a izquierda. La conversión de fracciones a la base de interés se logra restando de ésta las potencias negativas de la base hasta que no tengamos residuo o hasta la precisión que se requiera.50. En el caso de fracciones se debe dividir el número en dos partes.

3 Suma y Resta en Sistema Binario La suma y resta en sistema binario son mucho más sencillas de aprender que en cualquier otro sistema pues las reglas son muy sencillas.00 La resta tiene también reglas muy sencillas: 0-0=0 1-0=1 1-1=0 0 .11 3. 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.1 = 1 con un préstamo de 1 Y la forma de hacerla es similar al sistema decimal: 1001 -101 100 10000 -11 1101 110.10 1.01 -100.2.01 10100 101.2.11 100011 1001.4 Multiplicación y División Binaria La tabla de multiplicar usada por el sistema binario sólo tiene cuatro reglas a diferencia de las 100 usadas para la multiplicación en sistema decimal: 0x0=0 1x0=0 0x1=0 1x1=1 3-60 .Ensamblador 3.

9 y agregamos las letras para representar al 10. 1. en base dos tenemos dos símbolos distintos.01 11101.. Así. pero actualmente la única base usada mayor que la decimal es la base 16 o hexadecimal. es decir dividiendo consecutivamente entre la 3-61 . ¿Pero qué símbolos usar para bases mayores que diez? Distintas culturas han empleado distintos símbolos para resolver este problema.3 Representando Números en Otras Bases Hemos dicho ya que los números en otras bases tienen tantos símbolos como la base de que se trate. 13. . 12. Para representar números en base 16 usamos los nueve símbolos ya conocidos 0.. en base 10. B al símbolo 11. diez símbolos distintos para representar cualquier número. 11. 2. Para convertir de base 10 a cualquier otra empleamos los mismos métodos de la base dos. etc.Sistemas Numéricos Sólo 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 división es sumamente sencilla: 0ÿ1 = 0 1ÿ1 = 1 A continuación dos ejemplos de la división: 101 101 11001 101 001 101 100 110 101 100 111.00 3.. la A representa al símbolo 10. esto es. 14 y 15.

el sistema hexadecimal es una forma conveniente de representar en notación corta al sistema binario evitando errores (con este mismo propósito se utilizó mucho tiempo la base 8). 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 .2 Distintas Representaciones de los Enteros del 0 al 15. Encontramos la equivalencia de un número en cualquier base con respecto a la decimal usando notación de posición y multiplicando por la base elevada a la potencia de la posición 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. La forma de convertir de sistema hexadecimal a binario es sustituir cada uno de los símbolos usados en el número en hexadecimal por su equivalencia en binario: F09516 = 1111 0000 1001 01012 o cualquier número en binario dividiendo el número en grupos de 4 de derecha a izquierda y sustituyendo por su símbolo equivalente en base 16: 100010101102= 0100 0101 01102 = 45616 Para estas conversiones es conveniente tener una tabla a la mano: Tabla 3.Ensamblador base y anotando el residuo. Para el caso de base 16 dividiremos entre dieciséis.

2 K d1 d 0 donde d i ® { 0. muchas de las primeras computadoras usaban un sistema de codificación decimal a binaria. Código Binario Dígito Decimal Peso 8421 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 0 1 2 3 4 5 6 7 8 9 Nótese que son necesarios 4 dígitos binarios para cada símbolo decimal. En tal sistema. se usan grupos de dígitos binarios para representar cada uno de los 10 símbolos usados en el sistema decimal.3 Código binario de pesos. Todos los cálculos que realizamos usualmente se realizan en el sistema decimal. es más práctico codificar un número decimal d n-1 d n. el sistema decimal es el más natural para nosotros.Sistemas Numéricos 3. Por otro lado. 9 } de la siguiente forma: Reemplace cada dígito decimal con su equivalente de 4 símbolos binarios tal como están definidos en la tabla 2 anterior. Debido a esto. Esto es ineficiente pues las combinaciones de 4 dígitos binarios son 24 = 16 de los que sólo usamos 10 pero si usamos 3 dígitos 23 = 8 son insuficientes.4 Decimal Codificado en Binario (BCD) Puesto que las computadoras construidas usando el sistema binario requieren de una menor cantidad de circuitos electrónicos y por lo tanto son más eficientes que las máquinas que operan con otros sistemas numéricos. . 1. 4. el sistema binario es el sistema más natural para una computadora y el de mayor uso actualmente.. pero deben ser convertidos por las computadoras de decimal a binario antes de realizar cualquier operación. Por ejemplo. uno de los códigos más obvios y naturales es usar un “código binario de pesos” donde cada posición representa un “peso” tal y como se muestra en la tabla 3. 1 o 3-63 .. El número resultante es llamado código binario decimal.3 Tabla 3.. 2. Para simplificar la conversión de decimal a binario. código 8.

tenemos que: 10001010101BCD = 45510 Hay que resaltar que el número resultante BCD y el binario son muy distintos. tiene la desventaja de requerir más bits por cada número a representar. Para resolver estas desventajas se diseñaron otro tipos de códigos. primero sumamos 3. y lo indicaremos con el sufijo BCD. 2. cada 1 no representa una potencia de 2 que podamos sumar para formar el número decimal. resultando 7 y luego usamos el BCD “normal”. Aunque el formato BCD claramente simplifica la conversión decimal. Usando 8 bits. el mayor número representable es 10011001BCD = 9910 mientras que en binario con el mismo número de bits tenemos: 111111112 = 25510 Otras de las desventajas es en las operaciones matemáticas como la resta que normalmente se realizan usando el complemento del número (ver siguiente sección). En la representación BCD. 1 representado en la tabla 4.Ensamblador simplemente BCD (Binary-coded decimal). Así. 3-64 . A cada uno de los dígitos binarios le llamamos bit (de binary digit). Este código se usa extensivamente en instrumentos y calculadoras electrónicas. El código exceso 3 no es un código de peso (de notación). Uno de los primeros es el llamado de exceso 3 (excess 3) en el que para formar la equivalencia. 4. es el código 2. Un código de peso en el que el complemento a 9 pueda ser formado complementando cada bit. Este procedimiento es usado para formar el complemento a 9 de un número decimal. Cambiando cada 0 por 1 y cada 1 por 0 formamos lo que se llama el complemento del número binario. que es 0111. cada segmento de 4 bits representa un sólo dígito decimal cuyo peso es una potencia de 10. Por ejemplo el complemento de 0100 (1 decimal en código exceso 3) es 1011 u ocho decimal. esto es. El 0111 es el código exceso 3 para el 4. Por ejemplo para representar al 4. Unicamente 10 de los 16 posibles patrones de grupos de 4 bits son necesarios para la representación BCD. primero se suma 3 al número decimal.

como en el caso de una suma. El resultado de una operación matemática en una palabra de n bits requiere. Decimal Exceso 3 Complemento Código a nueve 2. en una computadora que tenga longitudes de registro.Sistemas Numéricos Tabla 4. Los números sin signo se consideran como positivos y el signo de + es omitido. 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. 2. Si el resultado completo es una palabra de n+1 bits. Representaciones Alternas. llamadas palabras de 8 bits (8 bits equivalen generalmente a 1 byte) sólo podran usarse 7 posiciones (128 números distintos ó 2n-1) y la última para el signo. A esta notación se le llama notación con signo. Cada posición puede tomar un valor de 0 ó 1 y es costumbre representar a los números negativos reservando la última posición de la izquierda para el signo. En una computadora los números se almacenan en una memoria que tiene un número finito y fijo de posiciones. Un desborde se indica con una generación extra de una señal que modifica una memoria de un bit cambiándola de 0 a 1. se dice que ha ocurrido un desbordamiento o saturación (overflow). De esta forma. 4. Las operaciones matemáticas pueden realizarse en la misma forma que las operaciones manuales con números decimales. En algunos casos la saturación puede ser ignorada y considerar como resultado adecuado a 3-65 .5 Números Negativos Hasta el momento sólo hemos trabajado con números positivos (sin signo) pero el signo positivo o negativo es necesario para distinguir a los positivos de los negativos. que el resultado sea una palabra de n bits. Por convención se ha escogido utilizar un 1 para números negativos y 0 para los positivos. De tal forma. -104 se representa por 11101000 y 104 como 01101000. típicamente.

3. 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. El método para encontrar el complemento en la base dos de cualquier cantidad consiste en sustituir todo 0 por 1 y todo 1 por 0. para el binario. dependiendo del tipo de complemento se sumará 1 o no. Se forma restando cada dígito de la cantidad al número de la base menos uno y luego agregando 1 al resultado así obtenido. otra representación binaria llamada de complementos es usada con frecuencia en computadoras digitales. para el binario. complemento a dos. Complemento a la base menos 1. Complemento a la base.Ensamblador los n bits de la palabra y en otros será necesario tomar alguna acción correctiva.1 Complementos Aunque el código de notación con signo es la contraparte directa del código decimal usado por los seres humanos. Al usar la representación por complementos la resta queda simplificada realizándose con sumas: 3-66 . Se forma restando a cada dígito de la cantidad al número de la base menos uno. Para el sistema decimal llamamos a esta forma complemento a nueve. Existen dos tipos de complementos usados: · 1. · 2.5. complemento a uno. En el sistema binario el complemento a dos de 101102 es 010102 y el de 110102 es 001102. principalmente porque simplifica la construcción de ciertas operaciones aritméticas. es que todos los bits del número son tratados de forma uniforme y que la resta y suma son realizadas por el mismo circuito que sólo suma y es mucho más sencillo. Para el sistema decimal llamamos a esta forma complemento a diez. La ventaja principal de usar complementos en sistemas digitales durante la suma o resta.

Sistemas Numéricos

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 Código Grey y ASCII
Las secuencias de los números binarios son “naturales” y generalmente se comprenden con facilidad pues siguen un patrón posicional tal como el sistema decimal. Podemos, sin embargo, representar a un número por una secuencia arbitraria de 1 y 0. Para evitar ambiguedad debemos sin embargo asignar a cada valor numérico una secuencia distintiva e individual. Los números representados en otros sistemas que los naturales, son llamados códigos puesto que se les debe asignar un código (regla de asignación) para determinar el valor numérico representado por la secuencia. Ya hemos analizado algunos códigos utilizados en computación e introducimos dos más: el Grey reflejado y el ASCII. El código ASCII (American Standard Code for Information Interchange, Código Americano Estandard para el Intercambio de Información) es un esfuerzo de los diseñadores para tener compatibilidad entre las distintas máquinas y aplicaciones. El código se forma de 7 bits y

3-67

Ensamblador

el octavo se deja disponible para que el diseñador juege con el, ya sea para comprobar por medio de paridad (explicada en los siguientes capítulos) si no hay error de transmisión o manipulación de datos o para expandir el juego de caracteres disponibles elevándolo de 27 (128) a 28 (256) (esto último es lo que se realiza en las computadoras modernas). Las primeras 32 posiciones están reservadas para carácteres de control y usualmente no se pueden desplegar o imprimir (hay formas de dar la vuelta a esto). Los demás se usan para las letras, los números y toda una serie de símbolos utilizados. En Japón y otros países 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 código pueda representar todas sus palabras. El usar este código garantiza, en muchos casos, compatibilidad entre datos de distintas aplicaciones de forma que el resultado de un programa pueda ser leído por otro con poco esfuerzo de nuestra parte.

3-68

Sistemas Numéricos

Figura 3.2 Código ASCII de 8 Bits.

En el código Grey, los dos primeros números son representados en forma natural, la siguiente serie de números son encontrados de la forma especificada en la figura 3.2. Una imagen espejo se representa por la línea de guiones entre los primeros dos números (en la tabla de la izquierda) y que da lugar al punto de la reflexión. De ahí en adelante un cero es añadido a la primera serie de números y un 1 a la segunda. Repeticiones sucesivas del proceso de reflexión nos permiten hacer cualquier serie de números. La característica más importante del código Grey es que los números cambian de uno a otro sólo en un dígito. Por ejemplo notemos que del número 7 (0100) al 8 (1100) sólo cambia el dígito en la posición cuarta mientras que en la representación binaria (7=0111, 8=1000) cambian 4

3-69

Ensamblador

dígitos. Encuentra aplicación en un sin número de situaciones de la que daremos un breve ejemplo. Supongamos que tenemos una veleta que nos dará la dirección del viento en cualquier momento. Un circuito recibe la señal y la interpreta mandando el resultado a un computador que analizará los datos junto con muchos más para dar un pronóstico de tiempo. Si el circuito detecta que más de un dígito cambia a la vez, podemos estar seguros de que hay un error en la transmisión o en el sensor y podemos descartar la lectura y esperar a la siguiente o dar la alarma para que la situación se corriga.

Figura 3.3 Desarrollo del código Grey.

3.7 Resumen
Los números 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 fácilmente.

3-70

Sistemas Numéricos

3.7.1 Puntos Importantes del Capítulo
· 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 computación. · Existen otras representaciones de números usando unos y ceros que hacen más fácil el tratamiento de números dentro de la computadora como son el BCD, exceso tres, 2421 y complementación. · Los números negativos se representan reservando un bit para el signo. · El código Grey y el ASCII son usados extensivamente en computación.

3.8 Ejercicios
3.1 Convierta los siguientes números a su equivalente binario: a) 3910, b) 1210, c) 12310 3.2 De los números binarios obtenidos en el problema 3.1 encuentre su equivalente hexadecimal. 3.3 Convierta los números del problema 3.1 a base 8 y base 4 (recuerde que la base 8 sólo consta de 8 símbolos distintos 0 a 7, y la base 4 del 0 al 3). 3.4 Encuentre la equivalencia binaria de los siguientes números: 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 310ÿ1510. 3.7 Convierta los siguientes números 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

38 x 28 = 68. Por ejemplo 26 x 26 = 46. c) 54 x 44 3.9 Convierta los siguientes números hexadecimales a binario: a) BCD16. si es mayor que la base.8 Bibliografía Llano Emiliano Sistemas Digitales y Arquitectura de Computadoras. pero 26 x 46 = 86 y 6ÿ8 = 1 y sobran 2 por lo que 26 x 46 = 126. b) 63516. b) 27 x 37. 3-72 . Unam 1993. Usando esta regla.Ensamblador 3.10 Una regla sencilla para multiplicar dos números en cualquier base es multiplicar los dos números en forma decimal. se toma tal cual. divida en decimal entre la base y tome el residuo como el dígito menos significativo y el cociente como el más significativo. Capítulo 3. c) FFF16 3. Si el producto es menos que la base. multiplique: a) 27 x 47.

métodos de cálculo. etc.Capítulo 4 4. Transformar el código fuente en lenguaje de máquina por medio de un ensamblador (por ejemplo MASM). · 2. etc. veremos como esto es posible y por qué es un método utilizado solamente para programas pequeños. Preparar el programa. Se puede utilizar desde el primitivo EDLIN. hasta un sofisticado procesador de palabras basado en Windows. En está fase se corrigen los posibles errores de estructura y sintaxis del programa fuente. El segundo método consiste en utilizar un código fuente en un procesador de palabras o cualquier otro editor que nos entregue como resultado código ASCII y a continuación ensamblar este código para producir un código ejecutable. Este método es el más corriente y conveniente.1 Las herramientas Existen una multitud de métodos para codificar un programa en ensamblador. 4-73 . sus datos. Este paso previo se realiza generalmente en papel o en la multitud de programas disponibles para tal fin. el editor de programas de PASCAL o C. El primero y más primitivo consiste en codificar directamente el programa por medio de una herramienta como DEBUG. Codificar el programa en un editor o Procesador de Palabra que entregue código ASCII como salida. para llevarlo a cabo es necesario seguir los siguientes pasos: · 1. programas de Diagramas de Flujo. · 3. como son Procesadores de Palabra. su estructura.

Aquí será necesario corregir los errores de lógica y funcionamiento del programa ejecutable. · 5. Dentro del archivo fuente no se requiere de ninguna organización en especial pero se recomienda utilizar cuatro columnas para mantener la claridad del programa y hacernos la vida más fácil. En esta sección detallamos algunas de las reglas del ensamblador. Ligar el programa si el ensamblador no lo hace por nosotros. Repetir la secuencia anterior a partir del paso 2 tantas veces como sea necesaria hasta obtener un código limpio que ejecute según las especificaciones originales. · Un mnemónico válido que forme parte del juego de instrucciones del procesador. Se puede utilizar el programa DEBUG o cualquier otro comercial para ejecutar el código paso a paso. como todos los demás. agregar todas las rutinas externas a nuestro programa y que se requieran para su funcionamiento. separados por comas si el mnemónico así lo requiere. · Un operando o varios. 4-74 . Como se ve de los pasos anteriores esto lleva mucho tiempo y consume muchos recursos de dinero y esfuerzo. 4. Verificar el funcionamiento del programa ejecutable entregado en el paso anterior. · 6. etc. hace falta respetar ciertas reglas. esto es. · Un comentario en relación a la instrucción. por lo que el paso 1 es el más importante y en el que debemos tardarnos más para evitar tardarnos en los demás. se forma de un juego de instrucciones separadas en líneas conteniendo cada una de ellas (como ya se vio en capítulos precedentes) las siguientes partes: · Un identificador opcional. 4.Ensamblador · 4.2 La Sintaxis Como en todo lenguaje de programación.1 Las Reglas del Juego El lenguaje ensamblador. revisar los registros.2.

· Los siguientes símbolos: · + . Los caracteres válidos son: · Los caracteres del alfabeto a excepción de los caracteres acentuados (se pueden usar en el campo de los comentarios). ! .Colocar bandera o indicador como 4-75 .2 Los Caracteres El ensamblador reconoce un subconjunto de la secuencia de caracteres ASCII disponibles.0 INC BX = inc bx pero ‘ABC’ no es igual a ‘abc’ Aún así.set flag en uno Aunque el segmento anterior puede ser muy claro para algunos. VRAI TRUE EQU EQU 1 1 . · Las instrucciones y su operandos en mayúsculas siempre.0 = MoV Ax. _ : @ $ espacio tabulador CR (retorno) LF (alimentación de línea) Los caracteres alfabéticos mayúsculas son tratados exactamente como los minúsculos: MOV AX. siempre en minúsculas y utilizando acentos y marcas diacríticas que hagan más fácil su comprensión. preferimos: marca EQU verdadero (1) 1 . ‘ .2. · Los caracteres numéricos.* / = ( ) [ ] .Colocar flag en 1 . A partir de este momento en el libro se sigue la siguiente convención: · Los comentarios en español tratando de no emplear anglicismos ni modismos donde sea posible. · Las etiquetas en español y siempre en minúsculas. se recomienda seguir algún tipo de convención propia y respetarla siempre.Las Herramientas 4.

MOV AX. no puede contener espacios y no debe de exceder de 80 caracteres en total. es mucho más claro para todo mundo a excepción de algunos cuantos privilegiados que preferimos discriminar a lo largo del libro.Ensamblador Que creemos. 4-76 . el agregar uno o más espacios es opcional y se hace muchas veces sólo por claridad: MOV AX. 4. identificadores. hará referencia el programa más adelante. 4. 0 MOV AX.5 Palabras Reservadas El ensamblador reconoce en tre cuatro categorías de palabras reservadas: · Los mnemónicos del juego de instrucciones del procesador en cuestión.0 MOV Ax. pero no necesariamente.2. · El nombre de los registros del procesador en cuestión.2. · Las directivas del ensamblador en caso de que se use.4 Los Identificadores Los identificadores son los nombres definidos por el usuario para propósitos diversos. 0 es incorrecto pues no hay un espacio separador entre el mnemónico y el operador. Representan una variable o una etiqueta o marca a la que probablemente. Los operandos de una instrucción se separan entre ellos por medio de una coma y.3 Los Separadores Los diferentes elementos de un programa (instrucciones.) deben ser separados por lo menos con un espacio. en este caso. 4. Los identificadores están formados por una serie de caracteres el primero de los cuales debe de ser alfabético.2. etc. 0 0 Son correctos pero MOVAX.

Si se cuenta con algún 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. pero no tiene sentido la discusión cuando para lograr un programa fuente sólo requerimos lo mínimo indispensable de un procesador: · Que sea lo más rápido posible de ejecutar. 4. se puede utilizar cualquier editor o procesador por sencillo o complicado que sea.Las Herramientas · En caso de usar ensamblador. Seguramente con el nuevo advenimiento de sistemas operativos más poderosos basados en ventanas e iconos.2 en adelante) que se incluye como parte de sus utilerías. un editor intermedio como EDIT de las versiones nuevas del sistema operativo MS-DOS (6. Para nuestro gusto. Habrá gente que en este renglón se sienta en casa utilizando un editor primitivo como EDLIN o WORDSTART y gente que no pueda trabajar con algo menos que VENTURA. WORD y DWORD. ya de por si difícil.3 Editores Podemos escribir y discutir largo y tendido sobre las ‘grandes’ ventajas de un editor o procesador marca X sobre el marca Y. 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. es suficiente para la mayoría de los casos. De ser posible que quede residente en memoria y aún más sin estorbar o robar memoria principal a la hora de ejecutar nuestro lenguaje de máquina. En suma. las palabras BYTE. En ninguno de los casos pueden aparecer estas palabras como identificadores en un programa. el panorama se modificará pero 4-77 . · Que entrege como salida un archivo de código ASCII sin caracteres extraños ni de control que el ensamblador no puede usar. La elección depende de gustos y necesidades.

4. al usar DEBUG nos ponemos en contacto íntimo con la máquina. LINK y EXE2BIN). Para teclear. Tabla 4. Al usar un programa como DEBUG nos ahorramos. localidades de memoria.4 Debug En los siguientes capítulos utilizaremos el programa DEBUG debido a que es un programa más sencillo de usar en principio que MASM y nos pone en contacto íntimo con la máquina. toda una serie de directivas del ensamblador que causan que el programa ejecutable crezca. probar y corregir un código sólo necesitamos ejecutar DEBUG mientras que para usar MASM se requiere de hasta 4 programas (editor.Ensamblador se debe recordar que más nuevo y complicado no necesariamente quiere decir mejor. MASM.1 DEBUG contra Ensamblador DEBUG Ensamblador F á c i l d e Difícil de ejecutar ejecutar No se Se agregan muchas líneas de código 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 máquina máquina No es tan Muy versátil versátil Bueno para Bueno para programas grandes programas pequeños Debug es práctico para modificar registros de la UPC. Por último. cargar. Para ejecutar DEBUG basta tenerlo en la memoria secundaria presente e invocarlo con la instrucción: C>DEBUG 4-78 . por el momento. Tarde o temprano si se continua programando en ensamblador se requiere aprender a usar el DEBUG. crear e iniciar programas.

4. despliega la información de cierta área de memoria en la pantalla (en hexadecimal). Otra alternativa es invocando el programa DEBUG [nombre programa con extensión]. Introduce un programa usando códigos hexadecimales o modifica una dirección colocando los nuevos códigos hexadecimales. Escribe programa en memoria a disco. G[dirección]. Es preciso primero indicar qué programa queremos con el comando N. convierte sus códigos hexadecimal a mnemotécnicos. Ejecuta un programa en memoria..4. Carga un programa en memoria. Desensambla un programa en memoria. W. Informa a Debug el nombre del programa que queremos recuperar o guardar. para esto es necesario haberle puesto nombre con el comando N e indicar su longitud (registro BX+CX) con el comando R Q. F[dirección inicial] [dirección final] [constante] E[dirección]. Introduce un programa usando mnemotécnicos válidos del juegos de instrucciones. 4-79 . esto es.1 Comandos El DEBUG acepta toda una serie de comandos sencillos de una letra que describimos brevemente a continuación: (Los argumentos entre paréntesis cuadrados indican parámetros opcionales) ?. Salir del programa DEBUG. U[dirección inicial][. Nnombre. R[registro].Las Herramientas - El guión que aparece a continuación es el indicador de que DEBUG se encuentra en memoria activo y listo a recibir nuestros comandos. Despliega. Despliega ayuda (en versiones nuevas de DEBUG). D[dirección].extensión. Visualiza o modifica registros de la UPC. A[dirección]. L.dirección final].

2 INT 21 INT 20 El la última línea presionamos Retorno para terminar con el programa y lo ejecutamos: -G Problema 4.1 Usando el manual de DEBUG averigüe cómo guardar su programa utilizando los comandos R. Al introducir el último número hexadecimal presionemos la tecla de re torno en lugar de barra espaciadora. Escoja un nombre que termine con la extensión .COM.Ensamblador Ejercicio 4.1 MOV AH. Ejecute ahora el programa desde el Sistema Operativo. Verifiquemos: -D100 y ejecutemos: -G Ejercicio 4.2 Volvamos a introducir nuestro programa utilizando ahora los mnemotécnicos correspondientes. 4-80 . -A100 MOV DL. Por el momento no nos importa que significan.1 Introduciremos un pequeño programa utilizando DEBUG y lo ejecutaremos: C>DEBUG -E100 Introduzcamos esta serie de números seguidos cada uno de la barra espaciadora: B2 1 B4 2 CD 21 CD 20. N. Termine cada línea con Retorno. W.

5. en diseñar el programa en papel. Más adelante explicaremos las líneas adicionales. para lo cual se requieren agregar otros comandos propios del ensamblador: cara SEGMENT ASSUME CS:cara MOV DL. Finalmente convertimos el programa EXE a uno de tipo COM que explicaremos en la siguiente sección: C>EXE2BIN prueba prueba.2 INT 21h INT 20h cara ENDS END Se guarda el programa con cualquier nombre seguido de una extensión . Como ejemplo introduzcamos nuestro programa de la sección anterior. por ejemplo PRUEBA. 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. código que aún no es ejecutable.ASM.ASM.Las Herramientas 4.5 MASM Para el uso de un ensamblador el primer paso consiste.1 Las Instrucciones del Ensamblador El ensamblador cuenta con una serie de instrucciones para hacer más fácil la tarea del programador. conocidas como 4-81 .1 MOV AH. Estas instrucciones. como ya se mencionó. listado) que dirigimos a la impresora con LPT1:. 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. a continuación en pasarlo a un editor que entrega ASCII.com 4. El siguiente paso es ligar el programa con las rutinas externas al programa o con otros programas pues el ensamblador sólo nos entrega un archivo con extensión OBJ de objeto.

si comienza por letra. Analizaremos a continuación algunas de las más importantes.identificador escape=27 El valor especificado puede ser también una asignación completa evaluada al momento de ensamblar: cinco seis definido) EQU EQU 2*2+1 cinco+1 . es necesario colocar un 0 para evitar que el ensamblador se confunda con una etiqueta.Ensamblador pseudo .5. bytes.1.1.5. no son parte del juego de instrucciones de ningún procesador en especial sino que sirven para indicar ciertas acciones al ensamblador.2 END Indica el fin del archivo de programa 4. etc. palabras.3 Definiciones Es necesario muchas veces definir variables.1. 4.asigna el valor a cinco de 5 .5. Entre las instrucciones para realizar esto tenemos EQU que asigna valores a etiquetas: si escape EQU EQU 1 27 .identificador si=1 .1 Segmentos La instrucción SEGMENT y ENDS informan al ensamblador en qué segmento se localiza el programa y deben contar con una etiqueta que defina el nombre. para aclarar el significado de ciertas partes del código. segmento de código) ¿Por qué el ensamblador no lo puede definir por sí mismo? La razón no es clara pero es necesario incluir la pseudo instrucción. En el caso de decimal no es necesario y en el caso hexadecimal.asigna el valor de seis (cinco ya Los números pueden estar en binario (1011b). 4-82 . La pseudo instrucción ASSUME CS:nombre define el segmento donde se localiza el programa (definido con el registro CS. en hexadecimal (0AF2h) o en decimal (123 ó 123d) sólo es necesario colocar el identificador respectivo en cada número. 4.instrucciones.

Las Herramientas Para la definición de variables se utilizan las directivas DD.2.tabla de 5 elementos no definidos . El comando DB define bytes que pueden tener un valor cualquiera entre 0 y 255 decimal: estado xyz tipo Byte no_se tabla aún tabla1 1. Estas directivas pueden también servir para cadenas de caracteres: mensaje salta alarma DB DB DB ‘Bienvenido a Ensamblador$’ ‘Salta la línea’. El mismo caso sucede para DD que define palabras dobles o 32 bits. Consiste únicamente de una serie de números en binario que conforman el programa. de la misma forma que DB.instrucción DUP es opcional en operadores como DB.etc. 4. tabla2 0.un valor no definido aún .’$’ 07. El número que precede a la instrucción indica cuántas veces se quiere hacer el duplicado.3.1) .define estado inicial .10. define variables pero en este caso de 16 bits (una palabra o Word en inglés). DB y DW.etc.’$’ Note que al final se agrega el signo de $ que indica el fin del mensaje y sólo es necesario si se intenta desplegar la cadena en la pantalla.2.4.1.2.1.Tabla de 25 elementos inicializados a .Tabla de 20 elementos inicializados a La pseudo . DB DB DB DB DB DB 0 1. La directiva DW. lo que hace que 4-83 . Los archivos tipo EXE contienen un encabezado que contiene información variada requerida para funcionar.’Mensaje con sonido’. No existe ninguna otra información además del programa por lo que ocupa el menor espacio posible en memoria secundaria.0.13.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 cuáles son sus diferencias? Un archivo tipo COM es la forma más fácil de guardar un programa ejecutable. DW o DD y su propósito es hacer duplicado de sus argumentos.3 ? 5 DUP(?) 5 DUP(1.5) 10 DUP(0.define una zona de tres elementos .

Por otro lado existen desventajas en usar archivos tipo COM: · No pueden ocupar más de 64K bytes de memoria (la longitud de un segmento) lo que puede ser desventaja para un programa muy grande. Recuerde que si el programa resulta útil es muy conveniente registrarse con el autor. 4. si usamos ensamblador. Recibe uno el derecho legal a usarlo. aun cuando el programa se forme de 1 sólo byte.Ensamblador el programa sea un poco más grande. · Se requiere de un paso extra. en especial cuando no contamos con ninguna otra para practicar. 4-84 . actualizaciones. · No pueden usar con facilidad distintos segmentos de memoria. 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. Puesto que son más pequeños y compactos. manuales. etc. para convertir del tipo EXE a COM al tener que usar EXE2BIN. El propósito del programa LINK es el de unir varios programas en uno sólo ejecutable lo que acarrea toda una serie de ventajas en sistemas grandes. mientras que en los tipo EXE esto se realiza sumamente fácil. los programas COM son ejecutados más rápido. Considerando todo esto es preferible comenzar con archivos tipo COM y luego evolucionar a los del tipo EXE.7 Otros Existen en el mercado otras herramientas profesionales para la programación en ensamblador. Incluimos tres herramientas de la categoría Shareware en un disco de 3 1/2" que pueden sernos de utilidad. Si el programa objeto es de 100 bytes. mientras que los EXE requieren de una instrucción tipo RET. mientras que el EXE tiene una longitud mínima de 640 bytes. el archivo COM será de 100 bytes. · No pueden ser ligados con otros archivos restando flexibilidad al lenguaje. Un programa del tipo COM puede utilizar una instrucción del tipo INT 20 para terminar su ejecución.

con descripción .datos . fecha.salva el viejo segmento de datos SUB AX.nombre del programa . versión .——————————————————prognom SEGMENT .——————————————————END comienzo .autor.AX .y variables utilizadas .——————————————————SEGMENT STACK .definiciones con la instrucción EQU .——————————————————principal PROC FAR .datos aquí con DB (datos DB pila DB pila datos ‘hola$’) datos ENDS .prepara DS con segmento actual MOV AX.define segmento de código . DS:datos comienzo: .——————————————————.dirección del segmento de datos MOV DS.——————————————————SEGMENT . .fin del segmento de código .define segmento de datos .prepara pila para el regreso PUSH DS .y guárdalo .——————————————————subr1 PROC NEAR . principal ENDP .8 Esqueleto de Programa en Ensamblador Presentamos el esqueleto que sugerimos sea usado para ensamblar programas.coloca cero en AX PUSH AX .O.con la palabra ‘pila’ ENDS .Aquí va la subrutina subr1 ENDP .fin del ensamble 4-85 .——————————————————prognom ENDS .regresa al S.define la pila 20 DUP(‘pila’) .AX .aquí programa principal .parte principal del programa ASSUME CS:prognom.y guarda en registro DS .define una subrutina .La parte principal programa va aquí RET .Las Herramientas 4.

4-86 . de esta forma es muy claro donde comienza la pila para propósitos de espulgar el programa y nos damos inmediatamente cuenta del contenido modificado de la pila. USA 1986. Columbia Data Products Inc. En este capítulo se establecen las reglas que serán utilizadas a lo largo del libro. Alleur Bélgica. Marabout 1992.Ensamblador Se debe hacer notar aquí la incialización del segmento de pila en cuya memoria reservada se coloca la palabra “pila” muchas veces. Unam 1993. 4.9 Resumen Se introduce y comentan sobre las principales herramientas para ensamblar un programa: DEBUG y MASM. 4. Varios Macro 86. 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. Mercier Philippe Assembleur Facile.10 Bibliografía Llano Emiliano Sistemas Digitales y Arquitectura de Computadoras.

La característica clave de la Entrada/Salida 5-87 . la computadora indicará de alguna forma a la lógica externa que está esperando que ponga información en ciertas localidades de memoria para poder accesarlas. En este caso todas las transferencias de datos entre la computadora y el exterior son controladas por la computadora o para ser más precisos por un programa corriendo en la computadora. pero todos están incluídos en las siguientes tres categorías: 1) E/S Programada.1 Entrada/Salida La transferencia de datos entre la lógica que forma parte del sistema de computadora y aquella que está más allá de éste. La interfase entre el sistema de computación y la lógica externa debe estar claramente definida. Existirá un protocolo bien definido en el que la computadora hace conocer a la lógica externa que los datos están disponibles en una localidad de memoria fija de donde ésta los puede tomar. Hay muchas formas en las que un sistema puede transferir datos hacia el exterior. Se incluye dentro del ámbito del sistema a toda la lógica que se haya diseñado para trabajar en conjunción con la UPC.Capítulo 5 5. debe proveer de facilidades para transferir datos. se conoce en general como entrada/salida o E/S (input/output o I/O). además de las señales de control que identifiquen a todos los eventos que ocurren. o bien. Toda aquella que no caiga dentro de esta clasificación se le conoce como externa.

cada vez que la lógica externa presentase datos a las conexiones de entrada y salida. Un puerto de entrada y salida consiste en un puerto con memoria de entrada y salida (buffer) conectado a las líneas de datos del bus del sistema y a las interconexiones que accesan a la lógica externa. Cuando la lógica externa transmite datos al sistema de cómputo. El puerto de entrada y salida no puede estar comunicándose constantemente con las líneas del bus de datos. por lo tanto seleccionar un puerto de E/S y leer el contenido del puerto en la misma forma que lo hace de una dirección de memoria. puesto que estas líneas pueden estar llevando información de o hacia la 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 lógica de la transferencia. Si las conexiones del puerto de entrada y salida se comunicaran permanentemente con el bus de datos. en cualquier dirección. lo hace presentando los datos en las conexiones del puerto de entrada y salida. 2) E/S por Interrupción. Las interrupciones son una forma que tiene la lógica externa para forzar a la computadora a poner atención y suspender lo que está haciendo para atender a las necesidades de la lógica externa. se pueden realizar operaciones aritméticas directamente con los puertos sin necesidad de almacenar los datos en memorias provisionales. 3) Acceso Directo a Memoria.Ensamblador Programada es que la lógica externa hace exactamente lo que se le dice que haga. los datos se propagarían por las líneas del bus de datos con consecuencias imprevisibles. La UPC debe. 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. 5-88 .2 Entrada/Salida Programada Los datos son transferidos entre el sistema de computación y la lógica externa. por medio de un puerto de entrada y salida. a esta forma de transferencia de E/S se le conoce también como E/S de mapa de memoria (memory mapped I/O). 5. Como los datos se leen de los puertos de E/S tal como si se tratase de una localidad de memoria. por lo que este mismo puerto almacena provisionalmente estos valores.

no siempre provee la suficiente capacidad de entrada y salida. es que el mapa de memoria se reduce automáticamente a la mitad. de la misma forma la lógica externa debe de indicar a la computadora cuando ha colocado datos en el buffer de entrada y salida. lo que en la mayoría de los sistemas de medios a grandes es un precio muy severo a pagar. Cuando la computadora transmite señales a la lógica externa como un medio para identificar eventos o datos se refiere a estas señales como controles de entrada y salida. Un método preferido es agregar a la UPC más líneas que controlen la transferencia de y hacia los puertos de entrada y salida. 2. La misma información viajando en sentido 5-89 . tendremos dividida la memoria en dos áreas bien diferenciadas. Una forma rudimentaria.. si tomamos una línea de dirección 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.. Las siguientes características no existen en este sistema: 1. y éstos pueden ser leídos. La penalidad pagada cuando una línea de dirección es utilizada para seleccionar el buffer de un puerto de entrada y salida. algún código que identifique alguna operación a ejecutarse. Claramente los datos que se están transfiriendo pueden ser sujetos a varias interpretaciones. Por ejemplo.Lógica más allá de la UPC Normalmente existe más de un dispositivo externo por lo que debe de haber más de un puerto de entrada y salida. solamente para seleccionar un puerto. Desafortunadamente la transferencia a ciegas de datos de un sistema de computación y la lógica externa. por ejemplo pueden ser datos puros binarios.El sistema de cómputo debe decir a la lógica externa cuando los datos han sido colocados en el buffer de entrada y salida y por lo tanto están listos para ser leídos. pueden ser parte de una dirección o una dirección completa. pero muy utilizada en sistemas pequeños. una de las cuales nos sirve para comunicarnos con los dispositivos externos y la otra con la memoria principal. de obtener uno o más puertos de entrada y salida consiste en dividir las líneas de dirección de la UPC entre la memoria y los puertos.Tanto la computadora como la lógica externa deben de tener alguna forma de informarse entre ellas la naturaleza de los datos que van a intercambiar.

Los sistemas de computación usualmente tienen toda una serie de controles de entrada y salida así como líneas de estado que son separadas y distintas de los puertos de entrada y salida.1 Respuesta de la UPC a una Interrupción En su forma más elemental. mientras que otros puertos de entrada y salida son los encargados de transferir los datos. A ésta se le conoce como señal de petición de interrupción puesto que por medio de ella la lógica externa pide sea interrumpido lo que se esté haciendo y se le preste atención. nada nos dice que una salida o entrada de datos tenga que suceder después de una interrupción. se le conoce como estado de entrada y salida. control o estado de los dispositivos. La característica más importante de toda esta serie de eventos es que son asíncronos e impredecibles. 5. sólo puede enviar información de su estado para que la computadora la interprete. La lógica externa no puede controlar a la computadora. Las computadoras usualmente asignan uno o más puertos de entrada y salida para funcionar como conductores del control y del estado. bien pueden ser señales de control las que se transmitan.3. Es solamente la forma en que la UPC interpreta los datos que hacen la diferencia entre información de datos. El propósito de la interrupción es informar a la UPC que suspenda lo que está haciendo. 5. De hecho. el flujo de información bien puede ser en el sentido contrario. la Unidad de Proceso Central puede responder a una interrupción cargando en el registro Contador de Programa (PC) la dirección inicial del programa que atiende a la interrupción pero esto nos deja con dos preguntas: 5-90 . esto es de la lógica externa hacia la computadora.3 Entrada/Salida por Interrupción Casi todas las UPC tienen una línea por la cual la lógica externa puede solicitar atención inmediata. procese los datos que se están transmitiendo desde el puerto de E/S y reanude lo que suspendió. Nótese que aunque nos hemos referido a la lógica externa entregando datos.Ensamblador opuesto.

el Contador de Programa (PC). se deben realizar los pasos en orden contrario para restaurar los registros correspondientes y volver al sitio del programa donde éste fue interrumpido. Si se trata de un sólo caso. en especial el Contador de Programa. A esta área de memoria reservada se le llama Pila (Stack) (en algunos diseños se guardan en un juego de registros paralelos). se corre el riesgo de no poder volver a ejecutar el programa que estaba en primer lugar. – 2) Dejar que el programador ejecute primero una rutina de servicio a la interrupción que se encarge de almacenar los datos de los registros en un lugar seguro.Lógica más allá de la UPC – – ¿Qué pasa con el programa que está en ejecución? ¿De dónde obtiene la UPC la dirección del programa que la lógica externa necesita que se ejecute? El programa que se está ejecutando en memoria tiene información almacenada en los registros de la UPC que puede ser importante: el acumulador (A). no importando que método esté disponible. Ahora consideremos la forma de obtener la dirección donde se ejecutará la rutina que atiende a la interrupción. Una interrupción no se reconoce hasta terminar con la instrucción que se está ejecutando. por lo que el registro de Instrucción (I) es quizá el único que no importe su valor pues inmediatamente es substituido por la instrucción próxima a ejecutarse. 5-91 . Si guardamos los valores de los registros con sólo restituirlos a los registros correspondientes. Al final de la ejecución del programa de interrupción. Si el nuevo programa a ejecutar no tiene algún mecanismo de guardar toda esta información. podemos regresar al sitio en el que suspendimos la ejecución. el Contador de Datos (DC) y otros registros existentes en la UPC. Existen dos formas de guardar la información necesaria para poder volver al punto donde se interrumpe un programa antes de comenzar el que atiende a la interrupción: – 1) La ejecución de un microprograma almacenado en la Unidad de Control que automáticamente guarda los registros por nosotros en un área predeterminada de memoria.

proporcionado por el dispositivo que interrumpe. al Contador de Programa para comenzar a ejecutar un programa en otra localidad de memoria. existen para esto en el mercado varios tipos de circuitos programables de interfase de E/S (PIO.3. PIA. Para esto se exige un poco más de la lógica externa pues debe ser capaz de almacenar su código de selección. 5-92 . – – 5.Ensamblador podemos considerar el tener una dirección de memoria fija que sepa de antemano la UPC.2 Código de Selección de un Dispositivo que Interrumpe Otro de los esquemas muy utilizados consiste en exigir que el dispositivo que interrumpe a la UPC mande un código que identifique qué puerto de E/S es el que interrumpe. – 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 dirección en memoria donde se encuentra el programa que atiende a la interrupción. nos permite tener gran flexibilidad al momento de definir nuestras rutinas. etc. Considere la forma en que la UPC responde a una interrupción: 1) Manda la señal de aceptación de la interrupción. pero en el caso de múltiples puertos de entrada y salida esto resulta un poco impráctico. Si se manda un código de selección del dispositivo. – 3) Mueve el contenido del vector de interrupciones que manda el puerto de E/S.) La secuencia de eventos es como sigue: – 1. 2) Guarda de forma automática todos los registros o permite al usuario guardarlos de alguna manera. podemos entonces accesar a una tabla en memoria que nos dé el vector de dirección de interrupción que cargaremos al Contador de Programa para ejecutar la rutina de interrupción. En forma funcional podemos comparar una interrupción con una subrutina de un lenguaje de alto nivel. La lógica del dispositivo externo crea una señal de petición de interrupción que transmite a la UPC.

La UPC recibe los datos y los interpreta como un código de identificación que usa para armar la dirección donde se encuentra localizado el programa que atiende a la interrupción en cuestión. Al recibir la señal del procesador. A este tipo de interrupciones con tan alta prioridad se les conoce como no mascarillables y no pueden ser deshabilitadas. Una vez más. pero existe otro tipo de interrupciones que exigen el máximo de atención y no pueden esperar. el dispositivo externo coloca ahora sus datos a través del puerto de entrada y salida para que éste lo transmita al bus del sistema cuando se le solicite. Siguiendo un protocolo especificado por el sistema.4 Acceso Directo a Memoria Como ya se observó en las secciones precedentes. se requiere de la participación activa de la UPC. Cuando la UPC está lista a dar servicio a la interrupción. Esto puede no ser tan rápido 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 visualización (CRT) o de y hacia la memoria de almacenamiento masivo como son los discos flexibles y duros de un sistema. el objetivo de la mayoría 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. Generalmente se pueden deshabilitar las interrupciones con alguna instrucción del juego de instrucciones que lo permita. – 4. esto es.Lógica más allá de la UPC 2. La solución lógica consiste en diseñar una computadora de propósito específico que se dedique exclusivamente a la transferencia de datos de y hacia la memoria. Generalmente se reserva esta línea de muy alta prioridad a eventos tales como falla inminente de energía o un error del sistema que impide que éste pueda seguir trabajando. la ejecución de instrucciones para leer o escribir tanto a los dispositivos externos como a la memoria interna (principal). la lógica del dispositivo externo coloca un código de identificación (de X número de bits) en el bus de datos del sistema. A tal circuito se le conoce como dispositivo de Acceso Directo a Memoria o por su siglas en inglés como DMA. la solución consiste en substituir los programas por electrónica que realice la misma función pero a más velocidad. responde con una señal de aceptación. tal como un error de memoria. – 3. – 5. 5-93 .

etc. Para nuestros propósitos usaremos algunas cuantas que iremos describiendo en cada caso. 80x86 y Px. mueve datos.5 Realización en la Familia Intel Los procesadores de la familia Intel.Ensamblador Una discusión completa del tema queda fuera del rango que pretende abarcar este libro por lo que. Una de las características interesantes de este circuito es que contiene dentro de su juego de instrucciones una instrucción que nos permite simular una interrupción por medio de programa (instrucción INT).) · Los elementos a manipular en la UPC. resta. ya sea en la memoria o en los registros de trabajo. la UPC debe saber su dirección y su longitud. las instrucciones especifican los siguientes elementos dentro de una UPC: · La operación a realizar (suma. baste saber que los diseñadores pasan muchas horas diseñando y programando la realización de rutinas eficientes para muchas de las operaciones que se realizan dentro de un sistema de cómputo. 5-94 . Aunque contar con una instrucción que simule las interrupciones por programa pueda sonar extraño e innecesario en un principio. Para acceder a una información en la memoria. 5. Analizaremos en detalle cada forma de direccionamiento pues se encuentran en casi todas las instrucciones a utilizar. 5. Existen distintas posibilidades de presentación de una localidad de memoria. referimos al lector interesado a la bibliografía para más detalles del tema. una vez más. no escapan a estas imposiciones de servicio y requieren de un esquema complejo de interrupciones y de acceso directo a memoria. La lista de interrupciones y sus funciones es enorme y hay libros dedicadas a ellas.6 Formas de Direccionamiento Como ya se ha mencionado. Tener acceso a estas rutinas nos da gran flexibilidad y facilidad de programación como veremos en los siguientes capítulos.

la dirección se divide en segmento+dirección dentro del segmento representado como: Segmento:Desplazamiento Recuerde que el registro por omisión para datos es siempre DS (segmento de datos) de forma tal que en lugar de usar MOV MOV AX. Dentro del sistema Intel se sigue la primera convención y la instrucción tiene cinco formas: MOV MOV MOV MOV MOV registro. Por el funcionamiento del procesador que estamos analizando. registro Nótese que no hay forma de mover entre localidades de memoria sin pasar antes por un registro. de la memoria a la memoria o entre registros dependiendo de sus argumentos y del procesador que se trate. Ilustraremos nuestros ejemplos con la instrucción mover (MOV.DS:[BX] AX. memoria memoria.Lógica más allá de la UPC Es importante resaltar que en ninguna instrucción (generalmente) se permite como operandos dos direcciones de memoria. constante memoria. lo que facilita enormemente la tarea de llevar el control de estas localidades o constantes (revise pseudo instrucción ASSUME y EQU en capitulo anterior). registro registro. Las constantes o localidades de memoria pueden estar definidas con etiquetas si se usa un ensamblador. fuente pero nada nos indica que no pueda ser exactamente al revés. de los registros a la memoria. La forma general de esta instrucción es: MOV destino. constante registro.DS:[SI+2] se usa 5-95 . Esta instrucción se encarga del movimiento de datos de la memoria a los registros. move) que es una instrucción que se encuentra en el juego de instrucciones de toda UPC. El diseñador tiene en esto la última palabra.

[SI+2] Como siempre existen excepciones que confirman la regla: Si se usa el registro BP (apuntador base). empantamiento que tarde o temprano tendrá que romperse y crear una nueva generación independiente. 5-96 .1 un resumen de los tipos de direccionamiento. Para las aplicaciones actuales está memoria es insuficiente por lo que se usa memoria virtual para tratar de mantener la compatibilidad con diseños anteriores a la vez que se trata de empujar el estandard a nuevas dimensiones. Resumiendo: segmento 0000 (desplazado 4 bits a la izquierda) + registro dirección efectiva de 20 bits Presentamos en la tab la 5.Ensamblador MOV MOV AX. Este se debe especificar en la instrucción: MOV AX. el segmento por omisión será SS (segmento de pila). Si hablamos de 16 bits nos da un número de 20 bits (FFFFFF hexadecimal) para la dirección ó 1 Megabyte de memoria directa.CS:[BX] La dirección 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.[BX] AX. Si el programador decide usar un segmento alterno.

[BX][DI]. ident. ident.1 Inmediata RegistroîValor inmediato El contenido de un registro es inicializado por un valor inmediato o una constante.[BP][SI].1 . Ejemplos: MOV AH. Indice y Desplazam iento (Directo o Inmediato) registro ident.Lógica más allá de la UPC Tabla 5.[SI]. el movimiento es de 8 bits (1 byte) . [BP][DI] 5. 5-97 . . [BX+SI].AHî12. ident.BXî1.[DI] o [SI+constante] registroîident. [BX][DI]. tanto BL como BH se afectan.12 MOV BX.1 Formas de Direccionamiento Inmediata Directa Base Indice Indice y base registro valorîinmediato registroîdirección de memoria registroîDS:[BX] o SS:[BP] registroîDS:[SI] o DS:[DI] registroî[BX][SI]. AL no es afectado. [BP][SI].[BX]. ident. [BP][DI] o [BP+SI] Base y registroîident. ident.[BP] o Desplazam [BX+constante] iento (Directo o Inmediato) Indice y Desplazam iento (Directo o Inmediato) Base.6.[BX][SI].

movimiento de 16 bits (1 palabra) El nombre del registro indica el número de bits implicados en la operación (L o H de 8 bits=1 byte.define una zona de 1 byte .Operaciones de registro a memoria MOV ident1.BXî8 . X de 16 bits=1 palabra) 5.ident2 registro de 8 bits . La operación puede ser de 8 ó 16 bits.[BX] .define los apuntadores a memoria Ident1 DB 2 Ident2 DW 5 Ident3 DB ? .apuntador de 1 byte . operación de 16 bits a un 5.6.apuntador de 2 bytes=1 palabra .ident1 MOV BX.dirección DS:0008 .2 Directo Registroîdirección de memoria El contenido de un registro es sustituido por el contenido de la zona de memoria apuntada por el identificador.AXîcontenido de la zona de memoria 5-98 .ERROR.ident2 .CH MOV AH. Ejemplos: .Ensamblador .6.Operaciones de memoria a un registro MOV AH. La operación puede ser de 8 ó 16 bits y si los dos operandos no coinciden. En este caso [BX] representa el contenido de la zona de memoria cuya dirección está contenida en BX.Define una zona de 1 byte :Define una zona de 2 bytes BX. se genera un error al ensamblar.AHî2 (8 bits) :BXî5 (16 bits) . Quedará esto más claro con los siguientes ejemplos: MOV MOV de la Ident1 Ident2 DB DW 2 5 .3 Base RegistroîDS:[BX] RegistroîSS:[BP] Inicializa un registro con el contenido del área de memoria situada en la dirección DS:[BX].8 AX.ident1îCH (8 bits) .

DS:ident2 (ident2=5) En las dos líneas precedentes obsérvese que la pseudo instrucción OFFSET indica un desplazamiento a partir de la variable.0 MOV [DI]. el de IDENT2 parte alta (0) y finalmente el de IDENT2 parte baja (5).4 Indice RegistroîDS:[SI] RegistroîDS:[DI] Este modo de direccionar se utiliza generalmente para las cadenas de caracteres o para aislar un elemento de una tabla o matriz.6.[SI] dirección DS:0 MOV DI.AH DS:0îcontenido de AH .AXîcontenido de la zona de memoria .BXîDesplazamiento de ident2 .[BX] . Una forma alternativa de este direccionamiento es con el uso del registro BP con el apuntador de segmento SS: MOV MOV BP. MOV SI.AXîcontenido de la memoria en la .AXîde la zona de memoria a la .Zona memoria apuntado por 5-99 . Generalmente el segmento utilizado es DS salvo en las excepciones que resaltaremos en ejemplos.OFFSET ident2 AX. Como la variable contiene 2 se indica un desplazamiento de 2 bytes. el propio de IDENT1 (2).0 MOV AX.Lógica más allá de la UPC MOV MOV dirección BX.[BP] .0AFFFh AX. apuntado por SS:BP (afff) 5.

MOV MOV MOV BX.AHî contenido de la memoria a .Ensamblador 5.AHî3er elemento de la tabla .[BX][SI] AH.Apuntar al noveno elemento de la tab.[BX][SI] . Es posible usar también la notación [BX+SI].2 SI.[BX][SI] SI.ALî9no elemento de la tabla tabla MOV MOV la MOV AL.5 Indice y base RegistroîDS:[BX][SI] RegistroîDS:[BX][DI] RegistroîDS:[BX+SI] RegistroîSS:[BP][SI] RegistroîSS:[BP][DI] RegistroîSS:[BP+SI] Este tipo de direccionamiento utiliza BX y SI o DI.(siendo el primero 0) . la dirección SS:[BP+SI] (SS:5+2) 5-100 .OFFSET tabla 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 omisión.[BP][SI] .define tabla de 20 elementos .5 AH.6. MOV MOV MOV BP.2 .2 SI. la base o segmento es DS. de ahí el nombre de base (del inicio de la tabla): tabla DB MOV MOV 20 DUP(?) BX.memoria DS:7 (BX+SI) Se habla de un segmento base puesto que frecuentemente se utiliza para referenciar los elementos de una tabla.AHîcontenido de la dirección de .5 AH. [BX+DI].Se va a leer el tercer elemento de la .BXîdirección base de la tabla .

6 Base y Desplazamiento (Directo o Inmediato) RegistroîDS:ident.[BX+constante] Una combinación de los precedentes tipos de direccionamiento (elementos dentro de una tabla).ident2[BX] .[BX] RegistroîSS:ident.5 SI. Ident1 DW MOV MOV 5 DUP(?) BX.Zona de 1 byte BX.6.6. Indice y Desplazamiento (Directo o Inmediato) Registroîident.8 Base.[BX][SI] Registroîident.[SI+1] .4 AX.ident1[BX][SI+1] . Ident1 DB MOV MOV MOV 2 .7 Indice y Desplazamiento (Directo o Inmediato) Registroîident.[BP][DI] Registroî[BX+SI+ident.[DI] Registroî[SI+constante] Otra combinación de los precedentes (elemento dentro de un registro).Zona de 10 bytes (5 palabras) .AXîcontenido de la zona de memoria 5-101 .apuntado por DS:4+1 5. MOV MOV SI.AXîcontenido de la zona de memoria .4 AX.Lógica más allá de la UPC 5.[SI] Registroîident.[BX][DI] Registroîident.[BP][SI] Registroîident.[BP] RegistroîDS: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).6.AXî3er elemento de la tabla Ident2 5.2 AX.

el circuito 80x86 debe saber si va a manipular a 1 ó 2 bytes en dicha dirección. Pero existen ciertos casos donde los operandos de la operación no permiten intuir el número de bytes lo que provoca un mensaje de error al ensamblar. 5.9 Número de Bits en una Instrucción Si una dirección de memoria como [BX+1] aparece como operando. entonces.4 [DI] [SI+2]. 5-102 . Aunque esto es estrictamente cierto. la funcionalidad del circuito sería casi nula.1 Donde BYTE PTR se refiere a Apuntador de Byte y WORD PTR a Apuntador de Palabra.1 Para los operaciones del tipo palabra MOV INC MOV WORD PTR [BX+1]. éste define por completo el tipo de operación con lo que respecta al número de bytes. Por ejemplo en los siguientes casos: MOV INC MOV [BX+1]. Es necesario.1 Se debe de completar la instrucción como sigue: Para el caso de 1 byte MOV INC MOV BYTE PTR [BX+1].4 WORD PTR [DI] WORD PTR [SI+2]. apuntado por DS:2+5+4+1 5. Hemos dicho que si el segundo operando lo forma un registro.Ensamblador .4 BYTE PTR [DI] BYTE PTR [SI+2].6. agregar toda una serie de circuitos y dispositivos que hagan que el diseño sea funcional y práctico para el que lo usa.7 Resumen Hemos dicho que un sistema de cómputo sólo debe de contar con la UPC y la memoria principal.

Lógica más 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 información del mundo externo. Los diseños de las computadoras modernas toman en cuenta esta variable y tratan de integrarla dentro del circuito resultante.

5.7.1 Puntos Importantes del Capítulo
· La transferencia de datos entre el sistema de cómputo 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 también 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 más líneas de control a la UPC que seleccionen entre la memoria y los dispositivos de E/S. · La E/S por Interrupción solicita al sistema su atención por medio de una línea la atención. · Si la UPC es interrumpida debe de realizar una secuencia ordenada antes de atender a la interrupción y esto incluye entre otras cosas el preservar el contenido de los registros. · El dispositivo externo que interrumpe debe proporcionar un código de dispositivo o un vector de interrupciones que es la dirección donde se encuentra el programa que atiende al dispositivo. · El DMA consiste en guardar o leer datos de la memoria principal sin la intervención de la UPC. Para esto, es necesario generar todas las señales que requiere la memoria y que en condiciones normales genera la propia UPC. · Existen varias formas de componer una instruccíon: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 decisión de los diseñadores de conservar el esquema de memoria real de sólo 1 megabyte en lugar de los 4 gigabytes accesables por los modelos 386, 486, P5 y P6. 5.2 Ensamble todos los pedazos de código en el ensamblador agregando las pseudo instrucciones necesarias y depure hasta no obtener ningún 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 código desde DEBUG. Ahora sí podemos ver los resultados de las transferencias utilizando las instrucciones adecuadas del programa DEBUG. 5.4 Investigue las mejoras de diseño de las siguientes generaciones: 486 a P5, P5 a P6.

5.10 Bibliografía
Llano Emiliano Sistemas Digitales y Arquitectura de Computadoras. Unam 1993. Capítulo 12 y 14. Mercier Philippe Assembleur Facile. Marabout 1992, Alleur Bélgica. Capítulo 1.

5-104

Capítulo 6
6.1 Más sobre Interrupciones
Todos los diseños de computadoras incluyen la previsión de interrupciones electrónicas. Lo novedoso del circuito 80x86 es la inclusión de estas mismas interrupciones electrónicas pero dentro del juego de instrucciones del circuito lo que permite el acceso a las utilerías diseñadas cuidadosamente (algunas no tanto) que hacen que el programar en ensamblador se simplifique. La instrucción de interrupción (INT realiza dentro del la UPC todos los pasos de una interrupción generada por un dispositivo de E/S y transfiere la ejecución del programa principal a la subrutina de interrupción apuntada por la dirección encontrada en el vector de interrupciones que se pasa como argumento de la instrucción. Los vectores de interrupción se encuentran en las localidades bajas de memoria, de la dirección 00000h a la 00400h (1Kbyte), formando así 256 vectores de interrupción cada uno de 32 bits (segmento:dirección). Por ejemplo si empleamos la instrucción INT 20, informamos a la UPC que se transfiera control a la subrutina cuya dirección encontramos en la localidad 20*4=80 decimal ó 40h. Se debe seguir la convención de byte menos significativo primero, esto es, byte bajo de dirección, byte alto de dirección, byte bajo de segmento, byte alto de segmento. Una lista completa de las interrupciones se encuentra en la sección de ROM del manual IBM Personal Computer Technical Reference. Para pasar parámetros a la subrutina de interrupción se utilizan los registros, cada uno de ellos con una función distinta según el caso. El

6-105

Ensamblador

llamar a una interrupción hace que el procesador guarde la dirección de regreso (CS e IP) junto con las banderas en la pila. Afecta también a las banderas IF (bandera de interrupción) y TF (bandera de trampa o paso a paso). Ejemplo 6.1. Ilustraremos aquí el punto con un breve ejemplo ya considerado en el capítulo 4 sección 4.4.1. En ese punto no se explicó la función del programa, pero aquí ya tenemos todos los elementos necesarios para comprender su función y colocar los comentarios:
MOV MOV pantalla INT INT sor 20h 21h ;Función de despliegue ;Regresa control a programa superviDL,1 AH,2 ;Valor ASCII a desplegar ;Despliega un carácter 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 diseñadores del ROM de IBM utilizaron para definir la interrupción de la pantalla (21h) y la de fin de programa que llama (20h). Si consultamos la tabla del capítulo 3 de códigos ASCII, podemos ahora variar el carácter a desplegar modificando la primera instrucción.

6.2 Saltos Incondicionales (JMP)
¿Qué pasaría si en lugar de una cara feliz queremos muchas? Requerimos pues de introducir una nueva instrucción: JMP. Esta instrucción salta a la localidad de memoria que se le in dica a continuación como argumento. Si empleamos el ensamblador podemos usar direcciones simbólicas 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 dirección:
-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 interrupción 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 dirección está representada en 8 bits, por lo que cae entre las direcciones comprendidas a -128 y +127 bytes de la dirección 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 opción ;Salta a Uno si escoge=0

6-107

Ejemplos: INC INC INC INC BX AL variable tabla[BX] .Ensamblador uno: dos: . etc. EBF8. 6. La bandera CF no es afectada nunca por esta operación pero sí las banderas de cero y saturación (ZF.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 sólo: MOV MOV INT INC JMP DL. Trataremos por el momento con saltos incondicionales.Operación de 1 byte .instrucciones para opción Uno . Por deducción podemos inferir que B2 corresponde el número hexadecimal a la instrucción MOV.02 21 DL 0102 Lo que nos lleva a una nueva instrucción: INC. Observemos detenidamente los códigos que nos entrega el programa DEBUG: B201. 6-108 . etc. pero éste es un salto hacia atrás y por lo tanto negativo de 8 bytes que corresponde a F8.instrucciones para opción Dos.Incrementa un elemento de una tabla Recuerde que en nuestro programa muestra se realiza una operación de 1 byte y el número máximo que se obtiene es de FFh ó 255 la siguiente operación de incremento regresa el contador a 0 y vuelve a comenzar la cuenta.a Dos si escoge=1. SF) son modificadas de acuerdo al resultado. CD21. Si se tratase de un salto hacia adelante de 8 bytes. el código correspondería a EB08.Incrementa una dirección .Operación de 2 bytes . ¿Pero por qué en la instrucción JMP el programa coloca F8 en lugar de la dirección 100 que es a la que estamos saltando para continuar con la ejecución del programa? Recordemos que estamos saltando a unas cuantas instrucciones atrás y por lo tanto es un salto corto definible en 1 byte. . Esta instrucción incrementa un registro o la memoria en una unidad.00 AH. B402. CD el de INT y EB al de JMP.

Si modificamos el programa de la siguiente manera podemos lograrlo: MOV MOV MOV INT INC LOOP INT CX. Visualice el contenido de los registros utilizando la instrucción r del DEBUG.prueba CX . LOOP no_entra: repite . En este caso la condición es: No saltar cuando CX=0. no cumpla con cierta condición. Está instrucción realiza un salto condicional a la dirección indicada mientras un contador.2 Deje ejecutar el programa por un tiempo aleatorio e interrumpa. la primera instrucción introduce en CX un contador de 256 decimal.0100 DL. Una nueva mejora sería controlar el número de veces que el programa pasa por un conjunto de operaciones. la instrucción LOOP decrementa al registro antes de realizar la comparación por lo que recorreremos el código 256 veces! Se puede usar la instrucción de salto condicional JCXZ (Jump if CX zero. 6-109 . salta si CX es cero) antes de entrar al lazo: JCXZ repite: .02 21 DL 0105 20 Se introduce un nuevo elemento de programación: la instrucción LOOP.Explorando el Ensamblador Ejercicio.instrucciones del lazo Note que en este caso al estar usando DEBUG.00 AH. 6. Esta instrucción no afecta a las banderas pero si decrementa el registro CX de forma automática.4 Lazos (LOOP) Nuestro programa va mejorando pero aún falta mucho para lograr el control deseado.. 5. ATENCION: ¡Si el contador CX se encuentra en cero. en el registro CX..no entrar al lazo no_entra .

Prepara para la siguiente cadena a .OFFSET cadena . Realiza el bucle mientras CX<>0 y ZF=0 Se debe tener cuidado con las banderas pues un código aparentemente correcto a primera vista no funcionará: MOV cadena Busca: CMP AL.[SI] almacenada en AL INC SI comparar LOOPNE busca . Realiza el lazo mientas CX<>0 y ZF=1 · LOOPNE. Todos los saltos condicionales dependen de las banderas para hacer sus pruebas por lo que es necesario modificarlas de alguna forma (con alguna instrucción) antes de hacer la prueba de salto. en este caso la que más nos interesa. la bandera de cero (ZF) por lo que LOOPNE no puede salir del bucle nunca. La instrucción LOOP tiene dos variantes: · LOOPE.Compara con una cadena .Busca hasta encontrar cadena SI. Utilice pseudo instrucciones específicas para los contadores y direcciones. Para estos casos. sino que deseamos saltar sólo si se cumple alguna condición previa. La instrucción preferida es CMP: CMP CMP Registro.Constante Memoria. los diseñadores del circuito proveen de los saltos condicionales que pueden ir desde unos cuantos hasta una gran variedad como en los diseños modernos.5 Saltos Condicionales y Comparaciones Existen muchos casos en programación en los cuales no nos es suficiente un salto incondicional a una dirección predeterminada.Constante 6-110 .Ensamblador Ejercicio 5. 6. pero la siguiente instrucción es una operación aritmética que vuelve a modificar las banderas.3 Agregar las lineas necesarias para ensamblar con MASM y ensamble.En SI lleva el apuntador a una La instrucción CMP compara las dos cadenas y modifica las banderas de acuerdo al resultado (ver siguiente sección).

todas las instrucciones toman la forma J.Registro Registro.1 .1 . 6-111 . · SF=0 (último bit del byte o signo).6 .1. Por ejemplo: MOV CMP AH.Del tipo Byte -[BX]+1 BYTE WORD [BX].Explorando el Ensamblador CMP CMP CMP Registro.Registro La operación realiza una resta sin modificar ni el destino ni la fuente pero sí modificando las banderas de acuerdo al resultado.5 AH.Memoria Memoria.Operación indefinida Se define poniendo el tipo de apuntador: CMP CMP BYTE PTR [BX].. 1111 1011+0000 0110 = 1 0000 0001 por lo que las banderas modificadas serán: · OF=0 (no hay desbordamiento).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 categorías genéricas: · Comparación de banderas · Comparación entre números sin signo · Comparación entre números con signo Para la comparación de banderas. Se debe poner cuidado en operaciones indefinidas: CMP [BX].-AH+6 AH=05h=0000 0101 ó 1111 1011 en complemento a 2. identificador donde J. en el mnemónico de la instrucción e identificador es una etiqueta o dirección localizada en un intervalo de +128 a -127 bytes de distancia. · ZF=0 (el resultado es diferente a 0) y · CF=1 (puesto que hay un acarreo)..

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 . JAE o JNC (Jump if Not Below. esto nos indica que A<B puesto que el complemento a 2 de A es un número positivo muy grande que al sumarse a B nos da un desbordamiento. Jump if Not Above or Equal) JB..2 Comparación de Números sin Signo Salta si A>B Instrucción JNBE o JA (Jump if not Below or Equal. Si comparamos dos números A y B con la instrucción CMP (-A+B) y encontramos un desbordamiento. Jump if Above) JNB.1 Comparación de Banderas Instrucción Condición 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 aritméticas sin signo la bandera CF=1 indica un desbordamiento de capacidad. Jump if Above or Equal.Ensamblador Tabla 6. JNAE o JC (Jump if Below. Jump if Not Above or Equal. Jump if Carry) JE o JZ (Jump if Equal. Tabla 6. Jump if Not Carry) JBE o JNA (Jump if Below or Equal.. Jump if Zero) JNE o JNZ (Jump if Not Equal. De la misma forma si A>B no habrá desbordamiento y si A=B el indicador de cero (ZF) será 1.

los siguientes saltos condicionales toman en cuenta operaciones con signo. MOV CMP JL AH. esto es.0 sigue .0FFh AH.Compara FF con 0 . Jump if Less or Equal) JNGE o JL (Jump if Not Greater or Equal.Explorando el Ensamblador A diferencia del grupo anterior.0 sigue . en lugar de: 6-113 .0FFh AH. Por lo que si se requiere un salto largo se debe de emplear un truco.Comparación con signo . Jump if Not Less) JNG o JLE (Jump if Not Greater. a -127 ó +128 bytes de distancia y no modifican las banderas.3 Comparación de Números con Signo Salta si A>B Instrucción JG o JNLE (Jump if Greater. 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.Compara FF con 0 .Salta si menor En este caso si hay un salto pues -1 (0FFh en aritmética con signo) es menor que 0.Salta si menor La instrucción JB no provocará el salto pues 255 no es inferior a 0. Tabla 6. Jump if Zero) JNE o JNZ (Jump if Not Equal. Jump if Not Less or Equal) JGE o JNL (Jump if Greater or Equal.Comparación sin signo . Jump if Less) JE o JZ (Jump if Equal. Todos los saltos condicionales dentro del juegos de instrucciones del circuito 80x86 son saltos cortos.

Ensamblador JL .Serie de instrucciones .que dan más de 128 bytes 6. sigue: sigue1 sigue . NEG) Existen cierto tipo de instrucciones muy próximas a la lógica de la máquina.1 Y Lógico (AND) La primera que analizaremos es la operación Y (AND) que nos entrega un 1 si los dos operadores son 1 y un 0 si cualquiera de ellos es cero. Registro Donde Registro es un registro interno de trabajo de 8 ó 16 bits. XOR. . Memoria Memoria...Instrucción contraria a JL . TEST. OR.. en especial a las que realiza la UAL. Se utiliza muy a menudo para aislar ciertos bits de un byte o para poner en cero ciertos bits de un byte. Registro Registro. que permiten manipular los bits individuales de maneras extrañas y muy prácticas. sigue: sigue . Todas tienen las siguientes combinaciones posibles: Mnemónico Mnemónico Mnemónico Mnemónico Mnemónico Registro. Valor es una constante o valor y Memoria es una dirección de memoria o apuntador a una..Serie de instrucciones . NOT. Una de las aplicaciones menos utilizadas de la operación Y Lógica es obtener el residuo de una resta: Calcule el residuo de 29/8 00001 1101 (29) 0000 0111 (divisor-1=7) AND 6-114 .. 6.. .que dan más de 128 bytes .6 Operaciones Lógicas (AND.(error señalado por el ensamblador) Usaremos: JGE JMP sigue1: . Valor Registro.6. Valor Memoria... Todas las operaciones lógicas son realizadas bit a bit.

2 O Lógico (OR) La operación O (OR) da por resultado un 1 si cualesquiera de los dos operadores es un uno. Un uso común de la instrucción XOR es para colocar rápidamente un registro en cero: XOR AX. La operación toma la forma NOT NOT Registro Memoria 6.6 . AND AND 6.AX .Usa mascarilla (6) para conservar Ejercicio 6.6.6. OR OR OR AX. si hay un 1 tendremos un 0 y si hay un cero un 1. Un cero en la máscara nos dará por resultado un cero y un uno conserva el valor original del operando: AND bits 1 y 2 AND 4 AX.Explorando el Ensamblador 0000 0101 (residuo de 5) Cuando se trata de eliminar ciertos bits y otros no.Usa mascarilla para eliminar bits 2 y AX.BH 6.AX AX.3 No Lógico En este caso la operación da por resultado el contrario de lo que teníamos en un principio. Ejercicio 6.AX BH.0FBh .6.0104h 014h. esto es.2 Diga cuales de las siguientes instrucciones son incorrectas y por qué.3 Diga cuales de las siguientes instrucciones son incorrectas y por qué.AX 6. La mascarilla en este caso sirve para forzar ciertos bits a 1 lógico. se le nombra al operador de Y Lógico mascarilla.Coloca AX en cero Puede utilizarse también para invertir (complementar) uno o más bits con una mascarilla: 6-115 .4 O Exclusivo Lógico (XOR) Esta operación da por resultado un 1 si los bits son diferentes y un 0 si son iguales.

AX=-5 .Complementa bits 1 y 2 de AH Esta instrucción es muy usada en programas gráficos donde se desea pasear una figura por un fondo sin destruir éste.5 Prueba Lógica (TEST) La prueba lógica es el equivalente a la operación Y (AND) sin modificar los operadores pero alterando las banderas de acuerdo al resultado.AX=5 Nuevamente hay que tener cuidado con los operadores indeterminados: 6-116 . · La operación NO (NOT) es una excepción a lo anterior pues no modifica las banderas. ZF (cero) y PF (paridad) se modifican de acuerdo a los operadores. Las formas permitidas de la operación son: NEG NEG Registro Memoria Como ejemplos tenemos: MOV NEG NEG AX.6 Las Banderas En todas las operaciones lógicas se modifican las banderas.5 AX AX .6.7 Complemento a 2 (NEG) Con esta operación realizamos la negación de cada uno de los bits de un byte o palabra y luego la suma de 1 (el complemento a 2) en un sólo paso. 6. 6. Es comparable a la operación CMP para comparaciones lógicas. · Los indicadores SF (signo).6.6. de la siguiente forma: · Las banderas CF (acarreo) y OF (saturación) siempre son cero puesto que las operaciones no son aritméticas.Ensamblador XOR AH. a excepción de la operación TEST que es una prueba no destructiva. 6. · El indicador AF (auxiliar) queda indeterminado y no se usa.6 .

palabra 6.puertonum .7.el número de puerto a DX 6-117 .el número de puerto a DX .2 La instrucción IN Al contrario de la instrucción OUT. IN recibe un byte o palabra de un puerto externo: IN IN AX Puerto.recibe palabra de puerto y coloca en El número de puerto puede ser enviado también al registro DX: MOV DX.envía byte a puerto . AL Puerto.Explorando el Ensamblador NEG NEG NEG [BX] BYTE PTR [BX] WORD PTR [BX] .envía palabra a puerto El número de puerto puede ser enviado también al registro DX: MOV OUT identificado por DX DX.recibe byte de puerto y coloca en AL . AX .1 La instrucción OUT Esta instrucción envía un byte o una palabra a un puerto. OUT OUT Puerto. 6.byte .¿Es byte o palabra? .AL . 6. AL Puerto. 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.puertonum DX. El ensamblador da el control de todos estos recursos al programador y permite funciones que en lenguajes de alto nivel es muy difícil o imposible realizar. AX . Para ilustrar el punto supongamos que queremos controlar con precisión la forma en que la bocina de nuestra computadora personal emite sonidos (ampliaremos el concepto en capítulos subsecuentes).envía contenido de AL al puerto La instrucción no afecta ninguna bandera.7 El Mundo Externo: IN y OUT La UPC pasa una gran parte del tiempo comunicándose con los dispositivos externos o atendiendo sus demandas por medio de las rutinas de interrupción. Para poder controlar el mundo externo necesitamos introducir las instrucciones IN y OUT.7.

máscara para alternar bit 1 .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 capítulo. 6-118 .retraso para poder escuchar el sonido IN AL.140 10b 104 Asegúrese de las instrucciones con el comando U y antes de ejecutar salve el programa -nsonido.bocina .61 AL.el bit 0 controla un oscilador que queremos apagar y el bit 1 se conecta a una compuerta .2 61.y generar sonido pulsante retraso EQU 140h .AL por DX y coloca en AL .fc AL.máscara para quitar bits 0 y 1 .AL CX. Comentemos ahora el programa: bocina EQU 61h . Introduzcamos el siguiente programa desde DEBUG: IN AND XOR OUT MOV LOOP JMP AL.recibe byte de puerto identificado La instrucción no afecta ninguna bandera.puerto que controla la bocina quita EQU 0fch . No podemos utilizar la instrucción de interrupción puesto que los diseñadores no pensaron que fuese importante contar con una rutina de interrupción para la bocina.Ensamblador IN DX.que genera el pulso que se envía a la bocina alterna EQU 02h .

XOR. LOOPNE. JNBE. JNZ. 6.5 Varíe el retraso y comente sobre el resultado. AND. JNAE. Las instrucciones de IN y OUT nos permiten tener acceso de forma directa a los dispositivos externos. Ejercicio 6. JMP. JA. El circuito de INTEL nos permite tener acceso a las mismas rutinas de interrupción diseñadas por los fabricantes del SO dandonos muchas ventajas. JE. LOOPE. JL.apaga oscilador y compuerta . JZ. 6.9 Problemas 6.retraso repite sigue . IN. JNL. NEG. LOOP.repite el proceso Ejercicio 6.9 Instrucciones Analizadas INT.1 Averigue algunas de las interrupciones prácticas dentro del sistema operativo MS-DOS. JLE. CMP. Los saltos dentro de un segmento de código de programa pueden dividirese en incondicionales y condicionales y a su vez los incondicionales dependiendo el signo. JB. 6. TEST. JNGE. JG. OR. JNB. JC. JNC. JBE. 6-119 . NOT.marca la frecuencia . JNA. JNE. JS. JCXZ.apaga y prende la compuerta . JNS.8 Resumen Las interrupciones forman el trabajo principal y el cuello de botella de la UPC. JNLE. JNO. JGE. JAE. JNG. Las máscaras son patrones de bits que nos permiten eliminar ciertas secuencias de un byte que no nos interesan.quita AL. INC. JO.pierde el tiempo .AL CX.alterna bocina. OUT.Explorando el Ensamblador AND sigue: XOR OUT MOV repite: LOOP JMP AL.4 Introduzca el programa anterior en MASM agregando todas las pseudo instrucciones que vengan al caso.

6.1 para que limpie la pantalla y luego coloque una cara sonriente en la mitad de la pantalla.1.2 Utilice las interrupciones aprendidas en su ventaja modificando el programa del ejercicio 6. How to Program Microcomputers.Ensamblador 6. Lafore Robert Assembly Language Primer for the IBM PC. 6. Alleur Bélgica.10 Bibliografía Mercier Philippe Assembleur Facile. Marabout 1992. Sams & Company 1987. The Waite Group 1992. Barden William Jr. IBM Personal Computer Technical Reference. 6-120 .3 Modifique el programa del ejercicio 6.

Si el SO de todas formas debía de tener rutinas de manejo de todos los dispositivos conectados a la máquina. Si por cualquier causa cambiaban los dispositivos. Provee las funciones básicas de impresión. el tiempo que tarda en dar una revolución. se debía saber al detalle dónde se localizaba cada byte en el disco.1 El Sistema Operativo En todo sistema de cómputo existe una relación íntima entre los programas en ensamblador y el sistema operativo (SO) que se ejecuta en la computadora. etc. Como ya sabemos el propósito principal del SO es administrar a otros programas. Por ejemplo. almacenaje. todo debía de ser reescrito. despliegue. De esta forma si se desea escribir un carácter a la pantalla no se debe saber ya nada del circuito que la controla sino únicamente la 7-121 . si se deseaba guardar un archivo en disco flexible. A todas estas funciones sólo se puede acceder en su nivel más bajo a través del lenguaje ensamblador. etc. 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 se puede imaginar. En un principio la persona que se debía entender con el SO debía tener un íntimo conocimiento de la máquina. ¿Por qué no hacer las rutinas del SO accesibles a los otros programas? La idea detrás del SO cae dentro de esta pregunta. los programas se convertían en programas muy largos y complejos. cuanto tarda el motor de pasos en llegar a una pista determinada.Capítulo 7 7. mantendiéndolos en áreas específicas de memoria secundaria para su almacenamiento o en memoria principal para su ejecución.

al llamar una rutina del SO. Se puede obligar a la rutina del teclado a guardar la información en una memoria intermedia.2 El Teclado La rutina de interrupción que atiende al teclado es la 21h entrando con el registro AH en 1 y regresando en AL al carácter leído. nuestra tarea se convierte de una de extrema complejidad a una de moderada a poca dificultad. Analizaremos a lo largo del capitulo diversas utilerías del BIOS que nos serán de utilidad posteriormente. De esta forma.Ensamblador información de la rutina que lo puede hacer y cómo decirle qué queremos hacer. etc. Todas estas rutinas de control de periféricos residen en una memoria ROM que forma parte del BIOS de la computadora y a la que podemos tener acceso de forma ilimitada.1 21 100 Mientras estamos en la rutina de interrupción del teclado podemos revisar las funciones de edición que la rutina nos proporciona como es el borrado de caracteres. No olvide revisar el registro AL para ver el código ASCII de la tecla que se presionó. Para esto es necesario pasar como parámetro 0Ah en el registro AH y en los registros DS:DX la dirección de la memoria intermedia de almacenaje (buffer) en cuyo primer byte debemos guardar el máximo número de caracteres a leer del teclado.1 21 20 Se puede utilizar un salto incondicional para introducir una oración completa: MOV INT JMP AH. 7. MOV INT INT AH. La rutina nos regresa en el segundo byte de la memoria de almacenaje el número de caracteres leídos del teclado. El uso de las teclas CTRL y BREAK interrumpe la rutina. el empleo de teclas de control.1 Introduzca los siguientes ejemplos usando DEBUG. Ejercicio 7. 7-122 .

3 Convierta el programa del ejercicio 7.a 21 20 20 Examine el resultado con la instrucción D. MOV MOV INT INT DB DX.109 AH. 7.a 21 7-123 . Unamos las funciones aprendidas para realizar un programa que haga eco a la pantalla de lo que se teclea.4 Introduzca el siguiente programa en DEBUG a partir de la dirección 0100. Sabemos ya que para que la función 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.4 pero con las pseudo instrucciones requeridas para el ensamblador MASM. Ejercicio 7.El Mundo Exterior Ejercicio 7.2 Introduzca y ejecute el siguiente programa en DEBUG: MOV MOV INT INT DB DX. No se olvide de inicializar el segmento DS de donde se toma la dirección de la cadena a desplegar.5 Introduzca el programa del ejercicio 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 ($). No olvide inicializar el registro de segmento de datos (DS) con la dirección apropiada usando SEGMENT.109 AH. Ejercicio 7.116 AH.2 a MASM añadiendo las pseudo instrucciones requeridas.9 21 20 ‘Ejemplo de cadena impresa$’ Ejercicio 7.

interrupciones varias MOV DL.función del teclado pantalla EQU 02h .y dónde está el buffer ORG 0100h .teclado INT dos .dirección de buffer MOV AH.a AH.fija el origen a dirección 100 inicio: MOV DX.muestra .No olvide terminar la cadena de caracteres con $ teclado EQU 0Ah .salta primeros 2 bytes de buffer de teclado MOV AH. a partir de esta localidad datos ENDS .Termina y vuelve al SO .20 bytes para memoria de teclado .————————————————————————————————— ———————————————— programa SEGMENT ASSUME CS:programa .————————————————————————————————— ———————————————— programa ENDS 7-124 .Ensamblador MOV MOV MOV MOV INT INT DB DL.función de despliegue dos EQU 21h .OFFSET memoria .OFFSET memoria+2 .informa a MASM dónde estamos ASSUME DS:datos .interrupciones varias MOV DX.Llamada del SO fin EQU 20h .Programa que acepta caracters del teclado y hace eco a la pantalla .————————————————————————————————— ———————————————— datos SEGMENT memoria DB 20 .función de la pantalla lf_cr EQU 0Ah .despliegua en pantalla INT dos INT fin .9 21 20 30 El programa anterior en MASM: .lf_cr .118 AH.2 DX.termina y regresa a SO .alimentación de línea muestra EQU 09h .pantalla INT dos .agrega alimentación de línea MOV AH.

05 21 BX 0106 20 ‘Un mensaje a imprimir de 40 caracteres’. MOV MOV INT MOV MOV INT MOV INT MOV MOV INT INT DB DL.[125] AH. pero enviamos un 5 en el registro AH y en DL el carácter a imprimir.[122] AH.0a Claro que una mejor versión es inmediata usando direccionamiento indirecto: MOV MOV MOV MOV INT INC LOOP INT DB CX.0d.El Mundo Exterior .4 La Impresora Como para las funciones anteriores. En el siguiente ejemplo mostramos una forma muy primitiva de enviar una cadena a la impresora.Lleva la cuenta de la cadena 7-125 .0d.****************************************************************** END inicio Aparentemente más complicado pero mucho más fácil de entender y mantener.05 21 20 ‘si’.[124] 21 DL.111 DL.[123] AH.40 BX.0a Que para el MASM queda: .05 21 DL.Programa para impresión de caracteres imprime EQU cuenta EQU a imprimir 05h 40 .05 21 DL. 7.[BX] AH.función de impresora . esta vez usamos la interrupción 21h.

05 21 BX 0106 20 1b.interrupciones varias INC BX .’E’ Observe que en la última línea definimos el carácter de control para modo enfatizado de una impresora EPSON o compatible y puede ser sustituído por cualquier otro código.Termina y vuelve al SO . 7-126 .fija el origen a dirección 100 inicio: MOV CX.dirección de mensaje ciclo: MOV DL.imprime INT dos .y vé a imprimirlo INT fin .informa a MASM dónde estamos ASSUME DS:datos .cuenta MOV BX.Llamada del SO fin EQU 20h .————————————————————————————————— ———————————————— programa SEGMENT ASSUME CS:programa .0Dh.dirección carácter a imprimir MOV AH.[BX] AH.2 BX.0111 DL.apunta a siguiente carácter LOOP ciclo .****************************************************************** END inicio Presentamos a continuación un programa para mandar códigos de control a la impresora: MOV MOV MOV MOV INT INC LOOP INT DB CX.————————————————————————————————— ———————————————— datos SEGMENT cadena DB ‘Mensaje de 40 caracteres’.Ensamblador dos EQU 21h .y dónde están los datos ORG 0100h .[BX] .————————————————————————————————— ———————————————— programa ENDS .termina y regresa a SO .OFFSET cadena .0Ah datos ENDS .

quita dígitos de la izq.9 en ASCII a_f EQU 7h .Despliega si ente 0 y 9 ADD AL.número de dígitos rota: MOV CL.desplaza dígito a la izq. Integraremos finalmente el programa en uno sólo que convierte de decimal a hexadecimal: .El Mundo Exterior 7.Máscara 4 bits extrema derecha ascii EQU 30h .ascii .el dígito está entre A y F despliega: MOV DL. AL AND AL.Llamada del SO fin EQU 20h . MOV AL.convierte a ASCII CMP AL.cuenta .función de despliegue cuenta EQU 4 .CL .————————————————————————————————— ———————————————— programa SEGMENT .Equivalente de hexadecimal a ASCII nueve EQU 3Ah .a_f .Lleva cuenta de # dígitos mascara EQU 0Fh .————————————————————————————————— ———————————————— programa ENDS 7-127 .AL .inicio de segmento ASSUME CS:programa .muestra .¿Terminamos con los 4 dígitos? JNZ rota .fija el origen a dirección 100 inicio: MOV CH.Termina y vuelve al SO .Si aún no se termina INT fin . ADD AL.nueve .Función de despliegue INT dos .Programa para convertir binario a hexadecimal (ASCII) muestra EQU 02h .¿Es mayor que 9? JL despliega .cuenta a 4 bits ROL BX.y pasa a reg.BL .5 Los Corrimientos y Operaciones Aritméticas Comenzamos esta sección con un sencillo programa que convierte un número en binario a dígitos hexadecimales en su equivalente ASCII y lo despliega en la pantalla.cuenta .Regresa a SO .mascara .Convierte dígito A-F en ASCII dos EQU 21h .Coloca ASCII en DL MOV AH.Llama a DOS DEC CH .informa a MASM dónde estamos ORG 0100h .

Ejercicio 7. Se dividen en tres grupos: · Desplazamientos Aritméticos o corrimientos sin signo · Desplazamientos Aritméticos o corrimientos con signo. Antes de explicar el funcionamiento de este programa introduzcamos los corrimientos.Ensamblador . etc. rotaciones y las operaciones aritméticas: 7.5.6 Ejecute el programa desde DEBUG dando varios valores a BX y observando el resultado. O. Estas son operaciones comunes para encuadrar un byte con respecto a un valor o para eliminar los bits superfluos. Para ver su utilidad y comprender los nuevos conceptos es necesario ejecutarlo desde DEBUG y llenar el registro BX con el comando r.****************************************************************** 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á vacío.1 Corrimientos y Rotaciones Este tipo de instrucciones desplazan los bits de un byte o palabra hacia la izquierda o derecha. algo similar a las máscaras en las operaciones lógicas como Y. · Rotaciones La UAL sólo es capaz de realizar un número básico y limitado de operaciones: · Complemento a unos (inversión de bits) · Complemento a dos (negación) · Suma · Desplazamientos · Rotaciones · Operaciones Lógicas (Y. 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 . O.

1 Memoria. 7-129 .cuenta.CL Donde Registro es un registro de 8 o 16 bits.5.1 Corrimientos Lógicos (Rotaciones) ROR destino. De la misma forma un corrimiento hacia la derecha equivale a dividir entre la base.CL Memoria. Memoria es una localidad de memoria o una dirección y 1 es el valor inmediato de uno. Rota a la derecha byte o palabra pasando por el acarreo.1 Registro. 7.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.1. 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 números 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 aritméticos con signo. Todas las operaciones de corrimiento y rotaciones toman la forma Mnemónico Mnemónico Mnemónico Mnemónico Registro.

1.cuenta. Corrimiento lógico a la derecha de byte o palabra pasando por acarreo SAR destino. Rota a la izquierda a través del acarreo byte o palabra 7. Rota a la derecha a través del acarreo byte o palabra ROL destino.cuenta.1 7-130 . Corrimiento a la izquierda de byte o palabra pasando por acarreo Todos los corrimientos quedan ilustrados en la figura 7.cuenta.2 Corrimientos Aritméticos SHR destino.cuenta. Rota a la izquierda byte o palabra pasando por acarreo RCL destino.5.Ensamblador RCR destino. Corrimiento aritmético a la derecha de byte o palabra agregando el signo y pasando por acarreo SHL/SAL destino.cuenta.cuenta.

El circuito es capaz de realizar sumas. para sacar provecho de estas operaciones es necesario tener otro circuito dedicado a las operaciones matemáticas que se llama coprocesador pues realiza el proceso en paralelo al procesador principal.1 Suma y Resta (ADD y SUB) 7-131 . 7. multiplicaciones y divisiones pero estas dos últimas operaciones las realiza en base a sumas por lo que son lentas.1 Corrimientos y rotaciones. o 32 bits que nos dan números entre 0 y 65.2 Operaciones Aritméticas Las operaciones aritméticas son realizadas sobre los registros y son de 8. 16.El Mundo Exterior Figura 7.2.5. 7.535 en aritmética sin signo.5. restas.

Registro Donde Registro es un registro de 8 o 16 bits.sumando los 16 bits bajos . DEC DEC Registro Memoria 7. el bit del registro de banderas de acarreo es puesto en 1 lógico y las demás banderas (SF. Si existe un desbordamiento. CF. OF.WORD PTR suma2+2 .Inmediato Memoria.Ensamblador Las sumas y restas toman la forma de Mnemónico Mnemónico Mnemónico Mnemónico Registro.Número de 32 bits .suma siguientes 16 bits altos .WORD PTR suma1 .WORD PTR suma1+2 . La resta se logra sumando el complemento a dos del sustraendo.trabaja ahora los 16 bits altos agregando el acarreo si existe MOV DX.2.2.5. Existen las operaciones complementarias de suma (ADC) y resta (SBB) pero de doble precisión donde se agrega o quita el acarreo al resultado: suma1 DD ? .Memoria Registro.trabaja los primeros 16 bits bajos ADD AX.Número de 32 bits suma2 DD ? .16 bits primeros altos ADC DX.Inmediato Registro. ZF) se afectan de acuerdo al resultado.5.2 Decrementos Esta instrucción decrementa en 1 un registro o localidad de memoria dando por resultado una operación idéntica a la de la resta pero sin afectar la bandera de acarreo (CF) por lo que se debe poner atención si queremos realizar un salto condicional que dependa de este indicador.agregando acarreo 7. Recuerde el caso de los números negativos y de que las operaciones pueden ser con signo o sin signo lo que puede dar por resultado sorpresas indeseables.Suma los primeros 16 bits MOV AX. Memoria es una localidad de memoria o una dirección e Inmediato es un valor.WORD PTR suma2 .3 Multiplicación y División 7-132 .

Estas operaciones usan registros específicos como se muestra en la figura 7.2 Multiplicación y división. pues una división entre 0 o una cantidad muy pequeña genera una interrupción definida de antemano (al cargar el SO) que detiene el proceso general del SO y por ende de la máquina. En el caso específico de la división. es necesario prevenir. La instrucción DIV no permite dividir un byte entre un byte ni una palabra entre otra palabra por lo que hay que proceder como sigue: .2. IDIV).El Mundo Exterior En el caso de la multiplicación (MUL) y división (DIV) tenemos algo similar a la suma y resta. Es necesario una operación para considerar el signo en caso de requerirlo (IMUL. Figura 7.división entre dos bytes 7-133 .

Suma número en AX por el de BX ADD BX. el resultado se queda en BX decbin SEGMENT ASSUME CS:decbin MOV BX.en BL el divisor .BX .Salir si el #<0 CMP al.Ensamblador MOV AL.y multiplica por AX (AX*10) XCHG AX.división de una palabra entre un byte .30h .Regresa a SO decbin ENDS END Ejercicio 7.Regresa # a BX .7 Introduzca el programa anterior en MASM y ejecute desde DEBUG para observar el resultado en el registro BX.Convierte byte en AL a palabra en AX .dividendo CWD (DX.Convierte Decimal del teclado a binario.Cambia registros AX y BX MOV CX.Multiplica número en BX por 10 XCHG AX.AX .AX) MOV BX.BX .Convierte un byte en palabra (AH=0) .divisor DIV BX una palabra .división entre dos palabras MOV AX.división de una doble palabra entre Para este punto debe de quedar claro el funcionamiento del programa introducido en la sección an te rior e introducimos el siguiente complemento que conviete de un número decimal tomado del teclado a un binario en el registro BX.entrada del teclado INT 21h .9d . . y ve por otro sale: INT 20h .ASCII a binario JL sale .en AL el dividendo .¿Es > a 9? JG sale .en BX el divisor .Coloca 10 en CX MUL CX .Convierte palabra en doble palabra .en AX el dividendo . Use la instrucción 7-134 .dividendo CBW MOV BL.1 .0 .10d .Si es así.divisor DIV BL .llama a DOS SUB AL. no es dígito CBW .Limpia registro BX otro: MOV AH.suma dígito a # JMP otro .

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. En nuestro caso el punto antes de la interrupción 20h es 11b: g 11b. con los procedimientos o subrutinas que pueden ser llamados desde cualquier parte de un programa. cero AF. pariedad CF. acarreo En uno lógico En cero lógico OV DN EI NG ZR AC PE CY NV UP DI PL NZ NA PO NC Ejercicio 7. Se resuelve esto. por orden. En el lenguaje ensamblador se define el inicio de una sección de un programa con la pseudo instrucción PROC y su final con la pseudo instrucción ENDP. El programa DEBUG utiliza la siguiente simbología para las banderas: Tabla 7. por lo que debemos sustituir la instrucción por una nueva que no hace nada: NOP. 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 instrucción con qué tipo estamos tratando: 7-135 . dirección IF. acarreo auxiliar PF. 7. BX y CX. Esta instrucción ocupa un sólo byte por lo que en este caso debemos usar 2 para sustituir a INT que ocupa 2 bytes. Tendremos un problema al llegar a la instrucción INT pues nunca regresaremos al programa original.6 Procedimientos o Subrutinas En muchos casos se requiere. Para esto utilizamos el comando de DEBUG g pero seguido de una dirección lo que hace que se introduzca una pausa en lugares determinados (hasta 10).1 Simbología de DEBUG para las banderas Bandera OF. habilita interrupciones SF.8 Ejecute el programa DECBIN anterior pero ahora interrumpimos el flujo del mismo antes de ejecutar la última instrucción para poder analizar el registro BX. dividir el programa en segmentos lógicos independientes uno de otro pero a la vez que estos segmentos estén disponibles para su uso por otros segmentos del programa. al igual que en los lenguajes de alto nivel. signo ZF. saturación DF.

Agrega nueva línea JMP repite .(máximo de 65535d) dechex SEGMENT ASSUME CS:dechex . Todo procedimiento debe de terminar con la instrucción RET para que el ensamblador sepa que termina la subrutina y debe regresa al programa que la llamó. Para llamar a la subrutina o procedimiento se utiliza la instrucción CALL (llama) seguida de la dirección o identificador. No es afectada ninguna badera por esta instrucción.Ensamblador nombre segmento nombre PROC PROC NEAR FAR .Del teclado (base 10) a binario CALL crlf . La instrucción forza a que el procesador guarde la dirección de la siguiente instrucción que sigue a la de la llamada en un área especial de datos llamada la pila que analizaremos en el siguiente capítulo a fondo.si se trata de uno en otro segmento El nombre es el identificador del procedimiento con el cual haremos referencia posteriormente a esta subrutina.binario a hexadecimal y despliega CALL crlf .Parte principal del programa que une a los otros 2 repite: CALL decbin . si es una llamada lejana. Analizaremos esto en detalle en el siguiente capítulo. Una vez más si es una llamda corta.si se trata de uno en el mismo . Esto implica devolver el valor del apuntador de programa anterior sacándolo de la pila. Finalmente integramos los dos programas ya vistos en uno general que convierte un número decimal a hexadecimal directamente del teclado: .Convierte Decimal a Hexadecimal (DECHEX) . La instrucción RET puede tener un parámetro auxiliar para ajustar el tamaño de la pila al regresar.————————————————————————————————— ———————————————— 7-136 .Vuelve a repetir . la primera para IP y la segunda para CS. toma una palabra de la pila y la restituye en IP.Agrega nueva línea CALL binhex . Si es una llamada corta o cercana. si se trata de una llamada lejana. es necesario guardar tanto CS como IP. toma dos palabras de la pila. sólo se guarda el registro IP.

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

7 Resumen Se analizan en este capítulo distintas formas de aprovecharnos de las interrupciones de los diseñadores del SO en nuestro beneficio.Despliega una nueva línea crlf PROC NEAR MOV DL.regresa de crlf crlf ENDP . 7. Se introducen conceptos de procedimientos y la forma de accesar dejando para el siguiente capítulo la forma idónea de pasar parámetros a las subrutinas.llamada a DOS MOV DL. 7-138 . Para finalizar interrumpa presionando la tecla de CTRL y C al mismo tiempo. lpt1:.****************************************************************** dechex ENDS END Introduzca el programa anterior en MASM y pruebe con varios números.función de despliegue INT 21h . Ejercicio 7.CR MOV AH.9 Introduzca la pseudo instrucción PAGE como primera instrucción del programa y ensamble pero ahora usando el comando MASM dechex.REF que nos indica dónde se definieron todas las variables (con el signo #) y dónde son utilizadas todas ellas. . Así mismo hemos creado una referencia cruzada en un archivo de nombre DECHEX.LF MOV AH.llamada a DOS RET .0Dh .0Ah .2 .Ensamblador .función de despliegue INT 21h .————————————————————————————————— ———————————————— .2 . dechex Asegúrese de tener la impresora prendida y con papel pues el resultado se pasará directamente a la impresora.

Lafore Robert Assembly Language Primer for the IBM PC. IDIV.1 Analice el programa de conversión de decimal a hexadecimal en lo referente a las instrucciones de corrimiento. SUB. 7. El programa principal lo despliega en la pantalla o imprime. Morgan Christopher Bluebook of Assembly Languages Routines for the IBM. PAGE. AH=0Ah. Olume Waite. SHR. 7. New York 1984. Marabout 1992. ENDP. año de la siguiente forma: El día de 1 a 31 (5 bits) El mes de 1 a 12 (4 bits) El año en 7 bits y al que se le suma 1995 siempre Al recibir la llamada. ADC. ROL. CALL y las pseudo instrucciones PROC NEAR. SAR. IBM Personal Computer Technical Reference. 7-139 . RET. la subrutina regresa el día en ASCII en el registro BX. mes. The Waite Group 1992. SAL. Alleur Bélgica. ROR.10 Bibliografía Mercier Philippe Assembleur Facile. PROC FAR.8 Instrucciones Analizadas INT 20 (AH=9h. el mes en ASCII en el registro AX y el año en ASCII en CX y DX. MUL. RCL. DIV.2 Realice un código como subrutina en el que se le pasan como parámetro la fecha en el registro AX dividida en día. NOP. RCR.9 Problemas 7. AH=5h). SHL. SBB. 7. ADD. IMUL.El Mundo Exterior 7.

Algunos diseñadores 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. El uso de subprogramas plantea también la necesidad de pasar parámetros a estas subrutinas o procedimientos. Pronto se vio que la primera opción. con algunas variantes. Los tres métodos preferidos son: 8-141 . En el circuito de Intel. era el camino adecuado y el más conveniente para proporcionar toda la flexibilidad al programador y dejar que él decida cuándo y cómo deben guardarse los datos requeridos.1 La pila En los primeros diseños de microcomputadoras surgía el problema de que al atender las interrupciones generadas por los distintos dispositivos se requería preservar el contenido de varios registros en algún lugar. 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. el manejo de pilas se logra a través 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).Capítulo 8 8. 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. Otros se aseguraron de que esto sucediera siempre al incorporar una serie de registros paralelos donde se guardaba automáticamente el contenido de todos los registros de la UPC.

Sonido de disparo . Usado cuando se requieren un gran número de variables.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 restituyéndolos en un registro o localidad de memoria. La pila es usada en las microcomputadoras modernas para guardar el apuntador de memoria al llamar una rutina de interrupción (INT o interrupción externa) o un procedimiento del usuario (CALL). es decir.disparos de la pila LOOP otro .————————————————————————————————— ———————————————— 8-142 .1. pero se requiere de la definición estricta de muchas variables o el uso de archivos de almacenamiento externos creciendo mucho el programa. 8.Regresa a DOS principal ENDP . · Usando la pila.Recupera el contador de .repite hasta terminar INT 21h . Mejor que el anterior. 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.Ensamblador · En los registros.Y guarda silencio . el primero que entra es el primero que sale (PEPS). Limitado a unas cuantas variables. 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: .fin programa principal . Es el método preferido y el más utilizado cuando las variables van de pocas a regular en cantidad.10d otro: PUSH CX CALL disparo CALL silencio POP CX CS:ruido .Define inicio de programa .guarda la cuenta en la pila . · Por medio de variables.Sonido de Motor de Automóvil ruido SEGMENT principal PROC FAR ASSUME ORG 100h inicio: MOV CX. La pila en este circuito es una pila del tipo FIFO (first in first out).número de repeticiones .

11111100b .Retraso ligero (aumentar o disminuir según modelo) silencio PROC NEAR MOV CX.0FFFFh .140h .2 .AL .Coloca en CX espera: LOOP espera .quita bits 0 y 1 sonido: XOR AL.Regresa de la subrutina disparo ENDP .Cambia bit 1 de AL OUT 61h.11111100b .pasa a la pila los parámetros PUSH DS PUSH DX CALL rutina 8-143 .fin de ensamble Para comprender el funcionamiento de la pila.Suma de patrón pseudo aleatorio MOV CL.9248h .fin de código END inicio .0FFFFh .Regresa silencio ENDP .¿fué suficiente? JNZ sonido .La Pila . Genera número aleatorio ADD DX.61h .————————————————————————————————— ———————————————— .ciclo de espera .CL .————————————————————————————————— ——————————.valor inicial de la espera MOV BX.DX .cuenta de silencio repite1: LOOP repite1 RET .3Fh .Quita bits 0 y 1 OUT 61h.****************************************************************** ruido ENDS .Rota 3 bits MOV CX.Manda al puerto de sonido RET .3 . ejemplificaremos analizando la pila con una llamada a una subrutina donde se pasan los parámetros en la pila. DEC BX .AL .cuenta inicial IN AL.cuenta de silencio repite: LOOP repite MOV CX.Salida a puerto de sonido .Salta si aún no se acaba AND AL.Subrutina para hacer un sonido breve disparo PROC NEAR MOV DX.lee el puerto de sonido AND AL. .Prepara a rotar 3 bits ROR DX.

Las cifras a la izquierda son los 8-144 . Inicializar BP al mismo valor que SP (MOV BP. 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 parámetros están disponibles ahora con un simple ajuste del apuntador.SP).[BP+8] .Ensamblador En este punto recalquemos que la cima de la pila se encuentra en donde esté la última dirección del último byte empujado a la pila. Ilustramos este último punto con un ejemplo completo paso a paso. Salvar el valor actual de BP en la pila (PUSH BP). siendo n el número de bytes a ajustar.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 instrucción 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 ejecución anterior. 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 automáticamente los valores de CS e IP (en este caso de una llamada lejana) hacia la pila. Contamos con una pila inicial de 50 elementos (100 bytes) definidos en la sección de pila del programa. · 2. MOV MOV AX. Es menester entonces.[BP+6] BX. el ajustar el apuntador de la pila BP para que apunte al área de interés siguiendo los siguientes pasos: · 1.

...... . .............. .... îcima de la pila El programa x llama en este punto al subprograma y pasando los parámetros BX y DX en la pila: PUSH PUSH CALL BX DX y ...La Pila desplazamientos dentro del segmento SS definido también 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 también el valor de DS (PUSH DS) tendremos: 98 96 94 92 BPÄ SPÄ valor de CX valor de DS .....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 ..

inicializa pila para subrutina z 8-146 . No hay forma de saber si el programa anterior usa o no BP por lo que también es regla general guardarlo en la pila y comenzar a usarlo desde ese momento: PUSH MOV BP BP.1 BX.SP .SPÄ Desde este momento podemos consultar entonces los parámetros de la pila que se requieren y se encuentran en BP+8 (parámetro 1) y BP+6 (parámetro 2) puesto que todos los elementos de la pila requieren de 2 bytes.inicializa valor para subrutina z . Si se requiere usar algún registro.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 (parámetro 1) (parámetro 2) BP.inicializa valor para subrutina z . primero se empuja a la pila para asegurarse de que el programa que llama no pierda sus registros de trabajo.llama subrutina lejana z Las primeras instrucciones de la subrutina z serán para ajustar la pila y asegurarse el acceso a ella: PUSH MOV BP BP. Supongamos en este momento que se llama a la subrutina z pasándole los parámetros AX y BX: PUSH PUSH MOV MOV PUSH PUSH CALL AX BX AX.salva registro BP .guarda registro en la pila .SP .guarda registro de subrutina x .Guarda registro BP .Ensamblador En este punto el programa y tiene el control y requiere del registro BP (es la regla general de uso de la pila). La subrutina y puede usar la pila para salvaguardar los valores que requiere más tarde para su uso.1 AX BX z .guarda registro en la pila .guarda registro de subrutina x .

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 Parámetro 1 Parámetro 2 CS de y IP de y BP de y (parámetro 1) (parámetro 2) (salvado por y) (salvado por y) (transmitido por y) (transmitido por y) BP. El valor de n es conocido en el momento de la programación pues sabemos el número de parámetros pasados a la subrutina. Podemos entonces deducir el número de parámetros de la pila y colocar el valor correcto de n. Existe otra forma de la instrucción RET: RET n (ya mencionada) en la que se ajusta la pila por medio del registro SP agregándole un valor n (entero).SPÄ (salvado por z) La subrutina z puede a su vez consultar los parámetros 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 Parámetro 1 Parámetro 2 CS de y IP de y BP de y (parámetro 1) (parámetro 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. En este 8-147 .

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 Parámetro 1 Parámetro 2 CS de y IP de y BP de y (parámetro 1) (parámetro 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 .Ensamblador caso el valor es 4 pues se pasaron 2 parámetros y cada uno ocupa 2 bytes (2*2 bytes = 2 parámetros) 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 Parámetro 1 Parámetro 2 CS de y IP de y BP de y (parámetro 1) (parámetro 2) SPÄ (salvado por y) (salvado por y) (transmitido por y) (transmitido por y) (salvado por z) RET bytes 4 .

La Pila POP POP POP BX AX BP y regresa ajustando a su vez la pila en 4 unidades (2 parámetros): 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 Parámetro 1 Parámetro 2 CS de y IP de y BP de y (parámetro 1) (parámetro 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 Parámetro 1 Parámetro 2 CS de y IP de y BP de y (parámetro 1) (parámetro 2) (salvado por y) (salvado por y) (transmitido por y) (transmitido por y) (salvado por z) 8-149 .

. Se puede usar esta instrucción cuando se requiere de realizar operaciones intermedias antes de utilizar un salto condicional o cualquier otra operación que utilice las banderas para operar: PUSHF ..Leer un carácter del teclado . POP BX POP AX RET ENDP . una la opuesta de la otra: POPF y PUSHF.operación que modifica banderas POPF .regresa el AL el código ASCII .BX serán utilizados .destruye AL al llamarse MOV AH.lee un carácter 8.Ensamblador Como conclusión es un buen hábito colocar en la pila los registros o datos que serán utilizados por algún subprograma antes de llamarlo y una vez que termina la llamada.1 INT 21h RET lee ENDP .recupera las banderas 8-150 .2 ADD AX.3 . Estas instrucciones no contienen ningún operando.instrucciones del subprograma . ajustar la pila y recuperar los valores de la pila: prueba PROC NEAR PUSH AX PUSH BX .de AX y BX de la pila prueba Se aconseja también especificar al inicio del subprograma por medio de comentarios cuáles son los registros que se pasan como parámetros y cuáles serán eventualmente destruidos: Lee PROC NEAR .Guarda las banderas MOV AX.servicio de lectura de teclado .tanto AX como .1.2 Guardando las Banderas Existen dos instrucciones especiales para colocar las banderas en la pila..recupera los valores .

SIîdirección del texto1 .La Pila 8. .AL .DIîdirección del texto2 .zona de 20 caracteres .2 Manejo de Cadenas En la mayoría de las aplicaciones informáticas.aquí la lógica de las comparaciones . Siempre en un segmento apuntado por DS y usando como apuntador a la cadena el registro SI (Source Index).[SI] MOV AH.ESîDS . el tratamiento de cadenas de caracteres es particularmente importante.OFFSET texto2 .[DI] CMP AH. Cadena Fuente.ALî‘U’ de “Un text. Siempre en un segmento apuntado por ES y usando como apuntador a la cadena el registro DI (Destination Index).” .inicialización PUSH DS POP ES MOV SI. Las operaciones se realizan carácter a carácter 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(?) .Estamos listo a comparar las dos cadenas MOV AL.Compara las cadenas 8-151 ..” . En este tipo de operaciones intervienen dos operandos en distintas áreas de memoria: · 1.OFFSET texto1 MOV DI. Es tan común que los procesadores modernos integran una serie de instrucciones para realizar estas operaciones de forma eficiente.. · 2. 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 páginas completas de texto o imágenes a la memoria de donde el controlador de video toma su información para desplegar en la pantalla.AHî‘O’ de “Otro te. Cadena Destino...

Fija bandera de dirección) indica que los dos registros serán decrementados.2.[SI] MOV [DI].2 La Dirección de la Operación (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. 8. el inicio. podemos utilizar una pseudo instrucción del ensamblador: texto largo DB EQU MOV ‘Una cadena de longitud x’ $-texto . 8.OFFSET texto3 .calcula longitud de ‘texto’ CX. REP se usa con un grupo de tres instrucciones: MOVS (Move String.Ensamblador . Existen dos posibilidades para ajustar el contador de forma que comience por el principio de la cadena o por el final.1 La Instrucción REP El modificador REP (de REPeat.largo . Las banderas afectadas dependen de la operación.DIîdirección del texto3 MOV AL.OFFSET texto2 .2. SCAS (Scan String.SIîdirección del texto2 MOV DI.aquí la lógica que controla los contadores. mientras que el destino es apuntado por DI y reside en el segmento extra (ES). el fin.AL .3 Mover Cadenas (MOVSB y MOVSW) La instrucción MOVS se usa después de la instrucción 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. etc. repite) causa que la instrucción siguiente sea repetida hasta que el registro CX sea cero.en CX la longitud de la cadena 8. 8-152 . Para que este comando funcione. La instrucción CLD (Clear Direction Flag. Limpia bandera de dirección) indica al procesador que los registros SI y DI serán incrementados después de cada instrucción de manejo de cadenas mientras que la instrucción STD (Set Direction Flag. debemos colocar de antemano el número de repeticiones en el registro CX para lo cual entre muchas otras posibilidades. busca cadena) y CMPS (Compare String.2. compara cadena).Transferir de un área a otra: MOV SI. mueve cadena).

· 3.La Pila Cada vez que la instrucción MOVS se ejecuta suceden 3 cosas: · 1.en registro DS MOV AX.dirección del segmento fuente MOV DS.*************************************************** datos SEGMENT fuente DB 40 DUP(‘x’) datos ENDS .*************************************************** ASSUME DS:datos ASSUME ES:extra MOV AX.40 . SI es incrementado (o decrementado dependiendo de la bandera de dirección) ya sea en uno o dos bytes dependiendo si es transferencia de palabra o byte.OFFSET destino .en registro ES MOV SI. En esta operación no se modifica ninguna bandera. . CX es decrementado.OFFSET fuente .cuenta en CX REP MOVS . · 2. No es un programa completo pero es ilustrativo.*************************************************** extra SEGMENT destino DB 40 DUP(?) extra ENDS .AX . 8-153 . DI se incrementa (o decrementa dependiendo de la bandera de dirección) ya sea en uno o dos bytes dependiendo si es transferencia de palabra o byte.1 Complete el programa anterior con todas las instrucciones y pseudo instrucciones faltantes y ejecute. pero una vez que se logra esto. Mostramos un pedazo de código que mueve 40 letras “x” de su área de memoria fuente a su memoria destino.dirección del destino CLD .extra .bandera de dirección hacia adelante MOV CX.AX .datos .dirección de la fuente MOV DI.dirección del segmento destino MOV ES.Mueve toda la cadena Como se ve en el ejemplo anterior hay muchos registros que inicializar. Ejercicio 8. el trabajo es sencillo y lleva 2 instrucciones escritas en una sola línea (la última). Si llega a cero la transferencia termina.

repite mientras no igual) repite la operación CMPS o SCAS mientras CX sea distinto de cero o el resultado de una comparación 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 operación y el resultado de ésta. mientras que el destino es apuntado por DI y reside en el segmento extra (ES). 8. SI es incrementado (o decrementado dependiendo de la bandera de dirección) ya sea en uno o dos bytes dependiendo si es transferencia de palabra o byte. repite mientras igual) repite la operación CMPS o SCAS mientras CX sea distinto de cero o el resultado de una comparación cause que la bandera de cero sea limpiada (no cero) como resultado que dos palabras o bytes no sean iguales.DS:[SI] ES:[DI]. REPNE (Repite while not equal.2.5 Compara Cadenas (CMPSB y CMPSW) La instrucción CMPS se usa después de la instrucción REPE o REPNE y compara una cadena de una localidad a otra de la memoria. 8-154 . Cada vez que la instrucción CMPS se ejecuta suceden 3 cosas: · 1. REPE (Repite while equal.AL SI DI 8.Ensamblador La instrucción REP MOVS reemplaza al siguiente grupo de instrucciones repetidas CX veces: MOV MOV INC INC AL. Las banderas afectadas dependen de la operación y el resultado de ésta.4 REPE ó REPZ y REPNE ó REPNZ Estas instrucciones se utilizan sólo junto con las operaciones de comparación y búsqueda de cadenas (siguientes dos secciones) y señalan la terminación de dichas operaciones cuando el registro CX llega a cero o se localiza la cadena. La cadena fuente es apuntada por SI y reside en el segmento DS.2.

Si la cadena fuente es distinta de la destino.La Pila · 2. PF. DI se incrementa (o decrementa dependiendo de la bandera de dirección) ya sea en uno o dos bytes dependiendo si es transferencia de palabra o byte. · 2. REPE. ZF). DI se incrementa (o decrementa dependiendo de la bandera de dirección) ya sea en uno o dos bytes dependiendo si es transferencia de palabra o byte.2. Se usa esta instrucción para buscar un carácter dentro de una cadena. La cadena fuente es apuntada por DI y reside en el segmento extra (ES).6 Busca Carácter (SCASB y SCASW) La instrucción SCAS se usa después de la instrucción REPE o REPNE y compara una cadena de una localidad al registro AL (en caso de byte o AX en caso de palabra).AH salta SI DI otro 8.DS:[SI] AH. Si la cadena fuente es distinta al contenido de AL (o AX). CX es decrementado. · 3. Cada vez que la instrucción SCAS se ejecuta suceden 2 cosas: · 1. Si llega a cero la transferencia termina o: – A. B. OF. SF. Si llega a cero la transferencia termina o: A. 8-155 . Si la cadena fuente es igual a la destino. REPNE. REPE.ES:[DI] AL. La instrucción REPE CMPS reemplaza al siguiente grupo de instrucciones repetidas CX veces: otro: MOV MOV CMP JPZ INC INC JMP salta: AL. CF. CX es decrementado. En esta operación se modifican las banderas de acuerdo a la comparación realizada (AF.

0 . REPE. a la localidad de memoria apuntada por DS:SI. REPNE) no tienen sentido en este caso. REPNE.valor a traspasar REP STOSB .Ensamblador – B.7 LODSB y LODSW Este grupo de instrucciones cargan el contenido de una localidad de memoria por DS:SI al registro AL o AX según el tipo de operación.BL salta DI otro 8.ES:[DI] AL. En esta operación se modifican las banderas de acuerdo a la comparación realizada (AF.8 STOSB y STOSW Estas instrucciones pasan el contenido del registro AL o AX. según el tipo de operación.Inicializa una zona de 10 caracteres con 0 MOV CX.repite 10 veces la operación 8-156 . CF. nos puede servir para llenar un área de memoria con un valor conocido. Por ejemplo: . El uso de los repetidores (REP. OF. Después de la operación el registro SI es incrementado o decrementado (de acuerdo a la bandera de dirección) de forma automática en 1 ó 2 bytes. ZF). SF. Después de la operación el registro SI es incrementado o decrementado (de acuerdo a la bandera de dirección) de forma automática en 1 ó 2 bytes. PF.0Ah .cuenta 10 MOV AL.2. La instrucción REPE SCAS reemplaza al siguiente grupo de instrucciones repetidas CX veces: otro: MOV CMP JPZ INC JMP salta: BL. Si la cadena fuente es igual al contenido del registro AL (o AX).2. Con el repetidor REP. 8.

El usuario introduce una llave y a continuación .ES:datos .****************************************************************** Busca SEGMENT .parte principal del programa ASSUME CS:busca.0Ah.espacio para 127 caracteres llav_max DB 20d . 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).’No se encontro $’ mens4 DB 0Dh.****************************************************************** datos SEGMENT .0Ah.’Si se encontro $’ datos ENDS . real introducida oracion DB 127d DUP(?) .————————————————————————————————— ——————————Inicio: .****************************************************************** pila SEGMENT STACK.palabra pila y 4 blancos pila ENDS .long.espacio para 20 caracteres mens1 DB 0Dh.define la pila DB 20 DUP(‘pila ‘) .’Frase: $’ mens3 DB 0Dh.interrupción de DOS . real introducida llave DB 20d DUP(?) .una frase.función del teclado dos EQU 21h .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. .long. el programa decide si la llave se encuentra en la frase muestra EQU 9h .DS:datos.0Ah. máxima de frase ora_real DB ? .AX . lo que hace un poco más sencillo el manejo de la programación 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.define segmento de datos ora_max DB 127d . máxima de llave llav_real DB ? .0Ah.forma rápida de poner 0 en AX 8-157 .’Llave a buscar: $’ mens2 DB 0Dh.segmento de datos viejo SUB AX.BUSCA .guarda la valores para el regreso PUSH DS .long.función de despliegue teclado EQU 0Ah .long.segmento del código principal PROC FAR .

llave>long.y prepara a mostrar INT dos .llav_real .DS apunta ahora a nuestro segmento de datos MOV AX.teclado .dirección del segmento de datos MOV ES. de la frase .BX apuntador a inicio de frase .muestra .dirección mensaje MOV AH.long.OFFSET mens2 . CLD .dirección del segmento de datos MOV DS.————————————————————————————————— ——————————frase: .Ensamblador PUSH AX .Toma frase y guarda MOV DX.OFFSET llave_max .————————————————————————————————— ——————————.toma frase de teclado INT dos .CX long.OFFSET ora_max. frase .dirección mensaje MOV AH.————————————————————————————————— ——————————..datos .long.AX .————————————————————————————————— ——————————.hacia el registro DS .si long.y prepara a mostrar INT dos .OFFSET mens1 .Busca la llave en la frase .muestra .datos .————————————————————————————————— ——————————.ES apunta ahora a nuestro segmento extra MOV AX.SI apuntador a la llave .————————————————————————————————— ——————————.búsqueda hacia adelante MOV AL.dirección frase MOV AH.long.ora_real .guarda en pila (DS:0) .hacia registro ES la_llave: .DI apuntador a la frase . frase SUB AL.teclado .AX . llave + 1 .DX long.pide la frase y guárdala MOV DX.dirección de llave MOV AH.pide llave y coloca en memoria MOV DX. llave JL no_esta .toma llave de teclado INT dos . frase 8-158 .Toma llave y guarda MOV DX.

no. requerimos 8-159 .OFFSET mens3 .y guarda en CX REPE CMPSB .no se encontró llave MOV DX.BX apunta a inicio frase . continua siguiente .toma long.encontramos llave MOV DX.La Pila CBW . llave CBW .AX .BX .si.+1 MOV BX.Ve por otra llave y frase .muestra .OFFSET oracion . no está JMP compara . Asumamos que la llave tiene una longitud de tres caracteres.Ve por otra llave y frase RET .OFFSET llave .fin del programa Una vez que la llave y la oración han sido aceptadas.llav_real . Usa el registro BX como apuntador a los caracteres de la frase.AX .dirección mensaje MOV AH.repite hasta CX=0 o no se encuentre carácter JZ si_esta .————————————————————————————————— ——————————no_esta: .avanza apuntador a sig.muestra .cambia byte a palabra MOV DX. el programa procede a las comparaciones.convierte a palabra MOV CX.OFFSET mens4 .————————————————————————————————— ——————————principal ENDP .————————————————————————————————— ——————————si_esta: .————————————————————————————————— ——————————compara: MOV DI.prepara a mostrar INT dos JMP la_llave .poner en DX INC DX .fin del segmento END inicio .¿Acabamos? JZ no_esta .SI inicio de llave MOV AL. carácter de frase DEC DX .lugar donde comienza comparación MOV SI.no encontramos nada INC BX .dirección mensaje MOV AH. La comparación comienza desde el primer carácter.prepara a mostrar INT dos JMP la_llave .fin de programa principal busca ENDS .

sólo se busca en (longitud de la frase .3 Averigüe si el circuto MOTOROLA tiene instrucciones similares a las presentadas en este capítulo para manejo de pila y de cadenas.longitud de la llave + 1) caracteres sin necesidad de llegar al final. 8. 8. en la localidad llav_real y ora_real. en este caso.1 Convierta el programa BUSCA de forma tal que no se usen las instrucciones especiales de manejo de cadenas en la comparación. El registro SI apunta a las letras de la llave. Es necesario empujar DS a la pila pero también un cero para poder regersar al segmento adecuado de datos y que el programa lo sepa (segemento de datos en DS:0).3 Resumen Se introduce en este capítulo el manejo de la pila. 8. 8.Ensamblador de comparar la llave con los primeros tres caracteres de la frase de la siguiente forma: · 1. El registro DI apunta a las letras de la frase. Afortunadamente la interrupción del teclado (0Ah) regresa la longitud de lo que el usuario tecleó en la localidad inmediatamente después a la memoria reservada para dicha entrada. La instrucción CMPB se repite hasta que CX es cero o la comparación falla. · 2.2 Programe un algoritmo desde DEBUG que llene las localidades de memoria de la 200h a la 2FFh con un 0. 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 capítulo. Se analizan además. Para no buscar en toda la frase y hacer que el programa sea más rápido. 8-160 . El registro CX lleva la cuenta del número de letras de la llave. siempre importante en los diseños actuales de computadoras y programas. · 3.4 Problemas 8.

SCAS. POPF. MOVSW. RET n. IBM Personal Computer Technical Reference. STD. PUSHF. CLD. Barden William Jr. MOVSB. LODSW. STOSB. LODSB. STOSW 8. STOS. REPE. Marabout 1992. REPNZ. How to Program Microcomputers. CMPS. MOVS.La Pila 8. LODS. POP. Mercier Philippe Assembleur Facile. 8-161 . Sams & Company 1987. MASM 86 Columbia Data Products. REP. CMPSB. SCASB. CMPSW.6 Bibliografía Revista PC Magazine EU números de 1983. REPNE. EU 1986. Alleur Bélgica. REPZ. SCASW.5 Instrucciones Analizadas PUSH.

9-163 . Esto funciona muy bien en los confines del despliegue de letras. Los caracteres que se despliegan en la pantalla funcionaban en un principio como una serie de códigos ASCII que se mandaban al manejador de la pantalla uno a uno y éste se encargaba de todo lo demás.Capítulo 9 9. 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) están localizadas las letras C>DEBUG. Muchas de estas decisiones. Elemento de Pantalla). pero una vez que el usuario y los diseñadores exigen más de la pantalla.1 El Vídeo 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. buenas o malas. aún nos siguen persiguiendo con el fantasma de la compatibilidad. El siguiente paso consiste en reservar un área de memoria para cada localidad gráfica de la pantalla llamada PIXEL (Picture Element. ¡Hemos localizado el área de memoria reservada para la pantalla de video! Esta pantalla va de la dirección B800:0000 a la B800:0F9F (4000 bytes) y se forma por dos bytes por localidad. este esquema es inadmisible.

Byte de atributo del carácter INT 10 .renglón izq. F0. sup. 87 y 0F).0 . MOV DH.Servicio 02h de la interrupción 10h .0 . renglón AH . derecho MOV DL. derecha MOV BH.) diseñó: .Parámetros de salida : Ninguno 9-164 . MOV CL.llamada al ROM POP DX POP CX POP BX POP AX RET cls ENDP El siguiente programa usa de la misma forma la interrupción 10h: . 42. Desde DEBUG juguemos con los atributos: C>DEBUG -rds DS 08F1 :b800 -e0 Introduciendo la secuencia 41.columna izq. etc.24 .renglón inf.columna inf.42 y 43) pero en distintos atributos en la parte superior del video (códigos F0. El manejo del video se puede hacer también utilizando las rutinas de la interrupción 10h que el fabricante del BIOS (IBM.Código para limpiar pantalla MOV CH.Función de movimiento de pantalla MOV AL.0 .79 . 43. sup.Posiciona cursor en columna AL.Ensamblador ¿Pero qué significa el 07h que aparece a la izquierda de cada carácter? Hemos también localizado el byte de atributo de cada pixel de la pantalla.6 . 87.7 .Parámetros de entrada: AL y AH .Limpia la pantalla: Servicio 06h de la interrupción 10h del BIOS cls PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX MOV AH. F (Recuerde introducir usando la barra espaciadora y terminar usando la tecla de RETORNO) que da por resultado ABC (códigos 41. Phoenix.

interrupción 10h 9. en DL la columna .llamada al ROM .6 .0 . Esta característica es muy utilizada en los programas modernos integrados y ambientes en el que el manejo de las ventanas es la base.columna inf.0 INT 10h POP DX POP BX RET ir_a_XY ENDP . sup.Ventana: demostración del uso de ventanas . MOV DH. sup.servicio 2 de la .limpia pantalla MOV AH.————————————————————————————————— ——————————— 9-165 .0 . Mostraremos a continuación cómo colocar una ventana sencilla en la pantalla de 20 columnas de ancho y 9 renglones de alto colocada en la mitad de la pantalla: .en DH el renglón.————————————————————————————————— ——————————— .7 .El Video .Byte de atributo del carácter INT 10h .renglón izq.Registros destruidos : Ninguno IR_A_XY PROC NEAR PUSH BX PUSH DX MOV DX.página cero de la .24 . derecha MOV BH.renglón inf.2 MOV BH. derecho MOV DL.Código para limpiar pantalla MOV CH.AX MOV AH.2 Ventanas Las rutinas del ROM de una computadora IBM o compatible permiten el manejo de ventanas dentro de la pantalla.columna izq.Función de movimiento de pantalla MOV AL.79 . MOV CL. así como de varias páginas de video para animaciones rápidas y distintos trucos programáticos.NO utilice el ENTER para terminar una línea ventana SEGMENT ASSUME CS:ventana .0 .

servicio 2 de la MOV BH. acepta la entrada del teclado 20 veces tecla: MOV AH. derecha MOV BH.columna MOV AH.Renglón sup.————————————————————————————————— ——————————— .mueve pantalla hacia arriba MOV AH.30 . 2.cuenta a 20 .1 .6 .————————————————————————————————— ——————————— ventana ENDS END Ejercicio 9.renglón MOV DL.función del teclado INT 21h CMP AL. MOV DH. izq.————————————————————————————————— ——————————— .Define el segmento de video 9-166 . El siguiente código llena la pantalla con cierto carácter predeterminado y aprovecha que ya sabemos la dirección del área de memoria donde se guardan los datos de la pantalla. MOV CL.renglón inf.3 .termina LOOP tecla .1 Convierta el programa anterior en uno modular usando llamadas a subrutinas (CALL) en lugar de las secuencas de código insertadas para: 1. limpiar pantalla.16 .8 . mover renglón hacia arriba (Scroll).sigue hasta agotar CX .16 .Llena: llena la pantalla con un carácter . video JMP coloca salida: INT 20h . colocar cursor y 3.50 .Número de líneas MOV CH.función de mover MOV AL.Columna sup.página cero de la INT 10h . derecho MOV DL. colocar el cursor en las coordenadas adecuadas a la ventana coloca: MOV DH.Atributo normal INT 10h .2 .0 .llamada a int.20d .30 .Ensamblador . izq.Columna inf.7 .1 .interrupción 10h MOV CX.Si CTRL C JZ salida . .

apunta a segmento de video MOV AX.AX .0F9Fh .————————————————————————————————— ——————————— .cuenta .video MOV DS. 9-167 .tamaño de la pantalla (2048 bytes) video ENDS . Ejercicio 9.coloca carácter con atributo normal MOV AX.AX .El Video SEGMENT AT 0B800h DB 800h DUP(?) .AX en cero PUSH AX .————————————————————————————————— ——————————— .2 Modifique el programa anterior (llena) para usar la instrucción MOVS en lugar del lazo utilizado.segmento DS:0 .0 .incrementa contador en INC BX .inicio de pantalla MOV CX.2 bytes LOOP otro RET .inserta carácter INC BX .AX .————————————————————————————————— ——————————— llena ENDP codigo ENDS END video En el programa anterior remarquemos que no es posible regresar al SO usando una interrupción (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 instrucción RET.guarda el segmento viejo SUB AX.llena la pantalla otro: MOV [BX].————————————————————————————————— ——————————— .0701h MOV BX.********************************************************** codigo SEGMENT llena PROC FAR ASSUME CS:codigo ASSUME DS:video PUSH DS .

mientras más avanza la tecnología y los productos se vuelven populares por demanda o por baja de costos los diseñadores están presionados a mejorar día a día. Una posibilidad es el comando MODE del SO o cualquier utilería proporcionada por los fabricantes de los dispositivos controladores de video. pero la operación debe realizarse manualmente. y más colores.3 Utilizando el ejemplo del programa LLENA. Todo lo anterior desemboca en requerimientos más y más grandes de memoria pues el manejo de cada pixel requiere entonces de más bytes para especificar sus atributos y colores de los posibles de seleccionar. 9. modifique ahora el programa VENTANA para agregar un recuadro a la ventana. qué tipo de equipo está conectado en ese momento y guarda la información en un byte localizado en la dirección absoluta 00410h. Si se 9-168 . se pasa a mejores resoluciones. siendo común hasta 2M bytes y más en los controladores modernos Al ejecutarse el sistema operativo. Utilice las instrucciones de movimientos de cadenas.Ensamblador Ejercicio 9.3 Pantallas de Graficación Poco a poco ha habido una evolución en los dispositivos que conforman los sistemas de cómputo. · 2. más detalle (número de pixels). La alternativa es entonces automatizar el proceso dentro del programa que así lo requiera. Alterar algunos bits de un byte especial que reside en memoria llamado bandera del equipo. el SO reconoce por medio de los interruptores de la máquina. Al prender el equipo. 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 resolución casi fotográfica. Para lograr esto se requiere de dos pasos: · 1. Informar al BIOS del ROM que se ha modificado dicha bandera. De la sencilla pantalla de despliegue de caracteres en modo monocromático. éste “despierta” en modo de texto y es la obligación del programa que utiliza los servicios del sistema operativo de cambiar este modo.

A=Alta resolución 640 x 200 monocromático .C=Baja resolución 320 x 200 color tecla EQU 1h .muestra .escoge la bandera del equipo 9-169 .OFFSET mens .llamada a DOS .entrada del teclado muestra EQU 9h .————————————————————————————————— ——————————— .dirección del byte bandera DW ? rom ENDS .————————————————————————————————— ——————————— . AH=0.El Video quiere engañar al SO es necesario modificar los bits de esa localidad.MODO: cambia el modo de la pantalla a .Define el segmento de la bandera de video rom SEGMENT AT 040h ORG 10h .dirección del mensaje MOV AH. AH=0. · 320 x 200 pixels de color llamar con AL=4.despliegue en pantalla dos EQU 21h . · 640 x 200 pixel monocromático llamar con AL=6.Define segmento de código modo SEGMENT ASSUME CS:modo ASSUME DS:modo ORG 100h inicio: MOV DX. AH=0.prepara a desplegar INT dos .M=monocromático .************************************************ . Presentamos un corto programa que realiza esto precisamente: . 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 monocromática 80 x 25 caracteres La interrupción 10h maneja esto por nosotros con distintas alternativas de las que sólo investigaremos 3: · 80 x 25 caracteres monocromáticoal llamar con AL=2.

4 .Ensamblador ASSUME DS:rom MOV AX.entrada del teclado INT dos .y coloca bits de monocromático MOV bandera.00110000b .bandera .0 .bandera .llama a rutina de video JMP salida .finaliza .bandera del equipo AND AX.bandera .————————————————————————————————— ——————————— .bandera del equipo AND AX.quita los bits del video OR AX.regersa a su lugar MOV AL.2 .————————————————————————————————— ——————————— .AX .coloca en alta resolución alta_res: MOV AX.80 columnas en Blanco y Negro MOV AH.monocromático JE mono CMP AL.alta resolución JE alta_res CMP AL.————————————————————————————————— ——————————— .color JE color JMP inicio .rom MOV DS.11001111b .llama a rutina de video JMP salida .AX .11001111b .quita los bits del video OR AX.quita los bits del video MOV bandera.llama a DOS CMP AL.bandera del equipo AND AX.320 x 200 color MOV AH.regresa a su lugar MOV AL.finaliza .coloca en color 320 x 200 color: MOV AX.————————————————————————————————— ——————————— .’a’ .función de modifica equipo INT 10h .AX .11001111b .regersa a su lugar MOV AL.AX .6 .0 .y coloca bits de 640 x 200 MOV bandera.’c’ .0 .’m’ .Toma la letra del usuario y escoge la opción MOV AH.tecla .640 x 200 en Blanco y Negro MOV AH.00100000b .función de modifica equipo 9-170 .coloca en monocromático mono: MOV AX.función de modifica equipo INT 10h .

La forma de accesar la pantalla cambia también pues ahora se requiere de 320 x 200 (en baja resolución color) ó 64.llama a rutina de video .13.10 db ‘Teclee “m” para 80 x 25 monocromático’.000 bytes localidades de memoria para guardar la información 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.10 db ‘ “c” para 320 x 200 color’.10 db ‘ “a” para 640 x 200 monocromático’.000 localidades) en las siguientes combinaciones: · 00 negro · 01 amarillo · 10 azul · 11 blanco 9-171 .13. Establecemos en este momento la siguiente regla: REGLA.salir . SVGA o UVGA.El Video INT 10h . hemos forzado los datos en un sólo segmento y no en segmentos separados como en ejemplos anteriores. Otra cosa importante es que como deseamos un programa tipo COM.————————————————————————————————— ——————————— mens db 13.————————————————————————————————— ——————————— modo ENDS END inicio El programa anterior debe ser ensamblado en un archivo del tipo COM (usando EXE2BIN) y sólo puede ser usado en equipos con tarjeta CGA. VGA. Se puede tener más de un segmento en un archivo COM si este segmento es definido de antemano con la pseudo instrucción SEGMENT AT. la única excepción a esto es con el uso de la pseudo instrucción SEGMENT AT explicada en el parráfo anterior. El program hace uso de la pseudo instrucción SEGMENT AT que forza al segmento en una dirección explicita conocida de antemano.————————————————————————————————— ——————————— salida: INT 20h . EGA.13.10 db ‘Selección: $’ .

etc.2.4 Experimente en este punto con distintos códigos y vea el resultado. el código amarillo para cada uno de los 4 pixeles de cada byte.Ensamblador Experimentaremos un poco con el color y DEBUG una vez que ya tenemos el programa MODO ensamblado.) Probemos otros colores: -f 400 800 aa -f0 800 c00 ff Y llenemos ahora las líneas impares: -f 2000 2400 55 -f 2400 2800 aa -f 2800 2c00 ff Ejercicio 9.4.999 bytes) para las líneas impares (1.) · De las localidades 2000h a la 3F3Fh (7. Como primer paso necesitamos cambiar el modo de la pantalla a color resolución baja (320 x 200) usando nuestro programa MODO escogiendo la opción 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. ¿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.5. Lo que hemos logrado con el comando f es llenar las primeras 400h localidades del segmento de memoria con la constante 55h ó 01010101b. 9-172 . El color depende del monitor que estemos usando y del ajuste del mismo. etc.3.999 bytes) para las líneas pares (0.

para eso se requiere del llamado a la interrupción 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 mayúsculas derecha presionada · bit 1 Tecla de mayúsculas 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 numérico activada · bit 6 Tecla de bloqueo de mayúsculas activada · bit 7 Tecla de insertar activa . Desgraciadamente las teclas como mayúsculas.LINEAS Rutina para dibujo de linea en la pantalla utilizando . no tienen código. El programa opera usando las teclas 0. A su vez.el programa MODO de este mismo capítulo (opción c) arriba EQU 48H .1. es un poco difícil tratar de mantener el control de las dos áreas de memoria para gráficar un punto o línea de un lugar a otro. flecha hacia arriba 9-173 .Se requiere de monitor de color y de usar antes .El Video Como se puede suponer. hace uso de la interrupción 16h del teclado que nos regresa el código de cada tecla presionada. etc. bancos y pixels de cada byte. bloqueo de números. Para evitarnos este problema podemos usar una rutina del ROM que hace todo el trabajo: – – – – AH = 12h DX = número de renglón del punto a desplegar CX = número de la columna del punto a desplegar AL = color del punto En el siguiente programa evitaremos el uso de esta interrupción y diseñaremos el programa de forma tal que deba resolver todo lo relacionado a los colores.las flechas para la direccion .2 y 3 para definir el color del pixel y las flechas para definir la dirección de dibujo del mismo.

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

si es mayor que 3 (ASCII) JG grafica . defínelo AND AL. coordenada y en DX . si es hacia arriba resta línea no_arriba: CMP AL.————————————————————————————————— ———————————————graf_punto PROC NEAR . guarda en BL JMP lee_tecla . 1. toma siguiente caracter . coordenada x en CX.renglon y color PUSH CX 9-175 .derecha JNZ no_derecha INC CX no_derecha: CMP AL.AL . quita 5 bits superiores MOV BL. 320 x 200 en color . mascarilla los 2 bits más bajos salida: RET . entra con : . renglón en DX y columna en CX prendelo: MOV AL. arriba JNZ no_arriba . subrutina de graficación en pantalla .El Video CMP AL. encuentra hacia a donde ir y grafica siguiente punto grafica: MOV AL. llama a subrutina de gráfica que requiere color en AL. no es color CMP AL. color en AL(0=apagado.retrasa CALL graf_punto .columna. lee puerto B en AL JMP lee_tecla . si es menor que cero (ASCII) JL grafica . regresa a dos principal ENDP .2. salva BX.izquierda JNZ prendelo DEC CX .3 . resta línea no_abajo: CMP AL.30H . número entre 0 y 3.abajo JNZ no_abajo .3=colores) PUSH BX . poner código de búsqueda en AL CMP AL. si hacia abajo.AH . es un color. no es color .33H . final de parte principal de programa . resolución media. . salta si no es hacia abajo INC DX .BL . salta si no es hacia arriba DEC DX .

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

Presentamos un programa en el que al introducir una secuencia de 5 números (x1. 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. y2.|y2-y1| 9-177 .y2) y color (1.y1: coordenadas del punto inicial · x2. END inicio .Acepta 5 parámetros (x1.***************************************************** . El programa que sigue se basa en este algoritmo y en las interrupciones del ROM para graficar una línea recta entre dos puntos. éste espera 5 parámetros desde el teclado introducidos con ENTER: · x1.BRESENHAM: dibujo de una línea recta entre dos puntos de la pantalla . Una vez en el programa.|x2-x1| delta_y DW ? .2.y1). a diferencia de éstas. (x2. palabra o palabra doble. LABEL sólo 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 más tipos diferentes. .0) datos SEGMENT delta_x DW ? . LABEL WORD y LABEL DWORD que define o redefine una localidad como tipo byte. y1. color) realiza la línea utilizando el algoritmo de Bresenham.5 Investigar en qué consiste el algoritmo de Bresenham para dibujar una línea entre dos puntos en una pantalla. fin de ensamble Se introduce la pseudo instrucción LABEL BYTE.4. El dibujar líneas horizontales y verticales es muy sencillo pero en diagonal se vuelve un poco más complejo requiriendo de más pasos para definir qué pixeles encender y cuáles no.y2: coordenadas del punto final · color: el color para la línea al introducir el úlitimo dato el programa grafica la línea y espera otros 5 datos.3. Ejercicio 9. x2. Recordemos que las pseudo instrucciones DB y DW reservan y apartan las localidades de memoria necesarias según la definición realizada.El Video . Se requiere de este tipo de instrucciones pues el ensamblador es muy rígido con la definición de tipos y no es posible cambiar “al vuelo” el tipo de datos.use el programa MODO para cambiar a pantalla de color 320 x 200 .

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

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

Rutina de ROM para graficar punto requiere de: .————————————————————————————————— —————————————————graf_punto PROC NEAR PUSH BX .AX .SI .¿Se terminó la línea? JGE punto2 .delta_y .SI .DX=renglón.delta_y .1 .BX-|y2-y1| ADD CX.delta_x DX.inicializa registro BX MOV AX.BX-|x2-x1| .compara con |y2-y1|/2 JLE dcuenta2 .toma |y2-y1| SHR AX.mitad_y .Ensamblador JLE SUB ADD dcuenta: dcuenta BX.toma |x2-x1| MOV cuenta.toma y1 MOV BX. CX=columna.incrementa o decrementa Y DEC cuenta .no modificar inc/dec de Y .y1 .divide entre 2 MOV mitad_y.y guarda .delta_x .color 9-180 .x1 .————————————————————————————————— —————————————————pend PROC NEAR .pendiente > 1 MOV AX.grafica punto ADD DX.0 .no incrementar o decrementar X SUB BX.delta_y .aún no RET pend_1 ENDP .aún no RET pend ENDP .Inicia valores MOV CX.DI .BX+|x2-x1| CMP BX.¿Terminamos? JGE punto . AL=color MOV AX.AX .y guarda en cuenta punto2: CALL graf_punto .guarda registros PUSH CX PUSH DX PUSH AX PUSH SI PUSH DI .toma x1 MOV DX.incrementa o decrementa Y ADD BX.incrementa o decrementa X dcuenta2: DEC cuenta .

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

1 Modifique el programa BRESENH de forma que salte un renglón después de aceptar cada parámetro. IBM Personal Computer Technical Reference. 9. Marabout 1992. How to Program Microcomputers. 9.2 Modifique el programa BRESENH de forma que acepte alguna tecla que usted defina para terminar la ejecución.3 Modifique el programa BRESENH para que limpie la pantalla despues de la graficación de cada línea.7 Bibliografía Revista PC Magazine EU números de 1993. Apéndice A 9-182 . MASM 86 Columbia Data Products. Mercier Philippe Assembleur Facile. Alleur Bélgica.4 Resumen 9.Ensamblador END inicio .5 Instrucciones Analizadas SEGMENT AT. Barden William Jr. 9.fin de programa 9. LABEL BYTE. LABEL WORD 9.6 Problemas 9. Sams & Company 1987. EU 1986.

10-183 .1 Archivos Por razones históricas 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 interrupción regresa un número 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 métodos e ilustraremos con breves programas. 10.Capítulo 10 10.2 Acceso Secuencial El primer paso para el acceso a los datos de un archivo es guardar el nombre junto con otra información en un área de memoria preestablecida llamada Bloque de Control de Datos (File Control Block o FCB). El tercer paso es abrir el archivo y el cuarto y último sera cerrar el archivo una vez que los datos han sido leídos o escritos a él. 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).

DEBUG comienza siempre en la dirección 100h del segmento correspondiente. Función de abrir un archivo.0F INT 21 INT 20 Pero aún no hemos especificado el nombre del archivo. El primer servicio que veremos es el de abrir un archivo y corresponde al servicio 0Fh. Servicio 0Fh de la interrupción 21h Registros: AH=0Fh DS=Dirección del Segmento del FCB DX=Desplazamiento de la dirección del FCB (El nombre del archivo con su extensión deben estar ya en el FCB) Regresa: AL=00 AL=FF FCB el archivo se encontró y abrió El archivo no existe # de disco.fecha. sin embargo colocamos un número (5C) que corresponde al lugar donde estará el nombre del archivo. el FCB ocupa las localidades del 5Ch al 7Ch (en los accesos aleatorios es hasta 80h) seguido del DTA de la dirección 80h a la FFh.tamaño archivo.tamaño de registro. 10-184 .# bolque. 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.etc.Ensamblador La interrupción utilizada para el manejo de archivo es la 21h con distintos servicios solicitados por medio de datos en el registro AH.5C MOV AX. Practiquemos a abrir un archivo desde DEBUG: Primero creamos el archivo copiándolo desde el teclado: C>COPY CON prueba.txt ejemplo de información^Z 1 files(s) copied C>DEBUG -a100 MOV DX. ¿Qué hay en las localidades del 00h al FFh? Estas localidades forman parte del Prefijo del Segmento del Programa y dentro de éste.

los 4 siguientes en la dirreción donde los programas terminan.El Acceso a Disco El prefijo del segmento del programa de DEBUG consiste. Ejecutemos ahora nuestro programa con G. Dejemos que DEBUG nos ayude y usemos el comando N. -d0 Veremos que los bytes a partir del 5Ch han sido modificados y contienen ahora el nombre del archivo PRUEBA. los 6 siguientes en la dirección del despachador de DOS. pero primero llenemos algunas localidades con un valor conocido como por ejemplo 22. mayoritariamente en información que el SO y el programa requieren saber de un archivo en particular. los siguientes 2 el tamaño de la memoria disponible.TXT que DEBUG colocó ahí. Si desplegamos de nuevo la dirección 0 (D0) nos encontramos que todo el panorama del FCB ha cambiado y muestra nueva información de acuerdo a la siguiente tabla: 10-185 . El siguiente paso consiste en especificar el nombre del archivo que queremos abrir. Esta estructura se muestra en detalle en el apéndice E del libro IBM Personal Computing Disk Operating System. etc. en este caso. -f 40 7f 22 -nprueba. los siguientes dos en la dirección de salida para una interrupción por teclado (IP).txt y comprobemos con D. por ejemplo los 2 primeros bytes a partir de la dirección 0 son la INT 20h.

1 El FCB SO=datos llenados por el SO al abrir el archivo usuario=datos proporcionados por el usuario 0 5C Número 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 extensión archivo usuario 11 67 12 68 bloque actual SO 13 69 14 6A tamaño registro SO 15 6B 16 6C tamaño archivo (bajo) SO 17 6D 18 6E tamaño 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 (alto) usuario 36 80 Expliquemos brevemente las localidades más relevantes: – En la dirección 5C encontramos ahora un 02 que corresponde al disco C. en la 6A encontramos ahora 80h (128d) que es el tamaño 10-186 . aleatorio (bajo) usuario 34 7E 35 7F # reg.Ensamblador Tabla 10.

El servicio 14h de la interrupción 21h nos permite leer secuencialmente de un archivo: Función de lectura secuencial. B. Por ejemplo 0001111.fin de transferencia fin de archivo Desde DEBUG metamos ahora el siguiente programa: 10-187 . Los siguientes 4 bits al mes. byte bajo. Los últimos 7 bits al año que se deben sumar a 1980. Una vez que el archivo fue abierto. podemos proceder a leer su información.El Acceso a Disco – – – del registro que el sistema operativo toma por omisión pues es el tamaño estandard para archivos secuenciales. Recuerde que se especifica primero byte alto. C. Por ejemplo 01001 ó día 9.INT 21h servicio 14h Registros: AH=14h DS=Dirección del Segmento del FCB DX=Desplazamiento de la dirección del FCB (El nombre del archivo con su extensión. palabra alta. Por ejemplo 1000 ó mes 8. 15d que corresponde a 1995. bloque actual. De las localidades 72h a 7Bh se encuentra la dirección donde está almacenado físicamente el archivo. Los primeros 5 bits corresponden al día. palabra baja.no hay datos en el registro DTA muy pequeño. En las localidades 6C hasta la 6F se encuentra el tamaño del archivo y en este caso es de 16h (22d) bytes. La fecha se encuentra almacenada en las localidades 70h y 71h y en nuestro caso encontramos el número 09h 1Fh nuevamente en el orden invertido (1Fh 09h ó 0001 1111 0000 1001) con la siguiente convención: A. es un poco complicado y no lo tocaremos en este momento. registro actual y el tamaño 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.

encontramos el texto que contienen nuestro archivo muestra. Usando el comado E7C pongamos un cero en esa localidad. 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.llamada al SO muestra EQU 2h . 1Ah) que la mayoría de los procesadores colocan de forma automática: . Al terminar el programa.abrir archivo .5C AH. 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.vuelve a DEBUG Antes de ejecutar el programa llenemos con la instrucción f las localidades 80h a FFh con un valor conocido. el archivo debe terminar con un símbolo de fin de archivo (EOF.ejecutar junto con el nombre del archivo .servicio de lectura .SECUENCI: Lee un archivo ASCII y preséntalo en la pantalla .dirección del FCB .————————————————————————————————— ———————————————— . Para que este programa funcione.llama a DOS .llamada al SO fcb EQU 5Ch .0F 21 AH. esto es.llamada al SO abre EQU 0Fh . En la localidad 7Ch debemos colocar de antemano el número de registro a leer pero en este caso el archivo es tan pequeño que con el primer registro basta.————————————————————————————————— ———————————————— dos EQU 21h .llamada al SO eof EQU 1Ah .llama a DOS .llamada al SO 10-188 .llamada al SO lee EQU 14h .14 21 20 . Ejecutemos ahora el programa y revisemos con el comando D las localidades de la 80h a la FFh. esta localidad se incrementa en 1 pues ahora debe apuntar al siguiente registro por lo que una segunda ejecución del programa nos daría el siguiente registro. Pasemos ahora a un programa más sofisticado de lectura secuencial. una lectura secuencial.Ensamblador MOV MOV INT MOV INT INT DX.

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

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 .————————————————————————————————— ————————————————— datos SEGMENT ORG 7Ch regnum DB ? ORG 80h dato DB 80h DUP(?) .memoria para el teclado fcb EQU 5Ch .————————————————————————————————— ———————————————— .ASCII de ALIMENTA LINEA . algo similar al comando N de DEBUG.llamada al SO crear EQU 16h .área DTA datos ENDS . 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. Otra cosa a notar es el manejo del registro DS y ES que el sistema operativo.área de control de archivo cr EQU 0Dh .crear archivo escribe EQU 15h . inicializa con los datos del mismo programa apuntando a los segmentos adecuados.cierra archivo mem_prov EQU 0Ah .despliega carácter cierra EQU 10h . por tratarse de un archivo tipo EXE.————————————————————————————————— ———————————————— dos EQU 21h . Existe también un traslape de 1 byte entre el FCB y el DTA en la dirección 80h.————————————————————————————————— ————————————————guarda SEGMENT 10-190 .ASCII de RETORNO lf EQU 0Ah .TXT).Ensamblador secuencial ENDS END inicio El programa requiere del nombre del archivo que queremos leer y ver en la pantalla como parámetro del programa: SECUENCI LEEME. En el caso de acceso secuencial no hay problema pues el byte no es usado.TXT. el SO se encarga entonces de llenar el FCB con los datos del archivo (en este caso LEEME.

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

————————————————————————————————— ————————————————— guarda ENDS END inicio Los datos se introducen al programa línea a línea terminando con RECuando introducimos un RETORNO unicamente el programa cierra el archivo y regresa el controla al SO. 10-192 . Se han introducido dos nuevas funciones en el programa como se resumen en las siguientes tablas: TORNO.Ensamblador .

2 Agregue al programa GUARDA una rutina que mande a la pantalla un CR y LF por cada línea introducida. dejándolo con longitud 0. bloque actual. Función de Escritura Secuencial. De ahí es tomada cuando la longitud del sector es excedida o hasta que se cierra el archivo guardando la información en ese momento presente en el archivo. registro actual y el tamaño 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 pequeño.INT 21h servicio 16h Registros: AH=16h DS=Dirección del Segmento del FCB DX=Desplazamiento de la dirección del FCB (El nombre del archivo con su extensión 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 función pues si el archivo ya existía se borra. Ejercicio 10. Un sector tiene una longitud de 512 bytes y es la unidad básica de almacenamiento en archivos. Si el registro no es lo suficientemente grande como para llenar un área del disco llamada sector. 10-193 .INT 21h servicio 15h Registros: AH=15h DS=Dirección del Segmento del FCB DX=Desplazamiento de la dirección del FCB (El nombre del archivo con su extensión. la interrupción se encarga de incrementar el número de registro por nosotros dejándolo apuntando al siguiente. es colocado en una memoria temporal por el SO. fin de transferencia En la escritura secuencial.El Acceso a Disco Función de Crear un Archivo.

Una razón por la que los accesos aleatorios son más fáciles de manejar es debido a que en los accesos secuenciales se requieren de tres bytes: · El primero en la dirección 7Ch para especificar el número de registro a leer o escribir. En una lectura/escritura aleatoria.3 Acceso Aleatorio Una segunda forma de leer los registros de un archivo es de forma aleatoria.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. sin ningún orden en específico. Cuando 127d registros han sido escritos al archivo. El manejo de una palabra doble es directo con las instruccions 10-194 . cuesta también bastante trabajo. Agrege otra rutina para dar instrucciones específicas para el uso del programa. Aunque es posible en un programa de ensamblador. el bloque debe entonces incrementarse y el contador de registros colocarse en 0. se controla sólo el número de registro formado por 4 bytes que nos da un total muy grande de registros dentro de un archivo. · El segundo y tervero en las direcciones 68h y 69h para especificar el número de bloque. Ejercicio 10.4 Si el programa GUARDA. esto es.Ensamblador Ejercicio 10. 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.

————————————————————————————————— ————————————————— datos SEGMENT 10-195 . El nombre del archivo se introduce como parte del comando para ejecutar el programa y el número de registro como primer dato del programa. .fin de transferencia fin de archivo El programa que presentamos a continuación lee un sólo registro de cualquier parte de un archivo.LEEALEA: Lee registro en forma aleatoria de un archivo .no hay datos en el registro DTA muy pequeño. El programa debe encargarse de insertar el número adecuado de registro en la zona del FCB del archivo antes de cada lectura o escritura.lee un carácter del teclado fcb EQU 5Ch . Función de Lectura Aleatoria. La función 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 automática.despliega carácter tecla EQU 1h . el tamaño del registro y el número de registro deben estar en el FCB) Regresa: AL=00 AL=01 AL=02 AL=03 registro del archivo leido exitosamente fin de archivo.INT 21h servicio 21h Registros: AH=21h DS=Dirección del Segmento del FCB DX=Desplazamiento de la dirección del FCB (El nombre del archivo con su extensión.área de control de archivo eof EQU 1Ah .————————————————————————————————— ———————————————— .abre un archivo leer EQU 21h .ASCII de fin de archivo .El Acceso a Disco de ensamblador y el control se torna entonces sumamente sencillo y directo.————————————————————————————————— ———————————————— dos EQU 21h .leer de un archivo aleatorio muestra EQU 2h .llamada al SO abre EQU 0Fh .

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

0 de MS-DOS se prefiere que el manejo de archivos. sus FCB y DTA sean realizados por el mismo sistema operativo. 10. No hay FCB. Manejo por medio de manijas. El nombre del archivo se reemplaza por nombre + extensión + camino completo seguido de un byte en cero y se le denomina ASCIIZ por el cero adicional. No hay Registros.El Acceso a Disco . por lo que ya no es necesario preocuparse de ellos. Otra mejora sustancial en el método de acceso a archivos es el manejo uniforme de errores. El escribir a un registro secuencial sigue la misma mecánica que la lectura por lo que no nos entretendremos con ello.4 Manejadores de Archivos A partir de la versión 2. · 3. Los parámetros varios del FCB han sido “absorbidos” por el SO y ya no son visibles al usuario. la bandera de acarreo se fija (podemos probar la condición con un salto condicional 10-197 . los registros desaparecen y son sustituidos por el número de bytes que queremos leer/escribir/accesar de un archivo. nos encontramos con tres diferencias principales: · 1. · 2.————————————————————————————————— ————————————————— leealea ENDS END inicio Para conservar el programa sencillo sólo se aceptan números del 0 al 9 que se convierten de ASCII a binario restando 30h y la región del DTA se deja en su lugar (dirección 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. Al igual que el FCB. La única recomendación es no tratar de leer un registro que no existe y escribir sólo sobre registros que ya existen. Al usar estos servicios de las interrupciones proporcionadas por los diseñadores del SO. Las manijas son números de control de 16 bits que nos permite manejar el archivo por una referencia simbólica en lugar de por nombre. siempre que una función genere un error.

Ensamblador JC) y el registro AX contiene el número 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 Número de Función Inválida Archivo no encontrado Camino no encontrado Demasiados archivos abiertos Acceso denegado (atributo o código de acceso equivocados) Manija inválida Bloques de control de memoria destruídos Memoria insuficiente Bloque de dirección de memoria inválido Ambiente inválido Formato inválido Código de acceso inválido Datos inválidos no se usa Disco inválido Intento de remover el directorio actual No es el mismo dispositivo No hay más archivos Al abrirse el archivo se le asigna un código de acceso que determina si el archivo es de sólo lectura (código 0). No es archivo sino etiqueta de volumen. Archivo oculto. Sólo lectura. · bit 1. · bit 2. De la misma manera se le asigna un atributo en un byte: · bit 0. de sólo escritura (código 1) o de lectura y escritura (código 2). Archivo de sistema. · bit 3. 10-198 .

El Acceso a Disco · bit 4. Presentamos a continuación las distintas funciones para leer.4. El atributo de un archivo se puede cambiar usando el servicio 43h de la función 21h y se usa el registro CX para fijar el atributo. crear. No es archivo sino subdirectorio.2=lectura/escritura) Regresa: Bandera de acarreo 0 si no hay error.. etc. abrir. 1 si hay error (CF) AX AL=02 manejador de archivo o código de error DTA muy pequeño.. cerrar. un archivo con manijas y un programa que integra algunas de estas funciones como ejemplo: Función de Abrir Archivo. escribir.1=escritura. · bit 5. Indica que es un archivo.INT 21h servicio 3Dh Registros: AH=3Dh DS=Dirección del Segmento de cadena ASCII+0 DX=Desplazamiento de la dirección de cadena ASCII+0 AL=Códig o de (0=lectura.5 y 12) Acceso 10-199 .fin de transferencia (los errores posibles son 2.

0 si fin de archivo o código de error (posiblemente 5 ó 6) Función Crear un Archivo.INT 21h servicio 3Ch Registros: AH=3Ch DS=Dirección 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 código de error (posiblemente 3.4 ó 6) 10-200 .INT 21h servicio 3Fh Registros: AH=3Fh BX=Manejador de archivo CX=Número de bytes a leer DS=Dirección 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.Ensamblador Función Lee de Dispositivo o Archivo.

INT 21h servicio 40h Registros: AH=40h BX=Manejador de archivo CX=Número de bytes a escribir DS=Dirección 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 código de error (posiblemente 5 ó 6) Función Cierra Archivo.El Acceso a Disco Función Escribe a Dispositivo o Archivo.INT 21h servicio 3Eh Registros: AH=3Eh BX=Manejador de archivo Regresa: Bandera 0 si no hay error de acarreo (CF) AX código de error si es que lo hay (posiblemente 6) 10-201 .

mem.0Ah.bytes leidos DB 50 DUP(?) .almacenamiento de manija .0Ah.INT 21h servicio 42h Registros: AH=42h AL=00 Mover desde el inicio los bytes que señale CX:DX AL=01 Mover apuntador desde la localidad actual+bytes señalados por CX:DX AL=02 Mover apuntador a fin de archivo+bytes señalados por CX:DX. del registro manija DW ? .’Nombre del archivo con todo y camino:’.0Ah.’Datos: (termine con ENTER)’.servicios varios de DOS datos SEGMENT .0Dh.0Dh. del registro DB ? .’$’ 10-202 .————————————————————————————————— ———————————————— llama_dos EQU 21h .CREAARCH: Crea un archivo con manijas y escribe en él . prov.long.Ensamblador Función Posiciona Apuntador de Lectura/Escritura. si 0 regresa tamaño del archivo BX=Manejador de archivo CX=Número de bytes de desplazamiento dentro del archivo (parte alta) DX=Número 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 posición (parte alta) apuntador a la nueva posición (parte baja) o código de error (posiblemente 1 ó 6) .bytes leidos DB 80 DUP(80) . prov.Define segmento de datos nombre DB 50 . del nombre registro DB 80 .0Dh.0Ah.0Ah.nombre de archivo DB ? .zona de mensajes del programa mensj1 DB 0Dh.’$’ mensj2 DB 0Dh.————————————————————————————————— ———————————————— .mem.

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

y ajusta CX MOV AH.Compara bytes escritos con los que solicitamos escribir JNE error .función de despliegue INT llama_dos MOV BX.09h .y nueva línea ADD registro+1.función de despliegue INT llama_dos .y pasa a reg.OFFSET crlf . MOV AL.09h .dirección de mem.# a convertir en BX binhex PROC NEAR MOV CH.40h . AL 10-204 .registro+1 .toma el # de error CALL binhex .Ensamblador JLE salir .maneja los errores MOV DX.encargarse de la pantalla MOV AH.manija .desplaza dígito a la izq.registro+1 .toma la manija MOV AH.cuenta a 4 bits ROL BX.función de escritura a archivo INT llama_dos JC error .y si no salir .2 .Subrutina para convertir de binario a hexadecimal y desplegar en pantalla .si hay un error.manija .ajusta al nuevo final MOV DX.manija .————————————————————————————————— ———————————————— .registro+1 . prov.termina cerrando principio ENDP .Escribe al archivo el registro MOV BX.agrega salto de línea MOV [registro+BX+3].0Dh .coloca manija en BX MOV DX.3Eh .vuelve por más registros salir: .si no son iguales hay un error JMP otra_linea .CL .BL .OFFSET registro+2 .0 .termina normalmente error: . despliega RET .0 .4 .coloca cuenta MOV BH.Cierre el archivo y termina MOV BX.0Ah . MOV CL.4 .número de dígitos rota: MOV CL.convierte a hexadecimal y despliega JMP salir .OFFSET mensje .Inserta salto de línea al registro MOV BL.función de cierre de archivo INT llama_dos JC error .el mensaje de error MOV AH.y ajusta BX MOV [registro+BX+2].si hay un error salir CMP AL.# de bytes a escribir MOV CH.

el dígito está entre A y F despliega: MOV DL.El Acceso a Disco AND AL.Despliega si ente 0 y 9 ADD AL.0Fh .Llama a DOS DEC CH . Renombra directorio Todas ellas documentadas en el apéndice D del manual IBM Personal Computer Disk Operating System 10-205 .2h .Regresa binhex ENDP .————————————————————————————————— ———————————————— creaarch ENDS . Cambia a otro directorio · Servicio 17h. Borra un archivo · Servicio 3Ah. Crear un directorio · Servicio 56h.quita dígitos de la izq.3Ah .¿Es mayor que 9? JL despliega . Renombre un archivo · Servicio 41h. Como funciones auxiliares de la interrupción 21h no analizadas incluimos las siguientes · Servicio 39h. ADD AL.Función de despliegue INT llama_dos . algunas veces es conveniente dividir la longitud total de un archivo en registros de longitud fija que nos faciliten la tarea de encontrar información en cierto punto.¿Terminamos con los 4 dígitos? JNZ rota .Coloca ASCII en DL MOV AH.Si aún no se termina RET .AL . Remueve un directorio · Servicio 3Bh.7h .30h .convierte a ASCII CMP AL.————————————————————————————————— ———————————————— END inicio Aunque en el manejo de archivos con manija no se requiere de registros sino de bytes.

Resumen 10. How to Program Microcomputers. EU 1986. Sams & Company 1987. Barden William Jr. Apéndice D Morgan L. Bibliografía Revista PC Magazine EU números de 1980-93. IBM Personal Computer Technical Reference.Ensamblador 10. Christopher Bluebook of Assembly Routines for the IBM PC The Waite Group USA 1987 10-206 . MASM 86 Columbia Data Products. Problemas 10.

Pero por otro lado esa es su debilidad pues cuesta mucho trabajo y tiempo hacer programas en ensamblador. 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 sólo ejecutable uniendo las librerías y demás elementos necesarios para el funcionamiento del programa.1 La Asignación 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.1. el ligador desentraña las localidades requeridas y el problema se simplifica. El interprete o el compilador se encarga de asignar las localidades. En el otro extremo del espectro se encuentran los lenguajes de alto nivel como PASCAL o C donde es fácil realizar los programas pero muchas veces no obtienen la rapidez necesaria o el acceso a los dispositivos requerido.Capítulo 11 11. El reunir dos objetos de distintos lenguajes tiene problemas específicos que analizaremos por separado en las siguientes secciones. En el caso de un lenguaje compilado. Las cosas cambian cuando se unen con uno de ensamblador pues es necesario tomar en cuenta más módulos independientes. En el caso de un 11-207 . 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.

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.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 función y regrese su resultado al programa de lenguaje de alto nivel.Ensamblador interprete se requieren de ciertos trucos para encontrar como localizar el programa en memoria sin conflictos.1. 11.1. 11. 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).3 Pasando Argumentos En la gran mayoría de los casos se requieren de parámetros para que el programa de ensamblador haga su trabajo y a la vez regrese resultados al programa que lo llama.1. La información se pasa usualmente en forma de apuntadores (direcciones a las variables) que deben de ser resueltos en el programa de ensamblador. 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. coloca el valor de estas variables también en la pila simplificando nuestra labor en ensamblador. En el caso de los compiladores el paso es sencillo pues además de colocar las direcciones de las variables en la pila. Se debe estar de antemano de acuerdo en los argumentos que se pasan entre los programas y se debe también establecer un protocolo estricto que se debe de seguir al pie de la letra para la interfase. 11.4 Pascal y Ensamblador El sistema de interfase de todos los lenguajes de alto nivel compilados a ensamblador siguen más o menos los mismos lineamientos que consisten en los siguientes pasos: 11-208 . 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 transmisión de argumentos entre uno y otro lenguaje.

SP En esta secuencia se establece BP como el apuntador a la pila semipermanente para facilitar la referencia a los argumentos.reserva 4 bytes (2 palabras) en la pila WORD PTR [BP-2].0 . MOV MOV BP BP.1.segunda palabra a 0 No se debe olvidar de incrementar SP antes de salir de la función para restaurar los apuntadores.1. El ligador no puede unir módulos incompatibles y que se declaren de forma incorrecta.4. Al decrementar SP en una cantidad par. SS y DS así como BP (ya guardado): 11-209 .1. Se debe de comenzar la función con dos instrucciones: PUSH MOV BP BP. El modelo de PASCAL debe de definirse como grande (. aseguramos un espacio en la pila: PUSH MOV SUB .1 Definir la función.MODEL LARGE) 11.4.1.4.SP SP. 11.0 . 11.primera palabra a 0 WORD PTR [BP-4].4 .Interfase a otros Lenguajes 11.3 Apartar espacio para los datos locales (opcional) Las funciones en ensamblador pueden usar la misma técnica que las de alto nivel para apartar espacio en la pila para sus datos provisionales. .2 Entrar a la función. DI. . Las funciones y datos en ensamblador deben de definirse como públicas con la directiva PUBLIC.4. Inicializar de esta forma el apuntador asegura que BP permanezca constante durante el proceso y se pueda hacer referencia a cada parámetro como un desplazamiento fijo de BP.4 Conservar los valores de los registros Se deben de conservar los valores de los registros SI.

.5 Acceder parámetros 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 Parámetro Parámetro . BP BP.segundo parámetro ..1.4 SI DI SS DS .1.SP SP.. ..4. 11. 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 Dirección 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 número de los parámetros es predefinido y podemos asignarlo de la siguiente manera: para1 para2 para3 EQU EQU EQU [BP+6] [BP+8] [BP+10] .tercer parámetro 11.Ensamblador PUSH MOV SUB PUSH PUSH PUSH PUSH .primer parámetro . . .6 Regresar valores (opcional) El valor que se regresa se almacena en un registro y en general obedece a la siguiente convención: 11-210 .4.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 función.

define el segmento como público ASSUME CS:codigo PROC FAR PUSH BP MOV BP. SI o DI estos deben de restaurarse de la pila en orden inverso en el que fueron guardados · 2.CL . Si se regresa a BASIC. la función se encarga de ajustar la pila.salida).AX=AX x 2CX POP BP RET 4 .5)). END.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.argumento 1 en AX MOV CX. BEGIN WRITELN(‘5 x 2^5 es’. Mostramos el siguiente ejemplo de PASCAL para llamar a una subrutina en la que se calcula A x 2B PROGNAM prueba(entrada. FORTRAN o PASCAL agregar n a la instrucción RET para ajustar la pila al número de parámetros.argumento 2 en CX SHL AX. Si se asigno espacio para variables locales en la pila.BP · 3. FUNCTION eleva(a.b:INTEGER):INTEGER.[BP+8] .Ajusta la pila al salir ENDP ENDS eleva codigo 11-211 . Si se regresa a C. Y la rutina en ensamblador es codigo eleva SEGMENT BYTE PUBLIC .SP MOV AX. DS. Salir de la función con RET. EXTERNAL.eleva(5. Si se salvaron los registros SS.4. Recuperar BP de la pila · 4.[BP+6] . el apuntador SP se debe de restaurar con la instrucción MOV SP.7 Salir de la función Al terminar nuestra función y regresar al programa que llama se deben de realizar varios pasos: · 1.

[BP+8] .argumento 2 en CX SHL AX. si importan las mayúsculas y minúsculas.1.CL .define el segmento como público ASSUME CS:codigo PROC FAR PUSH BP MOV BP. Declare los procedimientos en C como lejanos (FAR) · 2. – c) Los parámetros se pasan por valor a excepción 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 módulos. EXTERN INT eleva(int. Recuerde que C solo reconoce los primeros 8 caracteres y que a menos de que se especifique lo contrario.5 C y Ensamblador Un programa en C puede llamar a uno en ensamblador tal como si se tratase de otro modulo o función escrita en C.int). MAIN() { PRINTF(‘5 x 2^5 es %d\n’. } Y la rutina en ensamblador es codigo _eleva SEGMENT BYTE PUBLIC .5)).Ensamblador END 11. Observe las siguientes convenciones: – a) Regrese con un simple RET sin tratar de ajustar la pila – b) Los parámetros se colocan en la pila en el orden inverso en el que aparecen en la lista de la llamada.[BP+6] .eleva(5.AX=AX x 2CX POP BP RET . El primer parámetro se encuentra en la parte baja de memoria.argumento 1 en AX MOV CX. Para tal propósito se den de seguir los siguientes pasos: · 1.Salir sin ajustar la pila ENDP ENDS _eleva codigo END 11-212 .SP MOV AX.

El primer programa que queda residente en memoria esperando nuestras ordenes es el interprete de comandos del mismo sistema operativo.2 Programas Residentes El uso de programas que terminan y quedan residentes en memoria (Terminate and Stay Resident. Las más comunes son las del teclado o las del reloj interno del sistema (tomadas de la Tabla de Vectores de Interrupción). recuperar de la pila los registros. ejecutarla de forma que intercepte las rutinas de interrupción 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 dirección distinta de terminación y a partir de la cual la memoria principal queda libre para el usuario o los programas de aplicación del usuario. banderas y segmentos para poder recuperarlos al salir. 11-213 . · Al comenzar nuestro programa guardar todos los registros. El concepto básico detrás de los programas residentes es el de crear una rutina (usualmente un programa corto de utilería). ISR) o a petición nuestra (TSR). Los pasos básicos de todo sistema que debe de quedar residente son: · Conocer el tamaño del programa que debe de quedar residente. El programa de esta forma residente puede entonces realizar su función ya sea de forma automática (Interrupt Service Rutine. · Al terminar nuestro programa. banderas y segmentos. TSR) es una idea tan vieja como el del uso del sistema operativo.Interfase a otros Lenguajes 11. ¿Por qué no ir un poco más allá y extender el concepto a cualquier programa del usuario? La idea suena atrayente y es un método efectivo de extender las funciones de un sistema operativo que no es multi-tareas ni re-entrante sin necesidad de modificarlo. Existen varios problemas técnicos para poder lograr que un programa residente ejecute bajo las ordenes del SO pero todos ellos pueden ser resueltos de una u otra forma. · Interceptar el vector de servicio que atiende a una interrupción en particular por medio de la cual nuestro programa ‘despertará’ y realizará la función para la cual fue diseñado. · Finalizar el proceso dejando el control a la rutina original de atención a la interrupción.

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 través de las rutinas de interrupción que el propio sistema operativo proporciona. Sin embargo. El programa intercepta los comandos dirigidos a otras rutinas y las modifica de acuerdo a su propósito por lo que puede causar ciertos conflictos si no es diseñado con cuidado. De la misma forma. llamados bloques de almacenamiento. 11-214 . estos apuntadores indican la dirección del prefijo del segmento del programa (Program Segment Prefix o PSP) y la longitud del programa en segmentos. El proceso se torna entonces sencillo. guardarla en el registro DX y llamar a la función 31h de la interrupción 21h del SO (manten proceso) o a la interrupción 27h (termina pero queda residente). viola algunas o todas las reglas de un programa que se comporta ‘adecuadamente’ ante un sistema operativo. Estas funciones se aseguran de que el programa quede residente conservando el bloque asignado de almacenamiento. Cada día 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. Para cada programa que se ejecuta.2. 11.1 Ensamblador Residente El SO utiliza una serie de apuntadores. el PSP del programa y el código del programa en memoria. se requiere de averiguar la longitud del programa en párrafos. una bandera indica si se uso la memoria apuntada por el segmento de almacenamiento asignado al programa. que llevan la pista de la memoria que se asigna o quita de los programas que se ejecutan.Ensamblador En base a los lineamientos anteriores analizaremos algunos casos de programas residentes en las siguientes secciones. el estudio de este caso es interesante y nos permite conocer un poco más del desarrollo de los sistemas operativos. por su propia naturaleza. Todo programa que queda residente.

AH JNZ pi2 MOV AH.ES .BX AL.*************************************************** 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. guarda vector de video CS:cseg. DS:cseg .DS:cseg ORG 100h start: JMP initialize . atiENDe a pantalla .128 desocupada IRET printer_interceptor ENDP initialize: MOV MOV MOV MOV INT MOV MOV BX.empuja banderas para DS:NOTHING .14h PUSHF ASSUME interrupcion a pantalla CALL video_io pi2: MOV AH.get_vector dos_function video_io.inicializa codigo video_io DD printer_interceptor PROC FAR ASSUME STI OR AH.salta servicio a impresora 11-215 . y guardalo para uso posterior video_io[2].BX .simular . es menester estudiarlo con cuidado para entender el funcionamiento de una rutina que termina y queda residente. en .no. utileria para redireccionar impresora a pantalla .Interfase a otros Lenguajes Presentamos los siguientes programa en ensamblador que explota estas técnicas.poner status de imp.dos_video_io . regresa . es una llamada a impresora? .CS DS. . pon interrupciones .toma interrup de video AH.

DS:code_seg.CS MOV DS.SYS .OFFSET message MOV AH.’[16.66p’ DB ‘$’ PROC NEAR MOV DX.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.termina quedando residente CSEG ENDS END START .CS .dos_printer_io MOV AH.BX MOV DX.SYS con DEVICE=ANSI.con el que apunta a esta rutina MOV DX.OFFSET printer_interceptor MOV AL.’[2J’ DB 27.114.BX .set_vector INT dos_function MOV BX.’[0. En los programas anteriores debemos de diferenciar entre los programas del tipo residentes (TSR) y los del tipo ISR (Interrupt Service 11-216 .Ensamblador MOV BX.definir prtscr como “A” y ^P como “NO” message DB 27. en CONFIG. .SYS TITLE Anti CTRL-PRINTSCREEN code_seg SEGMENT PARA PUBLIC ‘code’ ASSUME CS:code_seg.reemplaza vector de impresora viejo MOV DS.65p’ DB 27.OFFSET initialize INT dos_terminate_resident . SS:code_seg ORG 100h start: JMP screen . es necesario que este instalado el ANSI. ES:code_seg.limpia pantalla.

Dentro de la categoría de programas del tipo TSR encontramos a calculadoras.Interfase a otros Lenguajes Rutine). alarmas.4 Problemas 11. etc. colas de impresion (Spooler). en general.5 Bibliografía Revista PC Magazine EU números de 1980-93. En el caso de que la rutina si reemplace a la de interrupción es necesario utilizar como final de la rutina la instrucción IRET en lugar de RET que señala el fin de una rutina de interrupción. Apéndice D Morgan L. MASM 86 Columbia Data Products. memorias cache. 11. Christopher Bluebook of Assembly Routines for the IBM PC The Waite Group USA 1987 Tischer Turbo Pascal Internals Abacus USA 1990 11-217 . virus. agendas. En general todo aquel programa que se active por alguna combinacion de teclas para ejecutarse.3 Resumen 11. Estos últimos no interactuan con el usuario. EU 1986. IBM Personal Computer Technical Reference. Recordemos que aunque los programas TSR e ISR redireccionan las interrupciones a sus propias rutinas. Dentro del ti po ISR encontramos relojes. pr ogramas de redireccionamieto. macro conversores. su labor es silenciosa pero de todas maneras útil y muchas veces necesaria. no sustituyen estas rutinas de interrupción por lo que al finalizar su tarea pasan el control a estas y envian la información sin cambio a su sucesor. etc.

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 instrucción banderas del sistema Registros segmentos CS DS ES SS segmento de código segmento datos segmento extra segmento pilas A-219 .Apéndice A. A.1 Las Instrucciones del 80x86 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 más que con saltos A-220 .Ensamblador Tabla A.

Las Instrucciones Tabla A.Apéndice A.3 Banderas Principales Bandera OF DF IF TF SF ZF AF PF CF IOPL NT RF VM saturación dirección (operación con cadenas) habilita interrupciones trampa (ejecución paso a paso) signo (resultado negativo) cero acarreo auxiliar pariedad (par) acarreo nivel de privilegio para E/S (2 bits) tarea anidada continua operación modo virtual Función A-221 .

A-222 .Ensamblador Figura A.1 Segmentos y su uso.

Las Instrucciones Tabla A.4 Uso del Desplazamiento Tipo de referencia Traer instrucción Operación con pila Segmento base por omisión CS SS Segmento base alterno Ninguno Ninguno CS ES SS CS ES SS Ninguno CS ES SS Desplazamiento IP SP dirección efectiva SI DI dirección 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 Localización de los datos En la misma instrucción En el registro En la localidad de memoria apuntada por el desplazamiento contenido en la instrucción 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 instrucción De base e índice con La dirección de memoria se forma por la suma del contenido del registro base el contenido del registro índice y un desplazamiento desplazamiento A-223 .Apéndice A.

2 Formas de direccionamiento.Ensamblador Figura A.6 Ventajas de la Memoria Segmentada Lineal Se debe proporcionar toda la dirección Se limita el desarrollo futuro de memorias más amplias No hay relocalización dinámica de programas No hay programación modular No hay manejo de memoria por lo que la protección de ésta no es fácil Sí hay relocalización dinámica de programas lo que permite multitareas Segmentada Se proporcionan las direcciones en dos o más partes A-224 . Tabla A.

Movimientos de registros y datos 2..DX En la localidad de memoria apuntada por el ADD variable. Las Instrucciones Tabla A.Corrimientos 5.Operaciones con cadenas 6.AL suma del contenido del registro índice o base y el desplazamiento contenido en la instrucción Base e índice con desplazamiento La dirección de memoria es la suma del ADD [BX+DI+5].Prueba no destructiva de bits A-225 .Apéndice A.[BX] desplazamiento contenido en el registro En la localidad de memoria apuntada por la ADD [SI+6]..Traducción de bytes por tablas 7. resta 4.. más el contenido del registro índice y un desplazamiento Dividimos las instrucciones en los siguientes grupos genéricos: 1.Interrupciones programables 8.Multiplicación y división entre números decimales 3.Suma.5F ADD BX..DX contenido del registro base..BX desplazamiento contenido en la instrucción En la localidad de memoria apuntada por el ADD CX.Lazos de programas 9....7 Formas de Direccionamiento y Localización de los Datos MODO Inmediato Registro Directo Registro Indice o base LOCALIZACION En la instrucción En el registro EJEMPLO ADD CH...Coordinar multiproceso y coproceso 10.

puerto OUT puerto.fuente PUSH fuente POP destino PUSHF POPF XCHG op1.Ensamblador Tabla A.fuente XLAT Descripción de su operación 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 dirección efectiva Carga apuntador en destino y registro DS Carga apuntador en destino y registro ES traduce byte A-226 .fuente LDS destino.op2 LAHF SAHF IN acc.8 Instrucciones de Transferencia Mnemónico MOV destino.acc LEA destino.fuente LES destino.

Las Instrucciones Figura A.Apéndice A.3 Multiplicación y división. A-227 .

Ensamblador Figura A. A-228 .4 Corrimientos y rotaciones.

5 Diagrama interno de una 80486. A-229 . Las Instrucciones Figura A.Apéndice A.

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 Descripción de la Operación Suma byte o palabra Suma byte o palabra con acarreo Resta byte o palabra Resta byte o palabra con préstamo 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 multiplicación Ajuste de ASCII para la división A-230 .fuente SBB destino.9 Instrucciones Aritméticas Mnemónico ADD destino.fuente SUB destino.fuente ADC destino.Ensamblador 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 Interrupción Interrupción en caso de saturación Regresa de una interrupción Tabla A.Apéndice A.cuenta SAR destino.cuenta ROL destino. Las Instrucciones Tabla A.cuenta Descripción de la Operación Niega byte o palabra (complemento a 1) Operación Y con byte o palabra Operación O con byte o palabra Operación O EXCLUSIVA con byte o palabra Prueba byte o palabra Corrimiento lógico a la derecha de byte o palabra Corrimiento aritmético a la derecha de byte o palabra Corrimiento a la izquierda de byte o palabra Rota a la derecha byte o palabra Rota a través del acarreo byte o palabra Rota a la izquierda byte o palabra Rota a la izquierda a través del acarreo byte o palabra Tabla A.10 Operaciones Lógicas Mnemónico NOT destino AND destino.fuente SHR destino.cuenta RCR destino.fuente OR destino.11 Instrucciones de Transferencia Mnemónico JMP destino Jcond destino LOOP destino LOOPE/LOOPZ destino LOOPNE/LOOPNZ destino JCXZ destino CALL destino RET (opciónalmente un valor) INT tipo INTO IRET Descripción de la Operación Salta a una localidad de memoria indicada en destino Vea tabla A.cuenta SHL/SAL destino.12 Saltos Condicionales A-231 .fuente XOR destino.cuenta RCL destino.fuente TEST destino.cuenta ROR destino.

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 Saturación Signo No saturación No signo Tabla A.13 Instrucciones para Manipular Cadenas Mnemónico MOVSB/MOVSW CMPSB/CMPSW SCASB/SCASW LODSB/LODSW STOSB/STOSW Descripción de la Operación 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 .

Las Instrucciones Tabla A. fuente para STOS 0=autoincrementa DI y SI.Apéndice A.14 Registros Dedicados para Operaciones con Cadenas (Tabla A.13) Registro SI DI ES CX AL/AX DF ZF Operación Indice (desplazamiento) de cadena fuente Indice (desplazamiento) de cadena destino segmento de la cadena destino contador de repetición valor de búsqueda. 1=autodecrementa DI y SI Indica fin de búsqueda/comparación Tabla A.15 Instrucciones de Control de Proceso Instrucción 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 dirección Limpia bandera de dirección Habilita interrupciones Deshabilita interrupciones Detener procesamiento hasta que se inicialice el circuito o haya una interrupción externa Espera a que test (pata externa física del circuito) esté en 1 Escapa a procesador externo (coproceso) Bloquea el bus durante la siguiente instrucción No hacer nada (para rellenar tiempos) Acción A-233 . destino para LODS.

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

) Tipo de cursor Posición del cursor d e s p l ie g u e 01h 02h 03h 04h 05h 10h 10h 10h 10h 10h Lee posición del cursor Lee posición de la pluma de luz Selecciona página de video activa B-235 .Apendice B Interrupciones S e r v i c i o Interrupción Descripción (AH=) 02h 01h 09h 21h 20h 21h 21h Despliega carácter en pantalla Regresa a programa supervisor Lee un carácter del teclado Muestra una cadena en pantalla Parámetros Regresa DL=carácter (ASCII) AL=carácter leido del teclado DS:DX=dirección de la cadena terminada con $ DS:DX=dirección de memoria 1er byte memoria pro vi sional para contener la prov.=# carácteres leídos 0Ah 21h Lee cadena del teclado 05h 0Bh 21h 21h Imprime carácter Verifica entrada estandard DL=carácter a imprimir - AL=FF hay un carácter esperando AL=00 no hay carácter esperando 00h 10h Tipo de (color.=máximo # de carácters a cadena ser leidos 2do byte memoria prov.etc.mono.

Ensamblador 06h 07h 08h 09h 10h 10h 10h 10h Desplaza pantalla hacia arriba Desplaza pantalla hacia abajo Lee atributo/carácter de pantalla Escribe atributo /carácter a pantalla Escribe carácter a pantalla Escoge paleta de color Dibuja un punto a pantalla Lee punto de pantalla Regresa estado de video Generador de carácteres Información del equipo bit 0 coprocesador bit 4. El archivo no existe dirección del FCB 0Fh 21h Abrir archivo con manija B-236 . DL = 1 /1 0 0 segundos 2Dh 30h 38h 21h 21h 21h Fija hora del sistema Pide versión de DOS Información del país mismos que para la 2Ch - AX=versión DX=Dirección de buffer de 34 País en buffer bytes DS=Dirección del Segmento del AL=00.15 #puertos paralelos 0Ah 0Bh 0Ch 0Dh 0Fh 10h - 10h 10h 10h 10h 10h 10h 11h 2Ah 12h 21h Tamaño de la memoria Pide fecha del sistema - AX=# bytes CX=año (1980 a 2099) DH=mes (1 al 12) DL=día (1 al 31) 2Bh 2Ch 21h 21h Fija fecha del sistema Pide hora del sistema mismos que para la 2Ah - CH=hora.5 tipo de video bit 7. CL=minuto D H = se g u n d o s .6 # lectoras de disco bit 9. el archivo se encontró y FCB abrió DX=Desplazamiento de la AL=FF.10.11 #puertos RS-232 bit 13 joystick bit 14.

tamaño archivo.etc.tamaño de registro.# bolque. (El nombre del archivo con su extensión 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 . # de disco. Las Interrupciones FCB.Apéndice B.fecha.

Introducción Índice ! 804861-27 A acceso aleatorio1-23. 3-64 Bresenham9-177 buffer5-88 bus1-4 239 . 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 asignación de memoria11-207 ASSUME4-82 B BCD3-63 BIOS2-34 bit1-2.

3-65 BYTE PTR5-102 C C y ensamblador11-212 CALL7-136 carácteres de control3-68 CLD8-152 CMP6-110 CMPS8-152 código fuente2-35 código Grey3-67 código objeto2-35 códigos3-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 conversión binario-decimal3-58 conversión decimal-binario3-59 240 .Ensamblador byte1-3.

1-19 D DB4-83 DD4-83 debug4-78 DEC7-132 desbordamiento3-65 dirección1-3.Introducción corrimientos7-128 CPU1-2 .1-3. 1-25 dirección efectiva2-42 direccionamiento directo a memoria2-42 Implícito2-41 indirecto2-42 memoria2-41 relativo2-42 directivas de ensamblador2-39 DIV7-133 división 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 interrupción5-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 .

6-105 interfase a otros lenguajes11-207 intérprete2-45 interrupción impresora7-125 no mascarillable5-93 pantalla7-123 teclado7-122 ISR11-213.Introducción IDIV7-133 IMUL7-133 IN6-117 INC6-108 input/output5-87 instrucción1-8 INT5-94. 11-216 J JMP6-106 juego de instrucciones1-3 L LABEL BYTE9-177 LABEL DWORD9-177 LABEL WORD9-177 Leibnitz3-56 243 .

1-26 memoria de sólo lectura programable y borrable1-27 memoria interna1-21 memoria no volátil1-27 memoria principal1-21 memoria secundaria1-22 memoria volátil1-27 microinstrucción1-18 244 .Ensamblador lenguaje de máquina2-36 lenguajes de alto nivel2-44 LOOP6-109 LOOPE6-110 LOOPNE6-110 M macroinstrucción1-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 sólo lectura1-25 .

Introducción microprograma1-18 microprogramación1-18 mnemónico1-12 MOV5-95 MOVS8-152 MOVSB8-152 MOVSW8-152 MUL7-133 multiplexión1-17 multiplicación en otros sistemas3-60 N NEG6-114 NOP7-135 NOT6-114 O OR6-114 OUT6-117 P PAGE7-138 paginación2-42 palabra3-65 palabra de dirección1-25 paridad1-7 245 .

Ensamblador paridad impar1-7 paridad par1-7 párrafo1-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 .

Introducción registro de instrucción1-10 REP8-152 REPE8-154 REPNE8-154 REPNZ8-154 representación 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 interrupción5-91 S SAL7-130 saltos cercanos6-107 saltos condicionales6-110 saltos cortos6-107 saltos de índice6-107 saltos lejanos6-107 SAR7-130 saturación3-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 numéricos3-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 aritmética y lógica1-19 248 .

1-19 V vector de interrupciones5-92 video9-163 W WORD PTR5-102 X XOR6-114 249 .Introducción unidad de control1-17.1-3. 1-20 unidad de memoria1-20 unidad de procesamiento central1-3. 1-19 UPC1-2 .

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->