Ensamblador
por Emiliano Llano Díaz
Ensamblador
Emi lia no Lla no Díaz
El au tor y Exa Inge nie ría ®no es tán afi lia dos a nin gún fa bri can te.
Se han rea li za do to dos los es fuer zos po si bles para pro veer una in for ma ción ve raz y com ple ta. Sin em bar go,
el au to re no se hace res pon sa bles de omi sio nes, uso al que se des ti ne la in for ma ción o por in frac cio nes a pa ten -
tes u otros de re chos de ter ce ros que re sul ten.
De re chos Re ser va dos ©por el au tor 2002. De re chos mun dia les re ser va dos. Nin gu na par te de esta pu bli ca -
ción pue de ser re pro du ci da o al ma ce na da en nin gún me dio de re trans mi sión, fo to co pia do o re pro duc ción de
nin gún tipo, in clu yen do pero no li mi tán do se a fo to co pia, fo to gra fía, fax, al ma ce na mien to mag né ti co u otro re -
gis tro, sin per mi so ex pre so del au tor y de la edi to rial.
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.
i
ContenidoContenido · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 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
Contando en el Sistema Binario· · · · · · · · · · · · · · · · · · · 58
Conversión de Sistema Dec i mal 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
Ensamblador
ii
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
Introducción
iii
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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Pantallas de graficación . . . . . . . . . . . . . . . . . . . . . . 168
Problemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Bibliografía . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Capítulo 10· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 183
Manejadores de Archivos · · · · · · · · · · · · · · · · · · · · · 197
Capítulo 11 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 207
La Asignación de Memoria . . . . . . . . . . . . . . . . . . . . 207
Transfiriendo el Con trol a Ensamblador · · · · · · · · · · · · · · 208
Pasando Argumentos · · · · · · · · · · · · · · · · · · · · · · · 208
Pascal y Ensamblador· · · · · · · · · · · · · · · · · · · · · · · 208
C y Ensamblador · · · · · · · · · · · · · · · · · · · · · · · · · 212
Ensamblador Residente · · · · · · · · · · · · · · · · · · · · · · 214
Apéndice A. · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 219
Ensamblador
iv
Las instrucciones del 80x86 . . . . . . . . . . . . . . . . . . . . 219
Errores comunes al ensamblar un programa . . . . . . . . . . . . 234
Apendice B · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 235
Interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Índice · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 239
Introducción
v
Introducción¿Por qué usar ensamblador?
Las razones para APRENDER ensamblador no son las mismas, en gen -eral, que las razones para USAR ensamblador.
Una de las malas razones para querer usar ensamblador es porque sepiensa que ejecutará mucho más rápido que una secuencia en par tic u larde un lenguaje de propósito gen eral como Pascal, For tran, C o hasta BA -SIC compilado. Aunque esto en gen eral es verdadero, el tiempo yrecursos invertidos en el desarrollo pueden al fi nal no valer la pena conrespecto a la ganacia de velocidad obtenida.
Por otro lado, los lenguajes de alto nivel tienden a aislar al usuario de lamáquina, en lo que radica su fuerza y su debilidad. La gran mayoría de los lenguajes moderno de alto nivel proveen mecanismos para escribirsecuencias en ensamblador, aunque algunos de forma torpe (PEEK yPOKE de BA SIC). Esto crea complicaciones en la implementación y enel seguimiento y mantenimiento de programas elaborados de esta forma.
Algunas veces el sistema o lenguaje hace muy poco por nosotros; porejemplo, con el adaptador asíncrono, el sistema provee mecanismos quequedan cortos de nuestra espectativa y deben ser irremediablementemejorados o pagar las consecuencias en una comunicación de alto nivel(redes, in ter faces, etc.).
Otras veces el sistema o lenguaje hace demasiado por nosotros; porejemplo en el con trol de las teclas que conforman un teclado, dondepreviamente se han definido todas las secuencias que se generan alpresionar una tecla.
vii
Otras más, se hace el trabajo exacto pero de una forma ineficiente noaceptable a ciertas aplicaciones, como en el caso del manejador de lapantalla que normalmente usan los ca na les oficiales para comunicarsecon la electrónica que controla los dispositivos externos.
Es en estas ocaciones donde el ensamblador actúa con su mayorfortaleza: el con trol to tal de todos los elementos que conforman elsistema. Una parte crítica de un sistema es la más suceptible deoptimizarse vía programación en ensamblador. No deseamos hacer estoen términos de eficiencia de programación si se puede evitar con algúntruco del lenguaje de alto nivel o alguna otra argucia; pero existennumerosos casos en los que se cae constantemente en la necesidad dehacerlo.La razón por la cual el ensamblador es entonces mejor que unlenguaje de alto nivel, es la misma por la que Pascal es mucho mejor paraescribir un programa de nómina que Ensamblador: es mucho más fácil demantener y programar. Debemos dejar que los lenguajes de alto nivelhagan lo que saben hacer mejor y reconocer las ocaciones en las quedebemos ensuciarnos las manos con ensamblador.
Las razones para aprenderlo caen en la categoría de una formacióncompleta e in te gral en las áreas de cómputo de forma tal que se puedadecidir como jefe de proyecto o programador, en qué casos es mejorutilizar una herramienta y en qué otros utilizar otra. Como profesionista,se debe ser capaz de identificar una buena codificación de una mala enensamblador y poder sugerir caminos alternativos para lasimplementaciones de una solución genérica apropiada al problema quese trata de re solver.
Dividimos el aprendizaje del ensablador en fases o pasos que sugerimosseguir al pie de la letra:
· Fase 1 Conocer las herramientas de trabajo para crearaplicaciones en ensamblador.
· Fase 2 Conocer la arquitectura de la máquina en la que se pretenderealizar la programación.
· Fase 3 Conocer las instrucciones del lenguaje ensamblador de lamáquina específica en la que se aplicará.
· Fase 4 Conjuntar todos los elementos anteriores en programas deaplicación que realicen cosas prácticas o útiles desde nuestropunto de vista.
Ensamblador
viii
· Fase 5 Actualizarse constantemente.
En todo lo an te rior aplicamos una palabra clave: Selección. Hay que serselectivo en lo que se aprende y tener la capacidad de juzgar de antemanoqué nos puede servir o no an tes de emplear el esfuerzo y tiempo enaprenderlo aunque siempre se debe tener en cuenta que las necesidades,tecnologías y tendencias cambian constantemente el la computación, porlo menos a lo que el presente y fu turo cercano nos concierne.
Trataremos de cumplir a lo largo de este libro la palabra selectividad yde llenar todos los objetivos planteados en esta introducción.
Emiliano Llano Díaz
Septiembre 1995
Introducción
ix
Capítulo 11.1 Componentes Básicos de un Sistema
Si examinamos las microcomputadoras actuales, vemos que aunque hay diferencias en el tamaño físico de los componentes, de los sistemas y en -tre dist intos t ipos de computadoras (mini computadoras,macrocomputadoras y computadoras personales o microcomputadoras),la arquitectura empleada en todos los casos es muy sim i lar. Esto se debeal hecho de que las computadoras usan lógica binaria (de unos y ceros) yemplean el sistema binario en casi todos sus componentes, lo que exigeun cierto tipo de estrategia para re solver los problemas derivados de estaselección.
1-1
Figura 1.1 Los componenetes de una computadora.
Como se muestra en la figura 1.1, tenemos cinco par tes principales deun sistema de cómputo que se encuentran de una forma u otra en todosistema ac tual:
· 1. Unidad de Proceso Central (UPC o CPU en inglés). Queforma el cerebro de la computadora y, en general, controla todo elfuncionamiento de los demás componentes.
· 2. Memoria. Dispositivo de almacenaje electrónico donde seguardan las instrucciones y datos necesarios para elfuncionamiento del sistema.
· 3. Dispositivos de Entrada y Salida (E/S o I/O). Son el eslabónentre la máquina y el humano. Varían en complejidad y tipo deacuerdo a los requerimientos de procesamiento.
· 4. Interfases de Entrada/Salida. Son los dispositivosintermedios entre la UPC y los dispositivos de E/S y proveen loscontroles para que se puedan entender los dispositivos externos de E/S y la UPC.
· 5. Un programa. Controla todo lo anterior y da la secuencia deeventos que permiten que un sistema funcione como tal y ademáspueda resolver problemas de procesamiento genérico para lo cualse construyó el sistema en primer lugar.
Las computadoras digitales usan la lógica dig i tal para cumplir concierta meta de procesamiento. Esta lógica dig i tal o lógica binaria comotambién se le conoce, se basa en el hecho de que ciertos circuitoselectrónicos pueden estar conduciendo electricidad o no (prendidos oapagados), estado que se determina por las características de operación.Esto nos da pie a definir dos estados o condiciones bien diferenciados,mutuamente excluyentes y opuestos.
Si contamos con un sólo circuito dig i tal que nos indique uno de los dosposibles estados, se dice de este circuito contiene un dígito binario (BI -nary digiT) o BIT de información. Este dígito se puede designar comoprendido o apagado o más comunmente 1 ó 0 que corresponden a losúnicos dígitos utilizados dentro de los sistemas actuales de computadoras digitales.
Para sernos más utiles, los bits se agrupan en palabras que contienen Nnúmero de bits de acuerdo al fabricante, modelo de computadora u otrosfactores, aunque todos coinciden en que son potencias de 2. La longitud
Ensamblador
1-2
más común de palabra en las microcomputadoras es de 8 bits que senombra byte, de 16 bits, de 32 ó de 64 bits.
Quizá el único atributo que diferencia a las computadoras de otrasmáquinas es que se les puede decir qué deben hacer. Esto se logra conpalabras que contienen patrones de bits que son significativos para lacomputadora. Este significado preciso se lo da el fabricante decomputadoras y así, un patrón puede significar suma dos númerosmientras que otro ligeramente distinto significará quizá guarda unresultado en una localidad específica.
El grupo de patrones definido por el fabricante forma lo que se llama eljuego de instrucciones. La variedad de operaciones distintas quecontiene este juego de instrucciones obedece a criterios de diseño delcircuito. En gen eral todo juego de instrucciones cuenta con operacionesaritméticas, de manipulación de bits, de comparaciones, de entrada ysalida, etc. mismas que analizaremos en detalle para un circuitoespecífico en los capítulos siguientes.
Todos los datos, tanto de instrucciones de programa como datos, sonalmacenados en una serie de circuitos conocidos como memorias puestienen la particularidad de recordar la información contenida en ellos.Las memorias son organizadas como casilleros únicos en los que seguarda la información. Cada casillero o localidad de memoria tiene unidentificador que lo hace distinto a cualquier otro casillero parapropósitos de identificación y de almacenamiento de información. A esteidentificador se le llama dirección y sin entrar en más detalles hasta lasiguiente sección baste decir que la dirección es única e irrepetible paraevitar confusiones y que la capacidad del casillero forma la palabra de lacomputadora (número de bits que es posible almacenar en la memoria).
1.2 La Unidad de Proceso Central
Toda computadora tiene una especie de circuito de con trol genérico oUPC (cen tral pro cess ing unit o CPU), que forma el “cerebro” de lamáquina computadora. La UPC está formada por diferentes par tesinterconectadas en tre sí en forma tal que permite ciertas operacioneslógicas. Las computadoras de hace 10 años requerían de un chasísbastante grande para albergar los componentes de la UPC. Varias tarjetasbastante grandes que contenían cientos de circuitos interconectadas porca bles del tamaño de una manguera no era una vista extraña. Hoy en día,la UPC está contenida en unos pocos circuitos de alta integración o en el
Componentes Básicos de unSistema
1-3
caso de las microcomputadoras en uno solo. La microcomputadora, junto con unos cuantos circuitos externos, forman una computadora funcional.
Los componentes del sistema de computación deben de interconectarsede alguna forma. La manera en que se realicen las conexiones y cómo sehaga la comunicación, afecta las características de desempeño delsistema profundamente.
En las primeras computadoras y en algunas de las actuales, la UPC seinterconectaba con cada uno de los dispositivos externos a la UPC pormedio de un ca ble separado. Este método tiene la desventaja de quemuchos ca bles (llamados buses) distintos deben ser controlados y serequiere de una cantidad con sid er able de circuitos.
Para realizar la interconexión de forma más económica y paraestandarizar la lógica de interfase necesaria, una técnica muy pop u larconsiste en interconectar a todos los sistemas externos a la UPC pormedio de un sólo juego de ca bles o bus de interconexión. El bus consisteen los ca bles necesarios para encontrar a los distintos componentes,controlarlos y transferir datos de y hacia ellos.
En la figura 1.2 vemos el esquema de una unidad de procesamiento cen -tral. Se forma por la unidad aritmética y lógica (UAL o ALU, arith me ticlogic unit) encargada de las operaciones lógicas y aritméticas, la unidadde con trol encargada de la coordinación gen eral, una serie de registrosdonde se almacena información requerida por la UPC y la ALU de formapro vi sional y un bus de datos interno que interconecta a todas lasunidades.
Ensamblador
1-4
La función prin ci pal de la UPC será la de interpretar la información quere side en la memoria prin ci pal como instrucciones o datos y actuar deacuerdo a un plan determinado por el código de la instrucción generandolas operaciones necesarias de acuerdo a ese plan. Ningún programapuede ser ejecutado por la UPC si no re side an tes, en forma parcial o to -tal, en la memoria prin ci pal (descrita en la sección siguiente).
1.2.1 Interpretando el Contenido de la Memoria
Los datos almacenados en la memoria pueden ser interpretados como:
· 1. Datos binarios puros
· 2. Datos codificados en binario
· 3. Un código de carácter
· 4. Un código de instrucción
Estas cuatro categorías de interpretar datos pueden dividirse en dos másgenéricas: datos e instrucciones.
Los datos binarios puros, los datos codificados en binario y loscaracteres codificados tienen una cosa en común: son datos. El contenidode las palabras almacenadas en memoria puede ser usado por sí solo para
Componentes Básicos de unSistema
1-5
Figura 1.2 Esquema de una Unidad de Proceso Central.
operaciones o combinado con otras palabras de memoria en formasdirigidas por un programa.
1.2.1.1 Datos binarios puros
Consideremos primero a los datos binarios puros que no están sujetos aninguna interpretación. Es importante resaltar que podemos representareste tipo de datos en papel como un número binario, oc tal o hex a dec i mal(por sencillez) sin que tenga ningún impacto en el dato de la palabra. Porejemplo, una palabra arbitraria de 16 bits, en la que es posible representar216 combinaciones, puede ser:
11011011100010112=1556138=DB8B16
Se puede observar que la notación en hex a dec i mal, además de ser máscompacta, es mucho más fácil de apuntar y recordar, también evitaconfusiones, como veremos en el siguiente capítulo, por lo que la base 16o hex a dec i mal es la preferida en tre la gente dedicada a diseño lógico oprogramación a nivel máquina.
1.2.1.2 Datos Codificados en Binario
El contenido de una palabra de memoria, interpretada como datosbinarios puros, puede existir por sí solo o ser válido sólo cuando secombina con otras palabras para formar un código o un número mayorque sea utilizado con fines prácticos. No hay razón por la cual un datobinario no pueda formarse, por ejemplo con 2 o más palabras; más aún,las palabras pueden no ocupar localidades continuas de memoria, aunque se prefiere por fines prácticos que así sea.
La palabra puede también estar codificada de acuerdo a un códigoestablecido de antemano como puede ser exceso 3, BCD, números consigno, etc. (todos ellos analizados en el capítulo 2).
1.2.1.3 Códigos de Caracteres
Una computadora no sería muy práctica si tuviésemos que me ter cadauno de los datos como largas secuencias de unos y ceros o si lasrespuestas consistieran de números o letras en una representaciónbinaria. Debe ser posible para la computadora el manejar todo tipo detexto y otra información no numérica.
Ensamblador
1-6
Para que el manejo de texto sea completo debe de incluir al menos las 26letras en minúsculas y mayúsculas, los números y una serie de signosespeciales que usamos diariamente en nuestra comunicación como son el punto, la coma, etc. En conjunto, los caracteres más usados sumanalrededor de 87. Una palabra de 7 bits es suficiente para su representación pero es universalmente aceptada la codificación utilizando 8 bits (vercapítulo 2).
En algunos sistemas con longitud de palabra de 8 bits, se usa el códigoASCII de 7 bits y el bit li bre se utiliza para verificar errores en los datospor medio de un procedimiento llamado paridad. En otros sistemas seusa un código de 8 bits ASCII y se agrega a la memoria un bit más quesirve para la comprobación de paridad. A este bit se le conoce como bit de paridad.
La paridad consiste en una verificación sencilla de errores en la que seagrega un bit al código. 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 unapalabra sea siempre par o impar, según el tipo de paridad que se hayaescogido. Si el tipo de paridad que se escoge es par, el bit de paridad selimpia o fija para que el número to tal de unos de la palabra sea siemprepar. 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, el bit de paridad será en este caso 0.
Muchos esquemas muy elaborados son usados para verificar laconsistencia de los datos y asegurarse que no contengan errores, aún más, existen algoritmos para determinar dónde están los errores y tratar decorregirlos. Estas técnicas de detección de errores no tienen que ver nadaen par tic u lar con la arquitectura de las computadoras o la programaciónen ensamblador y, por lo tanto, no se discuten aquí. Para mayorinformación consulte la bibliografía, en es pe cial el l ibroTelecomunicaciones y Teleproceso.
Componentes Básicos de unSistema
1-7
1.2.1.4 Código de Instrucciones
Las palabras de memoria hasta ahora analizadas son conformadas porinformación de un tipo u otro pero el contenido también puede serinterpretado como un código solicitando una operación que se requierede la computadora.
Considere el sencillo ejemplo de una suma binaria en donde solicitamosque la palabra almacenada en cierta área de memoria sea sumada a otracontenida en otra área distinta y que el resultado sea almacenado en unatercera área. Los pasos necesarios para lograr esta suma serían:
· 1. Identificar la dirección de la primera palabra a sumar.
· 2. Transferir el contenido de la dirección a los registrosprovisionales de almacenamiento dentro de lo que forma laUnidad de Procesamiento Central.
· 3. Identificar la dirección de la segunda palabra a sumar.
· 4. Sumar el contenido de esta última palabra a la que se encontraba en los registros de la UPC, obtenida en el paso 2, por medio de laUnidad Lógica y Aritmética (UAL).
· 5. Identificar la dirección de memoria donde el resultado sealmacenará.
· 6. Transferir la suma almacenada en el registro adecuado de laUPC a la dirección obtenida en el paso 5.
Ilustrar el concepto de un programa de computadora con estos seissencillos pasos es sólo el comienzo. Tendremos que re sponder a lo largodel libro a las preguntas: ¿Cómo realiza la computadora las operacionesrequeridas por los códigos de instrucciones que conforman el programa?¿Qué es lo que la computadora demanda de la lógica externa para poderrealizar su trabajo? ¿Cómo se escribe un programa de computadora?
Ensamblador
1-8
1.3 Componentes de la Unidad de ProcesoCentral
Si consideramos el sencillo programa de suma descrito en la sección1.2, podemos examinar algunos de los requerimientos internos a la UPCpara poder satisfacer lo que se le solicita por medio del código deinstrucción SUMA.
1.3.1 Registros
Es necesario un almacenamiento pro vi sional (o varios) donde guardarlos números para trabajar con ellos, así como un registro dondealmacenar el resultado de las operaciones que llamamos acumulador yabreviaremos con A. En el acumulador podemos almacenar informacióntanto an tes de operar con ella, como el resultado de las operaciones conlos datos binarios. Por el momento y para simplificar las cosasconsideremos que tenemos sólo un acumulador y que éste es de 8 bits.
Se requiere de este tipo de almacenamiento pro vi sional por dos razones:
· 1. El contenido de la memoria sólo se puede leer o escribir, no esposible operar sobre los registros de la memoria principal debidoal diseño de las computadoras actuales.
· 2. Es posible tomar los datos directamente de memoria, operarsobre ellos y regresar el resultado otra vez a la memoria principal,pero una cantidad adicional importante e innecesaria de circuitoslógicos serían requeridos para esto, complicando el diseño,subiendo el costo y disminuyendo la rapidez de las operacionescomo será aparente según avancemos en el libro.
Para poder accesar una palabra de memoria, tanto para leer como paraescribir su contenido, necesitamos tener su dirección y ésta se almacenaen un registro es pe cial que llamaremos registro contador de datos (datacoun ter reg is ter) que abreviaremos con sus siglas en inglés: DC.
El tamaño de este registro depende de la cantidad de memoria prin ci palque la computadora pueda accesar directamente. En la figura 1.3suponemos un registro contador de datos de 16 bits que nos da unacapacidad de memoria de 65,536 palabras o 64K bytes (si la palabra es de1 byte).
Componentes Básicos de unSistema
1-9
Una computadora puede constar de más de un registro de este tipo perouna vez más, por simplicidad y por el momento, sólo consideraremosuno.
Necesitamos también un registro donde la instrucción sea contenida deforma que la UPC pueda hacer referencia a ese registro para ver de queinstrucción, de las muchas de una computadora, se trata. A este tipo deregistro se le denomina registro de instrucción (in struc tion reg is ter) 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 contadorde programa (pro gram coun ter) que abreviaremos con sus siglas eninglés: PC.
El contador de programa es análogo al de datos pero se asume que unocontiene la dirección de los datos en memoria y el otro la dirección de lasiguiente instrucción en memoria. Para explicar un poco más este punto:si la operación SUMA consta de un código de operación que sólo ocupauna palabra y le deben seguir dos palabras más de memoria quecontengan los datos a sumar, el apuntador a la siguiente instrucción debeactualizarse sumando tres localidades para que salte los datos y apunteefectivamente a la siguiente instrucción; de forma sim i lar el contador dedatos se actualizará sumando 1 al registro contador de programa y luego 1 más para poder localizar el siguiente dato.
Como se puede ver en la explicación an te rior, existe una diferencia con -cep tual grande en tre el contador de programa y el contador de datos, puesmientras el contador de programa debe de incrementarse continuamentepara encontrar la siguiente instrucción usando para ello la longitud enpalabras de que consta la instrucción an te rior, el contador de datos puedeo no incrementarse de acuerdo a si la instrucción requiere de datos o no.
Debe, por lo tanto, permitírsele gran flexibilidad al programador parapoder modificar el registro contador de datos, mientras que, usualmente,al registro contador de programas no se tiene acceso más que de formaindirecta.
Ensamblador
1-10
1.3.2 Forma de Usar los Registros
Para poder comprender en su totalidad el uso de los distintos registroque forman parte de la UPC, realizaremos paso a paso una suma como sede scribe en el algoritmo de la sección 1.1.2.4.
Para realizar la suma asumiremos que la UPC puede interpretar 3instrucciones sencillas: CARGA, SUMA y GUARDA. Cada una de estasinstrucciones está definida de antemano rígidamente y se deben seguirlos pasos que el fabricante explica. Supondremos que las instruccionesrealizan estos pasos:
SUMA: Toma el contenido de la dirección formada por el contenido delas siguientes dos palabras y súmala a la que está en el Acumuladordejando el resultado en el Acumulador. Inventamos el código deinstrucción 30 hex a dec i mal que al ser encontrado por la UPC en unalocalidad de memoria sea interpretado como la instrucción SUMA.
CARGA: Toma el contenido de la dirección formada por el contenidode las siguientes dos palabras y guárdala en el Acumulador. Inventamosel código de instrucción 40 hex a dec i mal que al ser encontrado por la
Componentes Básicos de unSistema
1-11
Figura 1.3 Registros típicos de una UPC.
UPC en una localidad de memoria sea interpretado como la instrucciónCARGA.
GUARDA: Toma el contenido del Acumulador y guardalo en ladirección de memoria formada por el contenido de las siguientes dospalabras. Inventamos el código de instrucción 50 hex a dec i mal que al serencontrado por la UPC en una localidad de memoria sea interpretadocomo la instrucción GUARDA.
Recuerde que el Contador de Programa debe de incrementarsecontinuamente para apuntar así a la siguiente dirección de memoriadonde se almacena una instrucción o dato.
Nuestro programa de suma sería entonces (las direcciones en hex a dec i -mal):
CARGA E0E0
SUMA E0E1
GUARDA E0E2
Notemos que aquí se in tro duce un nuevo concepto llamado mnemónicoque nos auxilia en recordar qué realiza cada código de instrucciones de lacomputadora en cuestión, pues en la palabra de memoria no se guarda lasletras de la instrucción sino un sim ple código que representa a lainstrucción:
40 E0 E0
30 E0 E1
50 E0 E2
Recordemos a su vez, que cada número en hex a dec i mal tiene suequivalente en binario y a su vez, cada número en binario se re sume en sihay corriente o no en cada uno de los circuitos que conforman el registroen cuestión, ya sea de memoria o interno a la UPC.
Coloquemos estos códigos en un mapa de memoria en una localidadarbitraria, por ejemplo en la dirección C000 hex a dec i mal (suponemosque tenemos una memoria to tal de 64K bytes por lo que bastan con 16líneas de dirección, 16 bits binarios o 4 hexadecimales para conocer sulocalización). En la figura 1.4 colocamos de alguna forma nuestroprograma en la memoria.
Ensamblador
1-12
Podemos seguir paso a paso el contenido de los registros hasta ahoraanalizados en la siguiente secuencia:
Componentes Básicos de unSistema
1-13
Figura 1.4 El manejo de los registros en un programa.
· 1. De una forma por ahora desconocida, el registro contador deprograma o PC contiene la dirección de la primera instrucción:
C0 00.
· 2. La UPC carga el contenido de la palabra de memoria apuntadapor el PC al registro de instrucciones o I, en este caso el número 40 hexadecimal (CARGA), e incrementa en uno el contenido delregistro PC.
· 3. El código 40 que aparece en el registro de instrucciones haceque la lógica de la UPC realice dos pasos. Primero, 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 delregistro contador de datos (DC). La Unidad de ProcesamientoCentral incrementa posteriormente el contenido del PC en uno. Elsegundo paso consiste en traer el contenido de la palabra dememoria apuntado por PC y guardado en el bit menossignificativo del registro DC. Ahora, se utiliza el contenido delregistro DC como apuntador para traer la palabra de memoriaindicada al registro acumulador (A). Una vez más la UPCincrementa el contenido del registro PC en uno. Con esto lainstrucción número 1 (CARGA) se completa.
· 4. Una vez terminada la instrucción anterior la UPC trae elcontenido de la palabra de memoria direccionado por el registroPC e incrementa en uno este registro. Puesto que no le hemos dado ninguna otra instrucción específica a la UPC, el contenido de lapalabra que se trae de la memoria se almacena en el registro I paraser interpretado como una instrucción.
· 5. Algo muy similar al paso 3 sucede en esta etapa. El registro DCcontiene ahora la dirección de la palabra de memoria a suma (E0E1) y la UPC pasa el contenido de esta palabra y el del acumulador a la UAL para su suma, el resultado se almacena en el acumuladory el contador de programa se ha incrementado en 2 para quedarapuntando a la siguiente instrucción.
· 6. La última instrucción de nuestro pequeño programa es algomuy similar a la instrucción 1 pero en lugar de traer los datos de ladirección apuntada por el registro DC, se almacena en esadirección.
Ensamblador
1-14
1.3.3 Banderas de Estado
Muchas veces es necesario sa ber en detalle qué es lo que realiza la UALpara poder decidir si la operación que se ordenó fue completada con éxitoo no o para tomar ciertas medidas con el resultado que nos entrega laUAL.
A los registros especializados en decirnos el resultado de lasoperaciones se les llama registros de estado (estatus reg is ter) o banderasy consisten en una memoria de un bit que nos in dica varias situacionesdentro de la UAL.
Algunas de estas situaciones en las que las banderas son modificadasque nos son de interés se resumen en los siguientes puntos:
· 1. El resultado fue cero.
· 2. Hay un acarreo.
· 3. Hay signo en la operación.
· 4. Hubo un desbordamiento en la operación.
· 5. Indicador de paridad.
· 6. Si la operación a realizar es suma o resta.
· 7. Acarreo a la mitad de los bits que forman la palabra.
Aquellas instrucciones que afectan o no a las banderas de estado soncuidadosamente seleccionadas por el fabricante y varían de computadora a computadora.
1.4 Ejecución de Instrucciones
Como en casi toda la lógica dig i tal, la UPC es controlada por un reloj.Este reloj puede ser tan sencillo como una sola señal o una combinaciónde varias señales de reloj requeridas por la UPC.
La ejecución de una instrucción puede ser dividida en dos par tesprincipales:
· Traer la instrucción (fetch en inglés)
· Ejecutar la instrucción (ejecute en inglés)
Componentes Básicos de unSistema
1-15
Si recordamos nuestro ejemplo an te rior de un programa, cadainstrucción comienza con el código que se carga en el registro deinstrucción (I). A esta operación le llamamos traer la instrucción (fetch).
Du rante la etapa donde se trae la instrucción, la UPC tiene que colocarel contenido del registro del contador de programa (PC) en el bus dedirecciones junto con las señales necesarias para informar a la lógica ex -te rior que se trata de una lectura a la palabra de memoria indicada por elcontenido del bus de direcciones. Por lo que a la lógica externa concierne, esto se trata de una sim ple lectura.
Mientras la lógica externa responde, la UPC usa su lógica interna parasumar 1 al contenido del registro PC. El contador de programas ahoraapunta a la siguiente localidad de memoria de la que el código de lainstrucción se trajo.
Una vez que el código de instrucción se encuentra en el registro deinstrucciones, dispara una serie de eventos controlados por la Unidad deCon trol que constituyen la ejecución de la instrucción.
En su forma más sencilla, dos periodos de reloj son necesarios paraejecutar la instrucción. Uno de ellos marca el tiempo para traer lainstrucción y el otro para ejecutarla.
Si consideramos las interconexiones necesarias para esto necesitaremos hasta el momento por lo menos las siguientes:
· 1. Las líneas necesarias para la dirección de memoria. Porsimplicidad consideraremos un diseño en el que se puedan accesar únicamente 65,535 localidades distintas de memoria ó 64K bytespara lo que se requiere de 16 líneas. En conjunto forman elllamado bus de direcciones.
· 2. Las líneas necesarias para leer o escribir información a lamemoria. Una vez más, por simplicidad, consideraremos undiseño de 8 bits de longitud de palabra por lo que se requieren de 8líneas de datos que en conjunto forman el llamado bus de datos.
· 3. La alimentación del circuito/circuitos que forma la UPCformado como mínimo con una línea de voltaje y otra de tierra.
· 4. Las señales adecuadas para informar a la lógica externa que setrata de una lectura o escritura a la memoria.
Ensamblador
1-16
· 5. La línea del reloj.
Mostramos en la figura 1.5 el diagrama parcial y esquematizado de uncircuito de UPC.
Algunas veces se requieren de más líneas que las que físicamentepermite el empaque. Se utiliza entonces una técnica llamadamultiplexión en la que las mismas interconexiones externas sirven paravarios propósitos. Por ejemplo, si se requieren de 20 líneas de dirección ysólo tenemos disponibles 14 conexiones, podemos mandar en elmomento t la dirección parte baja por las 14 conexiones disponibles y lasrestantes 6 en el momento t+1 por las mismas interconexiones.
1.5 La Unidad de Control
La unidad de con trol se puede representar funcionalmente como unacaja negra tal como en la figura 1.1, pero en realidad consiste de un grannúmero de elementos lógicos que pueden ser activados por una secuencia de señales habilitadoras. La IEEE de fine a la unidad de con trol como laparte de una computadora que lee las instrucciones en secuencia, vigilasu aplicación y gen era los comandos y señales adecuadas para la UnidadAritmética y Lógica (UAL) y otros circuitos para su correcta aplicación.
Componentes Básicos de unSistema
1-17
Figura 1.5 Una microcomputadora con sus líneas externas.
La unidad de con trol puede utilizar otros elementos contenidos en laUPC. Por ejemplo, la UC puede utilizar el complementador de la UnidadAritmética y Lógica. Una señal única de la Unidad de Con trol activa alcomplementador.
Sin em bargo, el complementar el contenido de una memoria pro vi -sional, aunque útil, no nos sirve de mucho. Lo que sí tiene valía escomplementar el contenido del Acumulador y esto implica mover lainformación al complementador y una vez realizada la operación,regresar el resultado al Acumulador.
Complementar el contenido del Acumulador requiere entonces de 5pasos:
· 1. Mover el contenido del Acumulador al Bus de Datos interno.
· 2. Mover el contenido del Bus de Datos al Complementador.
· 3. Activar la lógica del complementador.
· 4. Mover el contenido del Complementador al Bus de Datosinterno.
· 5. Mover el contenido del Bus de Datos al Acumulador.
A cada uno de estos 5 pasos se les llama microinstrucción. Cadamicroinstrucción es habilitada por una señal de la Unidad de Con trol. Sila Unidad de Con trol manda la combinación de señales adecuadas,cualquier número de microinstrucciones pueden ser ejecutadas para re -sponder a una macroinstrucción que es la respuesta aceptada de laUnidad de Procesamiento Cen tral a un código de una instrucción delenguaje de máquina, muy similares a las ya descritas (SUMA, CARGA yGUARDA).
Para complementar el contenido del Acumulador en nuestro ejemploprevio, la Unidad de Con trol requirió de 5 códigos binarios quedispararon las señales de con trol apropiadas. La secuencia de códigosbinarios que residen en la Unidad de Con trol son llamadosmicroprogramas y generar esta secuencia de códigos binarios se leconoce como microprogramación.
Existe un paralelo muy cercano en tre lo que es microprogramar y laprogramación en lenguaje de ensamblador. Un microprograma se guardacomo una serie de códigos binarios dentro de la Unidad de Con trol. Un
Ensamblador
1-18
programa en ensamblador es guardado como una serie de códigosbinarios dentro de la memoria prin ci pal (RAM o ROM). Al programa enensamblador se le conoce con el nombre de macroprograma y a cadamacroinstrucción le corresponden uno o más microprogramas dentro dela Unidad de Procesamiento Cen tral que deben ser ejecutados paragenerar la respuesta esperada.
Un microprograma guardado en la Unidad de Con trol tiene memoriapara datos, que consiste en los registros de la UPC, ademas dealmacenamiento interno a la misma Unidad de Con trol. Unmacroprograma también tiene una área de almacenamiento, ya sea pro vi -sional (RAM) o definitiva (ROM) como describimos en la siguientesección.
La complejidad de las operaciones asociadas con una macroinstrucciónes función directa del tamaño del microprograma que lamacroinstrucción inicia. Pero existe el límite impuesto por el tamañofísico que puede tener la Unidad de Con trol y esto se hace más patente enlas microcomputadoras, donde toda la UPC se encuentra contenida en unsolo circuito.
La Unidad de Con trol de cada computadora no es más que unmicroprograma. Si se permite al usuario modificarlo se dice que lacomputadora es microprogramable. Si la Unidad de Con trol se diseñacomo parte del diseño lógico de la computadora y forma parte in al ter ablede la Unidad de Procesamiento Cen tral, entonces, la computadora no esmicroprogramable.
1.6 Unidad Aritmética y Lógica
La Unidad Aritmética y Lógica (UAL, en inglés ALU) que es parte dela Unidad de Procesamiento Cen tral (UPC, Cen tral Pro cessing UnitCPU) es la sección de la computadora que realiza las operacionesmatemáticas y lógicas en los datos de entrada procesados por elcomputador. Esta sección de la máquina puede ser relativamentepequeña consistiendo en quizá uno o dos circuitos de integración a granescala (LSI), formar parte de la propia UPC como en el caso de lamicrocomputadora o ser una serie con sid er able de circuitos lógicos dealta velocidad como en las macrocomputadoras o supercomputadoras.No importando el tamaño y la complejidad de estos circuitos, lasmáquinas pequeñas realizan generalmente las mismas operacioneslógicas y aritméticas usando los mismos principios que en las grandes
Componentes Básicos de unSistema
1-19
máquinas. Lo que cambia es la velocidad de las compuertas lógicas y loscircuitos utilizados; también, técnicas especiales son utilizadas pararealizar varias operaciones en paralelo.
Aunque muchas funciones pueden ser realizadas por los UAL de lasmáquinas de hoy en día, las operaciones aritméticas básicas (suma, resta,multiplicación y división) continúan siendo las operaciones másutilizadas. In clu sive las especificaciones de una computadora nos danevidencia de la naturaleza fun da men tal de estas operaciones: en cadamáquina nueva se describen los tiempos requeridos para la suma ymultiplicación como características significativas.
Es importante resaltar que existe, como ya se explicó, otra parte de lacomputadora llamada Unidad de Con trol que dirige las operaciones delUAL. Todo lo que hace el UAL es sumar, restar, acarrear, etc. cuando se leprovee de la secuencia correcta de las señales de entrada. Depende delelemento de con trol el proveer de estas señales así como es función de launidad de memoria proveer a los elementos aritméticos de lainformación que usarán.
Ensamblador
1-20
1.7 La Memoria
La memoria de la computadora no está concentrada en un sólo lugar; losdispositivos de almacenaje están distribuidos en toda la máquina. En laparte más interna encontramos a los registros de operación que sonregistros utilizados por la unidad de con trol y la aritmética de lacomputadora. Los cálculos se realizan con los datos que se toman deestos registros, por ejemplo, la suma, multiplicación y corrimientos sontodos realizados en estos almacenamientos provisionales. El proceso ac -tual de información se realiza en la localidad de estos registros.
Viendo hacia afuera, la siguiente categoría de registros dealmacenamiento que encontramos es llamada memoria de altavelocidad, memoria interna o memoria prin ci pal. Esta sección de lamemoria de la computadora consiste en un conjunto de registros dealmacenamiento, cada uno de los cuales es identificado con una dirección
Componentes Básicos de unSistema
1-21
Figura 1.6 La Unidad Aritmética y Lógica esquematizada.
(localización de cada registro de memoria) que permite a la unidad decon trol, ya sea escribir o leer, de un registro en par tic u lar. Para que unprograma (conjunto de instrucciones) pueda ser ejecutado es necesarioque resida an tes en esta memoria.
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, 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 prin ci pal; por estarazón los dispositivos de almacenamiento con un tiempo de acceso(tiempo que transcurre en tre el momento que se solicita la información yel momento en que el dispositivo tiene una respuesta) rápido songeneralmente elegidos para la memoria prin ci pal.
Desafortunadamente los dispositivos disponibles en el momento, queson lo suficientemente rápidos para realizar esta funciónsatisfactoriamente, no poseen la capacidad de almacenamiento quealgunas veces es requerida ni un costo aceptable. Como resultado,memoria adicional, llamada memoria auxiliar o memoria secundaria,es agregada a la mayoría de las máquinas. Esta sección de la memoria dela computadora se caracteriza por un bajo costo por dígito almacenado,pero generalmente tiene una velocidad de operación mucho menor quelos registros de operación o que la memoria prin ci pal. Esta sección de lamemoria es algunas veces designada como memoria de respaldo, puessu función es manejar cantidades de datos en exceso a las que pueden seralmacenadas en la memoria interna.
Los dispositivos más externos y últimos de almacenamiento son usadospara introducir información a la computadora del “mundo externo” ypara guardar los resultados de la computadora para el usuario de lacomputadora. Este medio de almacenaje consiste generalmente entarjetas perforadas (en desuso), cinta de papel perforada (en desuso),cintas magnéticas o dis cos magnéticos y las salidas de la máquinaconsisten generalmente en caracteres impresos ya sea en pantalla o enpapel.
Cada una de las divisiones de la memoria tiene ciertas características.Por ejemplo la importancia de velocidad es muy alta en los registros deoperación. Estos registros generalmente deben realizar operaciones avarias veces la velocidad de la memoria prin ci pal. La memoria prin ci paltambién requiere grandes velocidades de operación, pero como esdeseable almacenar grandes cantidades de datos (de 600,000 a 109 bits)
Ensamblador
1-22
en esta sección de la memoria, un compromiso en tre el costo y lavelocidad debe buscarse. El mismo tipo de compromiso se realiza en elcaso de la memoria auxiliar en el que se almacenan en tre 360,000 y 1015
bits, siendo muy caro utilizar los mismos dispositivos que para lamemoria prin ci pal.
Es importante darse cuenta al considerar la velocidad de operación, quean tes de que una palabra puede ser leída, es necesario localizarla. Eltiempo para localizar y leer una palabra de memoria es llamado tiempode acceso. El procedimiento para localizar información puede serdividido en dos clases:
· Acceso Aleatorio
· Acceso Secuencial
Los dispositivos de almacenaje que tiene acceso aleatorio son aquellosen los que la localización dentro del dispositivo puede ser seleccionadaarbitrariamente sin seguir ningún orden y el tiempo aproximado deacceso es aproximadamente igual para cada una de las localidades dememoria del dispositivo. Los registros internos de trabajo o la memoriaprin ci pal es un ejemplo de un dispositivo de almacenamiento de accesoaleatorio.
Por otro lado los dispositivos de acceso secuencial necesitan serrecorridos en orden para llegar a cierta localidad de memoria, por lo queel tiempo de acceso varia de acuerdo a la localidad.
Otra forma de subdividir los dispositivos de almacenaje es de acuerdo asi son dispositivos del tipo
· Dinámicos
· Estáticos
En los estáticos, la información, una vez grabada en su localidad, no esolvidada o borrada por el tiempo en que el dispositivo tenga energíaeléctrica o la información no sea cambiada explícitamente. Comocontraparte, en un dispositivo dinámico, una vez guardada lainformación en una localidad, ésta se olvida en un tiempo fini to, por loque se debe recordar o “refrescar” constantemente.
Componentes Básicos de unSistema
1-23
1.7.1 Memoria de Acceso Aleatorio
La memoria de una computadora se organiza en palabras de X longitud,cada una de ella ocupa una localidad o dirección predeterminada dentrode la memoria. Como se puede observar en la figura 1.7 una memoriadada se di vide generalmente en N palabras donde N es una potencia de 2.Cada palabra tiene el mismo número de bits llamados la longitud de lapalabra.
La dirección de los números en la memoria corren consecutivamentecomenzando con la dirección cero hasta la máxima que la computadorapuede direccionar. Es importante entender la diferencia en tre contenidode la memoria y la dirección de la memoria. Una memoria es como ungran gabinete que contiene tantos cajones como direcciones hay enmemoria. En cada cajón hay una palabra y la dirección de la palabra estáescrita en la parte externa del cajón. No removemos la palabra en unadirección cuando la movemos; únicamente cambiamos el contenido de ladirección cuando almacenamos o escribimos una nueva palabra.
Desde el punto de vista externo, una memoria prin ci pal de altavelocidad es muy sim i lar a una “caja negra” con un número delocalidades o direcciones en las que los datos pueden ser almacenados oleídos. Cada dirección o localidad contiene un número fijo de bits
Ensamblador
1-24
Figura 1.7 La memoria vista como arreglo lineal.
binarios, y a este número se le llama longitud de la palabra de lamemoria. Una memoria que contenga 4,096 localidades distintas dememoria, cada una de ellas capaz de almacenar 16 bits binarios, esllamada “memoria de 16 bits 4,096 palabras” o en el lenguaje vernáculode la computadora “memoria de 4K 16 bits”. Puesto que las memoriasgeneralmente vienen en potencias de 2, el sufijo K significa en este caso1,024 y no 103, como en el caso dec i mal, pues se entiende que las 2N
localidades de memoria están disponibles. Por ejemplo una memora de16 bits de 216 palabras es llamada “memoria de 64K 16 bits”.
Las memorias puede ser leídas (los datos pueden ser tomados de) oescritas (los datos son almacenados en la memoria). Las memorias en lasque es posible leer y escribir son llamadas memorias de lectura yescritura y erróneamente conocidas como RAM (Ran dom Ac cess Mem -ory, memoria de acceso aleatorio) ya que las memorias de sólo lectura(ver siguiente párrafo) también entran en esta clasificación. A lasmemorias en las que solamente es posible leer y no permiten escritura son llamadas memorias de sólo lectura o ROM (Read only mem ory).
Una palabra de información binaria puede ser almacenada en grupos,por ejemplo 8 bits en unidades de memoria. Las entradas y salidas deestas unidades se encuentran interconectadas de forma que el grupo debits binarios en tre y salga de forma se rial o secuencial (uno a la vez), osean movidos en paralelo (todo el grupo a la vez).
Cuando se trata de registros dentro de la UPC (CPU) los programadoresusualmente los representan como pequeñas cajas una junto a otra ydentro de ellas un cero o uno lógico que representa su contenido.
1.7.2 Dirección
Incrementando el número de unidades de memoria de almacenamientopodemos aumentar el número de bits disponibles. Pero un problema fun -da men tal surge: ¿Cómo poder accesar a cada una de las localidades sinconfusión?
La solución es usar una forma de dirección. Podemos aplicar un únicogrupo de dígitos binarios a una serie de líneas de selección y de esta forma una localidad única queda disponible. En la figura 1.8 mostramos unamemoria de semiconductores estática típica arreglada de forma que sus“celdas” puedan ser seleccionadas independientemente con un códigobinario único llamado palabra de dirección.
Componentes Básicos de unSistema
1-25
Una vez que la celda ha sido localizada, un 0 o un 1 puede ser escrito a lacelda. Dentro del circuito las celdas se organizan en una matriz de x por y,con la mitad de las líneas de dirección localizando las coordenadas de y.Pero para nuestros propósitos es suficiente considerar a las celdas comouna larga cadena y a la dirección como un se lec tor de alguna forma de lacelda correcta.
1.7.3 La Memoria de Sólo Lectura
La memoria de sólo lectura (ROM Read Only Mem ory) es undispositivo de memoria utilizado para guardar información que nocambia. Hay una operación inicial en que la información se graba en lamemoria y posteriormente sólo es posible leer de ella y no sobre escribirla información. Generalmente la información es puesta en su lugar por elfabricante del dispositivo. Es deseable, sin em bargo, en muchasocasiones poder grabar la información uno mismo en el dispositivo puesel costo de fabricar unos pocos ROMs es prohibitivo. Existen en elmercado una serie de circuitos que cumplen con esta característica y que
Ensamblador
1-26
Figura 1.8 La memoria y sus conexiones extrenas.
son programables: las memorias de sólo lectura programables o PROM(pro gram ma ble read only mem ory)memoria de sólo lecturaprogramable. Estos circuitos permiten grabar la información una sola vez y de ahí en adelante se comportan exactamente igual a un ROM. Si serealizan circuitos experimentales y son constantes los cambios de diseñode datos y programas en la etapa inicial o se requiere de la flexibilidad depoder borrar de vez en cuando el contenido de la memoria ROM yreprogramarla, se utilizan los circuitos de memoria de sólo lecturaprogramables y borrables o EPROM (eras able pro gram ma ble read onlymem ory). Estos circuitos pueden ser programados, tal como los PROMpero tienen una ventana de cuarzo en la parte su pe rior del empaque por laque se puede borrar la información usando una luz ultravioleta.
El atributo más importante de la memoria ROM es que la informacióngrabada en ella no se borra si el voltaje que requiere el circuito parafuncionar es interrumpido. Tales memorias son conocidas como novolátiles. En contraste, casi todo tipo de memoria RAM es volátil.
La memoria ROM tiene muchas aplicaciones en sistemas digitales.Puede ser usada, por ejemplo, para contener valores arbitrarios de unatab la de verdad. Cuando una tab la de verdad tiene muchas vari ableslógicas de entrada y salida y su realización requiere de un gran número decompuertas, puede ser económicamente substituida por una memoriaROM. Se usa también en conversión de códigos para desplieguenumérico. Tiene una amplia aplicación en cálculo numérico donde serequiere de muchas operaciones que pueden ser substituidas por unabúsqueda en tab las, tales como las funciones trascendentales,multiplicación, división, logaritmos, etc. Pero principalmente guardan elprograma que forma el Sistema Operativo de la máquina en cuestión.
1.8 Arquitectura de sistemas 80x86
Hemos escogido para presentar como ejemplo de la UPC al circuito80486 de Intel. Esta selección obedece al hecho de que en México, casitodas las computadoras personales se basan de una forma u otra en estecircuito o en uno de la misma fa milia (todas las compatibles con IBM).
Las microcomputadoras han encontrado su camino hacia muchas de lasaplicaciones reservadas con anterioridad a la minicomputadora. Elabaratamiento de los circuitos y su incesante popularidad ha dadonacimiento a circuitos muy avanzados. El circuito 80486 (y los de su fa -milia) cuentan en tre sus características con:
Componentes Básicos de unSistema
1-27
· Arquitectura interna de 32 bits (64 para P5 y P6)
· Soporta directamente 4 gigabytes (232) de memoria principal y 64tetrabytes de memoria virtual (246)
· Aritmética de 8, 16 y 32 bits con y sin signo, binario y decimal;incluye multiplicación y división
· 14 palabras de registros de 32 bits divisibles en 16 u 8 bits cuatrode ellos
· Capacidad de acceso directo a memoria
· Soporte de coprocesadores (modelo SX, DX lo incluye)
· Operaciones con cadenas
· Soporta E/S por medio de mapa de memoria
Los registros gen er a les de la UPC han aumentado conforme losrequerimientos de cómputo han evolucionado. En un circuito de este tipoencontramos 14 registros de 32 bits (de los cuales sólo mencionaremoslos 16 bits bajos):
Ensamblador
1-28
Tab la 1.1 Registros
Registros gen er a les
AX acumulador
BX base
CX cuenta
DX datos
Grupo de apuntadores e índices
SP apuntador del stack
BP apuntador base
SI apuntador fuente
DI apuntador datos
IP apuntador de instrucción
F banderas del sistema
Registros segmentos
CS segmento de código
DS segmento datos
ES segmento ex tra
SS segmento pilas
El grupo de registros gen er a les consta de 32 bits al igual que los demáspero puede leerse en dos par tes de 16 bits y a su vez la parte baja de 16 bits se puede leer en dos par tes: una baja especificada con el sufijo L y una alta especificada con el sufijo H. Por ejemplo, el registro AX se puede dividiren AL y AH.
Algunos de estos registros tienen usos específicos y algunasinstrucciones requieren de ciertos registros:
Componentes Básicos de unSistema
1-29
Tab la 1.2 Registros y su uso
REGISTRO OPERACION
AX Multiplica o di vide palabras
AL Multiplica o di vide bytes
AH Multiplica o di vide bytes
BX Tra duce
CX Operaciones con cadenas o contador enlazos
CL Rota o corre vari able
DX Multiplica o di vide palabras
SP Operaciones con la pila
SI Operaciones con cadenas
DI Operaciones con cadenas
IP No es accesible más que con saltos
El registro de banderas consta de 16 bits como se muestra en la tab la 1.3.Las decisiones de la computadora se basan muchas veces en el estado deestos bits.
Tab la 1.3 Banderas
Bandera Función
OF saturación
DF dirección (operación con cadenas)
IF habilita interrupciones
TF trampa (ejecución paso a paso)
SF signo (resultado negativo)
ZF cero
AF acarreo auxiliar
PF pariedad (par)
CF acarreo
IOPL Nivel de privilegio para E/S (2 bits)
NT tarea anidada
RF Con tin ua operación
VM Modo vir tual
Este circuito ve a la memoria como un grupo de unidades lógicasllamadas segmentos. Cada segmento puede ser de hasta 4 giga bytes,siendo los de 64K bytes de longitud para compatibilidad con modelos
Ensamblador
1-30
anteriores, y son controlados por los registros de segmentos, cada unoindicando el fi nal del segmento en par tic u lar.
Sólo existe una restricción con respecto a los segmentos: debencomenzar en un párrafo que es una dirección que es di vis i bleexactamente en tre 16. Para esto, los 4 bits menos significativos deben sercero.
Los segmentos pueden ser adyacentes, disjuntos, sin traslape o contraslape parcial o to tal. Si requerimos usar un registro como apuntador amemoria, necesitaremos sumar un desplazamiento para poder completarlas 32 líneas de direccionamiento disponibles. Este desplazamiento se in -dica en la tab la 1.4.
Tab la 1.4 Uso del Desplazamiento
Tipo de referencia Segmento base por omisión Segmento base alterno Desplazamiento
Traer instrucción CS Ninguno IP
Operación con pila SS Ninguno SP
Vari ables (excepto los quesiguen)
DS CS ES SS dirección efectiva
Fuente cadena DS CS ES SS SI
Destino cadena ES Ninguno DI
BP usado como registro base SS CS ES SS dirección efectiva
El circuito cuenta con una cola de instrucciones donde el procesador vaguardando las siguientes instrucciones a ejecutar disminuyendo con estoel ciclo de instrucción del típico traer instrucción, decodificar instrucción y ejecutarla a sólo dos pasos, pues mientras se interpreta la instrucción setrae la siguiente al mismo tiempo.
1.9 Resumen
Se in tro duce a los componentes de una UPC y se muestra comofunciona está. Se mencionan y explican brevemente algunoscomponentes externos a la UPC en es pe cial circuitos auxiliares como lamemoria y sus clasificaciones. En este capítulo introducimos el conceptode instrucción y su forma de interpretación dentro de la UPC, losregistros in dis pen sa bles para el funcionamiento de la UPC y el ALU.
Se in tro duce un circuito típico de gran popularidad en México y elmundo: el Intel 80x86.
Componentes Básicos de unSistema
1-31
1.9.1 Puntos Importantes del Capítulo
· Un sistema se conforma por 5 componentes básicos: UPC,memoria, dispositivos de E/S, interfases de E/S y un programa
· El juego de patrones definidos por el fabricante forman el juego de instrucciones.
· La UPC consta de la UAL, los registros, la unidad de control y unbus interno para interconexiones
· Dentro de la memoria son almacenados datos que luego seinterpretan en la UPC, estos datos tienen muchas interpretacionessegún el programador y el diseñador del circuito.
· Existe un registro especializado llamado de banderas de estadoque nos indica varias condiciones dentro del la UPC.
· Para ejecutar las instrucciones es necesario traerlas de la memoria(fetch) y ejecutarlas (ejecute) esto se realiza en uno o variso ciclosde reloj que mide entonces la velocidad de ejecución de lainstrucciones.
· La unidad de control de una UPC puede o no programarse.
· La UAL ejecuta un conjunto de operaciones aritméticas y lógicasbásicas.
· La memoria puede dividirse en Interna, secundaria, ROM, RAM,dinámica, estática y todas ellas son accesadas por medio de unadirección que identifica las distintas localidades que laconforman.
1.10 Bibliografía
Llano Emiliano Sistemas Digitales y Arquitectura de Computadoras.Unam 1993. Capítulo 10 y 11.
Ensamblador
1-32
Capítulo 22.1 Otros lenguajes y el ensamblador
No se debe pasar por alto que un sistema de computación, noimportando la complejidad de los varios componentes electrónicos quelo formen, no es más que un juguete caro a menos de que exista unpropósito de su existencia y un programa que haga que este propósito secumpla. Es este programa, formado por una serie de instruccionesprecisas y arreglado en un orden lógico, que hace de la computadora unaherramienta útil.
Existen muchos tipos de programas y de sistemas de programas, a losque en conjunto se conocen como Programas (soft ware), en oposición alos elementos mecánicos y electrónicos llamados en conjunto Hard -ware. Algunos de estos programas se usan para un tarea en par tic u larcomo puede ser el caso de una nómina. Otros programas se usan paramanejar los distintos puertos de entrada y salida de una computadora. Laoperación tanto mecánica como lógica de los dispositivos externos alsistema por donde la información es introducida y entregada, escontrolada directamente por estos programas. Existe aún otro tipo deprogramas que realizan funciones muy específicas de computación como realizar las funciones que la UAL no puede realizar o realiza muydespacio. Algunas veces se conoce a los programas como subrutinas pues forman parte de programas mucho más grandes. Para un sistema decomputación dado, muchos programas pueden reunirse y guardarse en un sistema de almacenamiento externo tal como disco magnético flex i ble(medio muy común), posteriormente se utiliza un programa que puedaextraer a los primeros del medio donde fueron almacenados y ejecutarlos. A este programa se le conoce como sistema operativo (op er at ing sys -
2-33
tem) y si se encuentra almacenado en un disco magnético se le llamasistema operativo de disco (disk op er at ing sys tem o DOS).
La primera consideración sería ¿Cómo hacer que la computadoracomience a funcionar? Aplicando la energía eléctrica únicamente no essuficiente para hacer que la computadora comience a funcionar como elusuario desea. Debe existir un programa que haga la inicialización delsistema y de ter mine las metas a alcanzar para poder hacer que el sistemaesté en posibilidad de aceptar entradas de los dispositivos externos comopueden ser el teclado o los dis cos magnéticos de almacenamiento. A esteprograma se le conoce como programa de arranque (start-up pro gram).Usualmente se le conoce en inglés con el nombre de boot strap oprograma de arranque en frío (cold-start), los programas de arranque nonecesariamente tienen que ser muy grandes. El procedimiento comúnconsiste en colocar en una localidad de memoria predefinida del tipoROM, el pequeño programa de arranque. Toda computadora tiene unaforma determinada de comenzar la ejecución de un programa en unalocalidad específica al aplicarles la energía eléctrica, esta característicase aprovecha para guardar en esa localidad el inicio del programa dearranque.
El programa de arranque inicia una cadena de eventos que termina conla ejecución en memoria prin ci pal de una parte del sistema operativoconocida como procesador de comandos que queda en todo momentoactivo para recibir órdenes posteriores de otros programas o del usuariodirectamente en una parte del sistema operativo llamado BIOS o sistemabásico de entrada y salida (Ba sic In put Out put Sys tem).
Lo que sucede a partir del punto en que el sistema operativo toma con -trol de la Unidad de Proceso Cen tral, varía de sistema a sistema pero elobjetivo fun da men tal de este programa es coordinar las distintasoperaciones del computador y llevar registro del estado de varios eventos tales como interrupciones, peticiones a dispositivos externos, etc. Unadiscusión a fondo de sistemas operativos queda fuera del alcance de estelibro pero se puede consultar la bibliografía para ahondar en el tema.
2.2 Los Programas en la Memoria
Como hemos visto en la descripción de la Unidad de ProcesamientoCen tral y en es pe cial de la Unidad de Con trol, la computadora sólo escapaz de ejecutar una instrucción a la vez (en las arquitecturastradicionales no incluyendo en esto arquitecturas en paralelo) por lo que
Ensamblador
2-34
se requiere de una memoria donde guardar las instrucciones que formanel programa. La cantidad de memoria necesaria depende de lacomplejidad del programa y de la cantidad de datos que genere o use.
La ejecución del programa consiste en tomar una instrucción de lamemoria prin ci pal e interpretarla en la Unidad de Con trol de la UPC. Elregistro de Contador de Programa (PC) es utilizado para ir llevando unapuntador de memoria de la siguiente instrucción a ejecutar. Como yahemos visto, el PC se debe incrementar un poco an tes de realizar latransferencia (fetch) de la siguiente instrucción en memoria al Registrode Instrucciones (I).
Las instrucciones son utilizadas para especificar la secuencia lógica que debe ocurrir dentro del sistema de cómputo. Para usar una computadoradebemos, por lo tanto, seleccionar primero los dispositivos que nos darán la capacidad lógica suficiente y posteriormente realizar la secuencialógica que llenará nuestras necesidades. La secuencia lógica forma elprograma y programar es crear estas secuencias.
Nada nos impide crear estas secuencias lógicas en forma binaria y dealguna forma colocarlas en la memoria en las localidades escogidas y dehecho, las primeras computadoras eran programadas de esta forma: unasecuencia de 1 y 0 era cuidadosamente codificada y luego introducida a la máquina por medio de alambres que cambiaban el contenido de lamemoria (en las computadoras más antiguas) o por medio deinterruptores que se conectaban directamente a la memoria por medio delbus de datos (en la siguiente generación).
Pronto los programadores escogieron representar los códigos deinstrucciones en hex a dec i mal en lugar de binario para abreviar y facilitarsu la bor (es muchas veces más fácil identificar un er ror en una secuenciade números hexadecimales que en una cadena de unos y ceros) y luegobuscar la forma en que la máquina trabajará más ayudando a laconversión.
Un código escrito en un papel u otro medio, forma lo que llamamoscódigo fuente, este código es introducido luego a la máquina y elprograma que lo lee, lo convierte y coloca en su localidad de memoria, esllamado un ed i tor y es la forma más el e men tal de colocar los unos y ceros en donde deben estar. Estos unos y ceros colocados en la memoria prin ci -pal y listos a ser interpretados como un programa, son llamados el códigoobjeto y no son más que la representación exacta de lo que en un
Otros Lenguajes y el Ensamblador
2-35
principio teníamos en papel pero ahora colocado en la memoria de lacomputadora.
Pronto se vio que el camino correcto consistía en hacer el trabajo delprogramador más fácil mientras que el de la máquina debería ser el másdifícil. Simplificar el trabajo del programador es una mejora sustancial en nuestro equipo. Llevando este razonamiento un paso más allá, ¿Por quéno usar un lenguaje que sea más sencillo de aprender, programar eintroducir a la máquina que una secuencia de números sin sentido másque para el más experto?
La respuesta a esto, en nivel sistema de computadora, se encuentra en ellenguaje ensamblador que no es más que convertir las instrucciones queentiende la Unidad de Proceso Cen tral (lenguaje de máquina) en unaserie de símbolos alfabéticos y números mucho más convenientes paralos programadores humanos. Los lenguajes ensambladores son, en unaprimera aproximación, versiones simbólicas y mucho más fáciles de leerde los lenguajes de programación de máquinas computadoras. Alincrementarse el uso de las computadoras, los programas eran cada vezmás complejos y de mayor tamaño y se reconoció la necesidad deconstruir los programas en unidades o módulos más pequeños eindependientes. Estas características fueron pronto introducidas en loslenguajes ensambladores que permitieron que módulos de programasescritos como unidades independientes fuesen integrados o ensambladosen uno más grande, de ahí el nombre de ensamblador. En la época ac tual,casi todo tipo de computadora, sea grande o pequeña, se vende con unlenguaje ensamblador y otros programas asociados que nos permitenintroducir nuestras instrucciones a la memoria de la máquina. El lenguaje ensamblador es definido por el fabricante y es único a cada modelo deUPC. Ocasionalmente, varios lenguajes ensambladores pueden existirpara la misma máquina pero el programa que se encarga de colocar losunos y ceros en la memoria, debe entregar el mismo resultado: elprograma objeto ejecutable por la computadora.
Aunque algunos estándares para lenguaje ensamblador han sidopropuestos, hay poca evidencia de que los fabricantes se apeguen a el,pero un patrón gen eral ha emergido:
· Cada instrucción ocupa una línea.
· Cada línea se forma de cuatro campos:
Etiqueta
Ensamblador
2-36
Mnemónico
Operando
Comentario
Cada línea fuente de programa representa una línea objeto traducida porel programa que se denomina ensamblador.
El cam po del mnemónico es el más importante y es el único cam poobligatorio que aparece en cada línea.
etiqueta operando comentario
mnemónico
LIM DC0,ADDR1 ;carga dirección fuente en DC
AQUI LMA ;Carga palabra en acumulador
AIA H"0F" ;quita 4 bits de la palabra
BZ SALIR ;salir de programa si elresultado es cero
SRA ;Guarda bits modificados
INC DC0 ;Incrementa el contador dedatos
JMP AQUI ;regresa a procesar siguientebyte
SALIR ;siguiente instrucción
Nótese que lo único sagrado e in al ter able son los códigos binarios de lasinstrucciones; los mnemónicos del ensamblador pueden ser alteradossiempre y cuando se reprograme al programa ensamblador parareconocerlos y hacer la traducción adecuada.
El cam po de las etiquetas puede o no tener información y si la contiene,sirve al ensamblador para llevar apuntadores de sitios interesantes dentrodel programa a los que seguramente queremos regresar. Estos sitios sonapuntadores en memoria pues no tenemos forma de usar la direcciónverdadera al no sa ber 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 instruccionesespecíficas, etc.
El cam po de los operadores sirve para proveer información necesaria ala instrucción en caso de que exista. Por ejemplo, no podemos sumar unnúmero al registro Acumulador si no indicamos en el cam po de operandoeste número.
Otros Lenguajes y el Ensamblador
2-37
Los comentarios pueden o no ir, pero su uso es casi obligatorio puescontiene información que nos hace más fácil comprender qué es lo quehace el programa y en su caso modificar o dar mantenimiento aprogramas escritos por otra per sona o por nosotros mismos hace tiempo.La información contenida en este cam po es de vi tal importancia para elprogramador pero no influye en nada al resultado del ensamblador.
2.3 Conjunto de Instrucciones
El grupo de instrucciones usados por una Unidad de ProcesamientoCen tral par tic u lar es conocido como conjunto de instrucciones. Cadafabricante incorpora un conjunto de instrucciones ligeramente distinto en cada UPC, de acuerdo al uso al que se destinará el producto. Algunos sonmuy sencillos consistiendo en un puñado de instrucciones, mientras queotros son bastante complejos, con su to tal llegando a los varios cientos.Existen varios grupos de instrucciones, cada uno de ellos con unpropó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 deun grupo de caracteres, claro que, como ya sabemos, todo esto llegafinalmente a ser unos y ceros almacenados en una localidad de lamemoria prin ci pal.
2.4 Ensambladores
Un programa sencillo como el mostrado en la sección 1.3, no puede serensamblado tal como se presentó; es necesario informar al programaensamblador de varios elementos an tes de que pueda comenzar a realizarsu trabajo. Por ejemplo, es necesario informarle en qué localidad dememoria queremos comenzar a ensamblar el programa.
Ensamblador
2-38
Existen una clase de instrucciones llamadas directivas delensamblador que no forman parte del lenguaje de la máquina peroproveen al ensamblador de información que no puede deducir por símismo.
Para poder armar las direcciones de las etiquetas que el programacontiene, es necesario especificar el origen del programa. Esto se logracon la directiva “origen” (ORG) que es la única directiva obligatoria ynecesaria.
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 la bor deprogramar al asignar valores a vari ables para su uso pos te rior.
Otra de las directivas muy usadas es la asignación de una palabra o dedos palabras para asignar valores a vari ables (DB y DW) para su pos te rior uso.
Se debe recordar que las abreviaciones de las directivas delensamblador cambian de uno a otro y siempre se debe consultar el man -ual. Existen ensambladores bastante complejos que permiten toda unaserie de comandos complicados que hacen más sencillo el programar anivel ensamblador.
Nuestro programa, usando las directivas explicadas, quedaría:
ORG H"03FF"
mas cara EQU H"0F"
LIM DC0,ADDR1 ;carga dirección fuente en DC
AQUI LMA ;Carga palabra en acumulador
AIA mas cara ;quita 4 bits de la palabra
BZ SALIR ;salir de programa si el resultado escero
SRA ;Guarda bits modificados
INC DC0 ;Incrementa el contador de datos
JMP AQUI ;regresa a procesar siguiente byte
SALIR END ;siguiente instrucción
Una vez definido el inicio y fin de un programa, el ensamblador puedellevar a cabo su trabajo y nos entregará una secuencia de númeroshexadecimales que forman el programa objeto que correrá directamenteen la máquina tal como se muestra a continuación (el programa se
Otros Lenguajes y el Ensamblador
2-39
modificó ligeramente para ser ejecutado en un procesador del tipo 80x86y se le agregaron todas las directivas del ensambaldor necesarias parapoder ensamblarlo):
Microsoft (R) Macro As sem bler Ver sion 5.00 4/15/93 06:30:48
Page 1-1
;****************************************************************
;Programa an te rior 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 mas cara EQU 0Fh
; ————————————————————————————————
0000 datarea SEG MENT ; área definición dirección a convertir
0500 ORG 500h ; dirección de inicio de la zona dedatos
0500 ???? addr1 DW ?
0502 datarea ENDS
;*****************************************************************
0000 ejemplo SEG MENT ;Programa ejemplo
;————————————————————————————————————————————————-
0000 codigo PROC FAR
0100 ORG 100h
AS SUME CS:ejemplo, DS:datarea, ES:ejemplo ; donde está elcódigo
0100 inicio:
0100 8D 1E 0500 LEA BX,addr1 carga dir fuente enreg auxiliar
0104 89 07 AQUI: MOV [BX],AX ;mover datos de dir a Acum
0106 25 000F AND AX,mas cara ;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
Sym bols-1
Seg ments and Groups:
Ensamblador
2-40
N a m e Length Align Com bine Class
DATAREA . . . . . . . 0502 PARA NONE
EJEMPLO . . . . . . . . 0110 PARA NONE
Sym bols
N a m e Type Value Attr
ADDR1 L WORD 0500 DATAREA
AQUI L NEAR0104 EJEMPLO
CODIGO F PROC 0000 EJEMPLO Length = 0110
INICIO L NEAR0100 EJEMPLO
MAS CARA NUMBER 000F
SALIR L NEAR 0110 EJEMPLO
FILE NAME TEXT ensambla
64 Source Lines
64 To tal Lines
10 Sym bols
51078 + 264170 Bytes sym bol space free
0 Warn ing Er rors
0 Se vere Er rors
2.5 Direccionamiento a Memoria
Aunque realicemos solamente operaciones con los registros internos ala UPC, eventualmente necesitaremos guardar la información en unalocalidad de memoria prin ci pal. Para realizar esta operación, se debeproporcionar como operando una dirección de la que se traerán oalmacenarán datos. Las formas de especificar la dirección dentro de lainstrucción pueden ser muy variadas pero contamos con tipos muyespecíficos como los que describimos a continuación.
2.5.1 Direccionamiento Implícito
Una instrucción que usa el direccionamiento implícito, utiliza elcontenido del registro contador de datos (DC) como dirección dememoria.
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 registroDC como un apuntador a memoria.
Otros Lenguajes y el Ensamblador
2-41
2.5.2 Direccionamiento directo a memoria
Algunas instrucciones pueden especificar la dirección con la quetrabajarán directamente en su operando; a éstas se les conoce comoinstrucciones con direccionamiento directo a memoria.
Toda computadora tiene instrucciones con un rango limitado dememoria en la que pueden actuar. Si todas las instrucciones de unacomputadora están limitadas por esta restricción, a la computadora se leconoce como paginada.
Para formar la dirección fi nal a la que la UPC direccionará, se usa laparte alta del Contador de Programas (PC)y se une a la dirección depágina para formar la dirección efectiva. Este término se aplica a todadirección de memoria que se calcule de alguna forma utilizando para ellola información provista por la misma instrucción.
Los bits tomados del PC son llamados el número de página y los bitsproporcionados por la instrucción forman la dirección dentro de lapágina. Combinando ambos tenemos la dirección efectiva.
La imposición más severa impuesta por un esquema de páginas fijas esque el programa no puede referirse a otra página y los programas nopueden residir en los límites de las páginas cruzándolas, por lo que elprogramador gasta mucho tiempo calculando las páginas y localidadesde memoria para su programa.
Un método para eliminar algunas de las restricciones deldireccionamiento de páginas, consiste en proveer a la computadora deuna página base y un registro de apuntador de página que pueda seralterado por el programa a su conveniencia.
Una variación del esquema an te rior consiste en realizar saltos relativosal PC sumando un desplazamiento contenido en la instrucción, a estavariación se le llama direccionamiento relativo.
2.5.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 orecuperar de la memoria. Este esquema es flex i ble y permite usarapuntadores para aplicar todas las técnicas de programación avanzada alas computadoras directamente (uso de apuntadores, co las, pilas, etc.).
Ensamblador
2-42
2.6 Tipos de Instrucciones
A grandes rasgos las instrucciones pueden ser divididas en grupos muygenéricos, una vez más, depende del fabricante si incluye todos los tipos(o más) o un subconjunto de ellos. La aplicación fi nal del producto dictamuchas veces el tipo de instrucción necesario y el superfluo.
Aunque no exhaustiva, la siguiente clasificación puede muy bien servira nuestros propósitos:
· 1. Instrucciones que mueven datos. Incluyen instrucciones quemueven datos entre un registro y la memoria; entre dos registros einstrucciones inmediatas que cargan a los registros con un valorespecificado en el operando de la instrucción.
· 2. Instrucciones aritméticas y lógicas. Son generalmenteinstrucciones que trabajan con dos operandos y realizan sumas,restas, multiplicaciones, divisiones, Y, O así como sumas y restascon acarreos. Las banderas generalmente se afectan con elresultado.
· 3. Corrimientos. Son de tres tipos: corrimientos, corrimientosaritméticos y corrimientos lógicos. En algunos casos la palabra secorre a través de la bandera de acarreo.
· 4. Saltos y subrutinas. Incluyen saltos incondicionales, saltoscondicionales basados en las banderas, llamadas a subrutinas yregresos de subrutinas.
· 5. Incrementos y decrementos de los registros y la memoria.Usualmente incrementan en la unidad la memoria o los registrospara llevar una cuenta en lazos o para accesar a localidadescontiguas de memoria.
· 6. Comparaciones y pruebas. Comparan dos operandos ymodifican el registro de banderas de acuerdo al resultado orealizan pruebas sobre un operando.
· 7. Meter y sacar información de la pila (stack). Decrementan oincementan el registro de apuntador a la pila de acuerdo a laoperación realizada: empuja o saca.
· 8. Instrucciones con las banderas de estatus. Limpian o fijanalguna de las banderas del registro de banderas de la UPC antes derealizar alguna operación. Habilitan o deshabilitan lasinterrupciones a la UPC.
Otros Lenguajes y el Ensamblador
2-43
· 9. Instrucciones especiales. Todas las que no caigan dentro de las8 anteriores como son las de entrada y salida, que algunosprefieren clasificar en un grupo extra y otras.
Puesto que las instrucciones son distintas en tre las computadoras, sediscute cada grupo en gen eral y a lo largo del libro daremos un ejemplo de microcomputadora y sus instrucciones.
Otra clasificación de las muchas existentes agrupa las instrucciones en 3 divisiones aún más genéricas:
– 1. Instrucciones de transferencia de datos que mueveninformación (direcciones, valores de operandos, instrucciones,etc.) sin cambio de una parte de la computadora a otra.
– 2. Instrucciones de procesamiento de datos que transfieren datosrealizando las operaciones necesarias requeridas.
– 3. Instrucciones de control de programa usadas para determinarel orden de ejecución de las otras instrucciones.
2.7 Lenguajes de Alto Nivel
La programación a nivel máquina es necesaria para que ésta funcione,pero un usuario común y corriente no puede invertir tanto tiempo enaprender a programar una computadora cuando su objetivo prin ci pal es la resolución de problemas.
Los lenguajes de alto nivel son la parte del sistema operativo(aplicaciones) con la que el usuario avanzado se familiarizará (se prefiere hoy en día las soluciones “enlatadas” en forma de programas deaplicación con cierta programación integrada: hojas de cálculo,procesadores de palabras, comunicaciones, autoedición, etc.). Para poder hacer que la computadora se comporte como queremos, debe haber unaforma de comunicar nuestros deseos a la máquina. La mayoría de lascomputadoras existentes tienen alguna forma de lenguaje desarrolladopara ellas. Existen tantos lenguajes como existen computadoras y cadauno de ellos llena un sitio en es pe cial aunque todos tienen en común quetratan de ser de propósito gen eral y “fáciles de usar”.
Aunque es verdad que las diferencias de cada máquina nos limitan en suforma de programarla en lenguaje ensamblador (u objeto), esto no seaplica en su gran mayoría en los llamados lenguajes de alto nivel. ¿Por
Ensamblador
2-44
qué el nombre de alto nivel? Pues porque comparados con los primerosmétodos de programar una computadora son mucho más potentes yflexibles. De los lenguajes de alto nivel más conocidos y en tre los másviejos se encuentra el BA SIC. Es el lenguaje de alto nivel más usado ypop u lar en los sistemas pequeños de computadoras (computadoraspersonales) y en muchos de los sistemas grandes. Debe su popularidad ala sencillez de su sintaxis y a que es muy sencillo aprenderlo no tomandomás que unas cuantas horas para poder realizar nuestro primer programafuncional.
Esta misma sencillez del lenguaje BA SIC, es su prin ci pal desventajapues conforme las técnicas de programación han ido mejorando, senecesita cada vez de herramientas más poderosas que llenen losrequerimientos; han surgido así una serie de lenguajes que se substituyenunos a otros y cada uno clama ser la última y mejor herramienta para laprogramación:
LENGUAJE USO
FOR TRAN programación científica
CO BOL negocios
SMALLTALK objetos
C sistemas
SIMULA simulación
PASCAL enseñanza de técnicas correctas de programación
C++ interfases gráficas y ventanas, objetos
VI SUAL BA SIC interfases gráficas y ventanas, objetos
y muchísimos otros más cada uno con sus méritos, ventajas ydebilidades.
2.8 Intérpretes y Compiladores
No importando qué tan sofisticado sea el programa o el lenguaje en queesté escrito, nuevamente llegamos al punto en que la UPC debeinterpretarlo y ejecutarlo a la máxima velocidad posible. Esto implicatraducir cada una de las instrucciones del lenguaje de alto nivel oensamblador a unos y ceros que son colocados en las localidades precisasde memoria para que sean ejecutadas.
Las dos formas existentes de traducir las líneas de código de un lenguaje de alto nivel son usando programas intérpretes y programascompiladores.
Otros Lenguajes y el Ensamblador
2-45
2.8.1 Intérpretes
Un programa intérprete toma el código desarrollado por el usuario yescrito en un procesador de palabras o generalmente en un procesador detexto proporcionado por el mismo intérprete y al darle la orden deejecutar un programa, tra duce una a una las instrucciones del códigofuente a lenguaje de máquina.
Esto tiene una serie de ventajas y desventajas:
Ventajas:
– Muy fácil corregir errores y desarrollar programas pues en todomomento tenemos control sobre la ejecución, podemosinterrumpir, poner puntos de espera, preguntar el contenido devariables, ejecutar el programa paso a paso, etc.
– Fácil de entender y manejar; como no permite tantas opciones, no tenemos tantos comandos que aprender para controlar el proceso.
– Los errores se corrigen rápidamente y se ve de inmediato elresultado de estas correcciones.
– Las instrucciones del programa siempre están a disposición delusuario y éste puede modificarlas a su conveniencia.
Desventajas:
– Para la distribución del programa terminado debemos incluir elintérprete y las instrucciones para usarlo además de lasinstrucciones para usar el programa.
– No da flexibilidad pues no permite unir el programa con otrosdesarrollados en otros lenguajes.
– No es portátil de un ambiente a otro pues el intérprete usualmentees distinto de máquina a máquina a menos que se apegueestrictamente a un estándard.
– El proceso de traducir las instrucciones una a una lleva tiempo ysi por cualquier causa es necesario ejecutar alguna instrucciónque ya fue traducida, es necesario volver a traducirla una y otravez.
– Se requiere de la memoria necesaria para poder ejecutar elintérprete, más la memoria necesaria para el programa.
Ensamblador
2-46
– Como las instrucciones son interpretadas una a una, no es posibleoptimizar la traducción pues no tenemos el concepto deprograma completo sino de instrucción en instrucción.
– Si se quiere vender el programa final, se debe incluir cada una delas instrucciones permitiendo que el programa sea copiado y/omodificado ilegalmente las veces que se desee.
Por todas las razones expuestas, es muchas veces preferible utilizar uncompilador (ver siguiente sección) aunque algunas veces (si es posible)se prefiere desarrollar en un intérprete y entregar la versión fi nal delprograma en un compilador que aproveche las ventajas de estosprogramas.
2.8.2 Compiladores
Un programa compilador ejecutará el mismo programa que unintérprete, pero la acción se realiza de un modo distinto en cada caso. Elcompilador toma un programa fuente como una unidad y lo tra duce aprograma objeto en varios pasos dejando un programa ejecutable que yano requiere de ningún otro programa para ejecutarse a excepción delsistema operativo.
El programa que entrega el compilador puede ejecutarse directamentedesde el procesador de comandos del sistema operativo. Para que estosuceda, 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 quenecesita para poder realizar su trabajo.
Para que todo esto se cumpla se requiere de un trabajo adicional porparte del usuario y un esfuerzo mucho mayor que en el uso de unintérprete.
Es tal la popularidad de los sistemas de computación y de los lenguajes,que las compañías que los fabrican han invertido mucho tiempo y dineropara entregar un producto que sea rápido y evite muchas de las penuriasque se encontraban en los primeros compiladores comerciales.
El ciclo de desarrollo de un programa con un compilador consiste enescribir el programa en un procesador de texto separado del programa y
Otros Lenguajes y el Ensamblador
2-47
ejecutar el compilador; si no existen errores de sintaxis se procede a ligarcon las librerías de funciones que el programa requiere du rante suejecución; se ejecuta el programa objeto, si existe algún er ror, porpequeño que este sea, se repite todo el proceso.
Como se ve en la descripción an te rior el proceso es minucioso,elaborado, complicado y tardado. Debe existir alguna ventaja en usar uncompilador para que éste exista. La prin ci pal ventaja que se obtiene es larapidez de ejecución del programa fi nal. Pero siguen existiendo ciertasventajas y desventajas con respecto a un intérprete:
Ventajas:
– Programa objeto muy rápido en su ejecución (hasta 100 vecesmás rápido que con un intérprete dependiendo de lasinstrucciones y otros factores).
– Se puede unir el programa con otros desarrollados en otroslenguajes por lo que tenemos acceso a una librería desarrolladapor otros.
– Las instrucciones son traducidas una única vez.
– No existen pedazos de código con errores potenciales pues elprograma se traduce como un todo y no instrucción a instrucción.Al traducir instrucción a instrucción puede ser que hayanpedazos del programa que nunca sean ejecutados en nuestraspruebas.
– Se puede optimizar el resultado final pues se conocen todas lasreferencias y todo lo que hace el programa en términos deinstrucciones.
– No se requiere de ningún programa auxiliar para poder ejecutar el producto terminado.
Desventajas:
– El ciclo de desarrollo es tardado: programación, compilación,ligar y ejecutar. Mientras que en el intérprete sólo es un paso:ejecutar.
Como la única desventaja aparente es la del desarrollo, loscompiladores modernos ya incluyen un ambiente in te gral en el que seescribe el programa, se compila, liga y ejecuta en un sólo paso utilizandola memoria para ello y sólo se graba el programa fi nal como un módulo
Ensamblador
2-48
ejecutable cuando el ciclo de desarrollo está completo y así losolicitamos. Estos productos tratan de combinar las ventajas de unintérprete con las de un compilador y eliminar la mayoría de lasdesventajas de los intérpretes.
2.9 Sistemas Operativos Avanzados
La evolución de las computadoras sigue aún un ritmo desenfrenado.Muchas cosas sorprendentes son realizadas con las computadoras yquedan aún muchas más por realizar: Computadoras gigantescas querealizan todas las transacciones de un banco incluyendo a sus cajerosautomatizados; transacciones internacionales de computadora acomputadora, etc; computadoras para las aerolíneas que llevan los vuelos y reservaciones a nivel mundial; computadoras de tráfico aéreo quellevan el con trol vía ra dar de todos los vuelos que entran y salen de unaeropuerto y muchas aplicaciones más.
¿Puede usted imaginar la cantidad de potencia de cómputo requeridopara esto y la complejidad de un sistema operativo y los programasnecesarios para cumplir con el cometido asignado a la computadora?
Todo esto puede ser atribuido al nacimiento de grandes e increiblemente complejos sistemas operativos, todos ellos no prácticos hace apenas unos cuantos años. Hace poco tiempo el uso de más de 64K bytes de memoriaen un sistema per sonal era impensable e incosteable. Hoy son pocos lossistemas operativos que caben en esa cantidad de memoria.
La tendencia sigue siendo hacia compartir los datos por lo que términoscomo multitareas, multiusuario y multiproceso no serán del tododesconocidos en un fu turo. La necesidad de velocidad es tanta quenuevas arquitecturas surgen como alternativas al uso de un sóloprocesador cen tral: arquitectura paralela y redes neuronales son latendencia tecnológica del fu turo.
2.10 Resumen
Una de las par tes primordiales de un sistema de cómputo y sin el cual sufuncionamiento no es posible es el de la programación. Por medio de unprograma podemos guiar todas las acciones de la electrónica para poderllegar a una aplicación práctica y útil.
Otros Lenguajes y el Ensamblador
2-49
El aspecto de la programación es muy extenso e incluye muchos temascomplejos. Pero su aspecto fun da men tal se de scribe brevemente en estecapítulo.
El sistema operativo (SO) forma la parte sobre la cual actuan todos losdemás programas, todo requerimiento a la computadora es encauzadopor el ca nal adecuado por medio de la parte de entrada y salida básica delSO llamada BIOS.
Todo programa para poder ser ejecutado debe residir en la memoria ydebe ser puesto de alguna forma en ella en comandos que la UPC puedaentender e interpretar para lo cual se han desarrollado toda una serie deprogramas llamados intérpretes y compiladores que se encargan de estala bor.
2.10.1 Puntos Importantes del Capítulo
· Un programa de arranque inicia el sistema de cómputo y lepermite funcionar.
· El procesador de comandos de un sistema operativo quedaresidente todo el tiempo para recibir órdenes de otros programas odel mismo usuario.
· Un programa consiste en una secuencia lógica de instrucciones yse conoce como programar a crear estas secuencias.
· El código fuente consiste en las instrucciones que el programaensamblador interpretará para crear un código objeto.
· El código objeto es el resultado de un ensamblador y consiste en el programa fuente interpretado y colocado en la memoria para suejecución.
· Toda Unidad de Procesamiento Central (UPC)consta de un juegode instrucciones definidas por el fabricante durante suconstrucción.
· Entre las formas de indicar una localidad o dirección de memoriacontamos con: direccionamiento directo, implícito o indirecto.
· Las instrucciones que permite una UPC son clasificados deacuerdo a su función y existen varias de estas clasificaciones.
· Un intérprete traduce instrucción a instrucción un programafuente mientras que un compilador lo hace todo de una vez.
Ensamblador
2-50
2.11 Actividades
2.1 Investigue qué programa ensamblador viene junto con los circuitosbasados en una UPC de Motorola, tales como los Ap ple.
2.2 Encuentre el conjunto de algunas instrucciones de una UPC 68000de Motorola.
2.3 Haga un programa sencillo para multiplicar dos números de 8 bits en lenguaje ensamblador inventado por usted. Use el registro Acumulador ydos auxiliares llamados B y C. No emplee una instrucción que hagadirectamente la multiplicación.
2.12 Bibliografía
Llano Emiliano Sistemas Digitales y Arquitectura de Computadoras.Unam 1993. Capítulo 13.
Macro 86 Co lum bia Data Prod ucts, Inc. 1982.
MPC Op er a tions Guide Co lum bia Data Prod ucts, Inc. 1982.
Otros Lenguajes y el Ensamblador
2-51
3. Sistemas NuméricosComo matemático, Laplace1 apreciaba enormemente el sistema
numérico dec i mal. Comprendía que cientos de años de esfuerzosmentales así como de buena suerte dieron como resultado el sistema queusamos y estaba en una posición en la que podía apreciar sus ventajas.Nuestro presente sistema numérico provee a los matemáticos modernos y científicos con grandes ventajas sobre los usados por anteriorescivilizaciones y es un fac tor importante de nuestro rápido avance.
Puesto que las manos son la herramienta más conveniente con la que lanaturaleza nos dotó, los seres humanos siempre hemos tendido a usarlaspara contar. Es entonces nat u ral y afortunado que nuestro sistema decontar se base en el número de dedos que tenemos. Sin em bargo pasóbastante tiempo an tes de poder representar estos números gráficamente.Las primeras representaciones gráficas encontradas consisten en marcasverticales y horizontales. El número 1 es un ejemplo de esto; esinteresante hacer notar que el 2 consistía de dos marcas horizontalesunidas con una línea y el 3 de tres marcas horizontales unidas (sistemaarábigo). Los números Romanos son un buen ejemplo de líneas usadascomo base para números (ver figura 3.1).
3-53
1 Pierre Simon marqués de Laplace (1749-1827). Astrónomo y matemático francés que dio basecientífica a la Hipótesis de las Nebulosas. Entre sus trabajos matemáticos más notables se destaca elperfeccionamiento de la teoría de las probabilidades.
Ensamblador
3-54
Figura 3.1 Comparación de algunos sistemas de números.
El sistema dec i mal ha sido tan aceptado y adoptado por nuestracivilización que rara vez consideramos la posibilidad de otros sistemasen uso. De todas formas, no es razonable pensar que un sistema basado enel número de dedos que tenemos en las manos sea el más eficiente parausar en las máquinas que construimos. El hecho es que un sistema muypoco usado para otra cosa, pero muy sencillo, el sistema binario, haprobado ser el más nat u ral y eficiente para su uso en máquinascomputadoras.
3.1 El Sistema Decimal
Nuestro sistema ac tual se forma por 10 símbolos distintos: 0, 1, 2, 3, ..., 9 llamados dígitos Arábigos. Con este esquema nos veríamos forzados adetenernos en 9 o inventar otros símbolos para los demás números si nofuese porque usamos una notación de posición. Un ejemplo de esto lopodemos encontrar en los números romanos que son en esencia aditivos:III=I+I+I, XXV=X+X+V. Se requieren nuevos símbolos conforme laserie crece (X, M, C, etc.). Así, se usa V en lugar de IIIII=5 la únicaimportancia en posición en los números Romanos es si un símbolo pre -cede o an te cede a otro (VI=6, IV=4). La torpeza de este sistema resalta encuanto deseamos realizar cualquier operación con dos números, porejemplo multiplicar XII por XIV (12x14). El cálculo con númerosRomanos es tan engorroso que los primeros matemáticos se vieronforzados a usar casi exclusivamente el ábaco o tab las de contar y luegotraducir el resultado a números Romanos. Los cálculos con papel y lápizson tan increiblemente complicados en este sistema que la habilidad parahacerlo era muy apreciada en tre los antiguos Romanos.
La gran simplicidad y belleza de nuestro sistema dec i mal puedeentonces apreciarse en detalle. Sólo es necesario aprenderse 10 dígitos yel sistema de notación de posición para contar cualquier cantidad.Después de aprender de memoria 10 tab las de multiplicar y de sumar asícomo aprender unas sencillas reglas, es posible realizar cualquieroperación aritmética. Nótese la sencillez para realizar la operación 12 por 14:
14
x 12
28
14
168
Sistemas Numéricos
3-55
El significado del número 168 puede notarse al decir la cantidad “cientosesenta y ocho”. Básicamente e l número consis te en(1x102)+(6x101)+(8x100). La importancia es que el valor de cada dígitoestá determinado por su posición. El 3 en 3000 vale distinto que el 3 en 30y se denota al hablar diciendo tres mil o treinta (tres decenas).
La regla gen eral para representar cualquier número en notación dec i mal es:
( . )31 10 1011
22
1 2a a a a a an nn n
- -+ + + =K K
donde n denota el número de dígitos a la izquierda del punto dec i mal.
La base del sistema es definido como la cantidad de dígitos distintosusados en cada posición en un sistema de notación. El sistema dec i maltiene base 10, esto significa que el sistema tiene 10 dígitos distintos pararepresentar cualquier cifra (0, 1, 2, 3, ..., 9). La historia registra el uso devarias bases. El sistema quinario (base 5) prevalece en tre los esquimalesy los indios de Norte América, la base doce aún se usa en relojes, pies,docenas; el de base 60 (usado por los Babilonios) en segundos y minutos.
3.2 El Sistema Binario
El matemático del siglo XVII, Leibnitz2, era un fanático del uso de labase 2 que sólo usa los símbolos 0 y 1 para representar cifras. Puedeparecer extraño que un matemático eminente use un sistema tan sencillo,pero debe recordarse que en esa época casi todos los matemáticos erantambién filósofos y religiosos. Su preferencia al sistema base dos sedebió a razones míticas, el uno representando a la deidad y el cero a lanada.
Cualesquiera fuesen las razones de Leibnitz para usar el sistema binario, en los últimos años se ha vuelto muy pop u lar. Todas las computadorasmodernas se construyen para operar usando el sistema binario o sistemascodificados en binario y todo in dica que en un fu turo cercano seguiránsiendo construidas de esta forma.
Ensamblador
3-56
2 Gottfired Wilhelm barón von Leibniz o Leibnitz (1646-1716). Filósofo y matemático alemántambién erudito en ciencia, historia y derecho. Desarrolló el cálculo infinitesimal sin conocer la obrade Newton en el mismo campo. Su filosofía se apoya fundamentalmente en la concepción de ununiverso compuesto por un número infinito de unidades de fuerza espiritual o materia a la que llamamónadas.
Los componentes básicos de las primeras computadoras eran losrelevadores y contactos que son binarios por naturaleza pues sólo puedenestar en dos estados posibles: cerrados (1) o abiertos (0). Los principalescomponentes de las computadoras actuales son los transistores similaresa los usados en televisores y ra dios. La necesidad de un funcionamientoconfiable llevó a los diseñadores a utilizar a los transistores en susestados de corte y saturación reduciendo así sus estados posibles a dosfácilmente identificables, conduciendo (1) o no (0). Una sim ple analogíapuede realizarse en tre estos dos estados y un foco de luz eléctrica. Encierto momento el foco está prendido (tran sis tor conduciendo) emitiendo luz o apagado (tran sis tor no conduciendo). Aunque el foco esté viejo y no produzca tanta luz, se puede decir con certeza si está prendido o apagado.Lo mismo sucede con un ra dio, si éste está viejo o con las pilas gastadas,hay que compensar subiendo el volumen pero por muy bajo que esté,siempre se puede decir si está prendido o no.
Debido al gran número de par tes que forman una computadora, esaltamente deseable utilizarlas de tal forma que los cambios en suscaracterísticas no afecten el desempeño to tal del sistema. La mejor formade lograr esto es usando los circuitos en su forma biestable (de dosestados posibles).
Sistemas Numéricos
3-57
3.2.1 Contando en el Sistema Binario
El mismo tipo de notación de posición que usamos en el sistema dec i mal es el que se usa en el sistema binario. Obsérvense los primeros 16números en el sistema binario:
Tab la 3.1 Conversión de Dec i mal a Binario
Dec i mal Binario Dec i mal Binario
0 0 8 1000
1 1 9 1001
2 10 10 1010
3 11 11 1011
4 100 12 1100
5 101 13 1101
6 110 14 1110
7 111 15 1111
Debe notarse que el sistema dec i mal usa potencias de 10 mientras que elbinario potencias de 2 y en gen eral el sistema n usará potencia n. Mientras que el número 35 en dec i mal equivale a 3 x 101 + 5 x 100, el mismonúmero en binario (35) se representa como 1000112 significa 1 x 25 + 0 x24 + 0 x 23 + 0 x 22 + 1 x 21 + 1x20. Los siguientes ejemplos ilustran laconversión de una base a la otra, debe notarse que la potencia puedesubstituirse por potencia n para sistema n (por ejemplo 16 para sistemabase hex a dec i mal u ocho para sistema oc tal).
111 1 2 1 2 1 2 4 2 1 72 1 0= + + = + + =x x x
1011 1 2 0 2 1 2 1 2 6 0 2 1 93 2 1 0= + + + = + + + =x x x x
11011 1 2 1 2 0 2 1 2 1 2 2 1 01
4
1
83
3
81 0 1 2 3. = + + + + = + + + + =- - -x x x x x
Los números fraccionarios se forman al igual que en el sistema dec i mal:
Ensamblador
3-58
0135 1 10 3 10 5 101 2 3. = + +- - -x x x
3.2.2 Conversión de Sistema Decimal a Binario
Existen muchos métodos de conversión en tre bases pero el primero ymás obvio es restar todas las potencias de la base al número en base 10hasta que el resultado sea cero. En base 2 restaremos la potencia mayor de 2 del número; al res tante se le aplica el mismo procedimiento hasta que elresultado sea cero. Para convertir 2510 a base 2 restaremos de 25 lapotencia mayor de 2 que no exceda a 25, en este caso 24 quedando25-16=9 del que restamos la siguiente potencia mayor (23=8) y asícontinuamos hasta que no tengamos nada que restar. El número quedacomo 24 + 23 + 20 ó 11001.
Un método más empleado para números grandes es dividir en tre la basey apuntar el residuo resultante de derecha a izquierda, volviendo a dividirel resultado en tre la base hasta que el resultado sea cero. Por ejemplo12510:
125ÿ2=62+1, 62ÿ2=31+0, 31ÿ2=15+1, 15ÿ2=7+1, 7ÿ2=3+1,
3ÿ2=1+1, 1ÿ2=0+1
tomando los residuos de derecha a izquierda: 11111012.
En el caso de fracciones se debe dividir el número en dos par tes, laentera en la que se aplica cualquiera de los métodos an tes expuestos y lafraccionaria.
La conversión de fracciones a la base de interés se logra restando de éstalas potencias negativas de la base hasta que no tengamos residuo o hastala precisión que se requiera. Este primer método es engorroso parafracciones grandes por lo que se prefiere multiplicar por la base y tomarlo que queda a la izquierda del punto para formar la fracción y lo quequeda a la derecha para volver a aplicar el procedimiento. Por ejemplo0.437510 a base 2:
2x0.4375=0.8750, 2x0.8750=1.750, 2x0.750=1.50, 2x0.50=1.0
tomando los números a la izquierda del punto dec i mal de izquierda aderecha tenemos que 0.437510=0.01112.
Sistemas Numéricos
3-59
3.2.3 Suma y Resta en Sistema Binario
La suma y resta en sistema binario son mucho más sencillas de aprenderque en cualquier otro sistema pues las reglas son muy sencillas. Para lasuma 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 sim i laral dec i mal al que ya estamos acostumbrados:
101 1111 11.01
110 10100 101.11
1011 100011 1001.00
La resta tiene también reglas muy sencillas:
0 - 0 = 0
1 - 0 = 1
1 - 1 = 0
0 - 1 = 1 con un préstamo de 1
Y la forma de hacerla es sim i lar al sistema dec i mal:
1001 10000 110.01
-101 -11 -100.10
100 1101 1.11
3.2.4 Multiplicación y División Binaria
La tab la de multiplicar usada por el sistema binario sólo tiene cuatroreglas a diferencia de las 100 usadas para la multiplicación en sistemadec i mal:
0 x 0 = 0
1 x 0 = 0
0 x 1 = 0
1 x 1 = 1
Ensamblador
3-60
Sólo es necesario copiar de nuevo el fac tor si se multiplica por 1 ó ponerceros 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 111.01
101 11001 100 11101.00
101 110
001 101
101 100
3.3 Representando Números en Otras Bases
Hemos dicho ya que los números en otras bases tienen tantos símboloscomo la base de que se trate, esto es, en base dos tenemos dos símbolosdistintos, en base 10, diez símbolos distintos para representar cualquiernúmero. ¿Pero qué símbolos usar para bases mayores que diez? Distintasculturas han empleado distintos símbolos para re solver este problema,pero actualmente la única base usada mayor que la dec i mal es la base 16 o hex a dec i mal.
Para representar números en base 16 usamos los nueve símbolos yaconocidos 0, 1, 2, ..., 9 y agregamos las letras para representar al 10, 11,12, 13, 14 y 15. Así, la A representa al símbolo 10, B al símbolo 11, etc.
Para convertir de base 10 a cualquier otra empleamos los mismosmétodos de la base dos, es decir dividiendo consecutivamente en tre la
Sistemas Numéricos
3-61
base y anotando el residuo. Para el caso de base 16 dividiremos en tredieciséis.
Encontramos la equivalencia de un número en cualquier base conrespecto a la dec i mal usando notación de posición y multiplicando por labase 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 di vis i ble en tre la base dos, el sistema hex a dec i mal es una forma conveniente de representar en notación corta al sistemabinario evitando errores (con este mismo propósito se utilizó muchotiempo la base 8). La forma de convertir de sistema hex a dec i mal a binario es sustituir cada uno de los símbolos usados en el número en hex a dec i mal por su equivalencia en binario:
F09516 = 1111 0000 1001 01012
o cualquier número en binario dividiendo el número en grupos de 4 dederecha a izquierda y sustituyendo por su símbolo equivalente en base16:
100010101102= 0100 0101 01102 = 45616
Para estas conversiones es conveniente tener una tab la a la mano:
Tab la 3.2 Distintas Representaciones de los Enteros del 0 al 15.
Dec i mal Binario Hex a dec i mal 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
Ensamblador
3-62
3.4 Decimal Codificado en Binario (BCD)
Puesto que las computadoras construidas usando el sistema binariorequieren de una menor cantidad de circuitos electrónicos y por lo tantoson más eficientes que las máquinas que operan con otros sistemasnuméricos, el sistema binario es el sistema más nat u ral para unacomputadora y el de mayor uso actualmente. Por otro lado, el sistemadec i mal es el más nat u ral para nosotros. Todos los cálculos querealizamos usualmente se realizan en el sistema dec i mal, pero deben serconvertidos por las computadoras de dec i mal a binario an tes de realizarcualquier operación. Debido a esto, muchas de las primerascomputadoras usaban un sistema de codificación dec i mal a binaria. Ental sistema, se usan grupos de dígitos binarios para representar cada unode los 10 símbolos usados en el sistema dec i mal. Por ejemplo, uno de loscódigos más obvios y naturales es usar un “código binario de pe sos”donde cada posición representa un “peso” tal y como se muestra en la tab -la 3.3
Tab la 3.3 Código binario de pe sos.
Código Binario Dígito Dec i mal
Peso
8 4 2 1
0 0 0 0 0
0 0 0 1 1
0 0 1 0 2
0 0 1 1 3
0 1 0 0 4
0 1 0 1 5
0 1 1 0 6
0 1 1 1 7
1 0 0 0 8
1 0 0 1 9
Nótese que son necesarios 4 dígitos binarios para cada símbolo dec i mal. 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 soninsuficientes.
Para simplificar la conversión de dec i mal a binario, es más prácticocodificar un número dec i mal d d d dn n- -1 2 1 0K donde { }d i ® 0 1 9, , ...,de la siguiente forma: Reemplace cada dígito dec i mal con su equivalentede 4 símbolos binarios tal como están definidos en la tab la 2 an te rior. Elnúmero resultante es llamado código binario dec i mal, código 8, 4, 2, 1 o
Sistemas Numéricos
3-63
simplemente BCD (Bi nary-coded dec i mal), y lo indicaremos con elsufijo BCD. Así, tenemos que:
10001010101BCD = 45510
Hay que resaltar que el número resultante BCD y el binario son muydistintos. A cada uno de los dígitos binarios le llamamos bit (de bi narydigit). En la representación BCD, cada segmento de 4 bits representa unsólo dígito dec i mal cuyo peso es una potencia de 10. Unicamente 10 delos 16 posibles patrones de grupos de 4 bits son necesarios para larepresentación BCD. Aunque el formato BCD claramente simplifica laconversión dec i mal, tiene la desventaja de requerir más bits por cadanúmero a representar. Usando 8 bits, el mayor número rep re sent able 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 (versiguiente sección). Para re solver estas desventajas se diseñaron otro tipos de códigos. Uno de los primeros es el llamado de exceso 3 (ex cess 3) en el que para formar la equivalencia, primero se suma 3 al número dec i mal.Por ejemplo para representar al 4, primero sumamos 3, resultando 7 yluego usamos el BCD “nor mal”, que es 0111. El 0111 es el código exceso3 para el 4.
Cambiando cada 0 por 1 y cada 1 por 0 formamos lo que se llama elcomplemento del número binario. Este procedimiento es usado paraformar el complemento a 9 de un número dec i mal. Por ejemplo elcomplemento de 0100 (1 dec i mal en código exceso 3) es 1011 u ochodec i mal.
El código exceso 3 no es un código de peso (de notación), esto es, cada 1no representa una potencia de 2 que podamos sumar para formar elnúmero dec i mal. Un código de peso en el que el complemento a 9 puedaser formado complementando cada bit, es el código 2, 4, 2, 1representado en la tab la 4. Este código se usa extensivamente eninstrumentos y calculadoras electrónicas.
Ensamblador
3-64
Tab la 4. Representaciones Alternas.
Dec i mal Exceso 3 Complemento Código
a nueve 2, 4, 2, 1
Peso
2 4 2 1
00 0011 1100 0 0 0 0
01 0100 1011 0 0 0 1
02 0101 1010 0 0 1 0
03 0110 1001 0 0 1 1
04 0111 1000 0 1 0 0
05 1000 0111 1 0 1 1
06 1001 0110 1 1 0 0
07 1010 0101 1 1 0 1
08 1011 0100 1 1 1 0
09 1100 0011 1 1 1 1
3.5 Números Negativos
Hasta el momento sólo hemos trabajado con números positivos (sinsigno) pero el signo positivo o negativo es necesario para distinguir a lospositivos de los negativos. Los números sin signo se consideran comopositivos y el signo de + es omitido. En una computadora los números sealmacenan en una memoria que tiene un número fini to y fijo deposiciones. Cada posición puede tomar un valor de 0 ó 1 y es costumbrerepresentar a los números negativos reservando la última posición de laizquierda para el signo. De esta forma, en una computadora que tengalon gi tudes de registro, llamadas palabras de 8 bits (8 bits equivalengeneralmente a 1 byte) sólo podran usarse 7 posiciones (128 númerosdistintos ó 2n-1) y la última para el signo.
Por convención se ha escogido utilizar un 1 para números negativos y 0para los positivos. De tal forma, -104 se representa por 11101000 y 104como 01101000. A esta notación se le llama notación con signo. Lasoperaciones matemáticas pueden realizarse en la misma forma que lasoperaciones manuales con números decimales.
El resultado de una operación matemática en una palabra de n bitsrequiere, típicamente, que el resultado sea una palabra de n bits. Si elresultado completo es una palabra de n+1 bits, como en el caso de unasuma, se dice que ha ocurrido un desbordamiento o saturación (over -flow). Un desborde se in dica con una generación ex tra de una señal quemodifica una memoria de un bit cambiándola de 0 a 1. En algunos casosla saturación puede ser ignorada y considerar como resultado adecuado a
Sistemas Numéricos
3-65
los n bits de la palabra y en otros será necesario tomar alguna accióncorrectiva.
3.5.1 Complementos
Aunque el código de notación con signo es la contraparte directa delcódigo dec i mal usado por los seres humanos, otra representación binariallamada de complementos es usada con frecuencia en computadorasdigitales, principalmente porque simplifica la construcción de ciertasoperaciones aritméticas.
Existen dos tipos de complementos usados:
· 1. Complemento a la base. Se forma restando cada dígito de lacantidad al número de la base menos uno y luego agregando 1 alresultado así obtenido. Para el sistema decimal llamamos a estaforma complemento a diez, para el binario, complemento a dos.
· 2. Complemento a la base menos 1. Se forma restando a cadadígito de la cantidad al número de la base menos uno. Para elsistema decimal llamamos a esta forma complemento a nueve,para el binario, complemento a uno.
Por ejemplo el complemento a diez de 8710 es 1310 (1210+110) y el de2310 es 7710 (7610+110) mientras que el complemento a nueve de 8710 es1210 y el de 7710 es 2210. En el sistema binario el complemento a dos de101102 es 010102 y el de 110102 es 001102.
El método para encontrar el complemento en la base dos de cualquiercantidad consiste en sustituir todo 0 por 1 y todo 1 por 0, dependiendo deltipo de complemento se sumará 1 o no.
La ventaja prin ci pal de usar complementos en sistemas digitales du -rante la suma o resta, es que todos los bits del número son tratados deforma uniforme y que la resta y suma son realizadas por el mismo circuito que sólo suma y es mucho más sencillo.
Al usar la representación por complementos la resta queda simplificadarealizándose con sumas:
Ensamblador
3-66
Complemento a la base
89 89
-23 +77
66 66 (el último acarreo se descarta)
11011 11011
-10100 +01100
00011 100111 (el último acarreo se descarta)
Complemento a la base menos uno
89 89
-23 +76
66 1 65
+1 (el último acarreo se suma)
66
11001 11001
-10100 +01001
00011 1 00010
+1 (el último acarreo se suma)
00011
3.6 Código Grey y ASCII
Las secuencias de los números binarios son “naturales” y generalmentese comprenden con facilidad pues siguen un patrón posicional tal como el sistema dec i mal. Podemos, sin em bargo, representar a un número por una secuencia arbitraria de 1 y 0. Para evitar ambiguedad debemos sin em -bargo asignar a cada valor numérico una secuencia distintiva e in di vid -ual.
Los números representados en otros sistemas que los naturales, sonllamados códigos puesto que se les debe asignar un código (regla deasignación) para determinar el valor numérico representado por lasecuencia. Ya hemos analizado algunos códigos utilizados encomputación e introducimos dos más: el Grey reflejado y el ASCII.
El código ASCII (Amer i can Stan dard Code for In for ma tion In ter -change, Código Americano Estandard para el Intercambio deInformación) es un esfuerzo de los diseñadores para tener compatibilidad en tre las distintas máquinas y aplicaciones. El código se forma de 7 bits y
Sistemas Numéricos
3-67
el oc tavo se deja disponible para que el diseñador juege con el, ya seapara comprobar por medio de paridad (explicada en los siguientescapítulos) si no hay er ror de transmisión o manipulación de datos o paraexpandir 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 con trol yusualmente no se pueden desplegar o imprimir (hay formas de dar lavuelta a esto). Los demás se usan para las letras, los números y toda unaserie de símbolos utilizados. En Japón y otros países donde se usa otrotipo de letras que no son las romanas, se utilizan hasta 2 bytes (16 bits oposiciones de unos y ceros) para que el código pueda representar todassus palabras. El usar este código garantiza, en muchos casos,compatibilidad en tre datos de distintas aplicaciones de forma que elresultado de un programa pueda ser leído por otro con poco esfuerzo denuestra parte.
Ensamblador
3-68
En el código Grey, los dos primeros números son representados enforma nat u ral, la siguiente serie de números son encontrados de la formaespecificada en la figura 3.2. Una imagen espejo se representa por la línea de guiones en tre los primeros dos números (en la tab la de la izquierda) yque da lugar al punto de la reflexión. De ahí en adelante un cero esañadido a la primera serie de números y un 1 a la segunda. Repeticionessucesivas del proceso de reflexión nos permiten hacer cualquier serie denúmeros.
La característica más importante del código Grey es que los númeroscambian de uno a otro sólo en un dígito. Por ejemplo notemos que delnúmero 7 (0100) al 8 (1100) sólo cambia el dígito en la posición cuartamientras que en la representación binaria (7=0111, 8=1000) cambian 4
Sistemas Numéricos
3-69
Figura 3.2 Código ASCII de 8 Bits.
dígitos. Encuentra aplicación en un sin número de situaciones de la quedaremos un breve ejemplo.
Supongamos que tenemos una ve leta que nos dará la dirección delviento en cualquier momento. Un circuito recibe la señal y la interpretamandando el resultado a un computador que analizará los datos junto conmuchos más para dar un pronóstico de tiempo. Si el circuito detecta quemás de un dígito cambia a la vez, podemos estar seguros de que hay un er -ror en la transmisión o en el sen sor y podemos descartar la lectura yesperar a la siguiente o dar la alarma para que la situación se corriga.
3.7 Resumen
Los números son la base de todas las representaciones formales querealizamos. Las bases distintas a la de diez han estado en uso du rantemucho tiempo pero es la base 2 la única distinta de 10 que actualmenteusamos. Dada su sencillez, la base 2 se utiliza en las computadorasdigitales actuales. Es importante entenderla y ser capaz de realizaroperaciones sencillas fácilmente.
Ensamblador
3-70
Figura 3.3 Desarrollo del código Grey.
3.7.1 Puntos Importantes del Capítulo
· El sistema decimal es un sistema de posiciones en la que a cadasitio 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 cerosque hacen más fácil el tratamiento de números dentro de lacomputadora como son el BCD, exceso tres, 2421 ycomplementación.
· Los números negativos se representan reservando un bit para elsigno.
· El código Grey y el ASCII son usados extensivamente encomputació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 suequivalente hex a dec i mal.
3.3 Convierta los números del problema 3.1 a base 8 y base 4 (recuerdeque la base 8 sólo consta de 8 símbolos distintos 0 a 7, y la base 4 del 0 al3).
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 yde 2:
a) 101112, b) 10012, c) 11112
3.8 Haga la siguiente resta usando complementos a 1 y a 2:111012-110112
Sistemas Numéricos
3-71
3.9 Convierta los siguientes números hexadecimales a binario:
a) BCD16, b) 63516, c) FFF16
3.10 Una regla sencilla para multiplicar dos números en cualquier basees multiplicar los dos números en forma dec i mal. Si el producto es menosque la base, se toma tal cual; si es mayor que la base, divida en dec i malen tre la base y tome el residuo como el dígito menos significativo y elcociente como el más significativo. Por ejemplo 26 x 26 = 46, 38 x 28 = 68;
pero 26 x 46 = 86 y 6ÿ8 = 1 y sobran 2 por lo que 26 x 46 = 126. Usandoesta regla, multiplique:
a) 27 x 47, b) 27 x 37, c) 54 x 44
3.8 Bibliografía
Llano Emiliano Sistemas Digitales y Arquitectura de Computadoras.Unam 1993. Capítulo 3.
Ensamblador
3-72
Capítulo 44.1 Las herramientas
Existen una multitud de métodos para codificar un programa enensamblador. El primero y más primitivo consiste en codificardirectamente el programa por medio de una herramienta como DE BUG;veremos como esto es posible y por qué es un método utilizado solamente para programas pequeños.
El segundo método consiste en utilizar un código fuente en unprocesador de palabras o cualquier otro ed i tor que nos entregue comoresultado código ASCII y a continuación ensamblar este código paraproducir un código ejecutable.
Este método es el más corriente y conveniente, para llevarlo a cabo esnecesario seguir los siguientes pasos:
· 1. Preparar el programa, su estructura, sus datos, métodos decálculo, etc. Este paso previo se realiza generalmente en papel oen la multitud de programas disponibles para tal fin, como sonProcesadores de Palabra, programas de Diagramas de Flujo, etc.
· 2. Codificar el programa en un editor o Procesador de Palabra queentregue código ASCII como salida. Se puede utilizar desde elprimitivo EDLIN, el editor de programas de PASCAL o C, hastaun sofisticado procesador de palabras basado en Windows.
· 3. Transformar el código fuente en lenguaje de máquina pormedio de un ensamblador (por ejemplo MASM). En está fase secorrigen los posibles errores de estructura y sintaxis del programafuente.
4-73
· 4. Ligar el programa si el ensamblador no lo hace por nosotros,esto es, agregar todas las rutinas externas a nuestro programa yque se requieran para su funcionamiento.
· 5. Verificar el funcionamiento del programa ejecutable entregadoen el paso anterior. Aquí será necesario corregir los errores delógica y funcionamiento del programa ejecutable. Se puedeutilizar el programa DEBUG o cualquier otro comercial paraejecutar el código paso a paso, revisar los registros, etc.
· 6. Repetir la secuencia anterior a partir del paso 2 tantas vecescomo sea necesaria hasta obtener un código limpio que ejecutesegún las especificaciones originales.
Como se ve de los pasos anteriores esto lleva mucho tiempo y con sumemuchos recursos de dinero y esfuerzo, por lo que el paso 1 es el másimportante y en el que debemos tardarnos más para evitar tardarnos en los demás.
4.2 La Sintaxis
Como en todo lenguaje de programación, hace falta respetar ciertasreglas. En esta sección detallamos algunas de las reglas del ensamblador.
4.2.1 Las Reglas del Juego
El lenguaje ensamblador, como todos los demás, se forma de un juegode instrucciones separadas en líneas conteniendo cada una de ellas (como ya se vio en capítulos precedentes) las siguientes par tes:
· Un identificador opcional.
· Un mnemónico válido que forme parte del juego de instruccionesdel procesador.
· Un operando o varios, separados por comas si el mnemónico así lo requiere.
· Un comentario en relación a la instrucción.
Dentro del archivo fuente no se requiere de ninguna organización en es -pe cial pero se recomienda utilizar cuatro columnas para mantener laclaridad del programa y hacernos la vida más fácil.
Ensamblador
4-74
4.2.2 Los Caracteres
El ensamblador reconoce un subconjunto de la secuencia de caracteresASCII disponibles. Los caracteres válidos son:
· Los caracteres del alfabeto a excepción de los caracteresacentuados (se pueden usar en el campo de los comentarios).
· Los caracteres numéricos.
· Los siguientes símbolos:
· + - * / = ( ) [ ] ; ‘ . ! , _ : @ $ espacio tabulador CR (retorno) LF(alimentación de línea)
Los caracteres alfabéticos mayúsculas son tratados exactamente comolos minúsculos:
MOV AX,0 = MoV Ax,0
INC BX = inc bx
pero
‘ABC’ no es igual a ‘abc’
Aún así, se recomienda seguir algún tipo de convención propia yrespetarla siempre. A partir de este momento en el libro se sigue lasiguiente convención:
· Los comentarios en español tratando de no emplear anglicismosni modismos donde sea posible, siempre en minúsculas yutilizando acentos y marcas diacríticas que hagan más fácil sucomprensión.
· Las etiquetas en español y siempre en minúsculas.
· Las instrucciones y su operandos en mayúsculas siempre.
VRAI EQU 1 ;Colocar flag en 1
TRUE EQU 1 ;set flag en uno
Aunque el segmento an te rior puede ser muy claro para algunos,preferimos:
marca EQU 1 ;Colocar bandera o indicador comoverdadero (1)
Las Herramientas
4-75
Que creemos, es mucho más claro para todo mundo a excepción dealgunos cuantos privilegiados que preferimos discriminar a lo largo dellibro.
4.2.3 Los Separadores
Los diferentes elementos de un programa (instrucciones,identificadores, etc.) deben ser separados por lo menos con un espacio.Los operandos de una instrucción se separan en tre ellos por medio de unacoma y, en este caso, el agregar uno o más espacios es opcional y se hacemuchas veces sólo por claridad:
MOV AX,0
MOV Ax, 0
MOV AX, 0
MOV AX, 0
Son correctos pero
MOVAX, 0
es incorrecto pues no hay un espacio separador en tre el mnemónico y eloperador.
4.2.4 Los Identificadores
Los identificadores son los nombres definidos por el usuario parapropósitos diversos. Representan una vari able o una etiqueta o marca a laque probablemente, pero no necesariamente, hará referencia el programamás adelante. Los identificadores están formados por una serie decaracteres el primero de los cuales debe de ser alfabético, no puedecontener espacios y no debe de exceder de 80 caracteres en to tal.
4.2.5 Palabras Reservadas
El ensamblador reconoce en tre cuatro categorías de palabrasreservadas:
· Los mnemónicos del juego de instrucciones del procesador encuestión.
· Las directivas del ensamblador en caso de que se use.
· El nombre de los registros del procesador en cuestión.
Ensamblador
4-76
· En caso de usar ensamblador, las palabras BYTE, WORD yDWORD.
En ninguno de los casos pueden aparecer estas palabras comoidentificadores en un programa.
4.3 Editores
Podemos escribir y discutir largo y tendido sobre las ‘grandes’ ventajasde un ed i tor o procesador marca X sobre el marca Y, pero no tiene sentidola discusión cuando para lograr un programa fuente sólo requerimos lomínimo in dis pens able de un procesador:
· Que sea lo más rápido posible de ejecutar. De ser posible quequede residente en memoria y aún más sin estorbar o robarmemoria principal a la hora de ejecutar nuestro lenguaje demáquina.
· Que entrege como salida un archivo de código ASCII sincaracteres extraños ni de control que el ensamblador no puedeusar.
En suma, se puede utilizar cualquier ed i tor o procesador por sencillo ocomplicado que sea. Lo importante a resaltar aquí es que nos sintamos agusto con él y que nos provea de herramientas que faciliten y nodificulten nuestro trabajo, ya de por si difícil.
Habrá gente que en este renglón se sienta en casa utilizando un ed i torprimitivo como EDLIN o WORDSTART y gente que no pueda trabajarcon algo menos que VENTURA. La elección depende de gustos ynecesidades. Para nuestro gusto, un ed i tor intermedio como EDIT de lasversiones nuevas del sistema operativo MS-DOS (6.2 en adelante) que seincluye como parte de sus utilerías, es suficiente para la mayoría de loscasos.
Si se cuenta con algún ed i tor residente en memoria como SIDE KICKcontamos con algunas ventajas adicionales como son el tener siempredisponible el ed i tor desde cualquier punto ya sea dentro de DE BUG,ejecutando el programa u otros.
Seguramente con el nuevo advenimiento de sistemas operativos máspoderosos basados en ventanas e iconos, el pan orama se modificará pero
Las Herramientas
4-77
se debe recordar que más nuevo y complicado no necesariamente quieredecir mejor.
4.4 Debug
En los siguientes capítulos utilizaremos el programa DE BUG debido aque es un programa más sencillo de usar en principio que MASM y nospone en contacto íntimo con la máquina. Para teclear, probar y corregirun código sólo necesitamos ejecutar DE BUG mientras que para usarMASM se requiere de hasta 4 programas (ed i tor, MASM, LINK yEXE2BIN).
Al usar un programa como DE BUG nos ahorramos, por el momento,toda una serie de directivas del ensamblador que causan que el programaejecutable crezca.
Por último, al usar DE BUG nos ponemos en contacto íntimo con lamáquina. Tarde o temprano si se con tinua programando en ensambladorse requiere aprender a usar el DE BUG.
Tab la 4.1 DE BUG con tra Ensamblador
DE BUG Ensamblador
Fáci l deejecutar
Difícil de ejecutar
No sea g r e g anada alp rog ramaejecutable
Se agregan muchas líneas de código alprograma ejecutable
M u ycercano a la máquina
Nos aleja del funcionamiento in te rior de la máquina
No es tanversátil
Muy versátil
Bueno paraprogramaspequeños
Bueno para programas grandes
De bug es práctico para modificar registros de la UPC, localidades dememoria, cargar, crear e iniciar programas.
Para ejecutar DE BUG basta tenerlo en la memoria secundaria presentee invocarlo con la instrucción:
C>DE BUG
Ensamblador
4-78
-
El guión que aparece a continuación es el indicador de que DE BUG seencuentra en memoria activo y listo a recibir nuestros comandos.
4.4.1 Comandos
El DE BUG acepta toda una serie de comandos sencillos de una letra que describimos brevemente a continuación:
(Los argumentos en tre paréntesis cuadrados indican parámetrosopcionales)
?. Despliega ayuda (en versiones nuevas de DE BUG).
D[dirección]. Despliega, despliega la información de cierta área dememoria en la pantalla (en hex a dec i mal).
F[dirección inicial] [dirección fi nal] [constante]
E[dirección]. In tro duce un programa usando códigos hexadecimales omodifica una dirección colocando los nuevos códigos hexadecimales.
A[dirección]. In tro duce un programa usando mnemotécnicos válidosdel juegos de instrucciones.
G[dirección]. Ejecuta un programa en memoria.
U[dirección inicial][,dirección fi nal]. Desensambla un programa enmemoria, esto es, convierte sus códigos hex a dec i mal a mnemotécnicos.
R[registro],. Visualiza o modifica registros de la UPC.
Nnombre.extensión. Informa a De bug el nombre del programa quequeremos recuperar o guardar.
W. Escribe programa en memoria a disco, para esto es necesario haberlepuesto nombre con el comando N e indicar su longitud (registro BX+CX) con el comando R
Q. Salir del programa DE BUG.
L. Carga un programa en memoria. Es preciso primero indicar quéprograma queremos con el comando N. Otra alternativa es invocando elprograma DE BUG [nombre programa con extensión].
Las Herramientas
4-79
Ejercicio 4.1 Introduciremos un pequeño programa utilizando DE BUGy lo ejecutaremos:
C>DE BUG
-E100
Introduzcamos esta serie de números seguidos cada uno de la barraespaciadora: B2 1 B4 2 CD 21 CD 20. Al introducir el último númerohex a dec i mal presionemos la tecla de re torno en lugar de barraespaciadora.
Verifiquemos: -D100 y ejecutemos: -G
Ejercicio 4.2 Volvamos a introducir nuestro programa utilizando ahoralos mnemotécnicos correspondientes. Por el momento no nos importaque significan. Termine cada línea con Re torno.
-A100
MOV DL,1
MOV AH,2
INT 21
INT 20
El la última línea presionamos Re torno para terminar con el programa ylo ejecutamos: -G
Problema 4.1 Usando el man ual de DE BUG averigüe cómo guardar suprograma utilizando los comandos R, N, W. Ejecute ahora el programadesde el Sistema Operativo. Escoja un nombre que termine con laextensión .COM.
Ensamblador
4-80
4.5 MASM
Para el uso de un ensamblador el primer paso consiste, como ya semencionó, en diseñar el programa en papel, a continuación en pasarlo aun ed i tor que entrega ASCII. Como ejemplo introduzcamos nuestroprograma de la sección an te rior, para lo cual se requieren agregar otroscomandos propios del ensamblador:
cara SEG MENT
AS SUME CS:cara
MOV DL,1
MOV AH,2
INT 21h
INT 20h
cara ENDS
END
Se guarda el programa con cualquier nombre seguido de una extensión.ASM, por ejemplo PRUEBA.ASM. Más adelante explicaremos laslíneas adicionales. Lo siguiente es ensamblar el programa:
C>MASM prueba
El ensamblador pregunta por el nombre de tres archivos que por elmomento ignoramos, menos el segundo (LST, listado) que dirigimos a laimpresora con LPT1:. El siguiente paso es ligar el programa con lasrutinas externas al programa o con otros programas pues el ensambladorsólo nos entrega un archivo con extensión OBJ de objeto, código que aúnno es ejecutable.
C>LINK prueba
Al fi nal contaremos con un archivo llamado PRUEBA.EXE el ligadornos entrega un er ror que por el momento ignoramos pues no se especificóel inicio de la pila en el programa. Finalmente convertimos el programaEXE a uno de tipo COM que explicaremos en la siguiente sección:
C>EXE2BIN prueba prueba.com
4.5.1 Las Instrucciones del Ensamblador
El ensamblador cuenta con una serie de instrucciones para hacer másfácil la tarea del programador. Estas instrucciones, conocidas como
Las Herramientas
4-81
pseudo - instrucciones, no son parte del juego de instrucciones de ningúnprocesador en es pe cial sino que sirven para indicar ciertas acciones alensamblador.
Analizaremos a continuación algunas de las más importantes.
4.5.1.1 Segmentos
La instrucción SEG MENT y ENDS informan al ensamblador en quésegmento se localiza el programa y deben contar con una etiqueta quedefina el nombre.
La pseudo instrucción AS SUME CS:nombre de fine el segmento dondese localiza el programa (definido con el registro CS, segmento de código) ¿Por qué el ensamblador no lo puede definir por sí mismo? La razón no esclara pero es necesario incluir la pseudo instrucción.
4.5.1.2 END
In dica el fin del archivo de programa
4.5.1.3 Definiciones
Es necesario muchas veces definir vari ables, palabras, bytes, etc. paraaclarar el significado de ciertas par tes del código. En tre las instruccionespara realizar esto tenemos EQU que asigna valores a etiquetas:
si EQU 1 ;identificador si=1
es cape EQU 27 ;identificador es cape=27
El valor especificado puede ser también una asignación completaevaluada al momento de ensamblar:
cinco EQU 2*2+1 ;asigna el valor a cinco de 5
seis EQU cinco+1 ;asigna el valor de seis (cinco yadefinido)
Los números pueden estar en binario (1011b), en hex a dec i mal (0AF2h)o en dec i mal (123 ó 123d) sólo es necesario colocar el identificadorrespectivo en cada número. En el caso de dec i mal no es necesario y en elcaso hex a dec i mal, si comienza por letra, es necesario colocar un 0 paraevitar que el ensamblador se confunda con una etiqueta.
Ensamblador
4-82
Para la definición de vari ables se utilizan las directivas DD, DB y DW.El comando DB de fine bytes que pueden tener un valor cualquiera en tre 0 y 255 dec i mal:
estado DB 0 ;de fine estado inicial
xyz DB 1,2,3 ;de fine una zona de tres elementostipo Byte
no_se DB ? ;un valor no definido aún
tab la DB 5 DUP(?) ;tab la de 5 elementos no definidosaún
tabla1 DB 5 DUP(1,2,3,4,5) ;Tab la de 25 elementos inicializados a1,2,etc.
tabla2 DB 10 DUP(0,1) ;Tab la de 20 elementos inicializados a0,1,0,1,etc.
La pseudo - instrucción DUP es opcional en operadores como DB, DWo DD y su propósito es hacer duplicado de sus argumentos. El númeroque pre cede a la instrucción in dica cuántas veces se quiere hacer elduplicado.
La directiva DW, de la misma forma que DB, de fine vari ables pero eneste caso de 16 bits (una palabra o Word en inglés). El mismo caso sucedepara DD que de fine palabras dobles o 32 bits.
Estas directivas pueden también servir para cadenas de caracteres:
mensaje DB ‘Bienvenido a Ensamblador$’
salta DB ‘Salta la línea’,13,10,’$’
alarma DB 07,’Mensaje con sonido’,’$’
Note que al fi nal se agrega el signo de $ que in dica el fin del mensaje ysólo es necesario si se intenta desplegar la cadena en la pantalla.
4.6 Diferencia entre COM y EXE
Tanto los archivos tipo COM como EXE pueden ser cargados en lamemoria prin ci pal y ejecutados ¿Entonces por qué preferir uno sobreotro y cuáles son sus diferencias?
Un archivo tipo COM es la forma más fácil de guardar un programaejecutable. Consiste únicamente de una serie de números en binario queconforman el programa. No existe ninguna otra información además delprograma por lo que ocupa el menor espacio posible en memoriasecundaria. Los archivos tipo EXE contienen un encabezado quecontiene información variada requerida para funcionar, lo que hace que
Las Herramientas
4-83
el programa sea un poco más grande. Si el programa objeto es de 100bytes, el archivo COM será de 100 bytes, mientras que el EXE tiene unalongitud mínima de 640 bytes, aun cuando el programa se forme de 1 sólo byte.
Puesto que son más pequeños y compactos, los programas COM sonejecutados más rápido. Un programa del tipo COM puede utilizar unainstrucción del tipo INT 20 para terminar su ejecución, mientras que losEXE requieren de una instrucción tipo RET.
Por otro lado existen desventajas en usar archivos tipo COM:
· No pueden ocupar más de 64K bytes de memoria (la longitud deun segmento) lo que puede ser desventaja para un programa muygrande.
· No pueden ser ligados con otros archivos restando flexibilidad allenguaje. El propósito del programa LINK es el de unir variosprogramas en uno sólo ejecutable lo que acarrea toda una serie deventajas en sistemas grandes.
· No pueden usar con facilidad distintos segmentos de memoria,mientras que en los tipo EXE esto se realiza sumamente fácil.
· Se requiere de un paso extra, si usamos ensamblador, paraconvertir del tipo EXE a COM al tener que usar EXE2BIN.
Considerando todo esto es preferible comenzar con archivos tipo COMy luego evolucionar a los del tipo EXE.
4.7 Otros
Existen en el mercado otras herramientas profesionales para laprogramación en ensamblador. Incluimos tres herramientas de lacategoría Share ware en un disco de 3 1/2" que pueden sernos de utilidad,en es pe cial cuando no contamos con ninguna otra para practicar.
Recuerde que si el programa resulta útil es muy conveniente registrarsecon el autor. Recibe uno el derecho le gal a usarlo, actualizaciones,manuales, etc.
Vale la pena mencionar el programa Lan guage Win dow (Share ware)que coloca una tab la del juego de instrucciones 80286 en la memoria ypuede ser activado en cualquier momento.
Ensamblador
4-84
4.8 Esqueleto de Programa en Ensamblador
Presentamos el esqueleto que sugerimos sea usado para ensamblarprogramas.
;nombre del programa
;con descripción
;y vari ables utilizadas
;autor, fecha, versión
;——————————————————-
;definiciones con la instrucción EQU
;——————————————————-
pila SEG MENT STACK ;de fine la pila
DB 20 DUP(‘pila’) ;con la palabra ‘pila’
pila ENDS
;——————————————————-
datos SEG MENT ;de fine segmento de datos
;datos aquí con DB (datos DB‘hola$’)
datos ENDS
;——————————————————-
prognom SEG MENT ;de fine segmento de código
;——————————————————-
prin ci pal PROC FAR ;parte prin ci pal del programa
AS SUME CS:prognom, DS:datos
comienzo: ;aquí programa prin ci pal
;prepara pila para el regreso
PUSH DS ;salva el viejo segmento de datos
SUB AX,AX ;coloca cero en AX
PUSH AX ;y guárdalo
;prepara DS con segmento ac tual
MOV AX,datos ;dirección del segmento de datos
MOV DS,AX ;y guarda en registro DS
;La parte prin ci pal programa va aquí
RET ;regresa al S.O.
prin ci pal ENDP
;——————————————————-
subr1 PROC NEAR ;de fine una subrutina
;Aquí va la subrutina
subr1 ENDP
;——————————————————-
prognom ENDS ;fin del segmento de código
;——————————————————-
END comienzo ;fin del ensamble
Las Herramientas
4-85
Se debe hacer notar aquí la incialización del segmento de pila en cuyamemoria reservada se coloca la palabra “pila” muchas veces, de estaforma es muy claro donde comienza la pila para propósitos de espulgar elprograma y nos damos inmediatamente cuenta del contenido modificadode la pila.
4.9 Resumen
Se in tro duce y comentan sobre las principales herramientas paraensamblar un programa: DE BUG y MASM. Estos programas sonsencillos de usar pero a su vez constan de una serie de comandos quedeben ser aprendidos an tes de poder utilizarlos en toda su capacidad. Eneste capítulo se establecen las reglas que serán utilizadas a lo largo dellibro.
4.10 Bibliografía
Llano Emiliano Sistemas Digitales y Arquitectura de Computadoras.Unam 1993.
Mercier Philippe Assembleur Fac ile. Marabout 1992, Alleur Bélgica.
Varios Macro 86. Co lum bia Data Prod ucts Inc. USA 1986.
Ensamblador
4-86
Capítulo 55.1 Entrada/Salida
La transferencia de datos en tre la lógica que forma parte del sistema decomputadora y aquella que está más allá de éste, se conoce en gen eralcomo entrada/salida o E/S (in put/out put o I/O).
Se incluye dentro del ámbito del sistema a toda la lógica que se hayadiseñado para trabajar en conjunción con la UPC. Toda aquella que nocaiga dentro de esta clasificación se le conoce como externa.
La interfase en tre el sistema de computación y la lógica externa debeestar claramente definida; debe proveer de facilidades para transferirdatos, además de las señales de con trol que identifiquen a todos loseventos que ocurren.
Hay muchas formas en las que un sistema puede transferir datos hacia elex te rior; pero todos están incluídos en las siguientes tres categorías:
1) E/S Programada. En este caso todas las transferencias dedatos entre la computadora y el exterior son controladas por lacomputadora o para ser más precisos por un programa corriendoen la computadora. Existirá un protocolo bien definido en el quela computadora hace conocer a la lógica externa que los datosestán disponibles en una localidad de memoria fija de donde ésta los puede tomar, o bien, la computadora indicará de algunaforma a la lógica externa que está esperando que pongainformación en ciertas localidades de memoria para poderaccesarlas. La característica clave de la Entrada/Salida
5-87
Programada es que la lógica externa hace exactamente lo que sele dice que haga.
2) E/S por Interrupción. Las interrupciones son una formaque tiene la lógica externa para forzar a la computadora a poneratención y suspender lo que está haciendo para atender a lasnecesidades de la lógica externa.
3) Acceso Directo a Memoria. Esta es una forma de transferirdatos entre la memoria interna y los dispositivos externos sininvolucrar a la Unidad de Procesamiento Central en la lógica dela transferencia.
5.2 Entrada/Salida Programada
Los datos son transferidos en tre el sistema de computación y la lógicaexterna, en cualquier dirección, por medio de un puerto de entrada ysalida. Un puerto de entrada y salida consiste en un puerto con memoriade entrada y salida (buffer) conectado a las líneas de datos del bus delsistema y a las interconexiones que accesan a la lógica externa.
Cuando la lógica externa transmite datos al sistema de cómputo, lo hacepresentando los datos en las conexiones del puerto de entrada y salida,por lo que este mismo puerto almacena provisionalmente estos valores.El puerto de entrada y salida no puede estar comunicándoseconstantemente con las líneas del bus de datos, puesto que estas líneaspueden estar llevando información de o hacia la memoria. Si lasconexiones del puerto de entrada y salida se comunicaranpermanentemente con el bus de datos, cada vez que la lógica externapresentase datos a las conexiones de entrada y salida, los datos sepropagarían por las líneas del bus de datos con consecuenciasimprevisibles. La UPC debe, por lo tanto seleccionar un puerto de E/S yleer el contenido del puerto en la misma forma que lo hace de unadirección de memoria.
Como los datos se leen de los puertos de E/S tal como si se tratase de unalocalidad de memoria, a esta forma de transferencia de E/S se le conocetambién como E/S de mapa de memoria (mem ory mapped I/O). Estetipo de esquema permite a la computadora utilizar las mismasinstrucciones poderosas de lectura y escritura tanto para localidades dememoria como para los puertos de Entrada/Salida. Por ejemplo, sepueden realizar operaciones aritméticas directamente con los puertos sinnecesidad de almacenar los datos en memorias provisionales.
Ensamblador
5-88
Normalmente existe más de un dispositivo externo por lo que debe dehaber más de un puerto de entrada y salida. Una forma rudimentaria, peromuy utilizada en sistemas pequeños, de obtener uno o más puertos deentrada y salida consiste en dividir las líneas de dirección de la UPC en tre la memoria y los puertos. Por ejemplo, si tomamos una línea de direccióncualquiera de un sistema de microcomputadora y escogemos que cuandosu valor sea 0 accese a la memoria y que cuando éste sea 1 accese a lospuertos de entrada y salida, tendremos dividida la memoria en dos áreasbien diferenciadas, una de las cuales nos sirve para comunicarnos con losdispositivos externos y la otra con la memoria prin ci pal.
La penalidad pagada cuando una línea de dirección es utilizada paraseleccionar el buffer de un puerto de entrada y salida, es que el mapa dememoria se re duce automáticamente a la mitad, lo que en la mayoría delos sistemas de medios a grandes es un precio muy severo a pagar,solamente para seleccionar un puerto.
Un método preferido es agregar a la UPC más líneas que controlen latransferencia de y hacia los puertos de entrada y salida.
Desafortunadamente la transferencia a ciegas de datos de un sistema decomputación y la lógica externa, no siempre provee la suficientecapacidad de entrada y salida. Las siguientes características no existen en este sistema:
1.- El sistema de cómputo debe decir a la lógica externa cuando losdatos han sido colocados en el buffer de entrada y salida y por lo tantoestán listos para ser leídos; de la misma forma la lógica externa debe de indicar a la computadora cuando ha colocado datos en el buffer deentrada y salida, y éstos pueden ser leídos.
2.- Tanto la computadora como la lógica externa deben de teneralguna forma de informarse entre ellas la naturaleza de los datos quevan a intercambiar. Claramente los datos que se están transfiriendopueden ser sujetos a varias interpretaciones, por ejemplo pueden serdatos puros binarios, algún código que identifique alguna operación aejecutarse; pueden ser parte de una dirección o una direccióncompleta.
Cuando la computadora transmite señales a la lógica externa como unmedio para identificar eventos o datos se refiere a estas señales comocontroles de entrada y salida. La misma información viajando en sentido
Lógica más allá de la UPC
5-89
opuesto, esto es de la lógica externa hacia la computadora, se le conocecomo estado de entrada y salida. La lógica externa no puede controlar a lacomputadora, sólo puede enviar información de su estado para que lacomputadora la interprete.
Los sistemas de computación usualmente tienen toda una serie decontroles de entrada y salida así como líneas de estado que son separadasy distintas de los puertos de entrada y salida. Las computadorasusualmente asignan uno o más puertos de entrada y salida para funcionarcomo conductores del con trol y del estado, mientras que otros puertos deentrada y salida son los encargados de transferir los datos. Es solamentela forma en que la UPC interpreta los datos que hacen la diferencia en treinformación de datos, con trol o estado de los dispositivos.
5.3 Entrada/Salida por Interrupción
Casi todas las UPC tienen una línea por la cual la lógica externa puedesolicitar atención inmediata. A ésta se le conoce como señal de peticiónde interrupción puesto que por medio de ella la lógica externa pide seainterrumpido lo que se esté haciendo y se le preste atención.
Nótese que aunque nos hemos referido a la lógica externa entregandodatos, el flujo de información bien puede ser en el sentido contrario. Dehecho, nada nos dice que una salida o entrada de datos tenga que sucederdespués de una interrupción, bien pueden ser señales de con trol las que se transmitan.
El propósito de la interrupción es informar a la UPC que suspenda loque está haciendo, procese los datos que se están transmitiendo desde elpuerto de E/S y reanude lo que suspendió.
La característica más importante de toda esta serie de eventos es que son asíncronos e impredecibles.
5.3.1 Respuesta de la UPC a una Interrupción
En su forma más el e men tal, la Unidad de Proceso Cen tral puede re -sponder a una interrupción cargando en el registro Contador de Programa (PC) la dirección inicial del programa que atiende a la interrupción peroesto nos deja con dos preguntas:
Ensamblador
5-90
– ¿Qué pasa con el programa que está en ejecución?
– ¿De dónde obtiene la UPC la dirección del programa que lalógica externa necesita que se ejecute?
El programa que se está ejecutando en memoria tiene informaciónalmacenada en los registros de la UPC que puede ser importante: elacumulador (A), el Contador de Programa (PC), el Contador de Datos(DC) y otros registros existentes en la UPC. Si el nuevo programa aejecutar no tiene algún mecanismo de guardar toda esta información, secorre el riesgo de no poder volver a ejecutar el programa que estaba enprimer lugar. Si guardamos los valores de los registros con sólorestituirlos a los registros correspondientes, en es pe cial el Contador dePrograma, podemos regresar al sitio en el que suspendimos la ejecución.
Una interrupción no se reconoce hasta terminar con la instrucción quese 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 lainstrucción próxima a ejecutarse.
Existen dos formas de guardar la información necesaria para podervolver al punto donde se interrumpe un programa an tes de comenzar elque atiende a la interrupción:
– 1) La ejecución de un microprograma almacenado en la Unidadde Control que automáticamente guarda los registros pornosotros en un área predeterminada de memoria. A esta área dememoria reservada se le llama Pila (Stack) (en algunos diseñosse guardan en un juego de registros paralelos).
– 2) Dejar que el programador ejecute primero una rutina deservicio a la interrupción que se encarge de almacenar los datosde los registros en un lugar seguro.
Al fi nal de la ejecución del programa de interrupción, no importandoque método esté disponible, se deben realizar los pasos en ordencontrario para restaurar los registros correspondientes y volver al sitiodel programa donde éste fue interrumpido.
Ahora consideremos la forma de obtener la dirección donde se ejecutará la rutina que atiende a la interrupción. Si se trata de un sólo caso,
Lógica más allá de la UPC
5-91
podemos considerar el tener una dirección de memoria fija que sepa deantemano la UPC, pero en el caso de múltiples puertos de entrada y salida esto resulta un poco impráctico.
Considere la forma en que la UPC responde a una interrupción:
– 1) Manda la señal de aceptación de la interrupción.
– 2) Guarda de forma automática todos los registros o permite alusuario guardarlos de alguna manera.
– 3) Mueve el contenido del vector de interrupciones que mandael puerto de E/S, al Contador de Programa para comenzar aejecutar un programa en otra localidad de memoria.
– 4) Realizar los pasos en sentido contrario para regresar al puntodel programa donde éste fue interrumpido.
Utilizar un vec tor de interrupciones que forme la dirección en memoriadonde se encuentra el programa que atiende a la interrupción,proporcionado por el dispositivo que interrumpe, nos permite tener granflexibilidad al momento de definir nuestras rutinas.
En forma funcional podemos comparar una interrupción con unasubrutina de un lenguaje de alto nivel.
5.3.2 Código de Selección de un Dispositivo que Interrumpe
Otro de los esquemas muy utilizados consiste en exigir que eldispositivo que interrumpe a la UPC mande un código que identifiquequé puerto de E/S es el que interrumpe.
Si se manda un código de selección del dispositivo, podemos entoncesaccesar a una tab la en memoria que nos dé el vec tor de dirección deinterrupción que cargaremos al Contador de Programa para ejecutar larutina de interrupción.
Para esto se exige un poco más de la lógica externa pues debe ser capazde almacenar su código de selección; existen para esto en el mercadovarios tipos de circuitos programables de interfase de E/S (PIO, PIA, etc.)
La secuencia de eventos es como sigue:
– 1. La lógica del dispositivo externo crea una señal de petición deinterrupción que transmite a la UPC.
Ensamblador
5-92
– 2. Cuando la UPC está lista a dar servicio a la interrupción,responde con una señal de aceptación.
– 3. Al recibir la señal del procesador, la lógica del dispositivoexterno coloca un código de identificación (de X número de bits)en el bus de datos del sistema. La UPC recibe los datos y losinterpreta como un código de identificación que usa para armar la dirección donde se encuentra localizado el programa que atiendea la interrupción en cuestión.
– 4. Siguiendo un protocolo especificado por el sistema, eldispositivo externo coloca ahora sus datos a través del puerto deentrada y salida para que éste lo transmita al bus del sistemacuando se le solicite.
Generalmente se pueden deshabilitar las interrupciones con algunainstrucción del juego de instrucciones que lo permita, pero existe otrotipo de interrupciones que exigen el máximo de atención y no puedenesperar. A este tipo de interrupciones con tan alta prioridad se les conocecomo no mascarillables y no pueden ser deshabilitadas. Generalmente sereserva esta línea de muy alta prioridad a eventos tales como fallainminente de energía o un er ror del sistema que impide que éste puedaseguir trabajando, tal como un er ror de memoria.
5.4 Acceso Directo a Memoria
Como ya se observó en las secciones precedentes, el objetivo de lamayoría de las operaciones de entrada y salida es la transferencia de datos en tre los dispositivos externos y la UPC. Ya sea la E/S programada o la deinterrupciones, se requiere de la participación activa de la UPC, esto es,la ejecución de instrucciones para leer o escribir tanto a los dispositivosexternos como a la memoria interna (prin ci pal). Esto puede no ser tanrápido como se piensa para ciertos procesos que requieren de extremadavelocidad como es el caso de la transferencia del contenido de memoria ala pantalla de visualización (CRT) o de y hacia la memoria dealmacenamiento masivo como son los dis cos flexibles y duros de unsistema. Una vez más, la solución consiste en substituir los programaspor electrónica que realice la misma función pero a más velocidad.
La solución lógica consiste en diseñar una computadora de propósitoespecífico que se dedique exclusivamente a la transferencia de datos de yhacia la memoria. A tal circuito se le conoce como dispositivo de AccesoDirecto a Memoria o por su siglas en inglés como DMA.
Lógica más allá de la UPC
5-93
Una discusión completa del tema queda fuera del rango que pretendeabarcar este libro por lo que, una vez más, referimos al lector interesado ala bibliografía para más detalles del tema.
5.5 Realización en la Familia Intel
Los procesadores de la fa milia Intel, 80x86 y Px, no escapan a estasimposiciones de servicio y requieren de un esquema complejo deinterrupciones y de acceso directo a memoria.
Una de las características interesantes de este circuito es que contienedentro de su juego de instrucciones una instrucción que nos permitesimu lar una interrupción por medio de programa (instrucción INT).
Aunque contar con una instrucción que simule las interrupciones porprograma pueda so nar extraño e innecesario en un principio, baste sa berque los diseñadores pasan muchas horas diseñando y programando larealización de rutinas eficientes para muchas de las operaciones que serealizan dentro de un sistema de cómputo. Tener acceso a estas rutinasnos da gran flexibilidad y facilidad de programación como veremos enlos siguientes capítulos.
La lista de interrupciones y sus funciones es enorme y hay librosdedicadas a ellas. Para nuestros propósitos usaremos algunas cuantas que iremos describiendo en cada caso.
5.6 Formas de Direccionamiento
Como ya se ha mencionado, las instrucciones especifican los siguienteselementos dentro de una UPC:
· La operación a realizar (suma, mueve datos, resta, etc.)
· Los elementos a manipular en la UPC, ya sea en la memoria o enlos registros de trabajo.
Para acceder a una información en la memoria, la UPC debe sa ber sudirección y su longitud.
Existen distintas posibilidades de presentación de una localidad dememoria. Analizaremos en detalle cada forma de direccionamiento puesse encuentran en casi todas las instrucciones a utilizar.
Ensamblador
5-94
Es importante resaltar que en ninguna instrucción (generalmente)se permite como operandos dos direcciones de memoria.
Ilustraremos nuestros ejemplos con la instrucción mover (MOV, move)que es una instrucción que se encuentra en el juego de instrucciones detoda UPC. Esta instrucción se encarga del movimiento de datos de lamemoria a los registros, de los registros a la memoria, de la memoria a lamemoria o en tre registros dependiendo de sus argumentos y delprocesador que se trate.
La forma gen eral de esta instrucción es:
MOV destino, fuente
pero nada nos in dica que no pueda ser exactamente al revés. Eldiseñador tiene en esto la última palabra. Dentro del sistema Intel se sigue la primera convención y la instrucción tiene cinco formas:
MOV registro, constante
MOV memoria, constante
MOV registro, memoria
MOV memoria, registro
MOV registro, registro
Nótese que no hay forma de mover en tre localidades de memoria sinpasar an tes por un registro.
Las constantes o localidades de memoria pueden estar definidas conetiquetas si se usa un ensamblador, lo que facilita enormemente la tareade llevar el con trol de estas localidades o constantes (re vise pseudoinstrucción AS SUME y EQU en capitulo an te rior).
Por el funcionamiento del procesador que estamos analizando, ladirección se di vide en segmento+dirección dentro del segmentorepresentado 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 AX,DS:[BX]
MOV AX,DS:[SI+2]
se usa
Lógica más allá de la UPC
5-95
MOV AX,[BX]
MOV AX,[SI+2]
Como siempre existen excepciones que confirman la regla:
Si se usa el registro BP (apuntador base), el segmento por omisión seráSS (segmento de pila).
Si el programador de cide usar un segmento alterno. Este se debeespecificar en la instrucción:
MOV AX,CS:[BX]
La dirección efectiva o real se forma en los sistemas 80x86 desplazando4 bits a la izquierda el contenido del registro de segmento y luegoagregando el contenido del registro especificado. Si hablamos de 16 bitsnos da un número de 20 bits (FFFFFF hex a dec i mal) para la dirección ó 1Mega byte de memoria directa. Para las aplicaciones actuales estámemoria es insuficiente por lo que se usa memoria vir tual para tratar demantener la compatibilidad con diseños anteriores a la vez que se trata deempujar el estandard a nuevas dimensiones, empantamiento que tarde otemprano tendrá que romperse y crear una nueva generaciónindependiente.
Resumiendo:
segmento 0000 (desplazado 4 bits a la izquierda)
+ registro
dirección efectiva de 20 bits
Presentamos en la tab la 5.1 un resumen de los tipos dedireccionamiento.
Ensamblador
5-96
Tab la 5.1 Formas de Direccionamiento
Inmediata registro valorîinmediato
Directa registroîdirección de memoria
Base registroîDS:[BX] o SS:[BP]
Indice registroîDS:[SI] o DS:[DI]
Indice ybase
registroî[BX][SI], [BX][DI],[BX+SI], [BP][SI], [BP][DI] o
[BP+SI]
Base yDesplazam
iento(Directo oInmediato)
registroîident.[BX], ident.[BP] o[BX+constante]
Indice yDesplazam
iento(Directo oInmediato)
registro ident.[SI], ident.[DI] o[SI+constante]
Base,Indice y
Desplazamiento
(Directo oInmediato)
registroîident.[BX][SI],ident.[BX][DI], ident.[BP][SI],
ident. [BP][DI]
5.6.1 Inmediata
RegistroîValor inmediato
El contenido de un registro es inicializado por un valor inmediato o unaconstante.
Ejemplos:
MOV AH,12 ;AHî12, AL no es afectado,
; el movimiento es de 8 bits (1 byte)
MOV BX,1 ;BXî1, tanto BL como BH se afectan,
Lógica más allá de la UPC
5-97
; movimiento de 16 bits (1 palabra)
El nombre del registro in dica el número de bits implicados en laoperación (L o H de 8 bits=1 byte, X de 16 bits=1 palabra)
5.6.2 Directo
Registroîdirección de memoria
El contenido de un registro es sustituido por el contenido de la zona dememoria apuntada por el identificador. La operación puede ser de 8 ó 16bits y si los dos operandos no coinciden, se gen era un er ror al ensamblar.
Ejemplos:
;de fine los apuntadores a memoria
Ident1 DB 2 ;apuntador de 1 byte
Ident2 DW 5 ;apuntador de 2 bytes=1 palabra
Ident3 DB ? ;de fine una zona de 1 byte
;Operaciones de memoria a un registro
MOV AH,ident1 ;AHî2 (8 bits)
MOV BX,ident2 :BXî5 (16 bits)
;Operaciones de registro a memoria
MOV ident1,CH ;ident1îCH (8 bits)
MOV AH,ident2 ;ER ROR, operación de 16 bits a unregistro de 8 bits
5.6.3 Base
RegistroîDS:[BX]
RegistroîSS:[BP]
Inicializa un registro con el contenido del área de memoria situada en ladirección DS:[BX]. En este caso [BX] representa el contenido de la zonade memoria cuya dirección está contenida en BX. La operación puede ser de 8 ó 16 bits. Quedará esto más claro con los siguientes ejemplos:
MOV BX,8 ;BXî8
MOV AX,[BX] ;AXîcontenido de la zona de memoriade la
;dirección DS:0008
Ident1 DB 2 ;De fine una zona de 1 byte
Ident2 DW 5 :De fine una zona de 2 bytes
Ensamblador
5-98
MOV BX,OFF SET ident2 ;BXîDesplazamiento de ident2
MOV AX,[BX] ;AXîde la zona de memoria a ladirección
; DS:ident2 (ident2=5)
En las dos líneas precedentes obsérvese que la pseudo instrucción OFF -SET in dica un desplazamiento a partir de la vari able. Como la vari ablecontiene 2 se in dica un desplazamiento de 2 bytes, el propio de IDENT1(2), el de IDENT2 parte alta (0) y finalmente el de IDENT2 parte baja (5).
Una forma alternativa de este direccionamiento es con el uso delregistro BP con el apuntador de segmento SS:
MOV BP,0AFFFh
MOV AX,[BP] ;AXîcontenido de la zona de memoria
; apuntado por SS:BP (afff)
5.6.4 Indice
RegistroîDS:[SI]
RegistroîDS:[DI]
Este modo de direccionar se utiliza generalmente para las cadenas decaracteres o para aislar un elemento de una tab la o matriz. Generalmenteel segmento utilizado es DS salvo en las excepciones que resaltaremos enejemplos.
MOV SI,0
MOV AX,[SI] ;AXîcontenido de la memoria en ladirección DS:0
MOV DI,0
MOV [DI],AH ;Zona memoria apuntado porDS:0îcontenido de AH
Lógica más allá de la UPC
5-99
5.6.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, la base o segmentoes DS. Es posible usar también la notación [BX+SI], [BX+DI].
MOV BX,2
MOV SI,5
MOV AH,[BX][SI] ;AHîcontenido de la dirección de
;memoria DS:7 (BX+SI)
Se habla de un segmento base puesto que frecuentemente se utiliza parareferenciar los elementos de una tab la, de ahí el nombre de base (delinicio de la tab la):
tab la DB 20 DUP(?) ;de fine tab la de 20 elementos
MOV BX,OFF SET tab la ;BXîdirección base de la tab la
MOV SI,2 ;Se va a leer el tercer elemento de latab la
;(siendo el primero 0)
MOV AH,[BX][SI] ;AHî3er elemento de la tab la
MOV SI,8 ;Apuntar al noveno elemento de la tab -la
MOV AL,[BX][SI] ;ALî9no elemento de la tab la
La segunda forma del direccionamiento índice y base es el que utiliza aBP y SI o DI como apuntador donde SS es el segmento base por omisión.
MOV BP,2
MOV SI,5
MOV AH,[BP][SI] ;AHî contenido de la memoria a
; la dirección SS:[BP+SI] (SS:5+2)
Ensamblador
5-100
5.6.6 Base y Desplazamiento (Directo o Inmediato)
RegistroîDS:ident.[BX]
RegistroîSS:ident.[BP]
RegistroîDS:ident.[BX+constante]
Una combinación de los precedentes tipos de direccionamiento(elementos dentro de una tab la).
Ident1 DW 5 DUP(?) ;Zona de 10 bytes (5 palabras)
MOV BX,2
MOV AX,ident2[BX] ;AXî3er elemento de la tab la Ident2
5.6.7 Indice y Desplazamiento (Directo o Inmediato)
Registroîident.[SI]
Registroîident.[DI]
Registroî[SI+constante]
Otra combinación de los precedentes (elemento dentro de un registro).
MOV SI,4
MOV AX,[SI+1] ;AXîcontenido de la zona de memoria
;apuntado por DS:4+1
5.6.8 Base, Indice y Desplazamiento (Directo o Inmediato)
Registroîident.[BX][SI]
Registroîident.[BX][DI]
Registroîident.[BP][SI]
Registroîident.[BP][DI]
Registroî[BX+SI+ident.]
Este tipo de direccionamiento complicado es utilizado para direccionara estructuras (elemento dentro de un registro que está dentro de una basede datos).
Ident1 DB 2 ;Zona de 1 byte
MOV BX,5
MOV SI,4
MOV AX,ident1[BX][SI+1]
;AXîcontenido de la zona de memoria
Lógica más allá de la UPC
5-101
; apuntado por DS:2+5+4+1
5.6.9 Número de Bits en una Instrucción
Si una dirección de memoria como [BX+1] aparece como operando, elcircuito 80x86 debe sa ber si va a manipular a 1 ó 2 bytes en dichadirección. Hemos dicho que si el segundo operando lo forma un registro,éste de fine por completo el tipo de operación con lo que respecta alnúmero de bytes. Pero existen ciertos casos donde los operandos de laoperación no permiten intuir el número de bytes lo que provoca unmensaje de er ror al ensamblar. Por ejemplo en los siguientes casos:
MOV [BX+1],4
INC [DI]
MOV [SI+2],1
Se debe de completar la instrucción como sigue:
Para el caso de 1 byte
MOV BYTE PTR [BX+1],4
INC BYTE PTR [DI]
MOV BYTE PTR [SI+2],1
Para los operaciones del tipo palabra
MOV WORD PTR [BX+1],4
INC WORD PTR [DI]
MOV WORD PTR [SI+2],1
Donde BYTE PTR se refiere a Apuntador de Byte y WORD PTR aApuntador de Palabra.
5.7 Resumen
Hemos dicho que un sistema de cómputo sólo debe de contar con laUPC y la memoria prin ci pal. Aunque esto es estrictamente cierto, lafuncionalidad del circuito sería casi nula. Es necesario, entonces, agregar toda una serie de circuitos y dispositivos que hagan que el diseño seafuncional y práctico para el que lo usa.
Ensamblador
5-102
La interfase a estos dispositivos y circuitos se realiza por medio de lospuertos de Entrada/Salida. Es por estos puertos que la computadora secomunica y recibe información del mundo externo.
Los diseños de las computadoras modernas toman en cuenta esta vari -able 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 mundoexterno se le conoce como Entrada y Salida (E/S o I/O).
· La E/S se puede dividir en Programada, por Interrupciones yAcceso Directo a Memoria (DMA).
· La E/S programada es conocida también como E/S de mapa dememoria pues se divide el mapa de memoria entre memoria ydispositivos de E/S.
· Para evitar dividir el mapa de memoria se prefiere agregar máslíneas de control a la UPC que seleccionen entre la memoria y losdispositivos de E/S.
· La E/S por Interrupción solicita al sistema su atención por mediode una línea la atención.
· Si la UPC es interrumpida debe de realizar una secuenciaordenada antes de atender a la interrupción y esto incluye entreotras cosas el preservar el contenido de los registros.
· El dispositivo externo que interrumpe debe proporcionar uncódigo de dispositivo o un vector de interrupciones que es ladirección donde se encuentra el programa que atiende aldispositivo.
· El DMA consiste en guardar o leer datos de la memoria principalsin la intervención de la UPC. Para esto, es necesario generartodas las señales que requiere la memoria y que en condicionesnormales genera la propia UPC.
· Existen varias formas de componer una instruccíon:directa, base,índice y las combinaciones de las anteriores.
Lógica más allá de la UPC
5-103
5.8 Instrucciones Analizadas
INT, MOV
5.9 Problemas
5.1 Justifique la decisión de los diseñadores de conservar el esquema dememoria real de sólo 1 mega byte en lugar de los 4 giga bytes accesablespor 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 er -ror. No importa que el programa no tenga sentido y que no se pueda ver elresultado.
5.3 Intente ahora introducir los pedazos de código desde DE BUG.Ahora sí podemos ver los resultados de las transferencias utilizando lasinstrucciones adecuadas del programa DE BUG.
5.4 Investigue las mejoras de diseño de las siguientes generaciones: 486a 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 Fac ile. Marabout 1992, Alleur Bélgica.Capítulo 1.
Ensamblador
5-104
Capítulo 66.1 Más sobre Interrupciones
Todos los diseños de computadoras incluyen la previsión deinterrupciones electrónicas. Lo novedoso del circuito 80x86 es lainclusión de estas mismas interrupciones electrónicas pero dentro deljuego de instrucciones del circuito lo que permite el acceso a las utileríasdiseñadas cuidadosamente (algunas no tanto) que hacen que elprogramar en ensamblador se simplifique.
La instrucción de interrupción (INT realiza dentro del la UPC todos lospasos de una interrupción generada por un dispositivo de E/S y transfierela ejecución del programa prin ci pal a la subrutina de interrupciónapuntada por la dirección encontrada en el vec tor de interrupciones quese pasa como argumento de la instrucción.
Los vectores de interrupción se encuentran en las localidades bajas dememoria, 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 con trol a la subrutina cuya dirección encontramos en lalocalidad 20*4=80 dec i mal ó 40h. Se debe seguir la convención de bytemenos significativo primero, esto es, byte bajo de dirección, byte alto dedirección, byte bajo de segmento, byte alto de segmento.
Una lista completa de las interrupciones se encuentra en la sección deROM del man ual IBM Per sonal Com puter Tech ni cal Ref er ence.
Para pasar parámetros a la subrutina de interrupción se utilizan losregistros, cada uno de ellos con una función distinta según el caso. El
6-105
llamar a una interrupción hace que el procesador guarde la dirección deregreso (CS e IP) junto con las banderas en la pila. Afecta también a lasbanderas IF (bandera de interrupción) y TF (bandera de trampa o paso apaso).
Ejemplo 6.1. Ilustraremos aquí el punto con un breve ejemplo yaconsiderado en el capítulo 4 sección 4.4.1. En ese punto no se explicó lafunción del programa, pero aquí ya tenemos todos los elementosnecesarios para comprender su función y colocar los comentarios:
MOV DL,1 ;Valor ASCII a desplegar
MOV AH,2 ;Despliega un carácter ASCII en lapantalla
INT 20h ;Función de despliegue
INT 21h ;Regresa con trol a programa su per vi -sor
Dando por resultado que el programa despliegue una cara feliz en unpunto x de la pantalla, sobre el cual por el momento no tenemos con trol, yregrese al programa su per vi sor, en este caso, DE BUG. En este punto esnecesario introducir el programa de nuevo a la computadora usando DE -
BUG.
Hemos pues aprendido el vec tor de interrupciones que los diseñadoresdel 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 tab la del capítulo 3 de códigos ASCII, podemos ahoravariar 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. Estainstrucción salta a la localidad de memoria que se le in dica acontinuación como argumento.
Si empleamos el ensamblador podemos usar direcciones simbólicasdefinidas previamente:
Aqui:
MOV DL,1
MOV AH,2
INT 21h
JMP aqui
Ensamblador
6-106
Si se emplea el DE BUG se debe de especificar la dirección:
-a100
MOV DL,1
MOV AH,2
INT 21
JMP 0100
Desensamble el programa para asegurarse de que lo tecleó bien:
-u100,106
1649:0100 B201 MOV DL,1
1649:0102 B402 MOV AH,2
1649:0104 CD21 INT 21
1649:0106 EBF8 JMP 0100
Al ejecutar el programa (-g) la pantalla se llena inmediatamente de carasfelices. Para interrumpir el programa presionamos la tecla de CTRL y la de BREAK a la vez. Esto gen era una interrupción de teclado que al seratendida reconoce la secuencia de teclas e interrumpe el programaregresando con trol al programa su per vi sor.
Los saltos pueden ser incondicionales o condicionales y a su vezdividirse en tres tipos:
· Cortos. La dirección está representada en 8 bits, por lo que caeentre las direcciones comprendidas a -128 y +127 bytes de ladirección de donde se realiza el salto.
· Cercanos. Se representa en 16 bits por lo que van dentro delmismo segmento a -32,767 ó +32,768 bytes de distancia.
· Lejanos. A otro segmento. Se representan por 32 bits y losregistros IP y CS son modificados.
· De índice. Pueden ser cortos o cercanos y toman la forma de JMPregistro o JMP memoria. Se usan en general para salto indirectousando como apuntador un índice contenido en un registro o enuna localidad de memoria:
Salta DW uno ;de fine tab la de etiquetas
DW dos
DW tres
DW cuatro
MOV BX,escoge ;Coloca en BX la opción
JMP Salta[BX] ;Salta a Uno si escoge=0
Explorando el Ensamblador
6-107
;a Dos si escoge=1, etc.
uno: ;instrucciones para opción Uno
dos: ;instrucciones para opción Dos, etc.
Trataremos por el momento con saltos incondicionales. Observemosdetenidamente los códigos que nos entrega el programa DE BUG: B201,
B402, CD21, EBF8. Por deducción podemos inferir que B2 corresponde elnúmero hex a dec i mal a la instrucción MOV, CD el de INT y EB al de JMP.¿Pero por qué en la instrucción JMP el programa coloca F8 en lugar de ladirección 100 que es a la que estamos saltando para continuar con laejecución del programa? Recordemos que estamos saltando a unascuantas instrucciones atrás y por lo tanto es un salto corto definible en 1byte. Si se tratase de un salto hacia adelante de 8 bytes, el códigocorrespondería a EB08, pero éste es un salto hacia atrás y por lo tantonegativo de 8 bytes que corresponde a F8.
6.3 Incrementando Registros y Memoria (INC)
Podemos introducir una nueva variante al programa dejando quedespliege toda la serie de caracteres ASCII en lugar de uno sólo:
MOV DL,00
MOV AH,02
INT 21
INC DL
JMP 0102
Lo que nos lleva a una nueva instrucción: INC. Esta instrucciónincrementa un registro o la memoria en una unidad. La bandera CF no esafectada nunca por esta operación pero sí las banderas de cero ysaturación (ZF, SF) son modificadas de acuerdo al resultado.
Ejemplos:
INC BX ;Operación de 2 bytes
INC AL ;Operación de 1 byte
INC vari able ;Incrementa una dirección
INC tab la[BX] ;Incrementa un elemento de una tab la
Recuerde que en nuestro programa muestra se realiza una operación de1 byte y el número máximo que se obtiene es de FFh ó 255 la siguienteoperación de incremento regresa el contador a 0 y vuelve a comenzar lacuenta.
Ensamblador
6-108
Ejercicio. 5.2 Deje ejecutar el programa por un tiempo aleatorio einterrumpa. Visualice el contenido de los registros utilizando lainstrucción r del DE BUG.
6.4 Lazos (LOOP)
Nuestro programa va mejorando pero aún falta mucho para lograr elcon trol deseado. Una nueva mejora sería controlar el número de vecesque el programa pasa por un conjunto de operaciones. Si modificamos elprograma de la siguiente manera podemos lograrlo:
MOV CX,0100
MOV DL,00
MOV AH,02
INT 21
INC DL
LOOP 0105
INT 20
Se in tro duce un nuevo elemento de programación: la instrucción LOOP.Está instrucción realiza un salto condicional a la dirección indicadamientras un contador, en el registro CX, no cumpla con cierta condición.En este caso la condición es: No saltar cuando CX=0. Esta instrucción noafecta a las banderas pero si decrementa el registro CX de formaautomática.
ATENCION: ¡Si el contador CX se encuentra en cero, la instrucciónLOOP decrementa al registro an tes de realizar la comparación por lo querecorreremos el código 256 veces! Se puede usar la instrucción de saltocondicional JCXZ (Jump if CX zero, salta si CX es cero) an tes de entrar al lazo:
JCXZ no_entra ;prueba CX
repite: ;instrucciones del lazo
...
LOOP repite
no_entra: ;no entrar al lazo
Note que en este caso al estar usando DE BUG, la primera instrucción in -tro duce en CX un contador de 256 dec i mal.
Explorando el Ensamblador
6-109
Ejercicio 5.3 Agregar las lineas necesarias para ensamblar con MASM yensamble. Utilice pseudo instrucciones específicas para los contadores ydirecciones.
La instrucción LOOP tiene dos variantes:
· LOOPE. Realiza el lazo mientas CX<>0 y ZF=1
· LOOPNE. Realiza el bucle mientras CX<>0 y ZF=0
Se debe tener cuidado con las banderas pues un código aparentementecorrecto a primera vista no funcionará:
MOV SI,OFF SET cadena ;En SI lleva el apuntador a unacadena
Busca:
CMP AL,[SI] ;Compara con una cadenaalmacenada en AL
INC SI ;Prepara para la siguiente cadena acomparar
LOOPNE busca ;Busca hasta encontrar cadena
La instrucción CMP compara las dos cadenas y modifica las banderas deacuerdo al resultado (ver siguiente sección), pero la siguiente instrucciónes una operación aritmética que vuelve a modificar las banderas, en estecaso la que más nos interesa, la bandera de cero (ZF) por lo que LOOPNEno puede salir del bucle nunca.
6.5 Saltos Condicionales y Comparaciones
Existen muchos casos en programación en los cuales no nos essuficiente un salto incondicional a una dirección predeterminada, sinoque deseamos saltar sólo si se cumple alguna condición previa.
Para estos casos, los diseñadores del circuito proveen de los saltoscondicionales que pueden ir desde unos cuantos hasta una gran variedadcomo en los diseños modernos.
Todos los saltos condicionales dependen de las banderas para hacer suspruebas por lo que es necesario modificarlas de alguna forma (con alguna instrucción) an tes de hacer la prueba de salto. La instrucción preferida esCMP:
CMP Registro,Constante
CMP Memoria,Constante
Ensamblador
6-110
CMP Registro,Memoria
CMP Memoria,Registro
CMP Registro,Registro
La operación realiza una resta sin modificar ni el destino ni la fuentepero sí modificando las banderas de acuerdo al resultado. Por ejemplo:
MOV AH,5
CMP AH,6 ;-AH+6
AH=05h=0000 0101 ó 1111 1011 en complemento a 2.
1111 1011+0000 0110 = 1 0000 0001 por lo que las banderasmodificadas serán:
· OF=0 (no hay desbordamiento),
· SF=0 (último bit del byte o signo),
· ZF=0 (el resultado es diferente a 0) y
· CF=1 (puesto que hay un acarreo).
Se debe poner cuidado en operaciones indefinidas:
CMP [BX],1 ;Operación indefinida
Se de fine poniendo el tipo de apuntador:
CMP BYTE PTR [BX],1 ;Del tipo Byte -[BX]+1
CMP BYTE WORD [BX],1;Del tipo Word (2 bytes) -[BX]+1
El juego de instrucciones del circuito 80x86 nos ofrece una amplia gamade 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, todas las instrucciones toman laforma J.. identificador donde J.. en el mnemónico de la instrucción eidentificador es una etiqueta o dirección localizada en un intervalo de +128a -127 bytes de distancia.
Explorando el Ensamblador
6-111
Tab la 6.1 Comparación de Banderas
Instrucción Condición Significado
JZ Salta si ZF=1 (Jump if Zero)
JE Salta si ZF=1 (Jump if Equal)
JNZ Salta si ZF=0 (Jump if Not Zero)
JNE Salta si ZF=0 (Jump if Not Equal)
JC Salta si CF=1 (Jump if Carry)
JNC Salta si CF=0 (Jump if Not Carry)
JS Salta si SF=1 (Jump if Sign)
JNS Salta si SF=0 (Jump if Not Sign)
JO Salta si OF=1 (Jump if Over flow)
JNO Salta si OF=0 (Jump if Not Over flow)
Sabemos que en las comparaciones aritméticas sin signo la banderaCF=1 in dica un desbordamiento de capacidad. Si comparamos dosnúmeros A y B con la instrucción CMP (-A+B) y encontramos undesbordamiento, esto nos in dica que A<B puesto que el complemento a 2de A es un número positivo muy grande que al sumarse a B nos da undesbordamiento. De la misma forma si A>B no habrá desbordamiento ysi A=B el indicador de cero (ZF) será 1.
Tab la 6.2 Comparación de Números sin Signo
Salta si Instrucción Valor de la bandera
A>B JNBE o JA(Jump if not Be low or Equal,, Jump if Above)
CF=0 y ZF=0
A>=B JNB, JAE o JNC(Jump if Not Be low,Jump if Above or Equal,Jump if Not Carry)
CF=0
A<=B JBE o JNA(Jump if Be low or Equal, Jump if Not Above or Equal)
(CF=1 y ZF=1) o (CF<>ZF)
A<B JB, JNAE o JC(Jump if Be low, Jump if Not Above or Equal,,Jump if Carry)
CF=1
A=B JE o JZ(Jump if Equal, Jump if Zero)
ZF=1
A<>B JNE o JNZ(Jump if Not Equal, Jump if Zero)
ZF=0
Ensamblador
6-112
A diferencia del grupo an te rior, los siguientes saltos condicionalestoman en cuenta operaciones con signo.
Tab la 6.3 Comparación de Números con Signo
Salta si Instrucción Valor de la bandera
A>B JG o JNLE(Jump if Greater, Jump if Not Less or Equal)
(ZF=0 y OF=SF)
A>=B JGE o JNL(Jump if Greater or Equal, Jump if Not Less)
SF=OF
A<=B JNG o JLE(Jump if Not Greater, Jump if Less or Equal)
(ZF=0 y SF=OF) o(ZF=1 y SF=OF) o (ZF=0 y SF<>OF)
A<B JNGE o JL(Jump if Not Greater or Equal, Jump if Less)
(SF<>OF)
A=B JE o JZ(Jump if Equal, Jump if Zero)
ZF=1
A<>B JNE o JNZ(Jump if Not Equal, Jump if Not Zero)
ZF=0
En un ejemplo notaremos la importancia de seleccionar un grupo u otro:
MOV AH,0FFh
CMP AH,0 ;Compara FF con 0
JB sigue ;Comparación sin signo
;Salta si menor
La instrucción JB no provocará el salto pues 255 no es in fe rior a 0.
MOV AH,0FFh
CMP AH,0 ;Compara FF con 0
JL sigue ;Comparación con signo
;Salta si menor
En este caso si hay un salto pues -1 (0FFh en aritmética con signo) esmenor que 0.
Todos los saltos condicionales dentro del juegos de instrucciones delcircuito 80x86 son saltos cortos, esto es, a -127 ó +128 bytes de distancia yno modifican las banderas. Por lo que si se requiere un salto largo se debede emplear un truco, en lugar de:
Explorando el Ensamblador
6-113
JL sigue
... ;Serie de instrucciones
... ;que dan más de 128 bytes
... ;(er ror señalado por el ensamblador)
sigue:
Usaremos:
JGE sigue1 ;Instrucción contraria a JL
JMP sigue ;Serie de instrucciones
sigue1: ;que dan más de 128 bytes
...
sigue:
6.6 Operaciones Lógicas (AND, OR, NOT, XOR,TEST, NEG)
Existen cierto tipo de instrucciones muy próximas a la lógica de lamáquina, en es pe cial a las que realiza la UAL, que permiten manipular losbits individuales de maneras extrañas y muy prácticas. Todas tienen lassiguientes combinaciones posibles:
Mnemónico Registro, Valor
Mnemónico Memoria, Valor
Mnemónico Registro, Memoria
Mnemónico Memoria, Registro
Mnemónico Registro, Registro
Donde Registro es un registro interno de trabajo de 8 ó 16 bits, Valor esuna constante o valor y Memoria es una dirección de memoria oapuntador a una.
Todas las operaciones lógicas son realizadas bit a bit.
6.6.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. Seutiliza muy a menudo para aislar ciertos bits de un byte o para poner encero ciertos bits de un byte. Una de las aplicaciones menos utilizadas dela operación Y Lógica es obtener el residuo de una resta:
Calcule el residuo de 29/8
00001 1101 (29)
AND 0000 0111 (di vi sor-1=7)
Ensamblador
6-114
0000 0101 (residuo de 5)
Cuando se trata de eliminar ciertos bits y otros no, se le nombra aloperador de Y Lógico mascarilla. Un cero en la máscara nos dará porresultado un cero y un uno conserva el valor orig i nal del operando:
AND AX,6 ;Usa mascarilla (6) para conservarbits 1 y 2
AND AX,0FBh ;Usa mascarilla para eliminar bits 2 y4
Ejercicio 6.2 Diga cuales de las siguientes instrucciones sonincorrectas y por qué.
AND 6,AX
AND AX,BH
6.6.2 O Lógico (OR)
La operación O (OR) da por resultado un 1 si cualesquiera de los dosoperadores es un uno. La mascarilla en este caso sirve para forzar ciertosbits a 1 lógico.
Ejercicio 6.3 Diga cuales de las siguientes instrucciones sonincorrectas y por qué.
OR AX,0104h
OR 014h,AX
OR BH,AX
6.6.3 No Lógico
En este caso la operación da por resultado el contrario de lo queteníamos en un principio; esto es, si hay un 1 tendremos un 0 y si hay uncero un 1. La operación toma la forma
NOT Registro
NOT Memoria
6.6.4 O Exclusivo Lógico (XOR)
Esta operación da por resultado un 1 si los bits son diferentes y un 0 sison iguales. Un uso común de la instrucción XOR es para colocarrápidamente un registro en cero:
XOR AX,AX ;Coloca AX en cero
Puede utilizarse también para invertir (complementar) uno o más bitscon una mascarilla:
Explorando el Ensamblador
6-115
XOR AH,6 ;Complementa bits 1 y 2 de AH
Esta instrucción es muy usada en programas gráficos donde se deseapasear una figura por un fondo sin destruir éste.
6.6.5 Prueba Lógica (TEST)
La prueba lógica es el equivalente a la operación Y (AND) sin modificarlos operadores pero alterando las banderas de acuerdo al resultado. Escom pa ra ble a la operación CMP para comparaciones lógicas.
6.6.6 Las Banderas
En todas las operaciones lógicas se modifican las banderas, a excepciónde la operación TEST que es una prueba no destructiva, de la siguienteforma:
· Las banderas CF (acarreo) y OF (saturación) siempre son ceropuesto que las operaciones no son aritméticas.
· El indicador AF (auxiliar) queda indeterminado y no se usa.
· Los indicadores SF (signo), ZF (cero) y PF (paridad) se modificande acuerdo a los operadores.
· La operación NO (NOT) es una excepción a lo anterior pues nomodifica las banderas.
6.6.7 Complemento a 2 (NEG)
Con esta operación realizamos la negación de cada uno de los bits de unbyte o palabra y luego la suma de 1 (el complemento a 2) en un sólo paso.Las formas permitidas de la operación son:
NEG Registro
NEG Memoria
Como ejemplos tenemos:
MOV AX,5
NEG AX ;AX=-5
NEG AX ;AX=5
Nuevamente hay que tener cuidado con los operadores indeterminados:
Ensamblador
6-116
NEG [BX] ;¿Es byte o palabra?
NEG BYTE PTR [BX] ;byte
NEG WORD PTR [BX] ;palabra
6.7 El Mundo Externo: IN y OUT
La UPC pasa una gran parte del tiempo comunicándose con losdispositivos externos o atendiendo sus demandas por medio de las rutinas de interrupción. El ensamblador da el con trol de todos estos recursos alprogramador y permite funciones que en lenguajes de alto nivel es muydifícil o imposible realizar. Para ilustrar el punto supongamos quequeremos controlar con precisión la forma en que la bocina de nuestracomputadora per sonal emite sonidos (ampliaremos el concepto encapítulos subsecuentes).
Para poder controlar el mundo externo necesitamos introducir lasinstrucciones IN y OUT. Estas instrucciones son la única forma en que unlenguaje en ensamblador puede comunicarse con un puerto externo y sonmuy comunes en todos los circuitos de microcomputadoras.
6.7.1 La instrucción OUT
Esta instrucción envía un byte o una palabra a un puerto.
OUT Puerto, AL ;envía byte a puerto
OUT Puerto, AX ;envía palabra a puerto
El número de puerto puede ser enviado también al registro DX:
MOV DX,puertonum ;el número de puerto a DX
OUT DX,AL ;envía contenido de AL al puertoidentificado por DX
La instrucción no afecta ninguna bandera.
6.7.2 La instrucción IN
Al contrario de la instrucción OUT, IN recibe un byte o palabra de unpuerto externo:
IN Puerto, AL ;recibe byte de puerto y coloca en AL
IN Puerto, AX ;recibe palabra de puerto y coloca enAX
El número de puerto puede ser enviado también al registro DX:
MOV DX,puertonum ;el número de puerto a DX
Explorando el Ensamblador
6-117
IN DX,AL ;recibe byte de puerto identificadopor DX y coloca en AL
La instrucción no afecta ninguna bandera.
Introduzcamos el siguiente programa desde DE BUG:
IN AL,61
AND AL,fc
XOR AL,2
OUT 61,AL
MOV CX,140
LOOP 10b
JMP 104
Asegúrese de las instrucciones con el comando U y an tes de ejecutarsalve el programa
-nsonido.com
-rbx
BX 0000
:
-rcx
CX 0000
:f
-w
Writ ing 000F bytes
El programa no puede interrumpirse una vez que se ejecuta pero esilustrativo de ciertos conceptos que redondean este capítulo. Nopodemos utilizar la instrucción de interrupción puesto que losdiseñadores no pensaron que fuese importante contar con una rutina deinterrupción para la bocina.
Comentemos ahora el programa:
bocina EQU 61h ;puerto que controla la bocina
quita EQU 0fch ;máscara para quitar bits 0 y 1
;el bit 0 controla un oscilador que queremos apagar y el bit 1 se conecta a unacompuerta
;que gen era el pulso que se envía a la bocina
alterna EQU 02h ;máscara para alternar bit 1
;y generar sonido pulsante
retraso EQU 140h ;retraso para poder escuchar el sonido
IN AL,bocina ;
Ensamblador
6-118
AND AL,quita ;apaga oscilador y compuerta
sigue:
XOR AL,alterna ;apaga y prende la compuerta
OUT bocina,AL
MOV CX,retraso ;marca la frecuencia
repite:
LOOP repite ;pierde el tiempo
JMP sigue ;repite el proceso
Ejercicio 6.4 Introduzca el programa an te rior en MASM agregandotodas las pseudo instrucciones que vengan al caso.
Ejercicio 6.5 Varíe el retraso y comente sobre el resultado.
6.8 Resumen
Las interrupciones forman el trabajo prin ci pal y el cuello de botella de la UPC. El circuito de INTEL nos permite tener acceso a las mismas rutinasde interrupción diseñadas por los fabricantes del SO dandonos muchasventajas.
Los saltos dentro de un segmento de código de programa puedendividirese en incondicionales y condicionales y a su vez losincondicionales dependiendo el signo.
Las máscaras son patrones de bits que nos permiten eliminar ciertassecuencias de un byte que no nos interesan.
Las instrucciones de IN y OUT nos permiten tener acceso de formadirecta a los dispositivos externos.
6.9 Instrucciones Analizadas
INT, JMP, INC, LOOP, JCXZ, LOOPE, LOOPNE, CMP, JZ, JE, JNZ,JNE, JC, JNC, JS, JNS, JO, JNO, JNBE, JA, JNB, JAE, JBE, JNA, JB,JNAE, JG, JNLE, JGE, JNL, JNG, JLE, JNGE, JL, AND, OR, NOT,XOR, TEST, NEG, IN, OUT.
6.9 Problemas
6.1 Averigue algunas de las interrupciones prácticas dentro del sistemaoperativo MS-DOS.
Explorando el Ensamblador
6-119
6.2 Utilice las interrupciones aprendidas en su ventaja modificando elprograma del ejercicio 6.1.
6.3 Modifique el programa del ejercicio 6.1 para que limpie la pantalla y luego coloque una cara sonriente en la mitad de la pantalla.
6.10 Bibliografía
Mercier Philippe Assembleur Fac ile. Marabout 1992, Alleur Bélgica.
Barden Wil liam Jr. How to Pro gram Mi cro com puters. Sams & Com -pany 1987.
Lafore Rob ert As sem bly Lan guage Primer for the IBM PC. The WaiteGroup 1992.
IBM Per sonal Com puter Tech ni cal Ref er ence.
Ensamblador
6-120
Capítulo 77.1 El Sistema Operativo
En todo sistema de cómputo existe una relación íntima en tre losprogramas en ensamblador y el sistema operativo (SO) que se ejecuta enla computadora. En los sistemas personales el sistema operativo re sideprincipalmente en el disco ya sea duro o flex i ble y recibe el nombre deDOS(Disk Op er ating Sys tem).
Como ya sabemos el propósito prin ci pal del SO es administrar a otrosprogramas, mantendiéndolos en áreas específicas de memoriasecundaria para su almacenamiento o en memoria prin ci pal para suejecución. Provee las funciones básicas de impresión, despliegue,almacenaje, etc. A todas estas funciones sólo se puede acceder en su nivel más bajo a través del lenguaje ensamblador.
En un principio la per sona que se debía entender con el SO debía tenerun íntimo conocimiento de la máquina. Por ejemplo, si se deseabaguardar un archivo en disco flex i ble, se debía sa ber al detalle dónde selocalizaba cada byte en el disco, el tiempo que tarda en dar unarevolución, cuanto tarda el mo tor de pasos en llegar a una pistadeterminada, etc. Como se puede imaginar, los programas se convertíanen programas muy lar gos y complejos. Si por cualquier causa cambiabanlos dispositivos, todo debía de ser reescrito.
Si el SO de todas formas debía de tener rutinas de manejo de todos losdispositivos conectados a la máquina. ¿Por qué no hacer las rutinas delSO accesibles a los otros programas? La idea detrás del SO cae dentro deesta pregunta. De esta forma si se desea escribir un carácter a la pantallano se debe sa ber ya nada del circuito que la controla sino únicamente la
7-121
información de la rutina que lo puede hacer y cómo decirle qué queremoshacer. De esta forma, al llamar una rutina del SO, nuestra tarea seconvierte de una de extrema complejidad a una de moderada a pocadificultad.
Todas estas rutinas de con trol de periféricos residen en una memoriaROM que forma parte del BIOS de la computadora y a la que podemostener acceso de forma ilimitada.
Analizaremos a lo largo del capitulo diversas utilerías del BIOS que nosserán de utilidad posteriormente.
7.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. El uso de las teclasCTRL y BREAK interrumpe la rutina.
Ejercicio 7.1 Introduzca los siguientes ejemplos usando DE BUG. Noolvide revisar el registro AL para ver el código ASCII de la tecla que sepresionó.
MOV AH,1
INT 21
INT 20
Se puede utilizar un salto incondicional para introducir una oracióncompleta:
MOV AH,1
INT 21
JMP 100
Mientras estamos en la rutina de interrupción del teclado podemosrevisar las funciones de edición que la rutina nos proporciona como es elborrado de caracteres, el empleo de teclas de con trol, etc.
Se puede obligar a la rutina del teclado a guardar la información en unamemoria intermedia. Para esto es necesario pasar como parámetro 0Ahen el registro AH y en los registros DS:DX la dirección de la memoriaintermedia de almacenaje (buffer) en cuyo primer byte debemos guardarel máximo número de caracteres a leer del teclado. La rutina nos regresaen el segundo byte de la memoria de almacenaje el número de caracteresleídos del teclado.
Ensamblador
7-122
Ejercicio 7.2 Introduzca y ejecute el siguiente programa en DE BUG:
MOV DX,109
MOV AH,a
INT 21
INT 20
DB 20
Ex am ine el resultado con la instrucción D.
Ejercicio 7.3 Convierta el programa del ejercicio 7.2 a MASMañadiendo las pseudo instrucciones requeridas. No olvide inicializar elregistro de segmento de datos (DS) con la dirección apropiada usandoSEG MENT.
7.3 La Pantalla
Para desplegar una serie de caracteres podemos utilizar la rutina 21hnuevamente pero ahora colocamos en el registro AH un 9 y en DS:DXcolocamos el inicio de la cadena a desplegar terminada por un signo depe sos ($).
Ejercicio 7.4 Introduzca el siguiente programa en DE BUG a partir de ladirección 0100.
MOV DX,109
MOV AH,9
INT 21
INT 20
DB ‘Ejemplo de cadena impresa$’
Ejercicio 7.5 Introduzca el programa del ejercicio 7.4 pero con laspseudo instrucciones requeridas para el ensamblador MASM. No seolvide de inicializar el segmento DS de donde se toma la dirección de lacadena a desplegar.
Unamos las funciones aprendidas para realizar un programa que hagaeco a la pantalla de lo que se teclea. Sabemos ya que para que la funciónde despliegue sepa donde termina la cadena ésta debe de finalizar con $por lo que en este sencillo programa nosotros debemos de introducirlo:
MOV DX,116
MOV AH,a
INT 21
El Mundo Exterior
7-123
MOV DL,a
MOV AH,2
MOV DX,118
MOV AH,9
INT 21
INT 20
DB 30
El programa an te rior en MASM:
;Programa que acepta caracters del teclado y hace eco a la pantalla
;No olvide terminar la cadena de caracteres con $
teclado EQU 0Ah ;función del teclado
pantalla EQU 02h ;función de la pantalla
lf_cr EQU 0Ah ;alimentación de línea
muestra EQU 09h ;función de despliegue
dos EQU 21h ;Llamada del SO
fin EQU 20h ;Termina y vuelve al SO
;—————————————————————————————————————————————————
datos SEG MENT
memoria DB 20 ;20 bytes para memoria deteclado
; a partir de esta localidad
datos ENDS
;—————————————————————————————————————————————————
programa SEG MENT
AS SUME CS:programa ;informa a MASM dónde estamos
AS SUME DS:datos ;y dónde está el buffer
ORG 0100h ;fija el origen a dirección 100
inicio:
MOV DX,OFF SET memoria ;dirección de buffer
MOV AH,teclado
INT dos ;interrupciones varias
MOV DL,lf_cr ;agrega alimentación de línea
MOV AH,pantalla
INT dos ;interrupciones varias
MOV DX,OFF SET memoria+2 ;salta primeros 2 bytes debuffer de teclado
MOV AH,muestra ;despliegua en pantalla
INT dos
INT fin ;termina y regresa a SO
;—————————————————————————————————————————————————
programa ENDS
Ensamblador
7-124
;******************************************************************
END inicio
Aparentemente más complicado pero mucho más fácil de entender ymantener.
7.4 La Impresora
Como para las funciones anteriores, esta vez usamos la interrupción21h, pero enviamos un 5 en el registro AH y en DL el carácter a imprimir.En el siguiente ejemplo mostramos una forma muy primitiva de enviaruna cadena a la impresora.
MOV DL,[122]
MOV AH,05
INT 21
MOV DL,[123]
MOV AH,05
INT 21
MOV DL,[124]
INT 21
MOV DL,[125]
MOV AH,05
INT 21
INT 20
DB ‘si’,0d,0a
Claro que una mejor versión es inmediata usando direccionamientoindirecto:
MOV CX,40
MOV BX,111
MOV DL,[BX]
MOV AH,05
INT 21
INC BX
LOOP 0106
INT 20
DB ‘Un mensaje a imprimir de 40 caracteres’,0d,0a
Que para el MASM queda:
;Programa para impresión de caracteres
imprime EQU 05h ;función de impresora
cuenta EQU 40 ;Lleva la cuenta de la cadenaa imprimir
El Mundo Exterior
7-125
dos EQU 21h ;Llamada del SO
fin EQU 20h ;Termina y vuelve al SO
;—————————————————————————————————————————————————
datos SEG MENT
cadena DB ‘Mensaje de 40 caracteres’,0Dh,0Ah
datos ENDS
;—————————————————————————————————————————————————
programa SEG MENT
AS SUME CS:programa ;informa a MASM dónde estamos
AS SUME DS:datos ;y dónde están los datos
ORG 0100h ;fija el origen a dirección 100
inicio:
MOV CX,cuenta
MOV BX,OFF SET cadena ;dirección de mensaje
ciclo:
MOV DL,[BX] ;dirección carácter a imprimir
MOV AH,imprime
INT dos ;interrupciones varias
INC BX ;apunta a siguiente carácter
LOOP ciclo ;y vé a imprimirlo
INT fin ;termina y regresa a SO
;—————————————————————————————————————————————————
programa ENDS
;******************************************************************
END inicio
Presentamos a continuación un programa para mandar códigos de con -trol a la impresora:
MOV CX,2
MOV BX,0111
MOV DL,[BX]
MOV AH,05
INT 21
INC BX
LOOP 0106
INT 20
DB 1b,’E’
Ob serve que en la última línea definimos el carácter de con trol paramodo enfatizado de una impresora EPSON o com pat i ble y puede sersustituído por cualquier otro código.
Ensamblador
7-126
7.5 Los Corrimientos y Operaciones Aritméticas
Comenzamos esta sección con un sencillo programa que convierte unnúmero en binario a dígitos hexadecimales en su equivalente ASCII y lodespliega en la pantalla. Integraremos finalmente el programa en unosólo que convierte de dec i mal a hex a dec i mal:
;Programa para convertir binario a hex a dec i mal (ASCII)
muestra EQU 02h ;función de despliegue
cuenta EQU 4 ;Lleva cuenta de # dígitos
mas cara EQU 0Fh ;Máscara 4 bits extremaderecha
ascii EQU 30h ;Equivalente de hex a dec i mala ASCII
nueve EQU 3Ah ;9 en ASCII
a_f EQU 7h ;Convierte dígito A-F enASCII
dos EQU 21h ;Llamada del SO
fin EQU 20h ;Termina y vuelve al SO
;—————————————————————————————————————————————————
programa SEG MENT ;inicio desegmento
AS SUME CS:programa ;informa a MASM dónde estamos
ORG 0100h ;fija el origen a dirección 100
inicio:
MOV CH,cuenta ;número de dígitos
rota: MOV CL,cuenta ;cuenta a 4 bits
ROL BX,CL ;desplaza dígito a la izq.
MOV AL,BL ;y pasa a reg. AL
AND AL,mas cara ;quita dígitos de la izq.
ADD AL,ascii ;convierte a ASCII
CMP AL,nueve ;¿Es mayor que 9?
JL despliega ;Despliega si ente 0 y 9
ADD AL,a_f ;el dígito está en tre A y F
despliega:
MOV DL,AL ;Coloca ASCII en DL
MOV AH,muestra ;Función de despliegue
INT dos ;Llama a DOS
DEC CH ;¿Terminamos con los 4 dígitos?
JNZ rota ;Si aún no se termina
INT fin ;Regresa a SO
;—————————————————————————————————————————————————
programa ENDS
El Mundo Exterior
7-127
;******************************************************************
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. Para ver suutilidad y comprender los nuevos conceptos es necesario ejecutarlodesde DE BUG y llenar el registro BX con el comando r.
Ejercicio 7.6 Ejecute el programa desde DE BUG dando varios valores a BX y observando el resultado.
An tes de explicar el funcionamiento de este programa introduzcamoslos corrimientos, rotaciones y las operaciones aritméticas:
7.5.1 Corrimientos y Rotaciones
Este tipo de instrucciones desplazan los bits de un byte o palabra hacia la izquierda o derecha. Estas son operaciones comunes para encuadrar unbyte con respecto a un valor o para eliminar los bits superfluos, algo sim i -lar a las máscaras en las operaciones lógicas como Y, O, etc.
Se dividen en tres grupos:
· Desplazamientos Aritméticos o corrimientos sin signo
· Desplazamientos Aritméticos o corrimientos con signo.
· Rotaciones
La UAL sólo es capaz de realizar un número básico y limitado deoperaciones:
· Complemento a unos (inversión de bits)
· Complemento a dos (negación)
· Suma
· Desplazamientos
· Rotaciones
· Operaciones Lógicas (Y, O, O Exclusiva)
Recordemos que si recorremos un registro en todos sus bits hacia laizquierda el equivalente es multiplicar por 2:
0000 0001 = 1 dec i mal
Ensamblador
7-128
0000 0010 = 2 dec i mal (corrimiento de 1 bit)
0000 0100 = 4 dec i mal (corrimiento de 2 bits)
principio que funciona en cualquier base: 1d con un corrimiento de 2posiciones a la izquierda equivale a 100d o multiplicar 2 veces por labase.
De la misma forma un corrimiento hacia la derecha equivale a dividiren tre la base, en este caso 2:
0000 1000 = 8 dec i mal
0000 0100 = 4 dec i mal (corrimiento de 1 bits)
0000 0010 = 2 dec i mal (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 paraobtener el resultado correcto 1111 1100 = -4 para lo cual se usancorrimientos aritméticos con signo.
Todas las operaciones de corrimiento y rotaciones toman la forma
Mnemónico Registro,1
Mnemónico Memoria,1
Mnemónico Registro,CL
Mnemónico Memoria,CL
Donde Registro es un registro de 8 o 16 bits, Memoria es una localidadde memoria o una dirección y 1 es el valor inmediato de uno.
7.5.1.1 Corrimientos Lógicos (Rotaciones)
ROR destino,cuenta, Rota a la derecha byte o palabra pasando por elacarreo.
El Mundo Exterior
7-129
RCR destino,cuenta, Rota a la derecha a través del acarreo byte opalabra
ROL destino,cuenta, Rota a la izquierda byte o palabra pasando poracarreo
RCL destino,cuenta, Rota a la izquierda a través del acarreo byte opalabra
7.5.1.2 Corrimientos Aritméticos
SHR destino,cuenta, Corrimiento lógico a la derecha de byte o palabrapasando por acarreo
SAR destino,cuenta, Corrimiento aritmético a la derecha de byte opalabra agregando el signo y pasando por acarreo
SHL/SAL destino,cuenta, Corrimiento a la izquierda de byte o palabrapasando por acarreo
Todos los corrimientos quedan ilustrados en la figura 7.1
Ensamblador
7-130
7.5.2 Operaciones Aritméticas
Las operaciones aritméticas son realizadas sobre los registros y son de8, 16, o 32 bits que nos dan números en tre 0 y 65,535 en aritmética sinsigno.
El circuito es capaz de realizar sumas, restas, multiplicaciones ydivisiones pero estas dos últimas operaciones las realiza en base a sumaspor lo que son lentas, para sacar provecho de estas operaciones esnecesario tener otro circuito dedicado a las operaciones matemáticas quese llama coprocesador pues realiza el proceso en paralelo al procesadorprin ci pal.
7.5.2.1 Suma y Resta (ADD y SUB)
El Mundo Exterior
7-131
Figura 7.1 Corrimientos y rotaciones.
Las sumas y restas toman la forma de
Mnemónico Registro,Inmediato
Mnemónico Memoria,Inmediato
Mnemónico Registro,Memoria
Mnemónico Registro, Registro
Donde Registro es un registro de 8 o 16 bits, Memoria es una localidadde memoria o una dirección e Inmediato es un valor.
Si existe un desbordamiento, el bit del registro de banderas de acarreo es puesto en 1 lógico y las demás banderas (SF, CF, OF, ZF) se afectan deacuerdo al resultado.
Recuerde el caso de los números negativos y de que las operacionespueden ser con signo o sin signo lo que puede dar por resultado sorpresasindeseables. La resta se logra sumando el complemento a dos delsustraendo.
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 ? ;Número de 32 bits
suma2 DD ? ;Número de 32 bits
;Suma los primeros 16 bits
MOV AX,WORD PTR suma1 ;trabaja los primeros 16 bitsbajos
ADD AX,WORD PTR suma2 ;sumando los 16 bits bajos
;trabaja ahora los 16 bits al tos agregando el acarreo si existe
MOV DX,WORD PTR suma1+2 ;16 bits primeros al tos
ADC DX,WORD PTR suma2+2 ;suma siguientes 16 bits al tos
;agregando acarreo
7.5.2.2 Decrementos
Esta instrucción decrementa en 1 un registro o localidad de memoriadando 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 queremosrealizar un salto condicional que dependa de este indicador.
DEC Registro
DEC Memoria
7.5.2.3 Multiplicación y División
Ensamblador
7-132
En el caso de la multiplicación (MUL) y división (DIV) tenemos algosim i lar a la suma y resta. Es necesario una operación para considerar elsigno en caso de requerirlo (IMUL, IDIV). Estas operaciones usanregistros específicos como se muestra en la figura 7.2.
En el caso específico de la división, es necesario prevenir, pues unadivisión en tre 0 o una cantidad muy pequeña gen era una interrupcióndefinida de antemano (al cargar el SO) que detiene el proceso gen eral delSO y por ende de la máquina.
La instrucción DIV no permite dividir un byte en tre un byte ni unapalabra en tre otra palabra por lo que hay que proceder como sigue:
;división en tre dos bytes
El Mundo Exterior
7-133
Figura 7.2 Multiplicación y división.
MOV AL,dividendo ;en AL el dividendo
CBW ;Convierte un byte en palabra (AH=0)
MOV BL,di vi sor ;en BL el di vi sor
DIV BL ;división de una palabra en tre un byte
;división en tre dos palabras
MOV AX,dividendo ;en AX el dividendo
CWD ;Convierte palabra en doble palabra(DX,AX)
MOV BX,di vi sor ;en BX el di vi sor
DIV BX ;división de una doble palabra en treuna palabra
Para este punto debe de quedar claro el funcionamiento del programaintroducido en la sección an te rior e introducimos el siguientecomplemento que conviete de un número dec i mal tomado del teclado aun binario en el registro BX.
;Convierte Dec i mal del teclado a binario, el resultado se queda en BX
decbin SEG MENT
AS SUME CS:decbin
MOV BX,0 ;Limpia registro BX
otro:
MOV AH,1 ;entrada del teclado
INT 21h ;llama a DOS
SUB AL,30h ;ASCII a binario
JL sale ;Salir si el #<0
CMP al,9d ;¿Es > a 9?
JG sale ;Si es así, no es dígito
CBW ;Convierte byte en AL a palabra enAX
;Multiplica número en BX por 10
XCHG AX,BX ;Cambia registros AX y BX
MOV CX,10d ;Coloca 10 en CX
MUL CX ;y multiplica por AX (AX*10)
XCHG AX,BX ;Regresa # a BX
;Suma número en AX por el de BX
ADD BX,AX ;suma dígito a #
JMP otro ; y ve por otro
sale:
INT 20h ;Regresa a SO
decbin ENDS
END
Ejercicio 7.7 Introduzca el programa an te rior en MASM y ejecute desde DE BUG para observar el resultado en el registro BX. Use la instrucción
Ensamblador
7-134
T (trace) para seguir el flujo del programa paso a paso y anotar el estadode los registros que nos interesan tal como AX, BX y CX. Tendremos unproblema al llegar a la instrucción INT pues nunca regresaremos alprograma orig i nal, por lo que debemos sustituir la instrucción por unanueva que no hace nada: NOP. Esta instrucción ocupa un sólo byte por loque en este caso debemos usar 2 para sustituir a INT que ocupa 2 bytes.
El programa DE BUG utiliza la siguiente simbología para las banderas:
Tab la 7.1 Simbología de DE BUG para las banderas
Bandera En uno lógico En cero lógico
OF, saturación OV NV
DF, dirección DN UP
IF, habilita interrupciones EI DI
SF, signo NG PL
ZF, cero ZR NZ
AF, acarreo auxiliar AC NA
PF, pariedad PE PO
CF, acarreo CY NC
Ejercicio 7.8 Ejecute el programa DECBIN an te rior pero ahorainterrumpimos el flujo del mismo an tes de ejecutar la última instrucciónpara poder analizar el registro BX. Para esto utilizamos el comando deDE BUG g pero seguido de una dirección lo que hace que se introduzcauna pausa en lugares determinados (hasta 10). En nuestro caso el puntoan tes de la interrupción 20h es 11b: g 11b.
7.6 Procedimientos o Subrutinas
En muchos casos se requiere, por orden, dividir el programa ensegmentos lógicos independientes uno de otro pero a la vez que estossegmentos estén disponibles para su uso por otros segmentos delprograma. Se resuelve esto, al igual que en los lenguajes de alto nivel, con los procedimientos o subrutinas que pueden ser llamados desde cualquier parte de un programa.
En el lenguaje ensamblador se de fine el inicio de una sección de unprograma con la pseudo instrucción PROC y su fi nal con la pseudoinstrucción ENDP. Los procedimientos pueden ser cortos o lejanosdependiendo de si se encuentran o no en el mismo segmento y se requierede especificar en la instrucción con qué tipo estamos tratando:
El Mundo Exterior
7-135
nombre PROC NEAR ;si se trata de uno en el mismosegmento
nombre PROC FAR ;si se trata de uno en otro segmento
El nombre es el identificador del procedimiento con el cual haremosreferencia posteriormente a esta subrutina.
Para llamar a la subrutina o procedimiento se utiliza la instrucciónCALL (llama) seguida de la dirección o identificador. La instrucciónforza a que el procesador guarde la dirección de la siguiente instrucciónque sigue a la de la llamada en un área es pe cial de datos llamada la pilaque analizaremos en el siguiente capítulo a fondo.
Si es una llamada corta o cercana, sólo se guarda el registro IP, si se tratade una llamada lejana, es necesario guardar tanto CS como IP. No esafectada ninguna badera por esta instrucción.
Todo procedimiento debe de terminar con la instrucción RET para queel ensamblador sepa que termina la subrutina y debe regresa al programaque la llamó. Esto implica devolver el valor del apuntador de programaan te rior sacándolo de la pila. Una vez más si es una llamda corta, tomauna palabra de la pila y la restituye en IP, si es una llamada lejana, tomados palabras de la pila, la primera para IP y la segunda para CS.
La instrucción RET puede tener un parámetro auxiliar para ajustar eltamaño de la pila al regresar. Analizaremos esto en detalle en el siguientecapítulo.
Finalmente integramos los dos programas ya vistos en uno gen eral queconvierte un número dec i mal a hex a dec i mal directamente del teclado:
;Convierte Dec i mal a Hex a dec i mal (DECHEX)
;(máximo de 65535d)
dechex SEG MENT
AS SUME CS:dechex
;Parte prin ci pal del programa que une a los otros 2
repite: CALL decbin ;Del teclado (base 10) abinario
CALL crlf ;Agrega nueva línea
CALL binhex ;binario a hex a dec i mal ydespliega
CALL crlf ;Agrega nueva línea
JMP repite ;Vuelve a repetir
;—————————————————————————————————————————————————
Ensamblador
7-136
;Convierte Dec i mal del teclado a binario, el resultado se queda en BX
decbin PROC NEAR
MOV BX,0 ;Limpia registro BX
otro:
MOV AH,1
INT 21h
SUB AL,30h ;ASCII a binario
JL sale ;Salir si el #<0
CMP al,9d ;¿Es > a 9?
JG sale ;Si es así, no es dígito
CBW ;Convierte byte en AL a palabra enAX
;Multiplica número en BX por 10
XCHG AX,BX ;Cambia registros AX y BX
MOV CX,10d ;Coloca 10 en CX
MUL CX ;y multiplica por AX (AX*10)
XCHG AX,BX ;Regresa # a BX
;Suma número en AX por el de BX
ADD BX,AX ;suma dígito a #
JMP otro ; y vé por otro
sale:
RET
decbin ENDP
;—————————————————————————————————————————————————
;Convierte número binario en BX a hex a dec i mal y despliega
binhex PROC NEAR
MOV CH,4 ;número de dígitos
rota: MOV CL,4 ;cuenta a 4 bits
ROL BX,CL ;desplaza dígito a la izq.
MOV AL,BL ;y pasa a reg. AL
AND AL,0Fh ;quita dígitos de la izq.
ADD AL,30h ;convierte a ASCII
CMP AL,3Ah ;¿Es mayor que 9?
JL despliega ;Despliega si ente 0 y 9
ADD AL,7h ;el dígito está en tre A y F
despliega:
MOV DL,AL ;Coloca ASCII en DL
MOV AH,2h ;Función de despliegue
INT 21h ;Llama a DOS
DEC CH ;¿Terminamos con los 4 dígitos?
JNZ rota ;Si aún no se termina
RET ;Regresa
binhex ENDP
El Mundo Exterior
7-137
;—————————————————————————————————————————————————
;Despliega una nueva línea
crlf PROC NEAR
MOV DL,0Dh ;CR
MOV AH,2 ;función de despliegue
INT 21h ;llamada a DOS
MOV DL,0Ah ;LF
MOV AH,2 ;función de despliegue
INT 21h ;llamada a DOS
RET ;regresa de crlf
crlf ENDP
;******************************************************************
dechex ENDS
END
Introduzca el programa an te rior en MASM y pruebe con variosnúmeros. Para finalizar interrumpa presionando la tecla de CTRL y C almismo tiempo.
Ejercicio 7.9 Introduzca la pseudo instrucción PAGE como primerainstrucción del programa y ensamble pero ahora usando el comando
MASM dechex, , lpt1:, dechex
Asegúrese de tener la impresora prendida y con papel pues el resultadose pasará directamente a la impresora. Así mismo hemos creado unareferencia cruzada en un archivo de nombre DECHEX.REF que nos in -dica dónde se definieron todas las vari ables (con el signo #) y dónde sonutilizadas todas ellas.
7.7 Resumen
Se analizan en este capítulo distintas formas de aprovecharnos de lasinterrupciones de los diseñadores del SO en nuestro beneficio. Seintroducen conceptos de procedimientos y la forma de accesar dejandopara el siguiente capítulo la forma idónea de pasar parámetros a lassubrutinas.
Ensamblador
7-138
7.8 Instrucciones Analizadas
INT 20 (AH=9h, AH=0Ah, AH=5h), ROR, RCR, ROL, RCL, SHR,SAR, SHL, SAL, ADD, SUB, ADC, SBB, MUL, DIV, IMUL, IDIV,NOP, RET, CALL y las pseudo instrucciones PROC NEAR, PROC FAR,ENDP, PAGE.
7.9 Problemas
7.1 Analice el programa de conversión de dec i mal a hex a dec i mal en loreferente a las instrucciones de corrimiento.
7.2 Realice un código como subrutina en el que se le pasan comoparámetro la fecha en el registro AX dividida en día, mes, año de lasiguiente 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, la subrutina regresa el día en ASCII en el registroBX, el mes en ASCII en el registro AX y el año en ASCII en CX y DX. Elprograma prin ci pal lo despliega en la pantalla o imprime.
7.10 Bibliografía
Mercier Philippe Assembleur Fac ile. Marabout 1992, Alleur Bélgica.
Mor gan Chris to pher Blue book of As sem bly Lan guages Rou tines for theIBM. Olume Waite, New York 1984.
Lafore Rob ert As sem bly Lan guage Primer for the IBM PC. The WaiteGroup 1992.
IBM Per sonal Com puter Tech ni cal Ref er ence.
El Mundo Exterior
7-139
Capítulo 88.1 La pila
En los primeros diseños de microcomputadoras surgía el problema deque al atender las interrupciones generadas por los distintos dispositivosse requería preservar el contenido de varios registros en algún lugar.Algunos diseñadores tomaron el camino de dejar al programador la tareade reservar un área de memoria para tal fin y de asegurar que los registrosfueran restaurados an tes de volver al programa prin ci pal. Otros seaseguraron de que esto sucediera siempre al incorporar una serie deregistros paralelos donde se guardaba automáticamente el contenido detodos los registros de la UPC.
Pronto se vio que la primera opción, con algunas variantes, era elcamino adecuado y el más conveniente para proporcionar toda laflexibilidad al programador y dejar que él decida cuándo y cómo debenguardarse los datos requeridos. Esto da gran libertad pero a la vezcomplica las cosas al tener que ser extremadamente cuidadoso con elmanejo de esta área reservada de memoria llamada pila.
Para poder implementar el uso de pilas, es requisito in dis pens ableagregar nuevos registros o utilizar los ya existentes de forma quepermitan el con trol de dicha pila. En el circuito de Intel, el manejo depilas se logra a través del registro SS (stack seg ment o segmento de pila)junto con SP (stack pointer o apuntador de fin de pila) y BP (base pointer o apuntador base de pila).
El uso de subprogramas plantea también la necesidad de pasarparámetros a estas subrutinas o procedimientos. Los tres métodospreferidos son:
8-141
· En los registros. Limitado a unas cuantas variables.
· Por medio de variables. Mejor que el anterior, pero se requiere dela definición estricta de muchas variables o el uso de archivos dealmacenamiento externos creciendo mucho el programa. Usadocuando se requieren un gran número de variables.
· Usando la pila. Es el método preferido y el más utilizado cuandolas variables van de pocas a regular en cantidad.
La pila es usada en las microcomputadoras modernas para guardar elapuntador de memoria al llamar una rutina de interrupción (INT ointerrupción externa) o un procedimiento del usuario (CALL). Sabemosya que se necesitan de por lo menos 16 bits pues se requiere guardar IP encaso de una llamada cercana o CS e IP en el caso de una lejana.
8.1.1 Manejo de la Pila
Para el manejo de pila se usan las instrucciones PUSH que empujavalores de un registro o localidad de memoria a la pila y POP que sacavalores de la pila restituyéndolos en un registro o localidad de memoria.La pila en este circuito es una pila del tipo FIFO (first in first out), es decir,el primero que entra es el primero que sale (PEPS).
Un ejemplo de un programa completo donde se requiere utilizar la pilapara guardar el contador que a su vez es utilizado en otra subrutinailustrará el punto:
;Sonido de Mo tor de Automóvil
ruido SEG MENT
prin ci pal PROC FAR
AS SUME CS:ruido
ORG 100h ;De fine inicio de programa
inicio:
MOV CX,10d ;número de repeticiones
otro: PUSH CX ;guarda la cuenta en la pila
CALL disparo ;Sonido de disparo
CALL silencio ;Y guarda silencio
POP CX ;Recupera el contador de
;disparos de la pila
LOOP otro ;repite hasta terminar
INT 21h ;Regresa a DOS
prin ci pal ENDP ;fin programa prin ci pal
;—————————————————————————————————————————————————
Ensamblador
8-142
;Subrutina para hacer un sonido breve
disparo PROC NEAR
MOV DX,140h ;valor inicial de la espera
MOV BX,3Fh ;cuenta inicial
IN AL,61h ;lee el puerto de sonido
AND AL,11111100b ;quita bits 0 y 1
sonido: XOR AL,2 ;Cambia bit 1 de AL
OUT 61h,AL ;Salida a puerto de sonido
;———————————————————————————————————————————-
; Gen era número aleatorio
ADD DX,9248h ;Suma de patrón pseudo aleatorio
MOV CL,3 ;Prepara a rotar 3 bits
ROR DX,CL ;Rota 3 bits
MOV CX,DX ;Coloca en CX
espera: LOOP espera ;ciclo de espera
;
DEC BX ;¿fué suficiente?
JNZ sonido ;Salta si aún no se acaba
AND AL,11111100b ;Quita bits 0 y 1
OUT 61h,AL ;Manda al puerto de sonido
RET ;Regresa de la subrutina
disparo ENDP
;—————————————————————————————————————————————————
;Retraso ligero (aumentar o disminuir según modelo)
silencio PROC NEAR
MOV CX,0FFFFh ;cuenta de silencio
repite: LOOP repite
MOV CX,0FFFFh ;cuenta de silencio
repite1: LOOP repite1
RET ;Regresa
silencio ENDP
;******************************************************************
ruido ENDS ;fin de código
END inicio ;fin de ensamble
Para comprender el funcionamiento de la pila, ejemplificaremosanalizando la pila con una llamada a una subrutina donde se pasan losparámetros en la pila.
;pasa a la pila los parámetros
PUSH DS
PUSH DX
CALL rutina
La Pila
8-143
En este punto recalquemos que la cima de la pila se encuentra en dondeesté la última dirección del último byte empujado a la pila. En elmomento que el procedimiento “rutina” recibe el con trol la pila seencuentra en el siguiente estado:
100
98 valor de DS
96 valor de DX
94 valor de CS
92 SPÄ valor de IP îcima de la pila
El subprograma no podrá leer los datos de DS y DX que nos interesanpues el procesador empuja automáticamente los valores de CS e IP (eneste caso de una llamada lejana) hacia la pila. Es menester entonces, elajustar el apuntador de la pila BP para que apunte al área de interéssiguiendo los siguientes pasos:
· 1. Salvar el valor actual de BP en la pila (PUSH BP).
· 2. Inicializar BP al mismo valor que SP (MOV BP,SP).
100
98 valor de DS îBP+8
96 valor de DX îBP+6
94 valor de CS îBP+4
92 valor de IP îBP+2
90 SPÄ valor de BP îBP
Los parámetros están disponibles ahora con un sim ple ajuste delapuntador.
MOV AX,[BP+6] ;mueve el valor de DX a AX
MOV BX,[BP+8] ;mueve el valor de DS a BX
Cuando el subprograma termine, deberá informar al procesador pormedio de la instrucción RET n que se ajuste la pila de acuerdo a losmovimientos realizados de forma tal que pueda recuperar CS e IP paravolver al punto de ejecución an te rior, siendo n el número de bytes aajustar. Ilustramos este último punto con un ejemplo completo paso apaso.
Contamos con una pila inicial de 50 elementos (100 bytes) definidos enla sección de pila del programa. Las cifras a la izquierda son los
Ensamblador
8-144
desplazamientos dentro del segmento SS definido también al inicio delprograma así como los valores de SP y BP que coinciden:
SPÄ îcima de la pila
98 BPÄ .....
96 .....
94 .....
92 .....
El programa requiere del uso pos te rior de CX por lo que se empuja a lapila:
PUSH CX
98 BP,SPÄ valor de CX îcima de la pila
96 .....
94 .....
.....
Si empujamos también el valor de DS (PUSH DS) tendremos:
98 BPÄ valor de CX
96 SPÄ valor de DS îcima de la pila
94 .....
92 .....
El programa x llama en este punto al subprograma y pasando losparámetros BX y DX en la pila:
PUSH BX
PUSH DX
CALL y ;llama a subrutina lejana y
98 BPÄ valor de CX
96 valor de DS
94 valor de BX
92 valor de DX
90 CS de x
88 SPÄ IP de x îcima de la pila
La Pila
8-145
En este punto el programa y tiene el con trol y requiere del registro BP (esla regla gen eral de uso de la pila). No hay forma de sa ber si el programaan te rior usa o no BP por lo que también es regla gen eral guardarlo en lapila y comenzar a usarlo desde ese momento:
PUSH BP ;salva registro BP
MOV BP,SP ;BP recibe el valor de SP
Lo que nos deja con la pila en el siguiente estado:
98 valor de CX
96 valor de DS
94 valor de BX (parámetro 1)
92 valor de DX (parámetro 2)
90 CS de x
88 IP de x
86 BP,SPÄ BP de x
Desde este momento podemos consultar entonces los parámetros de lapila 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 2bytes.
La subrutina y puede usar la pila para salvaguardar los valores querequiere más tarde para su uso. Si se requiere usar algún registro, primerose empuja a la pila para asegurarse de que el programa que llama nopierda sus registros de trabajo. Supongamos en este momento que sellama a la subrutina z pasándole los parámetros AX y BX:
PUSH AX ;guarda registro de subrutina x
PUSH BX ;guarda registro de subrutina x
MOV AX,1 ;inicializa valor para subrutina z
MOV BX,1 ;inicializa valor para subrutina z
PUSH AX ;guarda registro en la pila
PUSH BX ;guarda registro en la pila
CALL z ;llama subrutina lejana z
Las primeras instrucciones de la subrutina z serán para ajustar la pila yasegurarse el acceso a ella:
PUSH BP ;Guarda registro BP
MOV BP,SP ;inicializa pila para subrutina z
Ensamblador
8-146
Con lo que tenemos en la pila:
98 valor de CX
96 valor de DS
94 valor de BX (parámetro 1)
92 valor de DX (parámetro 2)
90 CS de x
88 IP de x
86 BP de x
84 valor de AX (salvado por y)
82 valor de BX (salvado por y)
80 Parámetro 1 (transmitido por y)
78 Parámetro 2 (transmitido por y)
76 CS de y
74 IP de y
72 BP,SPÄ BP de y (salvado por z)
La subrutina z puede a su vez consultar los parámetros 1 y 2 que mandala subrutina y (BP+6 y BP+8) y al regresar debe sacar el valor de BP de lapila (POP BP) para asegurar el comportamiento de la misma:
98 valor de CX
96 valor de DS
94 valor de BX (parámetro 1)
92 valor de DX (parámetro 2)
90 CS de x
88 IP de x
86 BPÄ BP de x
84 valor de AX (salvado por y)
82 valor de BX (salvado por y)
80 Parámetro 1 (transmitido por y)
78 Parámetro 2 (transmitido por y)
76 CS de y
74 SPÄ IP de y
72 BP de y (salvado por z)
En este momento la subrutina z informa al procesador que ya terminó sutarea (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 con trol a la subrutina y. Existe otraforma de la instrucción RET: RET n (ya mencionada) en la que se ajusta lapila por medio del registro SP agregándole un valor n (entero). El valor den es conocido en el momento de la programación pues sabemos elnúmero de parámetros pasados a la subrutina. Podemos entonces deducirel número de parámetros de la pila y colocar el valor correcto de n. En este
La Pila
8-147
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 valor de CX
96 valor de DS
94 valor de BX (parámetro 1)
92 valor de DX (parámetro 2)
90 CS de x
88 IP de x
86 BPÄ BP de x
84 valor de AX (salvado por y)
82 valor de BX (salvado por y)
80 Parámetro 1 (transmitido por y)
78 SPÄ Parámetro 2 (transmitido por y)
76 CS de y
74 IP de y
72 BP de y (salvado por z)
RET 4 ;regresa con ajuste de la pila en 4bytes
98 valor de CX
96 valor de DS
94 valor de BX (parámetro 1)
92 valor de DX (parámetro 2)
90 CS de x
88 IP de x
86 BPÄ BP de x
84 valor de AX (salvado por y)
82 SPÄ valor de BX (salvado por y)
80 Parámetro 1 (transmitido por y)
78 Parámetro 2 (transmitido por y)
76 CS de y
74 IP de y
72 BP de y (salvado por z)
En este punto la subrutina y recupera los valores empujados en la pila enorden inverso del almacenaje an tes de volver a la rutina que llama (x).
Ensamblador
8-148
POP BX
POP AX
POP BP
y regresa ajustando a su vez la pila en 4 unidades (2 parámetros):
RET 4
98 BPÄ valor de CX
96 SPÄ valor de DS
94 valor de BX (parámetro 1)
92 valor de DX (parámetro 2)
90 CS de x
88 IP de x
86 BP de x
84 valor de AX (salvado por y)
82 valor de BX (salvado por y)
80 Parámetro 1 (transmitido por y)
78 Parámetro 2 (transmitido por y)
76 CS de y
74 IP de y
72 BP de y (salvado por z)
A su vez la rutina x recupera sus valores empujados en la pila:
POP DS
POP CX
y la pila vuelve a su estado inicial (en lo que respecta a los apuntadores):
SPÄ
98 BPÄ valor de CX
96 valor de DS
94 valor de BX (parámetro 1)
92 valor de DX (parámetro 2)
90 CS de x
88 IP de x
86 BP de x
84 valor de AX (salvado por y)
82 valor de BX (salvado por y)
80 Parámetro 1 (transmitido por y)
78 Parámetro 2 (transmitido por y)
76 CS de y
74 IP de y
72 BP de y (salvado por z)
La Pila
8-149
Como conclusión es un buen hábito colocar en la pila los registros odatos que serán utilizados por algún subprograma an tes de llamarlo y unavez que termina la llamada, ajustar la pila y recuperar los valores de lapila:
prueba PROC NEAR
PUSH AX ;tanto AX como
PUSH BX ;BX serán utilizados
.... ;instrucciones del subprograma
POP BX ;recupera los valores
POP AX ;de AX y BX de la pila
RET
prueba ENDP
Se aconseja también especificar al inicio del subprograma por medio decomentarios cuáles son los registros que se pasan como parámetros ycuáles serán eventualmente destruidos:
Lee PROC NEAR
;Leer un carácter del teclado
;regresa el AL el código ASCII
;destruye AL al llamarse
MOV AH,1 ;servicio de lectura de teclado
INT 21h ;lee un carácter
RET
lee ENDP
8.1.2 Guardando las Banderas
Existen dos instrucciones especiales para colocar las banderas en lapila, una la opuesta de la otra: POPF y PUSHF. Estas instrucciones nocontienen ningún operando.
Se puede usar esta instrucción cuando se requiere de realizaroperaciones intermedias an tes de utilizar un salto condicional o cualquier otra operación que utilice las banderas para operar:
PUSHF ;Guarda las banderas
MOV AX,2
ADD AX,3 ;operación que modifica banderas
POPF ;recupera las banderas
Ensamblador
8-150
8.2 Manejo de Cadenas
En la mayoría de las aplicaciones informáticas, el tratamiento decadenas de caracteres es particularmente importante. Es tan común quelos procesadores modernos integran una serie de instrucciones pararealizar estas operaciones de forma eficiente.
Las operaciones de cadenas pueden ser utilizadas para otrasoperaciones para las cuales no fueron planeadas pero son muy eficientescomo es el caso de mover páginas completas de texto o imágenes a lamemoria de donde el controlador de video toma su información paradesplegar en la pantalla.
En este tipo de operaciones intervienen dos operandos en distintas áreasde memoria:
· 1. Cadena Fuente. Siempre en un segmento apuntado por DS yusando como apuntador a la cadena el registro SI (Source Index).
· 2. Cadena Destino. Siempre en un segmento apuntado por ES yusando como apuntador a la cadena el registro DI (DestinationIndex).
Las operaciones se realizan carácter a carácter y es posible realizarlascon otras operaciones que ya conocemos aunque de forma un poco torpee ineficiente:
Texto1: DB ‘Un texto cualquiera’
Texto2: DB ‘Otro texto’
Texto3: DB 20 DUP(?) ;zona de 20 caracteres
;inicialización
PUSH DS
POP ES ;ESîDS
MOV SI,OFF SET texto1 ;SIîdirección del texto1
MOV DI,OFF SET texto2 ;DIîdirección del texto2
;Estamos listo a comparar las dos cadenas
MOV AL,[SI] ;ALî‘U’ de “Un text...”
MOV AH,[DI] ;AHî‘O’ de “Otro te...”
CMP AH,AL ;Compara las cadenas
;aquí la lógica de las comparaciones
;
La Pila
8-151
;Transferir de un área a otra:
MOV SI,OFF SET texto2 ;SIîdirección del texto2
MOV DI,OFF SET texto3 ;DIîdirección del texto3
MOV AL,[SI]
MOV [DI],AL
;aquí la lógica que controla los contadores, el inicio, el fin, etc.
8.2.1 La Instrucción REP
El modificador REP (de RE Peat, repite) causa que la instrucciónsiguiente sea repetida hasta que el registro CX sea cero. REP se usa con ungrupo de tres instrucciones: MOVS (Move String, mueve cadena), SCAS
(Scan String, busca cadena) y CMPS (Com pare String, compara cadena).Las banderas afectadas dependen de la operación.
Para que este comando funcione, debemos colocar de antemano elnúmero de repeticiones en el registro CX para lo cual en tre muchas otrasposibilidades, podemos utilizar una pseudo instrucción del ensamblador:
texto DB ‘Una cadena de longitud x’
largo EQU $-texto ;calcula longitud de ‘texto’
MOV CX,largo ;en CX la longitud de la cadena
8.2.2 La Dirección de la Operación (CLD y STD)
El resultado de las operaciones de cadenas es manipular dos de ellas deforma que una resida en el segmento DS:SI y la otra en ES:DI. Existen dosposibilidades para ajustar el contador de forma que comience por elprincipio de la cadena o por el fi nal. La instrucción CLD (Clear Di rec tionFlag, Limpia bandera de dirección) in dica al procesador que los registrosSI y DI serán incrementados después de cada instrucción de manejo decadenas mientras que la instrucción STD (Set Di rec tion Flag, Fijabandera de dirección) in dica que los dos registros serán decrementados.
8.2.3 Mover Cadenas (MOVSB y MOVSW)
La instrucción MOVS se usa después de la instrucción REP y mueve unacadena de una localidad a otra de la memoria. La cadena fuente esapuntada por SI y re side en el segmento DS, mientras que el destino esapuntado por DI y re side en el segmento ex tra (ES).
Ensamblador
8-152
Cada vez que la instrucción MOVS se ejecuta suceden 3 cosas:
· 1. SI es incrementado (o decrementado dependiendo de labandera de dirección) ya sea en uno o dos bytes dependiendo si estransferencia de palabra o byte.
· 2. DI se incrementa (o decrementa dependiendo de la bandera dedirección) ya sea en uno o dos bytes dependiendo si estransferencia de palabra o byte.
· 3. CX es decrementado. Si llega a cero la transferencia termina.
En esta operación no se modifica ninguna bandera.
Mostramos un pedazo de código que mueve 40 letras “x” de su área dememoria fuente a su memoria destino. No es un programa completo peroes ilustrativo.
;***************************************************
datos SEG MENT
fuente DB 40 DUP(‘x’)
datos ENDS
;***************************************************
ex tra SEG MENT
destino DB 40 DUP(?)
ex tra ENDS
;***************************************************
AS SUME DS:datos
AS SUME ES:ex tra
MOV AX,datos ;dirección del segmento fuente
MOV DS,AX ;en registro DS
MOV AX,ex tra ;dirección del segmento destino
MOV ES,AX ;en registro ES
MOV SI,OFF SET fuente ;dirección de la fuente
MOV DI,OFF SET destino ;dirección del destino
CLD ;bandera de dirección hacia adelante
MOV CX,40 ;cuenta en CX
REP MOVS ;Mueve toda la cadena
Como se ve en el ejemplo an te rior hay muchos registros que inicializar,pero una vez que se logra esto, el trabajo es sencillo y lleva 2instrucciones escritas en una sola línea (la última).
Ejercicio 8.1 Com plete el programa an te rior con todas las instrucciones y pseudo instrucciones faltantes y ejecute.
La Pila
8-153
La instrucción REP MOVS reemplaza al siguiente grupo de instruccionesrepetidas CX veces:
MOV AL,DS:[SI]
MOV ES:[DI],AL
INC SI
INC DI
8.2.4 REPE ó REPZ y REPNE ó REPNZ
Estas instrucciones se utilizan sólo junto con las operaciones decomparación y búsqueda de cadenas (siguientes dos secciones) y señalanla terminación de dichas operaciones cuando el registro CX llega a cero ose localiza la cadena.
REPE (Repite while equal, repite mientras igual) repite la operaciónCMPS o SCAS mientras CX sea distinto de cero o el resultado de unacomparación cause que la bandera de cero sea limpiada (no cero) comoresultado que dos palabras o bytes no sean iguales. Las banderasafectadas dependen de la operación y el resultado de ésta.
REPNE (Repite while not equal, repite mientras no igual) repite laoperación CMPS o SCAS mientras CX sea distinto de cero o el resultado deuna comparación cause que la bandera de cero sea fijada (cero) comoresultado de que dos palabras o bytes sean iguales. Las banderasafectadas dependen de la operación y el resultado de ésta.
8.2.5 Compara Cadenas (CMPSB y CMPSW)
La instrucción CMPS se usa después de la instrucción REPE o REPNE ycompara una cadena de una localidad a otra de la memoria. La cadenafuente es apuntada por SI y re side en el segmento DS, mientras que eldestino es apuntado por DI y re side en el segmento ex tra (ES).
Cada vez que la instrucción CMPS se ejecuta suceden 3 cosas:
· 1. SI es incrementado (o decrementado dependiendo de labandera de dirección) ya sea en uno o dos bytes dependiendo si estransferencia de palabra o byte.
Ensamblador
8-154
· 2. DI se incrementa (o decrementa dependiendo de la bandera dedirección) ya sea en uno o dos bytes dependiendo si estransferencia de palabra o byte.
· 3. CX es decrementado. Si llega a cero la transferencia termina o:
A. REPE. Si la cadena fuente es distinta de la destino.
B. REPNE. Si la cadena fuente es igual a la destino.
En esta operación se modifican las banderas de acuerdo a lacomparación realizada (AF, CF, OF, PF, SF, ZF).
La instrucción REPE CMPS reemplaza al siguiente grupo deinstrucciones repetidas CX veces:
otro:
MOV AL,DS:[SI]
MOV AH,ES:[DI]
CMP AL,AH
JPZ salta
INC SI
INC DI
JMP otro
salta:
8.2.6 Busca Carácter (SCASB y SCASW)
La instrucción SCAS se usa después de la instrucción REPE o REPNE ycompara una cadena de una localidad al registro AL (en caso de byte o AX
en caso de palabra). La cadena fuente es apuntada por DI y re side en elsegmento ex tra (ES).
Se usa esta instrucción para buscar un carácter dentro de una cadena.Cada vez que la instrucción SCAS se ejecuta suceden 2 cosas:
· 1. DI se incrementa (o decrementa dependiendo de la bandera dedirección) ya sea en uno o dos bytes dependiendo si estransferencia de palabra o byte.
· 2. CX es decrementado. Si llega a cero la transferencia termina o:
– A. REPE. Si la cadena fuente es distinta al contenido deAL (o AX).
La Pila
8-155
– B. REPNE. Si la cadena fuente es igual al contenido delregistro AL (o AX).
En esta operación se modifican las banderas de acuerdo a lacomparación realizada (AF, CF, OF, PF, SF, ZF).
La instrucción REPE SCAS reemplaza al siguiente grupo de instrucciones repetidas CX veces:
otro:
MOV BL,ES:[DI]
CMP AL,BL
JPZ salta
INC DI
JMP otro
salta:
8.2.7 LODSB y LODSW
Este grupo de instrucciones cargan el contenido de una localidad dememoria por DS:SI al registro AL o AX según el tipo de operación.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.
El uso de los repetidores (REP, REPE, REPNE) no tienen sentido en estecaso.
8.2.8 STOSB y STOSW
Estas instrucciones pasan el contenido del registro AL o AX, según eltipo de operación, a la localidad de memoria apuntada por DS:SI.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.
Con el repetidor REP, nos puede servir para llenar un área de memoriacon un valor conocido. Por ejemplo:
;Inicializa una zona de 10 caracteres con 0
MOV CX,0Ah ;cuenta 10
MOV AL,0 ;valor a traspasar
REP STOSB ;repite 10 veces la operación
Ensamblador
8-156
Mostramos en el siguiente programa el uso de las instrucciones REPE yCMPS para buscar una llave introducida por el usuario dentro de una frasey decidir si ésta o no. Una cosa importante a notar en este programa es eluso de segmentos que se traslapan en el caso del segmento de datos (DS) y el segmento ex tra (ES), lo que hace un poco más sencillo el manejo de laprogramación pues no es necesario acordarse de los segmentos fuentes ydestino sino hacer referencia a una misma área de memoria en este casollamada DATOS.
;BUSCA
;El usuario in tro duce una llave y a continuación
;una frase, el programa de cide si la llave se encuentra en la frase
muestra EQU 9h ;función de despliegue
teclado EQU 0Ah ;función del teclado
dos EQU 21h ;interrupción de DOS
;******************************************************************
pila SEG MENT STACK;de fine la pila
DB 20 DUP(‘pila ‘) ;palabra pila y 4 blancos
pila ENDS
;******************************************************************
datos SEG MENT ;de fine segmento de datos
ora_max DB 127d ;long. máxima de frase
ora_real DB ? ;long. real introducida
oracion DB 127d DUP(?) ;espacio para 127 caracteres
llav_max DB 20d ;long. máxima de llave
llav_real DB ? ;long. real introducida
llave DB 20d DUP(?) ;espacio para 20 caracteres
mens1 DB 0Dh,0Ah,’Llave a buscar: $’
mens2 DB 0Dh,0Ah,’Frase: $’
mens3 DB 0Dh,0Ah,’No se encontro $’
mens4 DB 0Dh,0Ah,’Si se encontro $’
datos ENDS
;******************************************************************
Busca SEG MENT ;segmento del código
prin ci pal PROC FAR ;parte prin ci pal del programa
AS SUME CS:busca,DS:datos,ES:datos
;———————————————————————————————————————————-
Inicio:
;guarda la valores para el regreso
PUSH DS ;segmento de datos viejo
SUB AX,AX ;forma rápida de poner 0 en AX
La Pila
8-157
PUSH AX ;guarda en pila (DS:0)
;———————————————————————————————————————————-
;DS apunta ahora a nuestro segmento de datos
MOV AX,datos ;dirección del segmento de datos
MOV DS,AX ;hacia el registro DS
;———————————————————————————————————————————-
;ES apunta ahora a nuestro segmento ex tra
MOV AX,datos ;dirección del segmento de datos
MOV ES,AX ;hacia registro ES
la_llave: ;pide llave y coloca en memoria
MOV DX,OFF SET mens1 ;dirección mensaje
MOV AH,muestra ;y prepara a mostrar
INT dos
;———————————————————————————————————————————-
;Toma llave y guarda
MOV DX,OFF SET llave_max ;dirección de llave
MOV AH,teclado ;toma llave de teclado
INT dos
;———————————————————————————————————————————-
frase: ;pide la frase y guárdala
MOV DX,OFF SET mens2 ;dirección mensaje
MOV AH,muestra ;y prepara a mostrar
INT dos
;———————————————————————————————————————————-
;Toma frase y guarda
MOV DX,OFF SET ora_max;dirección frase
MOV AH,teclado ;toma frase de teclado
INT dos
;———————————————————————————————————————————-
;Busca la llave en la frase
;SI apuntador a la llave
;DI apuntador a la frase
;BX apuntador a inicio de frase
;DX long. frase - long. llave + 1
;CX long. de la frase
;
CLD ;búsqueda hacia adelante
MOV AL,ora_real ;long. frase
SUB AL,llav_real ;- long. llave
JL no_esta ;si long. llave>long. frase
Ensamblador
8-158
CBW ;cambia byte a palabra
MOV DX,AX ;poner en DX
INC DX ; + 1
MOV BX,OFF SET oracion ;BX apunta a inicio frase
;———————————————————————————————————————————-
compara:
MOV DI,BX ;lugar donde comienza comparación
MOV SI,OFF SET llave ;SI inicio de llave
MOV AL,llav_real ;toma long. llave
CBW ;convierte a palabra
MOV CX,AX ;y guarda en CX
REPE CMPSB ;repite hasta CX=0 o no se encuentrecarácter
JZ si_esta ;no encontramos nada
INC BX ;avanza apuntador a sig. carácter defrase
DEC DX ;¿Acabamos?
JZ no_esta ;si, no está
JMP compara ;no, con tinua siguiente
;———————————————————————————————————————————-
si_esta: ;encontramos llave
MOV DX,OFF SET mens4 ;dirección mensaje
MOV AH,muestra ;prepara a mostrar
INT dos
JMP la_llave ;Ve por otra llave y frase
;———————————————————————————————————————————-
no_esta: ;no se encontró llave
MOV DX,OFF SET mens3 ;dirección mensaje
MOV AH,muestra ;prepara a mostrar
INT dos
JMP la_llave ;Ve por otra llave y frase
RET
;———————————————————————————————————————————-
prin ci pal ENDP ;fin de programa prin ci pal
busca ENDS ;fin del segmento
END inicio ;fin del programa
Una vez que la llave y la oración han sido aceptadas, el programaprocede a las comparaciones. Usa el registro BX como apuntador a loscaracteres de la frase. La comparación comienza desde el primer carácter. Asumamos que la llave tiene una longitud de tres caracteres, requerimos
La Pila
8-159
de comparar la llave con los primeros tres caracteres de la frase de lasiguiente forma:
· 1. El registro SI apunta a las letras de la llave.
· 2. El registro DI apunta a las letras de la frase.
· 3. El registro CX lleva la cuenta del número de letras de la llave.
La instrucción CMPB se repite hasta que CX es cero o la comparaciónfalla. Para no buscar en toda la frase y hacer que el programa sea másrápido, sólo se busca en (longitud de la frase - longitud de la llave + 1)caracteres sin necesidad de llegar al fi nal. Afortunadamente lainterrupción del teclado (0Ah) regresa la longitud de lo que el usuariotecleó en la localidad inmediatamente después a la memoria reservadapara dicha entrada, en este caso, en la localidad llav_real y ora_real.
Es necesario empujar DS a la pila pero también un cero para poderregersar al segmento adecuado de datos y que el programa lo sepa(segemento de datos en DS:0).
8.3 Resumen
Se in tro duce en este capítulo el manejo de la pila, siempre importante enlos diseños actuales de computadoras y programas. Se analizan además,las instrucciones de manejo de cadenas particulares a este circuito y laforma de usarlas en nuestra ventaja en tareas sencillas como la del últimoprograma presentado en el capítulo.
8.4 Problemas
8.1 Convierta el programa BUSCA de forma tal que no se usen lasinstrucciones especiales de manejo de cadenas en la comparación.
8.2 Programe un algoritmo desde DE BUG que llene las localidades dememoria de la 200h a la 2FFh con un 0.
8.3 Averigüe si el circuto MOTOROLA tiene instrucciones similares a laspresentadas en este capítulo para manejo de pila y de cadenas.
Ensamblador
8-160
8.5 Instrucciones Analizadas
PUSH, POP, RET n, POPF, PUSHF, REP, CLD, STD, MOVS, MOVSB, MOVSW, CMPS, CMPSB, CMPSW, REPE, REPZ, REPNE, REPNZ,SCAS, SCASB, SCASW, LODS, LODSB, LODSW, STOS, STOSB,STOSW
8.6 Bibliografía
Revista PC Mag a zine EU números de 1983.
Mercier Philippe Assembleur Fac ile. Marabout 1992, Alleur Bélgica.
Barden Wil liam Jr. How to Pro gram Mi cro com puters. Sams & Com -pany 1987.
MASM 86 Co lum bia Data Prod ucts, EU 1986.
IBM Per sonal Com puter Tech ni cal Ref er ence.
La Pila
8-161
Capítulo 99.1 El Vídeo
Du rante el desarrollo de las microcomputadoras hubo que tomar variasdecisiones con respecto a los componentes que forman el sistema y a laforma de interactuar en tre ellos. Muchas de estas decisiones, buenas omalas, aún nos siguen persiguiendo con el fantasma de la compatibilidad.
Los caracteres que se despliegan en la pantalla funcionaban en unprincipio 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. Estofunciona muy bien en los con fines del despliegue de letras, pero una vezque el usuario y los diseñadores exigen más de la pantalla, este esquemaes inadmisible.
El siguiente paso consiste en reservar un área de memoria para cadalocalidad gráfica de la pantalla llamada PIXEL (Pic ture El e ment,Elemento de Pantalla).
Utilicemos de inmediato el programa DE BUG para averiguar a qué nosreferimos:
C>CLS
C>DE BUG
-d b800:0 fa
Notaremos que en la columna de la derecha (caracteres ASCII) estánlocalizadas las letras C>DE BUG, ¡Hemos localizado el área de memoriareservada para la pantalla de video! Esta pantalla va de la direcciónB800:0000 a la B800:0F9F (4000 bytes) y se forma por dos bytes porlocalidad.
9-163
¿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. Desde DE BUG juguemos con los atributos:
C>DE BUG
-rds
DS 08F1
:b800
-e0
Introduciendo la secuencia 41, F0, 42, 87, 43, F (Recuerde introducirusando la barra espaciadora y terminar usando la tecla de RE TORNO) queda por resultado ABC (códigos 41,42 y 43) pero en distintos atributos en laparte su pe rior del video (códigos F0, 87 y 0F).
El manejo del video se puede hacer también utilizando las rutinas de lainterrupción 10h que el fabricante del BIOS (IBM, Phoe nix, etc.) diseñó:
;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,6 ;Función de movimiento de pantalla
MOV AL,0 ;Código para limpiar pantalla
MOV CH,0 ;renglón izq. sup.
MOV CL,0 ;columna izq. sup.
MOV DH,24 ;renglón inf. derecho
MOV DL,79 ;columna inf. derecha
MOV BH,7 ;Byte de atributo del carácter
INT 10 ;llamada al ROM
POP DX
POP CX
POP BX
POP AX
RET
cls ENDP
El siguiente programa usa de la misma forma la interrupción 10h:
;Posiciona cur sor en columna AL, renglón AH
;Servicio 02h de la interrupción 10h
;Parámetros de entrada: AL y AH
;Parámetros de salida : Ninguno
Ensamblador
9-164
;Registros destruidos : Ninguno
IR_A_XY PROC NEAR
PUSH BX
PUSH DX
MOV DX,AX ;en DH el renglón, en DL la columna
MOV AH,2 ;servicio 2 de la
MOV BH,0 ;página cero de la
INT 10h ;interrupción 10h
POP DX
POP BX
RET
ir_a_XY ENDP
9.2 Ventanas
Las rutinas del ROM de una computadora IBM o com pat i ble permiten elmanejo de ventanas dentro de la pantalla, así como de varias páginas devideo para animaciones rápidas y distintos trucos programáticos.
Esta característica es muy utilizada en los programas modernosintegrados y ambientes en el que el manejo de las ventanas es la base.
Mostraremos a continuación cómo colocar una ventana sencilla en lapantalla de 20 columnas de ancho y 9 renglones de alto colocada en lamitad de la pantalla:
;Ventana: demostración del uso de ventanas
;NO utilice el ENTER para terminar una línea
ventana SEG MENT
AS SUME CS:ventana
;————————————————————————————————————————————
;limpia pantalla
MOV AH,6 ;Función de movimiento de pantalla
MOV AL,0 ;Código para limpiar pantalla
MOV CH,0 ;renglón izq. sup.
MOV CL,0 ;columna izq. sup.
MOV DH,24 ;renglón inf. derecho
MOV DL,79 ;columna inf. derecha
MOV BH,7 ;Byte de atributo del carácter
INT 10h ;llamada al ROM
;————————————————————————————————————————————
El Video
9-165
, colocar el cur sor en las coordenadas adecuadas a la ventana
coloca: MOV DH,16 ;renglón
MOV DL,30 ;columna
MOV AH,2 ;servicio 2 de la
MOV BH,0 ;página cero de la
INT 10h ;interrupción 10h
MOV CX,20d ;cuenta a 20
;————————————————————————————————————————————
; acepta la entrada del teclado 20 veces
tecla: MOV AH,1 ;función del teclado
INT 21h
CMP AL,3 ;Si CTRL C
JZ salida ;termina
LOOP tecla ;sigue hasta agotar CX
;————————————————————————————————————————————
;mueve pantalla hacia arriba
MOV AH,6 ;función de mover
MOV AL,1 ;Número de líneas
MOV CH,8 ;Renglón sup. izq.
MOV CL,30 ;Columna sup. izq.
MOV DH,16 ;renglón inf. derecho
MOV DL,50 ;Columna inf. derecha
MOV BH,7 ;Atributo nor mal
INT 10h ;llamada a int. video
JMP coloca
salida:
INT 20h
;————————————————————————————————————————————
ventana ENDS
END
Ejercicio 9.1 Convierta el programa an te rior en uno mod u lar usandollamadas a subrutinas (CALL) en lugar de las secuencas de códigoinsertadas para: 1. limpiar pantalla, 2. colocar cur sor y 3. mover renglónhacia arriba (Scroll).
El siguiente código llena la pantalla con cierto carácter predeterminadoy aprovecha que ya sabemos la dirección del área de memoria donde seguardan los datos de la pantalla.
;Llena: llena la pantalla con un carácter
;De fine el segmento de video
Ensamblador
9-166
video SEG MENT AT 0B800h
DB 800h DUP(?) ;tamaño de la pantalla (2048 bytes)
video ENDS
;**********************************************************
codigo SEG MENT
llena PROC FAR
AS SUME CS:codigo
AS SUME DS:video
PUSH DS ;guarda el segmento viejo
SUB AX,AX ;AX en cero
PUSH AX ;segmento DS:0
;————————————————————————————————————————————
;apunta a segmento de video
MOV AX,video
MOV DS,AX
;————————————————————————————————————————————
;coloca carácter con atributo nor mal
MOV AX,0701h
MOV BX,0 ;inicio de pantalla
MOV CX,0F9Fh ;cuenta
;————————————————————————————————————————————
;llena la pantalla
otro: MOV [BX],AX ;inserta carácter
INC BX ;incrementa contador en
INC BX ;2 bytes
LOOP otro
RET
;————————————————————————————————————————————
llena ENDP
codigo ENDS
END
En el programa an te rior remarquemos que no es posible regresar al SO
usando una interrupción (20h) puesto que el programa modifica elsegmento de datos por lo que primero se debe salvar este segmento y porúltimo regresar con la instrucción RET.
Ejercicio 9.2 Modifique el programa an te rior (llena) para usar lainstrucción MOVS en lugar del lazo utilizado.
El Video
9-167
Ejercicio 9.3 Utilizando el ejemplo del programa LLENA, modifiqueahora el programa VENTANA para agregar un recuadro a la ventana.Utilice las instrucciones de movimientos de cadenas.
9.3 Pantallas de Graficación
Poco a poco ha habido una evolución en los dispositivos que conformanlos sistemas de cómputo, mientras más avanza la tecnología y losproductos se vuelven populares por demanda o por baja de costos losdiseñadores están presionados a mejorar día a día. De la sencilla pantallade despliegue de caracteres en modo monocromático, se pasa a mejoresresoluciones, más detalle (número de pix els), y más colores. De 320 x200 pix els a color se evoluciona pasando por 640 x 200 16 colores hastael estandar ac tual de 1200 x 480 en 16 millones de colores en los cuales seobtiene resolución casi fotográfica.
Todo lo an te rior desemboca en requerimientos más y más grandes dememoria pues el manejo de cada pixel requiere entonces de más bytespara especificar sus atributos y colores de los posibles de seleccionar,siendo común hasta 2M bytes y más en los controladores modernos
Al ejecutarse el sistema operativo, éste “despierta” en modo de texto yes la obligación del programa que utiliza los servicios del sistemaoperativo de cambiar este modo. Una posibilidad es el comando MODE
del SO o cualquier utilería proporcionada por los fabricantes de losdispositivos controladores de video, pero la operación debe realizarsemanualmente. La alternativa es entonces automatizar el proceso dentrodel programa que así lo requiera.
Para lograr esto se requiere de dos pasos:
· 1. Alterar algunos bits de un byte especial que reside en memoriallamado bandera del equipo.
· 2. Informar al BIOS del ROM que se ha modificado dicha bandera.
Al prender el equipo, el SO reconoce por medio de los interruptores de lamáquina, qué tipo de equipo está conectado en ese momento y guarda lainformación en un byte localizado en la dirección absoluta 00410h. Si se
Ensamblador
9-168
quiere engañar al SO es necesario modificar los bits de esa localidad, ennuestro caso es pe cial 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 alternativasde las que sólo investigaremos 3:
· 80 x 25 caracteres monocromáticoal llamar con AL=2, AH=0.
· 640 x 200 pixel monocromático llamar con AL=6, AH=0.
· 320 x 200 pixels de color llamar con AL=4, AH=0.
Presentamos un corto programa que realiza esto precisamente:
;MODO: cambia el modo de la pantalla a
;M=monocromático
;A=Alta resolución 640 x 200 monocromático
;C=Baja resolución 320 x 200 color
tecla EQU 1h ;entrada del teclado
muestra EQU 9h ;despliegue en pantalla
dos EQU 21h ;llamada a DOS
;————————————————————————————————————————————
;De fine el segmento de la bandera de video
rom SEG MENT AT 040h
ORG 10h ;dirección del byte
bandera DW ?
rom ENDS
;************************************************
;De fine segmento de código
modo SEG MENT
AS SUME CS:modo
AS SUME DS:modo
ORG 100h
inicio:
MOV DX,OFF SET mens ;dirección del mensaje
MOV AH,muestra ;prepara a desplegar
INT dos
;————————————————————————————————————————————
;escoge la bandera del equipo
El Video
9-169
AS SUME DS:rom
MOV AX,rom
MOV DS,AX
;————————————————————————————————————————————
;Toma la letra del usuario y escoge la opción
MOV AH,tecla ;entrada del teclado
INT dos ;llama a DOS
CMP AL,’m’ ;monocromático
JE mono
CMP AL,’a’ ;alta resolución
JE alta_res
CMP AL,’c’ ;color
JE color
JMP inicio
;————————————————————————————————————————————
;coloca en monocromático
mono: MOV AX,bandera ;bandera del equipo
AND AX,11001111b ;quita los bits del video
OR AX,00110000b ;y coloca bits de monocromático
MOV bandera,AX ;regersa a su lugar
MOV AL,2 ;80 columnas en Blanco y Ne gro
MOV AH,0 ;función de modifica equipo
INT 10h ;llama a rutina de video
JMP salida ;finaliza
;————————————————————————————————————————————
;coloca en alta resolución
alta_res: MOV AX,bandera ;bandera del equipo
AND AX,11001111b ;quita los bits del video
OR AX,00100000b ;y coloca bits de 640 x 200
MOV bandera,AX ;regersa a su lugar
MOV AL,6 ;640 x 200 en Blanco y Ne gro
MOV AH,0 ;función de modifica equipo
INT 10h ;llama a rutina de video
JMP salida ;finaliza
;————————————————————————————————————————————
;coloca en color 320 x 200
color: MOV AX,bandera ;bandera del equipo
AND AX,11001111b ;quita los bits del video
MOV bandera,AX ;regresa a su lugar
MOV AL,4 ;320 x 200 color
MOV AH,0 ;función de modifica equipo
Ensamblador
9-170
INT 10h ;llama a rutina de video
;————————————————————————————————————————————
salida: INT 20h ;salir
;————————————————————————————————————————————
mens db 13,10
db ‘Teclee “m” para 80 x 25 monocromático’,13,10
db ‘ “a” para 640 x 200 monocromático’,13,10
db ‘ “c” para 320 x 200 color’,13,10
db ‘Selección: $’
;————————————————————————————————————————————
modo ENDS
END inicio
El programa an te rior debe ser ensamblado en un archivo del tipo COM
(usando EXE2BIN) y sólo puede ser usado en equipos con tarjeta CGA,EGA, VGA, SVGA o UVGA. El pro gram hace uso de la pseudo instrucciónSEG MENT AT que forza al segmento en una dirección explicita conocidade antemano. Otra cosa importante es que como deseamos un programatipo COM, hemos forzado los datos en un sólo segmento y no ensegmentos separados como en ejemplos anteriores, la única excepción aesto es con el uso de la pseudo instrucción SEG MENT AT explicada en elparráfo an te rior.
Establecemos en este momento la siguiente regla:
REGLA. Se puede tener más de un segmento en un archivo COM si este segmento
es definido de antemano con la pseudo instrucción SEG MENT AT.
La forma de accesar la pantalla cambia también pues ahora se requierede 320 x 200 (en baja resolución color) ó 64,000 bytes localidades dememoria para guardar la información de los pix els por lo que se escogióasignar 2 bits de un byte para cada localidad lo que nos da una posibilidadde 4 combinaciones para cada pixel y 4 pixel por byte (16,000localidades) en las siguientes combinaciones:
· 00 negro
· 01 amarillo
· 10 azul
· 11 blanco
El Video
9-171
Experimentaremos un poco con el color y DE BUG una vez que yatenemos el programa MODO ensamblado. 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 DE BUG
y cambiar el segmento al de la pantalla:
C>DE BUG
-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 laparte su pe rior del mon i tor. El color depende del mon i tor que estemosusando y del ajuste del mismo. Lo que hemos logrado con el comando f esllenar las primeras 400h localidades del segmento de memoria con laconstante 55h ó 01010101b, el código am a rillo para cada uno de los 4pixeles de cada byte.
¿Por qué si llenamos las primeras 400h localidades de memoria de video obtenemos entonces áreas en blanco de la pantalla? La memoria de videopara color se di vide en dos par tes:
· De las localidades 0000h a la 1F3Fh (7,999 bytes) para las líneaspares (0,2,4, etc.)
· De las localidades 2000h a la 3F3Fh (7,999 bytes) para las líneasimpares (1,3,5, etc.)
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 Experimente en este punto con distintos códigos y vea elresultado.
Ensamblador
9-172
Como se puede suponer, es un poco difícil tratar de mantener el con trolde las dos áreas de memoria para gráficar un punto o línea de un lugar aotro. Para evitarnos este problema podemos usar una rutina del ROM quehace 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 ydiseñaremos el programa de forma tal que deba re solver todo lorelacionado a los colores, bancos y pix els de cada byte. El programa op -era usando las teclas 0,1,2 y 3 para definir el color del pixel y las flechaspara definir la dirección de dibujo del mismo. A su vez, hace uso de lainterrupción 16h del teclado que nos regresa el código de cada teclapresionada. Desgraciadamente las teclas como mayúsculas, bloqueo denúmeros, etc. no tienen código, para eso se requiere del llamado a lainterrupción 16h con AH=2 lo que regresa una bandera con los distintosestados de las teclas presionadas en el registro AX de acuerdo a lasiguiente tab la:
· 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
;LINEAS Rutina para dibujo de linea en la pantalla utilizando
;las flechas para la direccion
;Se requiere de mon i tor de color y de usar an tes
;el programa MODO de este mismo capítulo (opción c)
arriba EQU 48H ; flecha hacia arriba
El Video
9-173
abajo EQU 50H ; flecha hacia abajo
derecha EQU 4dH ; -
izquierda EQU 4bH ;
es cape EQU 1bH ; tecla de ESC
;************************************************
video SEG MENT AT 0B800H ; de fine segmento ex tra apuntando apantalla
wd_buff LA BEL WORD
v_buff LA BEL BYTE
video ENDS
;************************************************
linea SEG MENT ; de fine el segmento de codigo
;——————————————————————————————————————————————————
prin ci pal PROC FAR ; parte prin ci pal del programa
AS SUME cs:linea,es:video
inicio: ; direccion inicial de ejecución
; prepara stack para regreso
PUSH ds ; guarda segmento de datos viejos
SUB AX,AX ; cero en AX
PUSH AX ; y guarda en pila(segmento DS:0)
; prepara ES con el segmento de video
MOV AX,video ; direccion del segmento de video
MOV ES,AX ; pasarlo a ES
; limpia pantalla usando el ROM
MOV AH,6 ; usa corrimiento hacia arriba
MOV AL,0 ; código para limpiar pantalla
MOV CX,0 ; punto su pe rior izq.=0,0
MOV DL,79 ; punto inf izq en
MOV DH,24 ; 79,24
INT 10H ; llama a rutina de ROM
; el apuntador a la pantalla está en CX, DX
; renglón de 0 a 200d en DX
; columna de 0 a 320d en CX
;
; posiciona en centro de pantalla para comenzar
MOV DX,100d ; número de renglones/2
MOV CX,160d ; columnas/2
;
; lee el teclado para obtener el dígito que se está presionando
lee_tecla:
MOV AH,0 ; función del teclado sin eco
INT 16H ; llama a dos
CMP AL,es cape ; si es ESC
JZ salida ; termina
Ensamblador
9-174
CMP AL,33H ; si es mayor que 3 (ASCII)
JG grafica ; no es color
CMP AL,30H ; si es menor que cero (ASCII)
JL grafica ; no es color
; número en tre 0 y 3, es un color, defínelo
AND AL,3 ; quita 5 bits superiores
MOV BL,AL ; guarda en BL
JMP lee_tecla ; toma siguiente caracter
; encuentra hacia a donde ir y grafica siguiente punto
grafica:
MOV AL,AH ; poner código de búsqueda en AL
CMP AL, arriba
JNZ no_arriba ; salta si no es hacia arriba
DEC DX ; si es hacia arriba resta línea
no_arriba:
CMP AL,abajo
JNZ no_abajo ; salta si no es hacia abajo
INC DX ; si hacia abajo, resta línea
no_abajo:
CMP AL,derecha
JNZ no_derecha
INC CX
no_derecha:
CMP AL,izquierda
JNZ prendelo
DEC CX
; llama a subrutina de gráfica que requiere color en AL,
; renglón en DX y columna en CX
prendelo:
MOV AL,BL ;retrasa
CALL graf_punto ; lee puerto B en AL
JMP lee_tecla ; mascarilla los 2 bits más bajos
salida:
RET ; regresa a dos
prin ci pal ENDP ; fi nal de parte prin ci pal de programa
;————————————————————————————————————————————————-
graf_punto PROC NEAR
; subrutina de graficación en pantalla
; resolución me dia, 320 x 200 en color
; entra con :
; coordenada x en CX, coordenada y en DX
; color en AL(0=apagado, 1,2,3=colores)
PUSH BX ; salva BX,columna,renglon y color
PUSH CX
El Video
9-175
PUSH DX
PUSH AX
; multiplica renglón x # de bytes por renglón
; (80 pero como ya fue mult. por 2 usar 40)
PUSH DX ; salva reng. para par/non
MOV AL,40 ; bytes/reng./2
AND DX,0FEh ; quita bit de non/par
MUL DL ; AX tiene ahora la dir. del reng.
; ver si hay que sumar 2000H para segundo banco de memoria
; si el renglón es impar
POP DX ; trae número orig i nal de reng.
TEST DL,1 ; probar bit 0 para par/non
JZ par ; salta a pares
ADD AX,2000H ; suma para apuntar a 2do banco demem.
par:
MOV BX,AX ; salvar reng. en BX
; sumar dir de columna a renglón
PUSH CX ; salvar columna
SHR CX,1 ; correr a izq. para
SHR CX,1 ;no matar bits de color
ADD BX,CX ; sumar a dir. en BX
; usar los bits de pos. para poner color y mas cara en pos. correcta
POP CX ; recupera columna
AND CX,3 ; guarda bits de pos.
INC CX ; corrimiento gra tis
POP AX ; trae color
MOV DL,0FCh ; DL mas cara 11,11,11,00
corre: ; AL color 00,00,00,cc
ROR AL,1 ; corre color
ROR AL,1 ; 2 bits a la derecha
ROR DL,1 ; corre mascarilla 2 bits
ROR DL,1 ; a la derecha
LOOP corre ; hacerlo el # de veces de pos. de bits
; contenido del byte, mascarilla todo menos color y OR con bits de color
AND [v_buff + BX],DL ; mascarilla
OR [v_buff + BX],AL ;OR con el color
POP DX ; restaura renglón
POP CX ; restaura columna
POP BX ; restaura BX y
RET ; regresa
graf_punto ENDP
;—————————————————————————————————————————————————-
linea ENDS ; fin de segmento
Ensamblador
9-176
;*****************************************************
;
END inicio ; fin de ensamble
Se in tro duce la pseudo instrucción LA BEL BYTE, LA BEL WORD y LA -
BEL DWORD que de fine o re de fine una localidad como tipo byte, palabrao palabra doble. Recordemos que las pseudo instrucciones DB y DW
reservan y apartan las localidades de memoria necesarias según ladefinición realizada, a diferencia de éstas, LA BEL sólo informa alensamblador qué tipo de localidad es la que sigue o pre cede sin reservarlocalidades de memoria y es sumamemte usada cuando se necesitadefinir una misma área como de dos o más tipos diferentes. Se requiere de este tipo de instrucciones pues el ensamblador es muy rígido con ladefinición de tipos y no es posible cambiar “al vuelo” el tipo de datos.
El dibujar líneas horizontales y verticales es muy sencillo pero en di ag o -nal se vuelve un poco más complejo requiriendo de más pasos paradefinir qué pixeles encender y cuáles no. Presentamos un programa en elque al introducir una secuencia de 5 números (x1, y1, x2, y2, color)realiza la línea utilizando el algoritmo de Bresenham.
Ejercicio 9.5 Investigar en qué consiste el algoritmo de Bresenham paradibujar una línea en tre dos puntos en una pantalla.
El programa que sigue se basa en este algoritmo y en las interrupcionesdel ROM para graficar una línea recta en tre dos puntos. El programa debede ser ejecutado como tipo EXE (no usar EXE2BIN) y se debe cambiar lapantalla a color 320 x 200 an tes de usarse. Una vez en el programa, ésteespera 5 parámetros desde el teclado introducidos con ENTER:
· x1,y1: coordenadas del punto inicial
· x2,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 5datos.
;BRESENHAM: dibujo de una línea recta en tre dos puntos de la pantalla
;use el programa MODO para cambiar a pantalla de color 320 x 200
;Acepta 5 parámetros (x1,y1), (x2,y2) y color (1,2,3,4,0)
datos SEG MENT
delta_x DW ? ;|x2-x1|
delta_y DW ? ;|y2-y1|
El Video
9-177
mitad_y LA BEL WORD ;|y2-y1|/2
mitad_x DW ? ;|x2-x1|/2
cuenta DW ? ;eje largo
x1 DW ? ;coordenada 1
y1 DW ? ;coordenada 1
x2 DW ? ;coordenada 2
y2 DW ? ;coordenada 2
color DW ? ;color de 0 a 4 ó de 0 a 1
datos ENDS ;fin de datos
;——————————————————————————————————————————————————-
bresen SEG MENT ;segmento de código
prog PROC FAR ;parte prin ci pal del programa
AS SUME CS:bresen,DS:datos
inicio: ;dirección inicial
;guarda la pila para el regreso
PUSH DS
SUB AX,AX
PUSH AX
; limpia pantalla usando el ROM
MOV AH,6 ; usa corrimiento hacia arriba
MOV AL,0 ; código para limpiar pantalla
MOV CX,0 ; punto su pe rior izq.=0,0
MOV DL,79 ; punto inf izq en
MOV DH,24 ; 79,24
INT 10H ; llama a rutina de ROM
n_linea:
CALL decbin ;pide x1
MOV x1,BX
CALL decbin ;pide y1
MOV y1,BX
CALL decbin ;pide x2
MOV x2,BX
CALL decbin ;pide y2
MOV y2,BX
CALL decbin ;pide el color
MOV color,BX
CALL linea ;dibuja la línea
JMP n_linea ;vuelve por otros datos
prog ENDP ;
;——————————————————————————————————————————————————-
linea PROC NEAR ;rutina para dibuhar la línea
;encuentra |y2-y1| resultado en delta_y
MOV AX,y2 ;toma y2
Ensamblador
9-178
SUB AX,y1 ;resta y1, resultado en AX
;Si delta_y es + SI=1, si - SI=-1
MOV SI,1 ;bandera positiva
JGE guarda_y ;manten si positivo
MOV SI,-1 ;poner bandera en negativo
NEG AX ;saca valor absoluto
guarda_y:
MOV delta_y,AX ;guarda valor de |y2-y1|
;encuentra |x2-x1| resultado en delta_x
MOV AX,x2 ;toma x2
SUB AX,x1 ;resta x1, resultado en AX
;Si delta_x es + DI=1, si - DI=-1
MOV DI,1 ;bandera positiva
JGE guarda_x ;si positivo manten
MOV DI,-1 ;si negativo pon bandera
NEG AX ;y saca valor absoluto
guarda_x:
MOV delta_x,AX ;guarda valor de |x2-x1|
;Encuentra si pendiente > o < que 1
CMP AX,delta_y ;compara las del tas
JL c_pend ;pendiente>1
CALL pend_1 ;pendiente<=1
JMP fin
c_pend:
CALL pend ;pendiente>1
fin: RET
linea ENDP
;——————————————————————————————————————————————————-
pend_1 PROC NEAR ;pendiente < 1
;Calcula |x2-x2|/2
MOV AX,delta_x ;toma |x2-x2|
SHR AX,1 ;di vide en tre 2
MOV mitad_x,AX ;y guarda
;Inicia valores
MOV CX,x1 ;toma x1
MOV DX,y1 ;toma y1
MOV BX,0 ;inicializa BX
MOV AX,delta_x ;fija la cuenta a
MOV cuenta,AX ;|x2-x1|
punto:
CALL graf_punto ;grafica un punto
ADD CX,DI ;inc/dec de X
ADD BX,delta_y ;+|y2-y1| en BX
CMP BX,mitad_x ;compara con |x2-x1|/2
El Video
9-179
JLE dcuenta ;no modificar inc/dec de Y
SUB BX,delta_x ;BX-|x2-x1|
ADD DX,SI ;incrementa o decrementa Y
dcuenta:
DEC cuenta ;¿Terminamos?
JGE punto ;aún no
RET
pend_1 ENDP
;——————————————————————————————————————————————————-
pend PROC NEAR ;pendiente > 1
MOV AX,delta_y ;toma |y2-y1|
SHR AX,1 ;di vide en tre 2
MOV mitad_y,AX ;y guarda
;Inicia valores
MOV CX,x1 ;toma x1
MOV DX,y1 ;toma y1
MOV BX,0 ;inicializa registro BX
MOV AX,delta_y ;toma |x2-x1|
MOV cuenta,AX ;y guarda en cuenta
punto2:
CALL graf_punto ;grafica punto
ADD DX,SI ;incrementa o decrementa Y
ADD BX,delta_x ;BX+|x2-x1|
CMP BX,mitad_y ;compara con |y2-y1|/2
JLE dcuenta2 ;no incrementar o decrementar X
SUB BX,delta_y ;BX-|y2-y1|
ADD CX,DI ;incrementa o decrementa X
dcuenta2:
DEC cuenta ;¿Se terminó la línea?
JGE punto2 ;aún no
RET
pend ENDP
;——————————————————————————————————————————————————-
graf_punto PROC NEAR
PUSH BX ;guarda registros
PUSH CX
PUSH DX
PUSH AX
PUSH SI
PUSH DI
;Rutina de ROM para graficar punto requiere de:
;DX=renglón, CX=columna, AL=color
MOV AX,color
Ensamblador
9-180
MOV AH,12d ;función de graficar punto
INT 10h ;Rutina del BIOS
POP DI ;Regresa registros
POP SI
POP AX
POP DX
POP CX
POP BX
RET
graf_punto ENDP
;——————————————————————————————————————————————————-
key_in EQU 1h
doscall EQU 21H
;——————————————————————————————————————————————————-
decbin PROC NEAR ;Ver capítulo 6
;Acepta dec i mal de teclado, regresa
;binario en registro BX
MOV BX,0 ;Limpia registro BX
otro:
MOV AH,key_in ;entrada del teclado
INT doscall ;llama a DOS
SUB AL,30h ;ASCII a binario
JL sale ;Salir si el #<0
CMP al,9d ;¿Es > 9?
JG sale ;Si es así, no es dígito
CBW ;Convierte byte en AL a palabra enAX
;Multiplica número en BX por 10
XCHG AX,BX ;Cambia registros AX y BX
MOV CX,10d ;Coloca 10 en CX
MUL CX ;y multiplica por AX (AX*10)
XCHG AX,BX ;Regresa # a BX
;Suma número en AX por el de BX
ADD BX,AX ;suma dígito a #
JMP otro ; y ve por otro
sale:
RET
decbin ENDP
;——————————————————————————————————————————————————-
bresen ENDS ;fin de segmento prin ci pal
;——————————————————————————————————————————————————-
El Video
9-181
END inicio ;fin de programa
9.4 Resumen
9.5 Instrucciones Analizadas
SEG MENT AT, LA BEL BYTE, LA BEL WORD
9.6 Problemas
9.1 Modifique el programa BRESENH de forma que salte un renglóndespués de aceptar cada parámetro.
9.2 Modifique el programa BRESENH de forma que acepte alguna tecla que usted defina para terminar la ejecución.
9.3 Modifique el programa BRESENH para que limpie la pantalladespues de la graficación de cada línea.
9.7 Bibliografía
Revista PC Mag a zine EU números de 1993.
Mercier Philippe Assembleur Fac ile. Marabout 1992, Alleur Bélgica.
Barden Wil liam Jr. How to Pro gram Mi cro com puters. Sams & Com -pany 1987.
MASM 86 Co lum bia Data Prod ucts, EU 1986.
IBM Per sonal Com puter Tech ni cal Ref er ence. Apéndice A
Ensamblador
9-182
Capítulo 1010.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 devarias 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 lainterrupción regresa un número de manejador que a partir de esemomento sirve para accesar los datos del archivo.
Analizaremos brevemente en las siguientes secciones cada uno de losmétodos e ilustraremos con breves programas.
10.2 Acceso Secuencial
El primer paso para el acceso a los datos de un archivo es guardar elnombre junto con otra información en un área de memoria preestablecidallamada Bloque de Con trol de Datos (File Con trol Block o FCB). Elsegundo paso consiste en especificar un lugar en memoria donde seguardan los datos de las lecturas y escrituras al disco y esta área se llamaArea de Transferencia de Datos (Data Trans fer Area o DTA). El tercerpaso es abrir el archivo y el cuarto y último sera cerrar el archivo una vezque los datos han sido leídos o escritos a él.
10-183
La interrupción utilizada para el manejo de archivo es la 21h condistintos servicios solicitados por medio de datos en el registro AH. Elprimer servicio que veremos es el de abrir un archivo y corresponde alservicio 0Fh. Este servicio exige que el archivo ya exista por lo que locreamos primero ya sea desde el sistema operativo copiando desde elteclado (consola) o usando un procesador de palabras.
Función de abrir un archivo, Servicio 0Fh de la interrupción21h
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 el archivo se encontró y abrió
AL=FF El archivo no existe
FCB # de disco,tamaño de registro,fecha,tamaño archivo,# bolque,etc.
Practiquemos a abrir un archivo desde DE BUG:
Primero creamos el archivo copiándolo desde el teclado:
C>COPY CON prueba.txt
ejemplo de información^Z
1 files(s) cop ied
C>DE BUG
-a100
MOV DX,5C
MOV AX,0F
INT 21
INT 20
Pero aún no hemos especificado el nombre del archivo, sin em bargocolocamos un número (5C) que corresponde al lugar donde estará elnombre del archivo. DE BUG comienza siempre en la dirección 100h delsegmento correspondiente. ¿Qué hay en las localidades del 00h al FFh?Estas localidades forman parte del Prefijo del Segmento del Programa ydentro de éste, el FCB ocupa las localidades del 5Ch al 7Ch (en losaccesos aleatorios es hasta 80h) seguido del DTA de la dirección 80h a laFFh.
Ensamblador
10-184
El prefijo del segmento del programa de DE BUG consiste, en este caso,mayoritariamente en información que el SO y el programa requieren sa -ber de un archivo en par tic u lar, por ejemplo los 2 primeros bytes a partirde la dirección 0 son la INT 20h, los siguientes 2 el tamaño de la memoriadisponible, los 6 siguientes en la dirección del despachador de DOS, los 4 siguientes en la dirreción donde los programas terminan, los siguientesdos en la dirección de salida para una interrupción por teclado (IP), etc.Esta estructura se muestra en detalle en el apéndice E del libro IBM Per -sonal Com puting Disk Op er ating Sys tem.
El siguiente paso consiste en especificar el nombre del archivo quequeremos abrir. Dejemos que DE BUG nos ayude y usemos el comando N,pero primero llenemos algunas localidades con un valor conocido comopor ejemplo 22.
-f 40 7f 22
-nprueba.txt
y comprobemos con D.
-d0
Veremos que los bytes a partir del 5Ch han sido modificados y contienen ahora el nombre del archivo PRUEBA.TXT que DE BUG colocó ahí.Ejecutemos ahora nuestro programa con G. Si desplegamos de nuevo ladirección 0 (D0) nos encontramos que todo el pan orama del FCB hacambiado y muestra nueva información de acuerdo a la siguiente tab la:
El Acceso a Disco
10-185
Tab la 10.1 El FCBSO=datos llenados por el SO al abrir el archivo
usuario=datos proporcionados por el usuario
0 5C Número de disco SO
1 5D
nombre del archivo usuario
2 5E
3 5F
4 60
5 61
6 62
7 63
8 64
9 65
10 66 extensión archivo usuario
11 67
12 68 bloque ac tual 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
Uso del SO SO
23 73
24 74
25 75
26 76
27 77
28 78
29 79
30 7A
31 7B
32 7C registro ac tual usuario
33 7D # reg. aleatorio (bajo) usuario
34 7E
35 7F # reg. aleatorio (alto) usuario
36 80
Expliquemos brevemente las localidades más relevantes:
– En la dirección 5C encontramos ahora un 02 que corresponde aldisco C, en la 6A encontramos ahora 80h (128d) que es el tamaño
Ensamblador
10-186
del registro que el sistema operativo toma por omisión pues es eltamaño estandard para archivos secuenciales.
– En las localidades 6C hasta la 6F se encuentra el tamaño delarchivo y en este caso es de 16h (22d) bytes. Recuerde que seespecifica primero byte alto, byte bajo, palabra alta, palabra baja.
– La fecha se encuentra almacenada en las localidades 70h y 71h yen nuestro caso encontramos el número 09h 1Fh nuevamente enel orden invertido (1Fh 09h ó 0001 1111 0000 1001) con lasiguiente convención:
A. Los primeros 5 bits corresponden al día. Por ejemplo 01001ó día 9.
B. Los siguientes 4 bits al mes. Por ejemplo 1000 ó mes 8.
C. Los últimos 7 bits al año que se deben sumar a 1980. Porejemplo 0001111, 15d que corresponde a 1995.
– De las localidades 72h a 7Bh se encuentra la dirección donde estáalmacenado físicamente el archivo, es un poco complicado y nolo tocaremos en este momento.
Una vez que el archivo fue abierto, podemos proceder a leer suinformación. El servicio 14h de la interrupción 21h nos permite leersecuencialmente de un archivo:
Función de lectura secuencial,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, bloque ac tual, registroac tual y el tamaño del registro deben estar ya en el FCB)
Regresa:
AL=00 registro del archivo leido exitosamente
AL=01 fin de archivo,no hay datos en el registro
AL=02 DTA muy pequeño,fin de transferencia
AL=03 fin de archivo
Desde DE BUG metamos ahora el siguiente programa:
El Acceso a Disco
10-187
MOV DX,5C ;dirección del FCB
MOV AH,0F ;abrir archivo
INT 21 ;llama a DOS
MOV AH,14 ;servicio de lectura
INT 21 ;llama a DOS
INT 20 ;vuelve a DE BUG
An tes de ejecutar el programa llenemos con la instrucción f laslocalidades 80h a FFh con un valor conocido. Estas localidades forman el Area de Transferenmcia de Datos (Data Trans fer Area o DTA) y es ellugar en memoria de donde se toman los datos para escribir en un archivoo se toman los datos del archivo y se colocan en ese sitio. Esto es:
El área de transferencia de datos (DTA) es el lugar pro vi sional enmemoria donde un registro de archivo es almacenado en su caminode o hacia el disco duro o flex i ble.
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 primerregistro basta. Usando el comado E7C pongamos un cero en esa localidad. Ejecutemos ahora el programa y revisemos con el comando D laslocalidades de la 80h a la FFh; encontramos el texto que contienennuestro archivo muestra. Al terminar el programa, esta localidad seincrementa en 1 pues ahora debe apuntar al siguiente registro por lo queuna segunda ejecución del programa nos daría el siguiente registro, estoes, una lectura secuencial.
Pasemos ahora a un programa más sofisticado de lectura secuencial.Para que este programa funcione, el archivo debe terminar con unsímbolo de fin de archivo (EOF, 1Ah) que la mayoría de los procesadorescolocan de forma automática:
;—————————————————————————————————————————————————
;SECUENCI: Lee un archivo ASCII y preséntalo en la pantalla
;ejecutar junto con el nombre del archivo
;—————————————————————————————————————————————————
dos EQU 21h ;llamada al SO
abre EQU 0Fh ;llamada al SO
lee EQU 14h ;llamada al SO
muestra EQU 2h ;llamada al SO
fcb EQU 5Ch ;llamada al SO
eof EQU 1Ah ;llamada al SO
Ensamblador
10-188
;—————————————————————————————————————————————————
datos SEG MENT
ORG 7Ch
regnum DB ? ;número de registro
ORG 80h
dato DB 80h DUP(?) ;área DTA
datos ENDS
;—————————————————————————————————————————————————
secuencial SEG MENT ;programa prin ci pal
;—————————————————————————————————————————————————
prog PROC FAR
AS SUME CS:secuencial,DS:datos
inicio:
;Salva segmentos para el regreso
PUSH DS ;salva DS
SUB AX,AX ;0 en AX
PUSH AX ;coloca 0 en la pila
;Abre el archivo y coloca registrro en 0
MOV DX,fcb ;poner dirección de FCB dentro delsegmento
MOV AH,abre ;servicio de apertura
INT dos ;de la interrupción 21h
MOV regnum,0 ;primer registro en 7Ch
;lee registro en forma secuencial
lee_reg:
MOV DX,fcb ;apunta al FCB
MOV AH,lee ;servicio de lectura de
INT dos ;la interrupción 21h
;muestra el registro que se encuentra en DTA
MOV CX,80h ;número de caracteres
MOV BX,0 ;inicializa el apuntador
imprime:
MOV DL,[dato+BX] ;toma carácter
CMP DL,eof ;¿Llegamos al fi nal de archivo?
JE salir ;si, salir
MOV AH,muestra ;no, muestra
INT dos
INC BX ;incrementa el contador
LOOP imprime ;realiza 80h veces
JMP lee_reg ;y ve por otro registro del archivo
salir: RET ;termina y regresa a DOS
prog ENDP
El Acceso a Disco
10-189
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.TXT, el SO
se encarga entonces de llenar el FCB con los datos del archivo (en estecaso LEEME.TXT), algo sim i lar al comando N de DE BUG.
Otra cosa a notar es el manejo del registro DS y ES que el sistemaoperativo, por tratarse de un archivo tipo EXE, inicializa con los datos delmismo programa apuntando a los segmentos adecuados.
Existe también un traslape de 1 byte en tre el FCB y el DTA en la dirección80h. En el caso de acceso secuencial no hay problema pues el byte no esusado. Pero en el caso de acceso aleatorio se debe tener cuidado de noperderlo por lo que muchas veces se prefiere “mudar” el área de DTA aotro lado.
En nuestro siguiente programa introducimos las funciones de crear unarchivo y de escribir a él conjuntamente:
;—————————————————————————————————————————————————
;GUARDA: toma datos del teclado y guarda en un archivo
;—————————————————————————————————————————————————
dos EQU 21h ;llamada al SO
crear EQU 16h ;crear archivo
escribe EQU 15h ;despliega carácter
cierra EQU 10h ;cierra archivo
mem_prov EQU 0Ah ;memoria para el teclado
fcb EQU 5Ch ;área de con trol de archivo
cr EQU 0Dh ;ASCII de RE TORNO
lf EQU 0Ah ;ASCII de ALIMENTA LINEA
;——————————————————————————————————————————————————
datos SEG MENT
ORG 7Ch
regnum DB ?
ORG 80h
dato DB 80h DUP(?) ;área DTA
datos ENDS
;—————————————————————————————————————————————————-
guarda SEG MENT
Ensamblador
10-190
prog PROC FAR
AS SUME CS:guarda,DS:datos
inicio:
;Guarda segmentos para regresar en paz
PUSH DS ;salva DS
SUB AX,AX ;colcoa 0 en AX
PUSH AX ;y empuja a la pila
;crea archivo, coloca contador de registro en 0
MOV DX,fcb ;FCB en DX
MOV AH,crear ;servicio de Crea archivo
INT dos ;de DOS
MOV regnum,0 ;0 en dirección 7Ch (número deregistro)
;limpia memoria llenando con re torno de línea
otra_linea:
MOV BX,0 ;apuntador de caracteres
MOV CX,80h ;cuenta de caracteres
borra:
MOV [BX+dato],cr ;CR en zona de datos
INC BX ;incrementa apuntador
LOOP borra ;repite 80h veces
;Toma línea del teclado
MOV dato-2,78 ;long. máxima de línea
MOV DX,OFF SET dato-2 ;dirección de DTA
MOV AH,mem_prov ;acepta del teclado una línea
INT dos
CMP dato-1,1 ;si no hay caracteres
JLE salir ;salir del programa
;inserta alimentación de línea
MOV BL,dato-1 ;coloca cuenta de caracteresaceptados
MOV BH,0 ;en registro BH
MOV [dato+BX+1],lf ;inserta alimentación de línea
;escribe registro al archivo en modo secuencial
MOV DX,fcb ;FCB en DX
MOV AH,escribe ;escribe en secuencia
INT dos
JMP otra_linea ;y acepta otra línea
;Cierra el archivo y sal a DOS
salir:
MOV DX,fcb ;FCB en DX
MOV AH,cierra ;función de cerra archivo
INT dos
RET
prog ENDP
El Acceso a Disco
10-191
;——————————————————————————————————————————————————
guarda ENDS
END inicio
Los datos se introducen al programa línea a línea terminando con RE -
TORNO. Cuando introducimos un RE TORNO unicamente el programacierra el archivo y regresa el controla al SO. Se han introducido dosnuevas funciones en el programa como se resumen en las siguientes tab -las:
Ensamblador
10-192
Función de Crear un Archivo,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 archivo creado exitosamente
AL=FF no hay espacio para crear archivo
Se debe tener cuidado con la función pues si el archivo ya existía seborra, dejándolo con longitud 0.
Función de Escritura Secuencial,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, bloque ac tual, registroac tual y el tamaño del registro deben estar en el FCB)
Regresa:
AL=00 registro del archivo escrito exitosamente
AL=01 el disco está lleno
AL=02 DTA muy pequeño, fin de transferencia
En la escritura secuencial, la interrupción se encarga de incrementar elnúmero de registro por nosotros dejándolo apuntando al siguiente. Si elregistro no es lo suficientemente grande como para llenar un área deldisco llamada sec tor, es colocado en una memoria tem po ral por el SO. De ahí es tomada cuando la longitud del sec tor es excedida o hasta que secierra el archivo guardando la información en ese momento presente en el archivo. Un sec tor tiene una longitud de 512 bytes y es la unidad básica de almacenamiento en archivos.
Ejercicio 10.2 Agregue al programa GUARDA una rutina que mande a lapantalla un CR y LF por cada línea introducida.
El Acceso a Disco
10-193
Ejercicio 10.3 Agrege las instrucciones necesarias para que el programaGUARDA nos advierta con un mensaje el nombre del archivo y nos solicite que comencemos a teclear. Agrege otra rutina para dar instruccionesespecíficas para el uso del programa.
Ejercicio 10.4 Si el usuario no proporcionó un nombre de archivo alprograma GUARDA, que el programa despliegue un mensaje de er ror ysalga de inmediato.
En los ejercicios anteriores use definiciones de mensajes en el área dedatos de forma similara a:
mensaj1 DB ‘Comience a introducir datos:$’
para posteriormente llamar:
MOV DX,OFF SET mensaj1
CALL despliega
10.3 Acceso Aleatorio
Una segunda forma de leer los registros de un archivo es de formaaleatoria, esto es, sin ningún orden en específico. Una razón por la que los accesos aleatorios son más fáciles de manejar es debido a que en losaccesos secuenciales se requieren de tres bytes:
· El primero en la dirección 7Ch para especificar el número deregistro a leer o escribir.
· El segundo y tervero en las direcciones 68h y 69h para especificarel número de bloque.
Cuando 127d registros han sido escritos al archivo, el bloque debeentonces incrementarse y el contador de registros colocarse en 0. Aunque es posible en un programa de ensamblador, cuesta también bastantetrabajo.
En una lectura/escritura aleatoria, se controla sólo el número de registroformado por 4 bytes que nos da un to tal muy grande de registros dentro de un archivo. El manejo de una palabra doble es directo con las instruccions
Ensamblador
10-194
de ensamblador y el con trol se torna entonces sumamente sencillo ydirecto.
La función de lectura de un registro aleatorio es muy sim i lar a la de unosecuencial con la diferencia de que el contador no es incrementado deforma automática. El programa debe encargarse de insertar el númeroadecuado de registro en la zona del FCB del archivo an tes de cada lecturao escritura.
Función de Lectura Aleatoria,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, el tamaño del registro y el número de registro deben estar en el FCB)
Regresa:
AL=00 registro del archivo leido exitosamente
AL=01 fin de archivo,no hay datos en el registro
AL=02 DTA muy pequeño,fin de transferencia
AL=03 fin de archivo
El programa que presentamos a continuación lee un sólo registro decualquier parte de un archivo. El nombre del archivo se in tro duce comoparte del comando para ejecutar el programa y el número de registrocomo primer dato del programa.
;—————————————————————————————————————————————————
;LEEALEA: Lee registro en forma aleatoria de un archivo
;—————————————————————————————————————————————————
dos EQU 21h ;llamada al SO
abre EQU 0Fh ;abre un archivo
leer EQU 21h ;leer de un archivo aleatorio
muestra EQU 2h ;despliega carácter
tecla EQU 1h ;lee un carácter del teclado
fcb EQU 5Ch ;área de con trol de archivo
eof EQU 1Ah ;ASCII de fin de archivo
;——————————————————————————————————————————————————
datos SEG MENT
El Acceso a Disco
10-195
ORG 7Dh ;registro aleatorio
aleatorio1 DW ? ;registro parte baja
aleatorio2 DW ? ;registro parte alta
ORG 80h
dato DB 80h DUP(?) ;área de transferencia de datos
datos ENDS
;—————————————————————————————————————————————————-
leealea SEG MENT
prog PROC FAR
AS SUME CS:leealea,DS:datos
inicio:
;Guarda segmentos para regresar en paz
PUSH DS ;salva DS
SUB AX,AX ;colcoa 0 en AX
PUSH AX ;y empuja a la pila
;abre el archivo
MOV DX,fcb ;FCB en DX
MOV AH,abre ;servicio de Abre archivo
INT dos ;de DOS
;Toma # registro del teclado y coloca en FCB
MOV ah,tecla ;función del teclado
INT dos
SUB AL,30h ;convierte de ASCII a binario
CBW ;convierte a palabra
MOV aleatorio1,AX ;coloca en FCB
MOV aleatorio2,0 ;y 0 en parte alta
;Lee registro del archivo
MOV DX,fcb ;en DX el FCB
MOV AH,leer ;lee de forma aleatoria
INT dos
;Muestra el registro del área de transferencia (DTA)
MOV CX,80h ;# de caracteres en CX (contador)
MOV BX,0 ;Inicializa apuntador
a_pantalla:
MOV DL,[dato+BX] ;toma carácter
CMP DL,eof ;¿Se llegó al fi nal?
JE salir ;si, salir
MOV AH,a_pantalla ;no, despliega en pantalla
INT DOS
INC BX ;ajusta el apuntador
LOOP muestra ;lazo de 80h veces
salir: RET ;regresa a DOS
prog ENDP
Ensamblador
10-196
;——————————————————————————————————————————————————
leealea ENDS
END inicio
Para conservar el programa sencillo sólo se aceptan números del 0 al 9que se convierten de ASCII a binario restando 30h y la región del DTA sedeja en su lugar (dirección del 7Dh al 80h) aunque existen posiblesconflictos en la localidad 7Dh que resolvemos moviendo un cero despues de llenar la DTA y an tes de leer un registro.
El escribir a un registro secuencial sigue la misma mecánica que lalectura por lo que no nos entretendremos con ello. La únicarecomendación es no tratar de leer un registro que no existe y escribir sólo sobre registros que ya existen.
10.4 Manejadores de Archivos
A partir de la versión 2.0 de MS-DOS se prefiere que el manejo dearchivos, sus FCB y DTA sean realizados por el mismo sistemaoperativo. Al usar estos servicios de las interrupciones proporcionadaspor los diseñadores del SO, nos encontramos con tres diferenciasprincipales:
· 1. No hay FCB. Los parámetros varios del FCB han sido“absorbidos” por el SO y ya no son visibles al usuario, por lo queya no es necesario preocuparse de ellos. El nombre del archivo sereemplaza por nombre + extensión + camino completo seguido de un byte en cero y se le denomina ASCIIZ por el cero adicional.
· 2. No hay Registros. Al igual que el FCB, los registrosdesaparecen y son sustituidos por el número de bytes quequeremos leer/escribir/accesar de un archivo.
· 3. Manejo por medio de manijas. Las manijas son números decontrol de 16 bits que nos permite manejar el archivo por unareferencia simbólica en lugar de por nombre.
Otra mejora sustancial en el método de acceso a archivos es el manejouniforme de errores, siempre que una función genere un er ror, la banderade acarreo se fija (podemos probar la condición con un salto condicional
El Acceso a Disco
10-197
JC) y el registro AX contiene el número de er ror de acuerdo a la siguientetab la:
Dec i mal Hex a dec i mal Er ror
1 01 Número de Función Inválida
2 02 Archivo no encontrado
3 03 Camino no encontrado
4 04 Demasiados archivos abiertos
5 05 Acceso denegado (atributo o código de acceso equivocados)
6 06 Manija inválida
7 07 Bloques de con trol de memoria destruídos
8 08 Memoria insuficiente
9 09 Bloque de dirección de memoria inválido
10 0A Ambiente inválido
11 0B Formato inválido
12 0C Código de acceso inválido
13 0D Datos inválidos
14 0E no se usa
15 0F Disco inválido
16 10 Intento de re mover el directorio ac tual
17 11 No es el mismo dispositivo
18 12 No hay más archivos
Al abrirse el archivo se le asigna un código de acceso que determina si elarchivo es de sólo lectura (código 0), de sólo escritura (código 1) o delectura y escritura (código 2). De la misma manera se le asigna unatributo en un byte:
· bit 0. Sólo lectura.
· bit 1. Archivo oculto.
· bit 2. Archivo de sistema.
· bit 3. No es archivo sino etiqueta de volumen.
Ensamblador
10-198
· bit 4. No es archivo sino subdirectorio.
· bit 5. Indica que es un archivo.
El atributo de un archivo se puede cambiar usando el servicio 43h de lafunción 21h y se usa el registro CX para fijar el atributo.
Presentamos a continuación las distintas funciones para leer, escribir,crear, abrir, cerrar, etc. un archivo con manijas y un programa que integraalgunas de estas funciones como ejemplo:
Función de Abrir 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ódigo de Acceso(0=lectura,1=escritura,2=lectura/escritura)
Regresa:
Bandera de acarreo(CF)
0 si no hay er ror, 1 si hay er ror
AX manejador de archivo o código de er ror
AL=02 DTA muy pequeño,fin de transferencia
(los errores posibles son 2,,4,,5 y 12)
El Acceso a Disco
10-199
Función Lee de Dispositivo o Archivo,INT 21hservicio 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:
Banderade
acarreo(CF)
0 si no hay er ror
AX # de bytes leidos, 0 si fin de archivo o código de er ror(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 cadenaASCII+0
CX=atributo del archivo
Regresa:
Banderade
acarreo(CF)
0 si no hay er ror
AX manejador de archivo si no hay er ror o código de er ror(posiblemente 3,4 ó 6)
Ensamblador
10-200
Función Escribe a Dispositivo o Archivo,INT 21hservicio 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:
Banderade
acarreo(CF)
0 si no hay er ror
AX # de bytes escritos o código de er ror (posiblemente 5 ó 6)
Función Cierra Archivo,INT 21h servicio 3Eh
Registros: AH=3Eh
BX=Manejador de archivo
Regresa:
Banderade
acarreo(CF)
0 si no hay er ror
AX código de er ror si es que lo hay (posiblemente 6)
El Acceso a Disco
10-201
Función Posiciona Apuntador deLectura/Escritura,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 ac tual+bytesseñalados por CX:DX
AL=02 Mover apuntador a fin de archivo+bytes señalados por CX:DX, si 0 regresa tamaño del archivo
BX=Manejador de archivo
CX=Número de bytes de desplazamiento dentro delarchivo (parte alta)
DX=Número de bytes de desplazamiento dentro delarchivo (parte baja)
Regresa:
Banderade
acarreo(CF)
0 si no hay er ror
DX apuntador a la nueva posición (parte alta)
AX apuntador a la nueva posición (parte baja) o código de er -ror (posiblemente 1 ó 6)
;—————————————————————————————————————————————————
;CREAARCH: Crea un archivo con manijas y escribe en él
;—————————————————————————————————————————————————
llama_dos EQU 21h ;servicios varios de DOS
datos SEG MENT ;De fine segmento de datos
nombre DB 50 ;nombre de archivo
DB ? ;bytes leidos
DB 50 DUP(?) ;mem. prov. del nombre
registro DB 80 ;long. del registro
DB ? ;bytes leidos
DB 80 DUP(80) ;mem. prov. delregistro
manija DW ? ;almacenamiento de manija
;zona de mensajes del programa
mensj1 DB 0Dh,0Ah,’Nombre del archivo con todo ycamino:’,0Dh,0Ah,’$’
mensj2 DB 0Dh,0Ah,0Dh,0Ah,’Datos: (termine conENTER)’,0Dh,0Ah,’$’
Ensamblador
10-202
mensje DB ‘Er ror $’
crlf DB 0Dh,0Ah,’$’ ;nueva línea
datos ENDS ;fin del segmento de datos
;—————————————————————————————————————————————————
creaarch SEG MENT ;segmento de código
;—————————————————————————————————————————————————
principio PROC FAR ;proceso prin ci pal
AS SUME CS:creaarch,DS:datos
inicio:
;Guarda segmentos para regresar en paz
PUSH DS ;salva DS
SUB AX,AX ;coloca 0 en AX
PUSH AX ;y empuja a la pila
MOV AX,datos ;apunta a nuestros datos
MOV DS,AX ;y coloca en segmento
MOV DX,OFF SET mensj1 ;primer mensaje
MOV AH,09h ;función de despliegue
INT llama_dos
MOV DX,OFF SET nombre ;dirección nombre
MOV AH,0Ah ;toma del teclado
INT llama_dos
MOV DX,OFF SET crlf ;agraga nueva línea
MOV AH,09h ;función de despliegue
INT llama_dos
MOV BL,nombre+1 ;toma # bytes leidos
MOV BH,0 ;ajusta al palabra
MOV [nombre+BX+2],0 ;y agrega un cero (ASCIIZ)
;Crea el archivo con los datos proporcionados
MOV DX,OFF SET nombre+2 ;dirección del nombre
MOV CX,0 ;atributo de archivo nor mal
MOV AH,3Ch ;función crear archivo
INT llama_dos
MOV manija,AX ;toma la manija de AX
JC er ror ;si hay un er ror, salir
;toma el contenido del archivo del teclado
MOV DX,OFF SET mensj2 ;primero un mensaje
MOV AH,09h ;función de despliegue
INT llama_dos
otra_linea:
MOV DX,OFF SET registro ;dirección del registro
MOV AH,0Ah ;función de lectura del teclado
INT llama_dos
CMP registro+1,1 ;ver si hay caracteres
El Acceso a Disco
10-203
JLE salir ;y si no salir
;Inserta salto de línea al registro
MOV BL,registro+1 ;coloca cuenta
MOV BH,0 ;y ajusta BX
MOV [registro+BX+2],0Dh ;agrega salto de línea
MOV [registro+BX+3],0Ah ;y nueva línea
ADD registro+1,2 ;ajusta al nuevo fi nal
MOV DX,OFF SET crlf ;encargarse de la pantalla
MOV AH,09h ;función de despliegue
INT llama_dos
;Escribe al archivo el registro
MOV BX,manija ;coloca manija en BX
MOV DX,OFF SET registro+2 ;dirección de mem. prov.
MOV CL,registro+1 ;# de bytes a escribir
MOV CH,0 ;y ajusta CX
MOV AH,40h ;función de escritura a archivo
INT llama_dos
JC er ror ;si hay un er ror salir
CMP AL,registro+1 ;Compara bytes escritos con los quesolicitamos escribir
JNE er ror ;si no son iguales hay un er ror
JMP otra_linea ;vuelve por más registros
salir: ;Cierre el archivo y termina
MOV BX,manija ;toma la manija
MOV AH,3Eh ;función de cierre de archivo
INT llama_dos
JC er ror ;si hay un er ror, despliega
RET ;termina normalmente
er ror: ;maneja los errores
MOV DX,OFF SET mensje ;el mensaje de er ror
MOV AH,09h ;función de despliegue
INT llama_dos
MOV BX,manija ;toma el # de er ror
CALL binhex ;convierte a hex a dec i mal y despliega
JMP salir ;termina cerrando
principio ENDP
;—————————————————————————————————————————————————
;Subrutina para convertir de binario a hex a dec i mal y desplegar en pantalla
;# a convertir en BX
binhex PROC NEAR
MOV CH,4 ;número de dígitos
rota: MOV CL,4 ;cuenta a 4 bits
ROL BX,CL ;desplaza dígito a la izq.
MOV AL,BL ;y pasa a reg. AL
Ensamblador
10-204
AND AL,0Fh ;quita dígitos de la izq.
ADD AL,30h ;convierte a ASCII
CMP AL,3Ah ;¿Es mayor que 9?
JL despliega ;Despliega si ente 0 y 9
ADD AL,7h ;el dígito está en tre A y F
despliega:
MOV DL,AL ;Coloca ASCII en DL
MOV AH,2h ;Función de despliegue
INT llama_dos ;Llama a DOS
DEC CH ;¿Terminamos con los 4 dígitos?
JNZ rota ;Si aún no se termina
RET ;Regresa
binhex ENDP
;—————————————————————————————————————————————————
creaarch ENDS
;—————————————————————————————————————————————————
END inicio
Aunque en el manejo de archivos con manija no se requiere de registrossino de bytes, algunas veces es conveniente dividir la longitud to tal de unarchivo en registros de longitud fija que nos faciliten la tarea de encontrarinformación en cierto punto.
Como funciones auxiliares de la interrupción 21h no analizadasincluimos las siguientes
· Servicio 39h. Crear un directorio
· Servicio 56h. Renombre un archivo
· Servicio 41h. Borra un archivo
· Servicio 3Ah. Remueve un directorio
· Servicio 3Bh. Cambia a otro directorio
· Servicio 17h. Renombra directorio
Todas ellas documentadas en el apéndice D del man ual IBM Per sonalCom puter Disk Op er ating Sys tem
El Acceso a Disco
10-205
10. Resumen
10. Problemas
10. Bibliografía
Revista PC Mag a zine EU números de 1980-93.
Barden Wil liam Jr. How to Pro gram Mi cro com puters. Sams & Com -pany 1987.
MASM 86 Co lum bia Data Prod ucts, EU 1986.
IBM Per sonal Com puter Tech ni cal Ref er ence. Apéndice D
Mor gan L. Chris to pher Blue book of As sem bly Rou tines for the IBM PCThe Waite Group USA 1987
Ensamblador
10-206
Capítulo 1111.1 Interfase a otros Lenguajes
Como ya hemos visto a lo largo del libro, el ensamblador es ideal paraproblemas en los que se requiere de rapidez o de el acceso a todos loscomponentes del sistema sin restricciones. Pero por otro lado esa es sudebilidad pues cuesta mucho trabajo y tiempo hacer programas enensamblador. En el otro extremo del espectro se encuentran los lenguajesde alto nivel como PASCAL o C donde es fácil realizar los programaspero muchas veces no obtienen la rapidez necesaria o el acceso a losdispositivos requerido.
La interfase se realiza con mucho mayor facilidad en los lenguajescompilados que en los interpretes pues el ligador se encarga de reunir losdistintos archivos OBJ en un sólo ejecutable uniendo las librerías ydemás elementos necesarios para el funcionamiento del programa.
El reunir dos objetos de distintos lenguajes tiene problemas específicosque analizaremos por separado en las siguientes secciones.
11.1.1 La Asignación de Memoria
Usualmente cuando se utiliza un ejecutable realizado en lenguaje dealto nivel no existe el problema de donde poner en memoria el programa.El interprete o el compilador se encarga de asignar las localidades. Lascosas cambian cuando se unen con uno de ensamblador pues es necesariotomar en cuenta más módulos independientes.
En el caso de un lenguaje compilado, el ligador desentraña laslocalidades requeridas y el problema se simplifica. En el caso de un
11-207
interprete se requieren de ciertos trucos para encontrar como localizar elprograma en memoria sin conflictos.
11.1.2 Transfiriendo el Control a Ensamblador
Una vez localizado en memoria o ligado en nuestro programa ejecutable surge el problema de transferir el con trol a nuestro programa enensamblador para que realice su función y regrese su resultado alprograma de lenguaje de alto nivel. El traspaso se realiza generalmentecon una llamada lejana (FAR CALL) por lo que nuestros procedimientosen ensamblador deben de ser definidos como lejanos (PROC FAR). Otradiferencia importante es que no se requiere de guardar el segmento dedatos en la pila pues es ahora el lenguaje de alto nivel el que se encarga deestos menesteres.
11.1.3 Pasando Argumentos
En la gran mayoría de los casos se requieren de parámetros para que elprograma de ensamblador haga su trabajo y a la vez regrese resultados alprograma que lo llama. La información se pasa usualmente en forma deapuntadores (direcciones a las vari ables) que deben de ser resueltos en elprograma de ensamblador.
Se debe estar de antemano de acuerdo en los argumentos que se pasanen tre los programas y se debe también establecer un protocolo estrictoque se debe de seguir al pie de la letra para la interfase. En los interpretesdebe de conocerse a fondo el área de la pila donde el interprete almacenasu vari ables de forma de poder pasar estas direcciones como argumentos.En el caso de los compiladores el paso es sencillo pues además de colocarlas direcciones de las vari ables en la pila, coloca el valor de estas vari -ables también en la pila simplificando nuestra la bor en ensamblador.
En resumen si se planea un programa con muchas referencias aensamblador es casi in dis pens able usar un lenguaje compilado que nosfacilite la tarea de interfase y transmisión de argumentos en tre uno y otrolenguaje.
11.1.4 Pascal y Ensamblador
El sistema de interfase de todos los lenguajes de alto nivel compilados aensamblador siguen más o menos los mismos lineamientos que consistenen los siguientes pasos:
Ensamblador
11-208
11.1.4.1 Definir la función.
El ligador no puede unir módulos in com pat ibles y que se declaren deforma incorrecta. Las funciones y datos en ensamblador deben dedefinirse como públicas con la directiva PUB LIC. El modelo dePASCAL debe de definirse como grande (.MODEL LARGE)
11.1.4.2 Entrar a la función.
Se debe de comenzar la función con dos instrucciones:
PUSH BP
MOV BP,SP
En esta secuencia se establece BP como el apuntador a la pilasemipermanente para facilitar la referencia a los argumentos. Inicializarde esta forma el apuntador asegura que BP permanezca constante du rante el proceso y se pueda hacer referencia a cada parámetro como undesplazamiento fijo de BP.
11.1.4.3 Apartar espacio para los datos lo cales(opcional)
Las funciones en ensamblador pueden usar la misma técnica que las dealto nivel para apartar espacio en la pila para sus datos provisionales. Aldecrementar SP en una cantidad par, aseguramos un espacio en la pila:
PUSH BP
MOV BP,SP
SUB SP,4 ;reserva 4 bytes (2 palabras) en la pila
.
.
.
MOV WORD PTR [BP-2],0 ;primera palabra a 0
MOV WORD PTR [BP-4],0 ;segunda palabra a 0
No se debe olvidar de incrementar SP an tes de salir de la función pararestaurar los apuntadores.
11.1.4.4 Conservar los valores de los registros
Se deben de conservar los valores de los registros SI, DI, SS y DS asícomo BP (ya guardado):
Interfase a otros Lenguajes
11-209
PUSH BP
MOV BP,SP
SUB SP,4 ;reserva 4 bytes (2 palabras) en la pila
PUSH SI
PUSH DI
PUSH SS
PUSH DS
.
.
.
No se debe de olvidar de sacar los valores de la pila an tes de regresar dela función.
11.1.4.5 Acceder parámetros
Considere la pila una vez realizado los pasos anteriores (x es elprograma de alto nivel):
d Parámetro Dirección alta
d-2 Parámetro
d-4 ...
d-6 ...
d-8 CS de x
d-10 IP de x
d-12 BPÄ BP de x (salvado por y)
d-14 espacio para datoslo cales
(reservado por y)
d-16 espacio para datoslo cales
(reservado por y)
d-18 SI de x (salvado por y)
d-20 DI de x (salvado por y)
d-22 SS de x (salvado por y)
d-24 SPÄ DS de x (salvado por y)
El número de los parámetros es predefinido y podemos asignarlo de lasiguiente manera:
para1 EQU [BP+6] ;primer parámetro
para2 EQU [BP+8] ;segundo parámetro
para3 EQU [BP+10] ;tercer parámetro
11.1.4.6 Regresar valores (opcional)
El valor que se regresa se almacena en un registro y en gen eral obedece a la siguiente convención:
Ensamblador
11-210
· Si es de 1 byte en AL
· Si es de 2 bytes en AX
· Si es de 4 bytes en DX y AX
11.1.4.7 Salir de la función
Al terminar nuestra función y regresar al programa que llama se debende realizar varios pasos:
· 1. Si se salvaron los registros SS, DS, SI o DI estos deben derestaurarse de la pila en orden inverso en el que fueron guardados
· 2. Si se asigno espacio para variables locales en la pila, elapuntador SP se debe de restaurar con la instrucción MOV SP,BP
· 3. Recuperar BP de la pila
· 4. Salir de la función con RET. Si se regresa a BASIC, FORTRAN o PASCAL agregar n a la instrucción RET para ajustar la pila alnúmero de parámetros. Si se regresa a C, la función se encarga deajustar la pila.
Mostramos el siguiente ejemplo de PASCAL para llamar a unasubrutina en la que se calcula A x 2B
PROGNAM prueba(entrada,salida);
FUNC TION eleva(a,b:IN TE GER):IN TE GER; EX TER NAL;
BE GIN
WRITELN(‘5 x 2^5 es’,eleva(5,5));
END.
Y la rutina en ensamblador es
codigo SEG MENT BYTE PUB LIC ;de fine el segmento como público
AS SUME CS:codigo
eleva PROC FAR
PUSH BP
MOV BP,SP
MOV AX,[BP+8] ;argumento 1 en AX
MOV CX,[BP+6] ;argumento 2 en CX
SHL AX,CL ;AX=AX x 2CX
POP BP
RET 4 ;Ajusta la pila al salir
eleva ENDP
codigo ENDS
Interfase a otros Lenguajes
11-211
END
11.1.5 C y Ensamblador
Un programa en C puede llamar a uno en ensamblador tal como si setratase de otro modulo o función escrita en C. Para tal propósito se den deseguir los siguientes pasos:
· 1. Declare los procedimientos en C como lejanos (FAR)
· 2. Observe las siguientes convenciones:
– a) Regrese con un simple RET sin tratar de ajustar la pila
– b) Los parámetros se colocan en la pila en el orden inverso en elque aparecen en la lista de la llamada. El primer parámetro seencuentra en la parte baja de memoria.
– c) Los parámetros se pasan por valor a excepción de los arreglosque se pasan por referencia
· Incluya un signo de subrayado en frente de cada variable que se vaa compartir con otros módulos. Recuerde que C solo reconoce losprimeros 8 caracteres y que a menos de que se especifique locontrario, si importan las mayúsculas y minúsculas.
EXTERN INT eleva(int,int);
MAIN()
{
PRINTF(‘5 x 2^5 es %d\n’,eleva(5,5));
}
Y la rutina en ensamblador es
codigo SEG MENT BYTE PUB LIC ;de fine el segmento como público
AS SUME CS:codigo
_eleva PROC FAR
PUSH BP
MOV BP,SP
MOV AX,[BP+6] ;argumento 1 en AX
MOV CX,[BP+8] ;argumento 2 en CX
SHL AX,CL ;AX=AX x 2CX
POP BP
RET ;Salir sin ajustar la pila
_eleva ENDP
codigo ENDS
END
Ensamblador
11-212
11.2 Programas Residentes
El uso de programas que terminan y quedan residentes en memoria (Ter -mi nate and Stay Res i dent, TSR) es una idea tan vieja como el del uso delsistema operativo. El primer programa que queda residente en memoriaesperando nuestras ordenes es el interprete de comandos del mismosistema operativo. ¿Por qué no ir un poco más allá y ex tender el conceptoa cualquier programa del usuario?
La idea suena atrayente y es un método efectivo de ex tender lasfunciones de un sistema operativo que no es multi-tareas ni re-entrantesin necesidad de modificarlo. El concepto básico detrás de los programasresidentes es el de crear una rutina (usualmente un programa corto deutilería), ejecutarla de forma que intercepte las rutinas de interrupciónque nos interesen y que ahora apunten a nuestro programa y de algunaforma ‘pegarlo’ al SO para que este se entere de que ahora tiene unadirección distinta de terminación y a partir de la cual la memoria prin ci -pal queda li bre para el usuario o los programas de aplicación del usuario.El programa de esta forma residente puede entonces realizar su funciónya sea de forma automática (In ter rupt Ser vice Rutine, ISR) o a peticiónnuestra (TSR).
Existen varios problemas técnicos para poder lograr que un programaresidente ejecute bajo las ordenes del SO pero todos ellos pueden serresueltos de una u otra forma.
Los pasos básicos de todo sistema que debe de quedar residente son:
· Conocer el tamaño del programa que debe de quedar residente.
· Interceptar el vector de servicio que atiende a una interrupción enparticular por medio de la cual nuestro programa ‘despertará’ yrealizará la función para la cual fue diseñado. Las más comunesson las del teclado o las del reloj interno del sistema (tomadas de la Tabla de Vectores de Interrupción).
· Al comenzar nuestro programa guardar todos los registros,banderas y segmentos para poder recuperarlos al salir.
· Al terminar nuestro programa, recuperar de la pila los registros,banderas y segmentos.
· Finalizar el proceso dejando el control a la rutina original deatención a la interrupción.
Interfase a otros Lenguajes
11-213
En base a los lineamientos anteriores analizaremos algunos casos deprogramas residentes en las siguientes secciones.
Cada día es menos la necesidad de programas residentes con los nuevossistemas operativos que permiten las multi-tareas y que son re-entrantespudiendo dejar en un área de memoria el programa ejecutandose en eltrasfondo y de li bre acceso en cualquier momento. Sin em bargo, elestudio de este caso es interesante y nos permite conocer un poco más deldesarrollo de los sistemas operativos.
Todo programa que queda residente, por su propia naturaleza, vi olaalgunas o todas las reglas de un programa que se comporta‘adecuadamente’ ante un sistema operativo. El programa intercepta loscomandos dirigidos a otras rutinas y las modifica de acuerdo a supropósito por lo que puede causar ciertos conflictos si no es diseñado concuidado. Una regla para no violar los preceptos del sistema operativo yevitarse conflictos posteriores en el caso de cambio de versiones es nousar rutinas de interrupciones no documentadas y siempre usar losrecursos del sistema a través de las rutinas de interrupción que el propiosistema operativo proporciona.
11.2.1 Ensamblador Residente
El SO utiliza una serie de apuntadores, llamados bloques dealmacenamiento, que llevan la pista de la memoria que se asigna o quitade los programas que se ejecutan. Para cada programa que se ejecuta,estos apuntadores indican la dirección del prefijo del segmento delprograma (Pro gram Seg ment Pre fix o PSP) y la longitud del programa ensegmentos. De la misma forma, una bandera in dica si se uso la memoriaapuntada por el segmento de almacenamiento asignado al programa.
El proceso se torna entonces sencillo, se requiere de averiguar lalongitud del programa en párrafos, guardarla en el registro DX y llamar ala función 31h de la interrupción 21h del SO (manten proceso) o a lainterrupción 27h (termina pero queda residente).
Estas funciones se aseguran de que el programa quede residenteconservando el bloque asignado de almacenamiento, el PSP delprograma y el código del programa en memoria.
Ensamblador
11-214
Presentamos los siguientes programa en ensamblador que explota estastécnicas, es menester estudiarlo con cuidado para entender elfuncionamiento de una rutina que termina y queda residente.
; utileria para redireccionar impresora a pantalla
;***************************************************
dos_printer_io EQU 17h
dos_video_io EQU 10h
dos_func tion EQU 21h
dos_ter mi nate_res i dent EQU 27h
get_vec tor EQU 35h
set_vec tor EQU 25h
cseg SEG MENT
AS SUME CS:cseg,DS:cseg
ORG 100h
start:
JMP ini tial ize ;inicializa codigo
video_io DD ; guarda vec tor de video
printer_in ter cep tor PROC FAR
AS SUME CS:cseg, DS:cseg
STI ; pon interrupciones
OR AH,AH ; es una llamada a impresora?
JNZ pi2 ;no, regresa
MOV AH,14h ; atiENDe a pantalla
PUSHF ;empuja banderas para
AS SUME DS:NOTH ING ;simu larinterrupcion a pantalla
CALL video_io
pi2:
MOV AH,128 ;poner sta tus de imp. endesocupada
IRET ;salta servicio a impresora
printer_in ter cep tor ENDP
ini tial ize:
MOV BX,CS
MOV DS,BX
MOV AL,dos_video_io ;toma interrup de video
MOV AH,get_vec tor
INT dos_func tion
MOV video_io,BX ; y guardalo para uso pos te rior
MOV video_io[2],ES
Interfase a otros Lenguajes
11-215
MOV BX,CS ;reemplaza vec tor deimpresora viejo
MOV DS,BX ;con el que apunta a estarutina
MOV DX,OFF SET printer_in ter cep tor
MOV AL,dos_printer_io
MOV AH,set_vec tor
INT dos_func tion
MOV BX,CS
MOV DS,BX
MOV DX,OFF SET ini tial ize
INT dos_ter mi nate_res i dent ;termina quedando residente
CSEG ENDS
END START
; es necesario que este instalado el ANSI.SYS
; en CONFIG.SYS con DE VICE=ANSI.SYS
TI TLE Anti CTRL-PRINTSCREEN
code_seg SEG MENT PARA PUB LIC ‘code’
AS SUME CS:code_seg, DS:code_seg, ES:code_seg,SS:code_seg
ORG 100h
start: JMP screen
;limpia pantalla,
;definir prtscr como “A” y ^P como “NO”
mes sage DB 27,’[2J’
DB 27,’[0;114;65p’
DB 27,’[16;66p’
DB ‘$’
screen PROC NEAR
MOV DX,OFF SET mes sage
MOV AH,09h
INT 21h
INT 27h
screen ENDP
code_seg ENDS
END start
Los programas del tipo TSR son una respuesta a la estructura de tareaúnica del sistema operativo para intentar que mas de un programafuncione a la vez.
En los programas anteriores debemos de diferenciar en tre losprogramas del tipo residentes (TSR) y los del tipo ISR (In ter rupt Ser vice
Ensamblador
11-216
Rutine). Estos últimos no interactuan con el usuario, su la bor essilenciosa pero de todas maneras útil y muchas veces necesaria.
Dentro de la categoría de programas del tipo TSR encontramos acalculadoras, agen das, alarmas, macro conversores, etc. En gen eral todoaquel programa que se ac tive por alguna combinacion de teclas paraejecutarse.
Dentro del t ipo ISR encontramos relojes, programas deredireccionamieto, memorias cache, co las de impresion (Spooler), vi rus,etc.
Recordemos que aunque los programas TSR e ISR redireccionan lasinterrupciones a sus propias rutinas, en gen eral, no sustituyen estasrutinas de interrupción por lo que al finalizar su tarea pasan el con trol aestas y envian la información sin cambio a su sucesor.
En el caso de que la rutina si reemplace a la de interrupción es necesarioutilizar como fi nal de la rutina la instrucción IRET en lugar de RET queseñala el fin de una rutina de interrupción.
11.3 Resumen
11.4 Problemas
11.5 Bibliografía
Revista PC Mag a zine EU números de 1980-93.
MASM 86 Co lum bia Data Prod ucts, EU 1986.
IBM Per sonal Com puter Tech ni cal Ref er ence. Apéndice D
Mor gan L. Chris to pher Blue book of As sem bly Rou tines for the IBM PCThe Waite Group USA 1987
Tischer Turbo Pascal In ter nals Aba cus USA 1990
Interfase a otros Lenguajes
11-217
Apéndice A.A.1 Las Instrucciones del 80x86
Tab la A.1 Registros
Registros gen er a les
AX acumulador
BX base
CX cuenta
DX datos
Grupo de apuntadores e índices
SP apuntador del stack
BP apuntador base
SI apuntador fuente
DI apuntador datos
IP apuntador de instrucción
F banderas del sistema
Registros segmentos
CS segmento de código
DS segmento datos
ES segmento ex tra
SS segmento pilas
A-219
Tab la A.2 Registros y su uso
REGISTRO OPERACION
AX Multiplica o di vide palabras
AL Multiplica o di vide bytes
AH Multiplica o di vide bytes
BX Tra duce
CX Operaciones con cadenas o contador enlazos
CL Rota o corre vari able
DX Multiplica o di vide palabras
SP Operaciones con la pila
SI Operaciones con cadenas
DI Operaciones con cadenas
IP No es accesible más que con saltos
Ensamblador
A-220
Tab la A.3 Banderas Principales
Bandera Función
OF saturación
DF dirección (operación con cadenas)
IF habilita interrupciones
TF trampa (ejecución paso a paso)
SF signo (resultado negativo)
ZF cero
AF acarreo auxiliar
PF pariedad (par)
CF acarreo
IOPL nivel de privilegio para E/S (2 bits)
NT tarea anidada
RF con tinua operación
VM modo vir tual
Apéndice A. Las Instrucciones
A-221
Ensamblador
A-222
Figura A.1 Segmentos y su uso.
Tab la A.4 Uso del Desplazamiento
Tipo de referencia Segmento base por omisión Segmento base alterno Desplazamiento
Traer instrucción CS Ninguno IP
Operación con pila SS Ninguno SP
Vari ables (excepto los quesiguen)
DS CS ES SS dirección efectiva
Fuente cadena DS CS ES SS SI
Destino cadena ES Ninguno DI
BP usado como registro base SS CS ES SS dirección efectiva
Tab la A.5 Formas de Direccionamiento
Forma Localización de los datos
Inmediato En la misma instrucción
Registro En el registro
Directo En la localidad de memoria apuntada por el desplazamientocontenido en la instrucción
Indirecto de Registro En la localidad de memoria apuntada por el desplazamientocontenido en el registro
Indexado o base En la localidad de memoria apuntada por la suma del índice oregistro base y el desplazamiento contenido en la instrucción
De base e índice condesplazamiento
La dirección de memoria se forma por la suma del contenido delregistro base el contenido del registro índice y undesplazamiento
Apéndice A. Las Instrucciones
A-223
Tab la A.6 Ventajas de la Memoria Segmentada
Lin eal Segmentada
Se debe proporcionar toda la dirección Se proporcionan las direcciones en dos o más par tes
Se limita el desarrollo fu turo de memorias más amplias
No hay relocalización dinámica de programas Sí hay relocalización dinámica de programas lo que permitemultitareas
No hay programación mod u lar
No hay manejo de memoria por lo que la protección de ésta no esfácil
Ensamblador
A-224
Figura A.2 Formas de direccionamiento.
Tab la A.7 Formas de Direccionamiento y Localización de los Datos
MODO LOCALIZACION EJEMPLO
Inmediato En la instrucción ADD CH,5F
Registro En el registro ADD BX,DX
Directo En la localidad de memoria apuntada por eldesplazamiento contenido en la instrucción
ADD vari able,BX
Registro En la localidad de memoria apuntada por eldesplazamiento contenido en el registro
ADD CX,[BX]
Indice o base En la localidad de memoria apuntada por lasuma del contenido del registro índice o basey el desplazamiento contenido en lainstrucción
ADD [SI+6],AL
Base e índice con desplazamiento La dirección de memoria es la suma delcontenido del registro base, más el contenidodel registro índice y un desplazamiento
ADD [BX+DI+5],DX
Dividimos las instrucciones en los siguientes grupos genéricos:
1.- Movimientos de registros y datos
2.- Multiplicación y división entre números decimales
3.- Suma, resta
4.- Corrimientos
5.- Operaciones con cadenas
6.- Traducción de bytes por tablas
7.- Interrupciones programables
8.- Lazos de programas
9.- Coordinar multiproceso y coproceso
10.- Prueba no destructiva de bits
Apéndice A. Las Instrucciones
A-225
Tab la A.8 Instrucciones de Transferencia
Mnemónico Descripción de su operación
MOV destino,fuente Mueve byte o palabra
PUSH fuente Empuja palabra a la pila
POP destino Saca palabra de la pila
PUSHF empuja banderas a pila
POPF saca banderas de la pila
XCHG op1,op2 intercambia el operador 1 con el operador 2
LAHF carga registro AH con las banderas
SAHF guarda en las banderas lo que hay en el registro AH
IN acc,puerto Carga en el acumulador con un byte o palabra del puerto
OUT puerto,acc Traspasa del contenido del acumulador hacia el puerto
LEA destino,fuente Carga dirección efectiva
LDS destino,fuente Carga apuntador en destino y registro DS
LES destino,fuente Carga apuntador en destino y registro ES
XLAT tra duce byte
Ensamblador
A-226
Apéndice A. Las Instrucciones
A-227
Figura A.3 Multiplicación y división.
Ensamblador
A-228
Figura A.4 Corrimientos y rotaciones.
Apéndice A. Las Instrucciones
A-229
Figura A.5 Diagrama interno de una 80486.
Tab la A.9 Instrucciones Aritméticas
Mnemónico Descripción de la Operación
ADD destino,fuente Suma byte o palabra
ADC destino,fuente Suma byte o palabra con acarreo
SUB destino,fuente Resta byte o palabra
SBB destino,fuente Resta byte o palabra con préstamo
INC destino Incrementa byte o palabra en 1
DEC destino Decrementa byte o palabra en 1
NEG destino Niega byte o palabra (complemento a 2)
CMP destino,fuente Compara byte o palabra
MUL fuente Multiplica byte o palabra sin signo
IMUL fuente Multiplica enteros (byte o palabra)
DIV fuente Di vide byte o palabra sin signo
IDIV fuente Di vide enteros (byte o palabra)
CBW cambia byte a palabra
CWD Cambia palabra a doble palabra
DAA Ajuste dec i mal para la suma
DAS Ajuste dec i mal para la resta
AAA Ajuste de ASCII para la suma
AAS Ajuste de ASCII para la resta
AAM Ajuste de ASCII para la multiplicación
AAD Ajuste de ASCII para la división
Ensamblador
A-230
Tab la A.10 Operaciones Lógicas
Mnemónico Descripción de la Operación
NOT destino Niega byte o palabra (complemento a 1)
AND destino,fuente Operación Y con byte o palabra
OR destino,fuente Operación O con byte o palabra
XOR destino,fuente Operación O EXCLUSIVA con byte o palabra
TEST destino,fuente Prueba byte o palabra
SHR destino,cuenta Corrimiento lógico a la derecha de byte o palabra
SAR destino,cuenta Corrimiento aritmético a la derecha de byte o palabra
SHL/SAL destino,cuenta Corrimiento a la izquierda de byte o palabra
ROR destino,cuenta Rota a la derecha byte o palabra
RCR destino,cuenta Rota a través del acarreo byte o palabra
ROL destino,cuenta Rota a la izquierda byte o palabra
RCL destino,cuenta Rota a la izquierda a través del acarreo byte o palabra
Tab la A.11 Instrucciones de Transferencia
Mnemónico Descripción de la Operación
JMP destino Salta a una localidad de memoria indicada en destino
Jcond destino Vea tab la A.12
LOOP destino Lazo
LOOPE/LOOPZ destino Lazo mientras Sea igual/Sea cero
LOOPNE/LOOPNZ destino Lazo mientras No sea igual/No sea cero
JCXZ destino Salta si CX=0
CALL destino Llama a una subrutina
RET (opciónalmente un valor) Regresa de una subrutina
INT tipo Interrupción
INTO Interrupción en caso de saturación
IRET Regresa de una interrupción
Tab la A.12 Saltos Condicionales
Apéndice A. Las Instrucciones
A-231
Con signo
JG/JNLE destino Mayor/no menor no igual
JGE/JNL destino Mayor o igual/No menor
JL/JNGE destino Menor/No mayor no igual
JLE/JNG destino Menor o igual/No mayor
JO destino Saturación
JS destino Signo
JNO destino No saturación
JNS destino No signo
Sin signo
JA/JNBE destino Arriba/No abajo o igual
JAE/JNB destino Arriba o igual/No abajo
JB/JNAE destino Abajo/No arriba o igual
JBE/JNA destino Abajo o igual/No arriba
No importa el signo
JC destino Acarreo
JE/JZ destino Igual/Cero
JP/JPE destino Pariedad/Pariedad par
JNC destino No acarreo
JNE/JNZ destino No igual/No cero
JNP/JPO destino No pariedad/Pariedad non
Tab la A.13 Instrucciones para Manipular Cadenas
Mnemónico Descripción de la Operación
MOVSB/MOVSW Mueve cadena de byte o palabra
CMPSB/CMPSW Compara cadena de byte o palabra
SCASB/SCASW Busca cadena de byte o palabra
LODSB/LODSW Carga cadena de byte o palabra
STOSB/STOSW Guarda una cadena de byte o palabra
Las instrucciones anteriores se utilizan con los siguientes prefijos:
REP Repite
REPE/REPZ Repite mientras sea Igual/Cero
REPNE/REPNZ Repite mientras no sea Igual/Cero
Ensamblador
A-232
Tab la A.14 Registros Dedicados para Operaciones con Cadenas (Tab la A.13)
Registro Operación
SI Indice (desplazamiento) de cadena fuente
DI Indice (desplazamiento) de cadena destino
ES segmento de la cadena destino
CX contador de repetición
AL/AX valor de búsqueda, destino para LODS, fuente para STOS
DF0=autoincrementa DI y SI, 1=autodecrementa DI y SI
ZF In dica fin de búsqueda/comparación
Tab la A.15 Instrucciones de Con trol de Proceso
Instrucción Acción
STC Fija bandera de acarreo
CLC Limpia bandera de acarreo
CMC Limpia bandera de complemento
STD Fija bandera de dirección
CLD Limpia bandera de dirección
STI Habilita interrupciones
CLI Deshabilita interrupciones
HLT Detener procesamiento hasta que se inicialice el circuito ohaya una interrupción externa
WAIT Espera a que test (pata externa física del circuito) esté en 1
ESC Escapa a procesador externo (coproceso)
LOCK Bloquea el bus du rante la siguiente instrucción
NOP No hacer nada (para rellenar tiempos)
Apéndice A. Las Instrucciones
A-233
A.2 Errores Comunes al Ensamblar un Programa
1.- Lógica invertida Ej. JC (Salta si está el acarreo) cuando se deseasaltar cuando acarreo=0.
2.- Uso equivocado de direccionamiento Ej. MOV AX,var cuandoqueremos MOV AX,off set var.
3.- Empujar y no sacar de la pila.
4.- Usar un registro para valor tem po ral y llamar una subrutina que lousa.
5.- Olvidar poner en CX el número de repeticiones cuando se entra a unlazo.
6.- Creer que una instrucción afecta a una bandera.
7.- Olvidar inicializar un registro.
8.- Olvidar el orden destino fuente.
9.- Contar mal los ciclos Ej. del area 100 a 103 debe haber 4 ciclos, no 3.
10.- Incrementar contadores de lazos en lugares equivocados, o noincrementarlos.
11.- Olvidar salvar registros y banderas en programas de manejo deinterrupciones, lo que da por resultado bloqueos aleatorios.
12.- No poner espacio de pila suficiente en un programa, pues en elcurso de este pueden ocurrir interrupciones y saturar la pila.
Ensamblador
A-234
Apendice BInterrupciones
S e r v i c i o(AH=)
Interrupción Descripción Parámetros Regresa
02h 21h Despliega carácter en pantalla DL=carácter (ASCII) -
- 20h Regresa a programa su per vi sor - -
01h 21h Lee un carácter del teclado - AL=carácter leido del teclado
09h 21h Muestra una cadena en pantalla DS:DX=dirección de la cadenaterminada con $
-
0Ah 21h Lee cadena del teclado DS:DX=dirección de memoriapro vi sional para contener lacadena
1er byte memoriaprov.=máximo # de carácters aser leidos
2do byte memoria prov.=#carácteres leídos
05h 21h Imprime carácter DL=carácter a imprimir -
0Bh 21h Verifica entrada estandard - AL=FF hay un carácteresperando
AL=00 no hay carácteresperando
00h 10h Tipo de despl iegue(color,mono,etc.)
01h 10h Tipo de cur sor
02h 10h Posición del cur sor
03h 10h Lee posición del cur sor
04h 10h Lee posición de la pluma de luz
05h 10h Selecciona página de video activa
B-235
06h 10h Desplaza pantalla hacia arriba
07h 10h Desplaza pantalla hacia abajo
08h 10h Lee atributo/carácter de pantalla
09h 10h Escribe atr ibuto /carácter apantalla
0Ah 10h Escribe carácter a pantalla
0Bh 10h Escoge paleta de color
0Ch 10h Dibuja un punto a pantalla
0Dh 10h Lee punto de pantalla
0Fh 10h Regresa estado de video
10h 10h Generador de carácteres
- 11h Información del equipo - bit 0 coprocesador
bit 4,5 tipo de video
bit 7,6 # lectoras de disco
bit 9,10,11 #puertos RS-232
bit 13 joy stick
bit 14,15 #puertos paralelos
- 12h Tamaño de la memoria - AX=# bytes
2Ah 21h Pide fecha del sistema - CX=año (1980 a 2099)
DH=mes (1 al 12)
DL=día (1 al 31)
2Bh 21h Fija fecha del sistema mismos que para la 2Ah -
2Ch 21h Pide hora del sistema - CH=hora, CL=minuto
DH=segundos, DL=1/100segundos
2Dh 21h Fija hora del sistema mismos que para la 2Ch -
30h 21h Pide versión de DOS - AX=versión
38h 21h Información del país DX=Dirección de buffer de 34bytes
País en buffer
0Fh 21h Abrir archivo con manija DS=Dirección del Segmento delFCB
AL=00, el archivo se encontró yabrió
DX=Desplazamiento de ladirección del FCB
AL=FF, El archivo no existe
Ensamblador
B-236
FCB, # de disco,tamaño deregistro,fecha,tamaño archivo,#bolque,etc.
(El nombre del archivo con su extensión deben de estar ya en el FCB)
4Eh 21h Busca primer archivo CS:DI=archivo a buscar DTA 0B0h
4Fh 21h Busca siguiente archivo CS:DI=archivo a buscar DTA 0B0h si AL=18 no seencontro
57h 21h Fija/toma datos de fecha y hora de archivo
Apéndice B. Las Interrupciones
B-237
Índice
!
804861-27
A
acceso aleatorio1-23, 10-194
acceso directo a memoria5-88
acceso secuencial1-23
acceso secuncial10-183
acumulador1-9
ADC7-132
ADD7-131
AND6-114
ASCII3-67
ASCIIZ10-197
asignación de memoria11-207
AS SUME4-82
B
BCD3-63
BIOS2-34
bit1-2, 3-64
Bresenham9-177
buffer5-88
bus1-4
Introducción
239
byte1-3, 3-65
BYTE PTR5-102
C
C y ensamblador11-212
CALL7-136
carácteres de con trol3-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-dec i mal3-58
conversión dec i mal-binario3-59
Ensamblador
240
corrimientos7-128
CPU1-2 - 1-3, 1-19
D
DB4-83
DD4-83
de bug4-78
DEC7-132
desbordamiento3-65
dirección1-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
Introducción
241
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
hard ware2-33
hex a dec i mal3-61
I
I/O1-2
IBM1-27
Ensamblador
242
IDIV7-133
IMUL7-133
IN6-117
INC6-108
in put/out put5-87
instrucción1-8
INT5-94, 6-105
interfase a otros lenguajes11-207
intérprete2-45
interrupción
impresora7-125
no mascarillable5-93
pantalla7-123
teclado7-122
ISR11-213, 11-216
J
JMP6-106
juego de instrucciones1-3
L
LA BEL BYTE9-177
LA BEL DWORD9-177
LA BEL WORD9-177
Leibnitz3-56
Introducción
243
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 - 1-26
memoria de sólo lectura programable y borrable1-27
memoria interna1-21
memoria no volátil1-27
memoria prin ci pal1-21
memoria secundaria1-22
memoria volátil1-27
microinstrucción1-18
Ensamblador
244
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
Introducción
245
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
Ensamblador
246
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
Introducción
247
SBB7-132
SCAS8-152
SEG MENT4-82
SEG MENT AT9-171
SHL7-130
SHR7-130
sistema base dos3-56
sistema binario3-56
sistema dec i mal3-55
sistema notacional3-56
sistema operativo2-33
sistemas numéricos3-53
soft ware2-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
Ensamblador
248
unidad de con trol1-17, 1-20
unidad de memoria1-20
unidad de procesamiento cen tral1-3, 1-19
UPC1-2 - 1-3, 1-19
V
vec tor de interrupciones5-92
video9-163
W
WORD PTR5-102
X
XOR6-114
Introducción
249