Está en la página 1de 283
LENGUAJE ENSAMBLADOR Y PROGRAMACION PARA IBM® PC Y COMPATIBLES Tercera edicién Peter Abel British Columbia Institute of Technology TRADUCCION: Lic. Victor Hugo Ibarra Mercado Lic. en Fisica y Mateméticas Coordinador Matematicas Aplicadas Escuela de Actuaria - Universidad Anéhuac REVISION TECNICA: Prof. Raymundo Hugo Rangel Gutiérrez UNAM México * Argentina + Brasil » Colombia + Casta Rica + Chile + Ecuador Espaiia + Guatemala * Panama + Pera * Puerto Rico * Uroguay * Venezuela EDICION EN INGLES PRE-PRESS/MANUFACTURING BUYER: BILL SCAZZERO- ACQUISITIONS EDITOR: MARCIA HORTON EDITORIAL/PRODUCTION SUPERVISION AND INTERIOR DESION RICHARD DeLORENZO COPY EDITOR; BRIAN BAKER EDITORIAL ASSISTANT: DOLORES MARS SUPLEMENT EDITOR: ALICE DWORKIN ABEL: LENGUAJE ENSAMBLADOR Y PROGRAMACION PARA IBM PC ¥ COMPATIBLES (3a. ed.) ‘Traducida del inglés de ta obra; IRM®-PC ASSEMBLY LANGUAGE. AND PROGRAMMING. All Rights Reserved. Authorized translation from English language edition published by Prentice Hall Inc, A Simon & Shuster Company. ‘Todos los derechos reservados, Traduccién autorizada de la edici6n en inglés publicada por Prentice Hall Inc, ‘All Rights Reserved. No part of this hook may be reproduced or transmitied in any form or by any means, electrowie or mechanical, including photocopying, recording or by any information storage and retrieval system, ‘without permission in writing from the publisher, Prohibids La reproduccién total o parcial de esta obra, por cualquier medio 0 método, sin la autorizaci6n escrita del editor Derechos reservados © 1996 respecto la primera edicisn en espanol publicads por PRENTICE-HALL HISPANOAMERICANA, S.A Atlacomiuleo Naga. 500-5" Piso ‘Col. Industral Atoto 53819, Nouenlpan de }irer, Edo, de México ISBN 968-380-708-7 ‘Miembro de la Cimara Nactonal de la Industria Editorial, Reg. Mim. 1524 ‘Original English Language Edicion Published by Prentice Hall Inc. ‘Conyrigth @ MCMXCV ISBN 0-13-124603-8 IMPRESO EN MEXICO/PRINTED IN MEXICO PARTE A — Fundamentos del hardware y software de la PC CAPITULO 1 Introduccién al hardware de la PC OBJETIVO Explicar las caracteristicas basicas del hardware de la micto- computadora y la organizacién de programas, INTRODUCCION Excribir un programa en lenguaje ensamblader requiere de comocimientos acerea de! hardware {arquitectara) de Ja computadora, su conjunto de instrucciones y sus reglas de uso. En este capi tulo sc ofrece una explicacién del hardware basico: bits, bytes, registros, el procesador y el bus de datos. El conjunta de instruceiones y su usa son desarrollados a la large del libra, Los bloques fundamentales de informacion. de sna computadora son los bits y los bytes. Estos proporeionan los medios por los cuales la computadora puede representar datos e instruccio- cnes en [a memoria Los elementos principales de hardware interno de la computadera son un micropracesador, la memoria y los registros: los elementos de hardware externo son los dispositives de entrada! salida, como el teclado, el monitor y el disco, El software consta de diversos programas y archi: vos de datos (ineluyendo al sistema operativo) almacenados en el disco. Para ejecutar (0 correr) un programa, el sistema lo copia del disco a la memoria interna. (La memoria interna es lo que la ‘gente entiende cuando pide que su computadora tenga, por ejemplo, 8 megabytes de memoria.) El microprocesador ejccuta las instrucciones del programa, y los registrox manejan la aritmetica, movimiento de datos y el direceionamiento. 2 Introduccién al hardware dela PC Capitulo 1 Un programa en lenguaje ensamblador consiste en uno o més segmencos para definis datos y almacenar instrucciones de maquina y un segmento Hamada stack (@ pila) que Contiene direccio- es almacenadas, BITS Y BYTES La unidad més pequefia de informaci6n en la computadora es el dit. Un bit puede estar no magne- tizado, 0 apapado, de modo que su valor es cero, o bien, magnetizado, o encendido, de modo que su valor es uno. Un solo bit no proporciona mucha infarmacién, pero es sorprendente lo que un conjunto de ellos puede hacer Bytes ‘A.un grupo de nueve bits se le Hama dyze, el eual representa locatidades de almacenamiento, tanto en memoria interna como en discos externos. En memoria, cada byte tiene una direccién nica, que inicia con cero para el primer byte. Cada byte tiene ocho bits para datos y un bit de paridad wpe fefeloefeleslel. (+s tas | paridss | Los acho bits de datos proporcionan la base para la aritmética binarla y para representar caracte- res come la letra A oel simbolo de asterisco (*). Ocho bits petmiten 256 combinaciones diferentes de condiciones de apagado-encendide (off-on), desde todas los bits apagados (00000000) hasta todos los bits encendidos (11111111). Por ejemplo, una representacidn de los bits para la letra A ¢s 01000001 y para el asterisco es 00101010, aunque no tenemos que memorizarlas, La paridad requiere que el nimero de bits encendidos en cada byte siempre sea impar Puesto que la letra A contiene dos bits encendides, para forzar Ia paridad impar el procesador establece de forma automitica su bit de paridad en encendide (01000001-1). De forma similar, puesto que el asterisce tiene ires bits encendides, para mantener 1a paridad impar el procesador establece el bit de paridad en apagado (00101010-0}. Cuando una instruccién hace referencia a un byte en memoria interna, el procesador verifica su paridad, Si su paridad es par, el sistema supone que un bit estd “perdido” y exhibe un mensaje 0 de error. Un error de paridad puede ser resultado de una falla en ¢l hardware o un trastorno eléctrico; de cualquier forma, ¢s un acontecimiento raro. Puede preguntarse c6mo es que In computadora “sabe™ que e] valor de los bits 01000001 representa la letra A. Cuando usted oprime la A en el teclado, el sistema envia una sefial desde esa tecla a la memoria y establece un byte (en una posicién de entrada) al valor 01000001. Usted puede mover el contenido de este byte de un lugar a otro de la memoria y aun imprimirio o mostrarlo en Ia pantalla como la letra A. Para propiisitos de referencia, los bits en el byte se numeran del (al 7 de derecha a izquier- da, como se muestra aqui para Is letra A (ya no nos preocuparemos por el bit de paridad) Naimero de bit 7 540 Coneadioen bis pila: | @ | 9 9 0 @ Nimeros binarios 3 Bytes relacionadas Un programa puede tratar a un grupo de bytes como una unidad de informacién, como tiempo © distancia. A un grupo de uno-o mas bytes que definen un valor particular se le-conoce cominmente como canpo. La computadora también emplea ciertos tamafios que le son naturales: + Palabra. Un campo de 2 bytes (16 bits). Los bits en una palabra son numerados desde 0 hasta 15, de derecha a izquierda, como se muestra a continuacidn para las letras Naimern debit ‘Coatenides.ca hits (PC) + Palabret doble. Un campo de 4 bytes (32 bits) + Palabra: cuddruple. Un campo de 8 bytes (64 bits), + Parrafo. Un campo de 16 bytes (128 bits) «+ Kilobyte (KB). El nimero 2!°es igual a 1024, el cual pasa a ser el valor de K, por kilobytes. Por tanto, una computadora con una memoria de 640K tiene 640 x 1024, 0 655,360 bytes. + Megabyte (MB). El nimero 2” ¢s igual a 1,048,576, o un megabyte. IMEROS BINARIOS Puesto que la computadora slo puede distinguir entre bits 0 y 1, trabaja con un sistema de numeracién de base 2 conocido.camo binario. De hecho, la palabra “bit” es una.contraccién de las palabras inglesas “binary digit” (digito binario). Una coleceién de bits puede representar cualquier valor numérico. El valor de un niimero binario depende de las posiciones relativas de cero a uno de los bits. Al igual que en los nimeros decimales, las posiciones de derecha a izquierda representan potencias ascendentes (pero de 2, no de 10). En el siguiente oamero de ocho bits, todos los bits se toman como uno (encendido}: Posicién: 7 6 5 4 3 2 1 0 Valor del bit: 1 1 1 1 i 1 1 1 Valor dela posicin: 1286432 16 8 4 2 1 E] primer bit de la derecha toma el valor 1 (2%) ¢l que sigue a la izquierda toma el valor 2 (2'); ef siguiente el valor 4 (2°), y asi sucesivamente. En.este caso el valor del ndmero binario-cs | + 2 + 4b a + 128 = 255 2"= 1, En forma similar, el valor del mimero bi ‘Valor del bit: 0 1 a 0 0 a o 1 Valorde la posicign: 128 6432. 16 8 4 2 1 Pero, no es 01000001 Ia letra A? En realidad, si, Los bits 01000001 pueden representar ya sea el mimero 65 0 bien la letra A, como a continuacién se indica: Introduccién al hardware de laPC Capitulo 1 + Siun programa define los dates para propésitos aritméticos, entonces 01000001 es un.rximero binario equivatente al mimero decimal 65 * Si un programa define los datos con propésites descriptives como encabezados, entonces 01000001 representa un cardcter alfabético. ‘Cuando inicie 1a programacién, vera con mas claridad esta distinciOn, puesto que define y utiliza cada elemento de informacién para un propésito especffiea. En la prictica, rara vez los dos usos son fuente de confusidn. Un numero binario no esté limitado a 8 bits. Un procesador que utiliza una arquitectura de 16 bits (0 de 32 bits) maneja de manera automatica miimeros de 16 bits (o de 32 bits). Para 16 bits, 2)*~ 1, da valores hasta 65,535, y para 32 bits, 2" ~ 1, proporciona valores hasta 4,284,967,295, Aritmética binaria La microcomputadora realiza aritmética sélo en formato binario, En consecuencia, el programa- dor de: lenguaje ensamblador tiene que estar familiarizado con el formato binario y Ia suma binaria Los siguientes ejemplos ilustran la suma binaria a 0 1 1 +000 Ht a 1 Io tt "1 Note en los dos ‘iitimos ejemplos un 1 de acarreo. Ahora, sumemos @]000001 a 00101010. Estamos sumando la letra A con el asterisco? No, son las cifras decimales 65 y 42 Decimal Binario 65 ‘01000001 +42 +001 107 OLIOIOL Verifique que la suma binaria 01101011 realmente es 107. Otro ejemplo: sume los valores deci males 60 y 53: Decimal Binario 60 oo1 11100 +53 +001 10101 13 01110001 ‘Niimeros negativos Los niimeros binaries anteriores son todos positives, porque cn cada uno el dltimo bit de la izquierda es un cero. Un nimero binaria negativo tiene un | en el bit de la izquierda. Sin embar go, no ¢s tan simple como cambiar el bit de la izquierda a 1, tal como 01000001 (+65) a 11000001 Un valor negative se expresa en noaciée de complemento a des; esto es, para representar un numero: binario como negativo la regla es: invierta los bits y sume 1. (Se entiende por invertir un bit que sisu valor es 1, lo cambiamos por 0, y $i su valor es 0, lo cambiamos por 1.) Como ejemplo, encontrar el complemento a dos de 01000001 (0 65). Numeros binarios 5 Namero +65: ‘01000001 Invertir los bits: 1OL10 Sumar 1: L Numero 65; Iola Un mimero binario es negativo si su tltimo bit a la izquierda es 1, pero si sum los valores de tos bits que tienen 1, para convertir el némero 10111111 a decimal, no obtendrd 65. Para de- terminar el valor absoluto de un nmero negative binario, simplemente repita la operacién ante rior, esto es, invierta wut 01000000 —1 ‘0100000! La suma de +65 y —65 debe set cero, Pruébelo: +65 1000001 65 +N 69 (00000000 En la suma, el valor de los 8 its es cero, y el acarreo de un | a la izquierda se pierde. Pero coma existe un acarreo hacia ¢l bit de signo y tn acarreo hacia afuera del bit de signo, el resultado es correct. La resta binaria cx simple: convierta cl nimero que sera restado a su complemento a dos y sume los nimeros, Restar 42 de 65, La representackin binaria de 42 es 00101010 y su compie~ mento a dos es 11010110: 65 1000001 +42) 411010110 23 @oooloit El resultado, 23, es correcta. Una vez mis, existe un acarreo valido hacia el bit de signo y un acarreo hacia fuera. Si Ia justificacién para Ia notacién de complemento a dos no es inmediatameme clara, considere la siguiente pregunta: ,Qué valor tiene que ser sumado al nimero binario 00000001 para hacer que la suma sea igual a 00000000? En términos de mimeros decimales, Ia respuesta seria 1. Ei complemente a dos del J es IIIILLI1, Asi sumamos +1 y—1 come sigue: 1 0000001 +-D mw Resultado: (7)00000000 Ignorando el acarreo de 1, puede ver que el niimero binario 11111111 es equivalente al decimal - 1. También puede ver un pattén en la forma en que los niimeros binarios decrecen en valor +3 00000011 +2 09000010 +1 00000001 a 00000000 -1 0 WHMI -2 1LuN10 -3 nor 6 Introduccién al hardware de laPC Capitulo 1 De hecho, en un niimero negative los bits con cero indican su valor (absoluto}: trate el valor posicional de cada uno de los bits con cero come si fueran 1, sume los valores y agregue 1. Este material sobre aritmética binaria y nimeros negativos lo eneantrara provechoso cuando vea los capitulos 12 y 13, sobre aritmética. REPRESENTACION HEXADECIMAL Imagine que quiere ver los contenidos de cuatro bytes adyacentes, que representan un valor bina- rio, en memoria (una palabra doble}. Aunque un byte puede tener cualquiera de las 256 combina- ciones de bits, no hay manera de mostrar o imprimir muchos de elles come caracteres ASCIL comunes. (Bjemplos de tales caracteres son fas configuraciones de bits para Tab, Enter, Form Feed y Escape [tabulador, Intro, Avance de pégina y Escape.) En consecuencia, los disedadores de computaderas desarrollaron un método abreviado para representar informacién binaria. El método divide todo byte en mitades y expresa cl valor para cada medio byte. Como cjemplo, considere los siguientes cuatro bytes: Binnie; [0101 1001 | oof) orm | tor too; | 1100 1110 Decimal: 59 3s} un 9] ew Puesto que los niimeros 11, 12 y 14 necesitan 2 digitos, se extiende ¢l sistema de numera- cidm de manera que 10 = A, 11 = B, 12 = C, 13 = D, 14 = Ey 18 = F. Aqui esté el nimero en forma abreviada que representa el contenido de los bytes dados: 39 35 BS CE Por tanto, el sistema de numeracidn incluye los “digitos” 0 a F, y ya que existen 16 de tales digitos, cl sistema es conocido como representacién, hexadecimal (o hex). La figura 1-1 muestra los niimeros decimales de 0 a 15 junto con sus valores equivalentes en binario y en hexadecimal Binaric Decimal Nexadecimal | Binarig Decimal Hexadecimal onan 0 . Loop a 5 gona, 1 a 1002 3 2 ooo a 2 1019 1 a gona, 3 3 1022 a B 0190 4 4 1109 wz c 0x93 5 5 1192 a 3 Gres 7 7 432 a5 F Figura 1-1 Representacién binaria, decimal y hexadecimal 1 lenguaje ensamblador hace uso considerable del formato hexadecimal. Un listado de un programa ensamblador muestra, en hexadecimal, todas las direcciones, instrucciones de eédigo de maquina y el contenido de [as constantes de datos. Para depurar sus programas, puede usar el programa DEBUG del DOS, cl cual también muestra las direcciones y los contenidos de los bytex en formato hexadecimal Muy pronte staré trabajando en formato hexadecimal. Tenga en mente que él siimera hexadecimal que sigue inmediatamente a F es el 10 hexadecimal, que es el valor decimal 16, Weamos a continuaci6n algunos ejemplos sencillos de aritmética hexadecimal. El procesador 7 6 5 F F 10, FF oo 48 HL SR 04 A D 1 1E 40 100 Note también que el 40 hexadecimal es igual al 64 decimal, el 100 hexadecimal es cl 256 decimal y €l 1,000 hexadecimal es el 4,096 decimal, En un programa para indicar un mimero hexadecimal, se escribe una *H” inmedistamente después de! nimero; asi 25H = 37 decimal. Por convencién, un ndmero hexadecimal siempre empieza con un digito 0-a 9, asi que debe codificar BRH, come OB8H. En este libro indicamos un walor hexade: con la palabra “hex” o una “H™ después del ntimero (como en 4C hex.o 4CH); un valor binario con la palabra “binario” o una “B” a continuackin del aimero (come 01001100 binario.o 01001 100B), y un valor decimal simplemente por un nimero (como. 76). Se exceptian Jos casos en que la base es obvia por el coniexto. En el apéndice A se explica cOmo convertir mimeras hexadecimales a decimal, y viceversa, CODIGO ASCIT Para uniformar Ia representacidn de caracteres, los fabricantes de microcomputadoras han adop: tado el cédigo ASCII (American Standard Code for Information Interchange). Un codigo unifor- ‘me facifita la transferencia de informacién entre los diferentes dispositivos de la computadora, 11 c6digo ASCII extendide de & bits que utiliza la PC proporciona. 256 caracteres, incluyendo simbo- los para alfabetos extranjeros, Por ejemplo, la combinacién de bits 01000001 (41 hex) indica la letra A. El apéndice B tiene una lista de las 256 caracteres ASCII y el capitulo 8 ensefia eémo mostrarlos en la pantalla. EL PROCESADOR ‘Un elemento importante del hardware de la PC es la unidad del sistema, que contiene una tarjeta de sistema, fuente de poder y ranuras de expansién para tarjetas opclonales, Los elementos de la tarjeta de sistema son un microprocesador Intel (o equivalente), memoria de s6lo lectura (ROM) y memoria de acceso aleatorio (RAM). El cerebro de la PC y compatibles es un microprocesador basado en la familia 8086-de Intel, que realiza todo el procesamiento de datos ¢ instrucciones. Los procesadores varian en velocidad y eapacidad de memoria, registros y bus de datos, Un bus de datos transfiere datos entre el procesador, la memoria y los dispositives externos. En realidad, dirige el tréfico (trénsito) de datos. En seguida se anota una breve descripcién de varios procesadores de Intel: 8088/8018. Estos procesadores tienen registros de 16 bits y un bus de datos de & bits, y pueden direccionar hasta un millén de bytes en memoria interna. Los registros pueden procesar dos bytes al mismo tiempo, mientras que el bus de datos sélo puede transferir un byte a la ver. El 80188 es un 8088 con mayor potencia. por la adicién de unas cuantas insirucciones, Ambos procesadores corren en lo que se conoce como mado real, esto es, un programa a la vez 8086/90186. Estos procesadores son similares « los 8088/80188, pero tienen un bus de daios de 16 bits y corren mas répida, El 80186 es un 8086 més potente con unas cuantas instruc- ciones adicionales. Introduccién al hardware dela PG Capitulo 1 80286. Este procesador puede corter mds répido que los anteriores y direceionar hasta 16 millones de bytes. Puede cotrer en modo real o en mode protegido para multitareas, 80396. Este procesador tiene registros de 32 bits y un bus de datos de 32 bits, y puede ccionar hasta cuatro mil millones de bytes en memoria. Puede correr en moda real o en modo protegido para multitareas, 80486. Este procesador también tiene registros de 32 bits y un bus de datos de 32 bits {aunque algunos. clones tienen un bus de-datos de 16 bits) y esta disehado para mejorar el desem- pefo, Puede correr en modo real o en modo protegido para multitareas, Pentium (o PS). Este procesador tiene registros de 32 bits, un bus de datos de 64 bits y puede ejecuar mis de una instruccién por ciclo de reloj. (Intel adopté el nombre “Pentium” Porque, a diferencia de los nimeros, los nombres pueden tener derechos reservados.) Unidad de ejecucién y unidad de interfaz del bus El procesador se divide en dos unidades logicas; una unidad de cjecucién (EU) y una unidad de interfaz. del bus (BIU), como se ilustra en la figura 1-2. El papel de la EU es ejecutar instruccio- nies, micniras que la BIU envia instrucciones y datos ala EU, La EU conticne una unidad aritmé- vica-légica (ALU), una unidad de control (CU) y varios registros. Estos elementos ejecutan ins- trucciones y operaciones aritméticas y légicas La funcién mas importante de la BIU es manejar la unidad de control del bus, los registros ide segmentos y la cola de instrucciones. La BIU controla los buses que transfieren los datos a la EU, a la memoria y a los dispositives de entrada/salida externos, mientras que los registros de segmentos controlan el direccionamiento de memoria. BU: Una a tata i ts Figura 1-2 Unidad de ejecuci6n y unidad de imertaz del bus Memoria interna, 9 ‘Otva funcién de la BIU es permitir el acceso a instrucciones. Ya que las instrucciones de un programa en ejecuciGn se encuentran en la memoria, la BIU debe accesar insirucciones desde la memoria y colocarlas en la cola de instrucetones. Puesto que el tamafio de esta cola es de 4 a 32 bytes, dependdiendo del procesador, la BIU es capaz de adelantarse y buscar con anticipacién instruceiones de manera que siempre haya una cola de instrucciones listas para ser ejecutadas La EV y la BIU trabajan en paralclo, si bien Ia BIU se mantiene un paso adelante. La EU notifica a la BIU cudndo necesita acceso a los datos en memoria o a un dispositive de E/S. También, la EU solicita instrucciones de maquina de la cola de instrucciones de la BIU. La instrucciGn que s¢ encuentra adelante de Ia cola ¢s la actualmente ejecutable, y mientras la EU esta ocupada ejecutando una instruceién, la BIU busca otra en la memoria. Esta bisqueda se traslapa con la ejecucién y aumenta la velocidad de procesamiento, Los procesadores hasta el 80486 tienen lo que se conoce como iuberia sencilla, la cual los restringe a completar una instruccin antes de iniciar la siguiente. El Pentium y pracesadores. posteriores tienen una duberia doble (0 dual) que les permite correr varias operaciones en paralelo. MEMORIA INTERNA La microcomputadora posee dos tipos de memoria interna: memoria de acceso aleatorio (RAM) y memoria de séla lectera (ROM). Los bytes en memoria se numeran en forma consecutiva, ini ciando con 00, de modo que cada localidad tiene un némero de direccidn tnico. La figura 1-3 muestra un mapa fisico de memoria de una PC tipo 8086. Del primer megabyte de memoria, los primeros 640K Ios ocupa la RAM, la mayor parte de la cual esté disponible para su uso. ROM, La ROM es tn chip especial de memoria que (como su nombre lo indica) s6to- puede ser lefda, Ya que las inscrucciones y los datos estiin “grabados” permanentemente en un chip de ROM, no pueden ser alterados. EL. Sistema Basico de Entrada/Salida (BIOS) de ROM inicia en la direccién 768K y maneja los dispositives de entrada/salida, como un controlador de disco duro. La ROM que inicia en 960K controla las funciones basicas de la computadera, como fa autoprueba al encender, patrones de puntos para los gréficos y el auttocargador de disco, Cuan- da se enciende la computadora, la ROM realiza ciertas verificaciones y carga, desde el disco, los daios especiales del sistema que envia ala RAM. Inicie Direceién use Dec Hex 360% F0000 768K coo00 memoria superior sox aggga | Ge video (RAN! memoria 640 K memoria (RAM) convencional cero 90000 Figura 1-3 Mapa de memoria fisiea 10 Introducctén al hardware dela PC Capitulo 1 RAM. Un programador esté preocupado principalmente con la RAM, que seria mejor tla- mada “memoria de lectura-escritura”. La RAM se dispone como una “boja de trabajo” para almacenamiemto temporal y ejecucién de programas. Ya que el contenido de la RAM se pierde cuando se apaga 1a computadora, debe reservar almacenamienio exierno para guardar programas y datos. Si cuando enciende la computadora tiene insertado un disco flexible con DOS o un disco duro instalado, el provedimiento de arranque en ROM carga el programa COMMAND.COM en RAM. Después se le pide s COMMAND.COM ealizar acciones, como cargar un programa de un disco ala RAM. Puesto que el COMMAND.COM ‘ocupa una pequefia parte de RAM, también existe espacio para otros programas. Su programa se ejecuta en RAM y por lo comvin produce salida a la pantalla. a la impresora.o a un disco. Cuando termina, usted puede pedir al COMMAND.COM cargar otro programa en RAM, una accivin que se escribe sobre el programa anterior. En todo él estudio posterior de la RAM se usaré el 1érmino general “memoria” Dircccionamiento de localidades de memoria Dependiendo del modelo, el provesador puede accesar uno o mis bytes de memoria a la vez. ‘Considere el nimero decimal 1,025. La representacion hexadecimal de esta cifra, O401H , requie- re de dos bytes (o una palabra) de memoria. Consta de un byte de orden alto (mas significativo), 04, yun byte de orden bajo (menos significative), 01. El sistema almacena en memoria estos bytes en Secuencia inversa de bytes: el byte de orden bajo en Ia direecién baja de memoria y el byte de orden alto en la direccién alta de memoria, Por ejemplo, el procesador transferirfa O401H de un registro a las localidades de memoria $612 y 5613 como: regia oa a ——s meemurs o1 o4 locabidad 5612, localidad $613, lnyte menas significative byte mis significative El procesador espera que los datos numéricos en la memoria estén en secuencia inversa de bytes y los procesa de acuerdo ¢on esto. Cuando el procesador recupera la palabra de la memoria, ovra vez invierte los bytes, restablecidndolos de manera correcta en el registro como 04 01 bex. Aunque esta caracteristica es enteramemte automitica, usted tiene que estar alerta cuando progra- ‘me y depure programas en lenguaje ensamblador Un programador de lenguaje ensambladar tiene que distinguir claramente entre la direecidn ¥ los contenidos de una localidad de memoria, En el ejemplo anterior, el comtenido de la localidad 5612 es O1 y el contenido de la lovalidad 5613 es 04 SEGMENTOS Y¥ DIRECCIONAMIENTO- Un segmento es un rea especial en un programa que inicia en un démite de un parrafo, esto es, en tuna localidad regularmente divisible entre 16, 0 M0 hex, Aunque un segmento puede estar ubicado casi en cualquier lugar de Ia memoria y, en modo real, puede ser hasta de 64K. silo necesita tanto espacio como el programa requiera para su ejecucién, Segmentos y direccionamiento " Un segment en modo real puede ser de hasta 64K. Se puede tener cualquier mimero de seg- mentos; para direccionar un segmemto en particular basta cambiar la direccidn en el registro del segmento apropiado. Los tres segmentos principales son los segments de cédtigo, de datas y de la pita Segmento de cédigo El segmento de cddigo (CS) contiene las instrucciones de méquina que son ejecutadas, Por lo comin, la primera instruccién ejecutable estd en el inicio del segmento, y el sistema operativo cmlaza a esa localidad para iniciar la ejecucién de! programa, Como su nombre indica, el registro del CS direcciona el segmento de cédigo. Si su drea de cédigo requiere mas de 64K, su programa puede necesitar definir mas de un segmento de cédigo. Segmento de datos El segmento de datos (DS) contiene datos, constantes y areas de trabajo definidos por el progra ma, El regisiro del DS direcciona el segmento de datos. Si su drea de datos requiere de mis de 68K, su programa puede necesitar definir mas de un segmento de datos. Segmento de la En términos sencitlos, la pila contiene los datos y direcciones que usted necesita guardar tempo ralmente o para uso de sus “Iamadas” subrutinas, El registro del segmento de la pila (SS) direcciona l segmento de la pita, Limites de los sepmentas Los registros de segmentos contienen la direcciGn inicial de cada segmento. La figura 1-4 presenta unesquema de los registros CS, DS y SS; los registros y segmentos no necesariamente estiin.en el orden mostrado. Otros registros de segmentos son el ES (segmento extra) y, en los procesadores 80386 y posteriores, los registros FS y GS, que tienen usos especializados. Como ya dijimos, un segmento inicia en un limite de parrafo, que es una direccidn por to connin divisible entre el 16 decimal, © 10 hex. Suponga que un segmento de datos inicia en Ia localidad de memoria 045 POH. Ya que en este y todos los demas casos €1 dltime digito hexadecimal de la derecha es cero, los diseftadores de computadora decidieron que seria innecesario almacenar el digito cero en el registro del segmento. Asi, (45FOH se almacena como 045F, con el cero de la extrema derecha sobrentendido. En donde sea spropiado, el texto indica al cero de la derecha con corchetes, como en 045F[0} stamens Figura 1-4 Segmentos y registros 12 Intreduceién al hardware dela PC — Capitulo 1 Desplazamientos de segmentos En un programa, todas las localidades de memoria estén referidas a una direccién inicial de segmento, La distancia en bytes desde la direccién del segment se define como el desplazamienta (offset). Un desplazamienio de dos bytes (16 bits) puede estar en el rango de OOOH hasta FFFFH, o bien, desde cero hasta 65,535. Asi, el primer byte del segmemto de cddigo tiene un desplaza. miento-00, el segundo byte tiene wn desplazamiemto Ot, etc. hasta el desplazamiemo 63,335. Para referir cualquier direceién de memoria en un segmento, el procesador combina la direccién del segmento en un regisire de segmento con un valor de desplazamiento En el ejemplo siguiemte, el registro DS contiene la direccidn de segmento del segmento de datos en O4SF[O] hexadecimal y una instruccion hace referencia a una localidad con un desplaza- miemto de 0032H bytes dentro del segmento de datos. EL 7 j ! irecciGn de segmento (4SFOH esplazamiena 32H Por tanto, la localidad real de memoria del byte referido por 1a instruccién es ($4622H. Direccién del segmento DS: G45FOH Desplazamiento: +0032H Direceion real 04622H Note. que un programa tiene uno o mas segmentos, los cuales pueden iniciar casi en cual quier lugar de memoria, variar en tamaio y estar en cualquier orden. Capacidad de direecionamiento La serie de PC ha usade varios procesadores Intel que proporcionan diferentes capacidades de: direceionamiento Direceionamiento de 8086/8088, Los registros de los procesadores 8086/8088 proporcio- nan 16 bits. Ya que una direccidn de segmento esti en el limite de un parrafo, los 4 bits de la extrema derecha de: su direccién son cero. Como ya vimos, una direccién es almacenada en un registro de segmento, y la computadora asume los cuatro dltimos bits de la derecha como ceros (un digito hexadecimal), como anan[0] hex. Ahora, FFFE[OJH permite direccionar hasta 1,048,560 byies. Si tiene duda, decodifique cada F hex come el 1111 binario, considere los cuatro dltimos bits de la derecha como ceros y sume: los valores de los bits a 1. Direcctonamiento 80286. En modo real, el procesador 80286 maneja ¢l direccianamiemio de la misma manera que lo hace el 8086, En moda protegide, el procesador utiliza 24 bits para direceionamiento, de manera que FFFFF[0] permite diteccionar hasta 16 millones de bytes. Los registros de segmento actéan come seleccionadores para accesar una direccidn de segmento de 24 bits de la memoria y sumar este valor a un desplazamiento de direceién de 16 bits: Regiutra de segment: 16 bits (0000), Direccién det segment: Da bats Registros 13 Direccionamiento 80386/486/586. En modo real, estos procesadores manejan el direc- cionamiento de forma muy parecida a como lo hace un 8086. En modo provegid, tos procesadores utilizan 48 bits para el direccionamiemto, lo que permite direcciones de segmento de hasta cuatro mil millones de bytes. Las registros de segmento de 16 bits actdan como seleocionadores para el acceso a direcciones de segmento de 32 bits de la memoria y para agregar este valor a un despla- zamiento de direeeién de 32 bits Registro de segmenio: 16its [0000] Dareceién del segment 3 REGISTROS Los registros del procesador se emplean para controlar instrucciones en ejecucién, manejar direccionamiento de memoria y proporcionar capacidad aritmética. Los registros son direccionables por medio de un nombre. Los bits, par convencién, se aumeran de derecha a izquierda, como en: M4 12 12 1 Ww 9876S 4 I2IIO Registros de segmento Un registra de segmento tiene 16>its de longitud y facilita un érea de memoria para direceionamiento conocida come el segmento actual. Como hemos dicho, un segmento se alinea en un limite de pirrafo y su direceién en un registro de seamenio supone cuatro bits 0a su derecha. Registro CS. El DOS almacena la direccién inicial del segmento de cédigo de un progra- ma en el registro CS. Esta direccién de segmento, mis un valor de desplazamiento en ¢l registro de apuntador de instruccién (LP), indica la direccién de una instroccién que es buscada para su ejecuciGn, Para propésitos de programacién normal, no se necesita referenciar el registro CS. Registro DS. La direccitin inicial de un segmento de datos de programa es almacenada en el registro DS. En términos sencillos, esta diteccién, més un valor de desplazamiento en una insiruceién, genera una referencia a la localidad de un byte especifico en el segmemto de datos. Registro SS, El registro S$ permite la colocacién en memoria de una pila, para almacena- miento temporal de dirceciones y datos. El DOS almacena la direccién de inicio del segmento de pila de un programa en el registro SS. Esta direccién de segmento, mis un valor de desplaramien to en el registro del apuntador de Ia pila (SP), indica la palabra actual en la pila que esté siendo direccionada. Para propésitos de programacién normal, no se necesita referenciar el registro SS. Registro ES. Algunas operaciones con cadenas de-caracteres (datos de caracteres) utilizan el registro extra de segmento para manejar el direccionamiento de memoria, En este contexto, el registro ES esti asociado con el registro DI (indice). Un programa que requiere el uso de! registro ES puede inicializarlo con una direcctén de segmento apropiada. Registros FS y GS. Son registros exira de segmento en los procesadores 80386 y poste~ riores. 4 Intraducci6n al hardware dela PC Capitulo 1 Registro de apuntador de instrucciones El registro apuntador de instrucciones (IP) de 16 bis contiene el desplazamicnio de direccién de Ia siguiente instruccién que se ejecuta. El IP esté asociada con el registro CS en el sentide de que el IP indica la instrucci6n actual deniro del segmento de cédigo que se est4 ejecutando actualmente Por lo comin, usted no refiere el registro IP en un programa, pero, para probar un programa, si puede cambiar su valor por medio de! programa DEBUG del DOS. Los procesadores 80386 y posteriores tienen un IP ampliado de 32 bits, llamado EIP. En el ejemplo siguiente, el registro CS contiene 25A4I0}H y el IP contiene 412H. Para encontrar la siguiente instruccién que sera ejecutada, el procesador combina las direcciones en ¢l CS y el IP: Segmento de direccidn en el registro CS: 25A40H Desplazamiento de direccign en el registro IP: + 12H Direccién de la siguiente instreccién: 25E52H Registros apuntadores Los registros SP (apuntador de la pila) y BP (apuntador base) estin asociados con el registro SS y permien al sistema accesar datos en el segmento de Ia pila. Registro SP, Fl apuntador de la pila de 16 bits est asociado con el registro SS y propor ciona un valor de desplazamicnto que sc refiere a Ia palabra actual que esta siendo-procesada en la pila. Los procesaderes 80386 y posteriores tienen un apuntador de pila de 32 bits, el registro ESP. El sistema maneja de manera automatica estos registros. En el ejemplo siguiente, e] registro SS contiene Ia direcciGn de segment 27B3[0]H y el SP, ¢l desplazamiento 312H. Para encontrar la palabra actual que esté siendo procesada en la pila, la computadora combina las direcciones en el SS y el SP: Direcci6n de segmento en el registra SS: 27B30H Desplazamiento en el registro SP: +312H Direceién én la pila: 27E42H LTT LT ‘2783 0)H_ 3H Direccid del sepmenso 8S Desplataieatn det SP Registro BP. E] BP de 16 bits facilita la referencia de pardmetros, los cuales som datos y direcciones transmitidos via la pila, Los procesadores 80386 y posteriores tienen un BP ampliado de 32 bits liamado el registro EBP. Registras de propésite general Los registros de propdésito general AX, BX, CX y DX son los caballos de batalla del sistema. Son tinicos en el sentide de que se puede direccionarlos come una palabra 0 como una parte de un byte. E! ltimo byte de la izquierda es la parte “alta”, y el dltimo byte de la derecha es 1a parte “baja” Por ejemplo, el registro CX consia de una parte CH (alia) y una parte CL (baja), y usted puede referirse a cualquier parte por su nombre. Las instrucciones siguientes mueven ceros a los regis- wos CX, CH y CL, respectivamente, Registros 15 MON CK.O0 ww Los procesadores 80386 y posteriores permiten el uso de todos los registros de propésito general, mas sus versiones ampliadas de 32 bits: EAX, EBX, ECX y EDX Registro AX. El registro AX, el acumulador principal, es utilizado para operaciones que implican entrada/salida y 1a mayor parte de la aritmética. Por ejempio, las instrucciones para multiplicar, dividir y waducir suponen el uso del AX. También, algunas operaciones generan cédigo mas eficiente si se refieren al AX en lugar de a los otros registros ax (Taw [a BAX: Registro BX. El BX es conocido como el registro base ya que es el tinico registro de propdsito general que puede ser un indice para direccionamiento indexado. Tambign es comiin emploar ¢l BX para célculos. BX: BH BL EBX: Registro CX. El CX es conocida como el registro contador. Puede contener un valor para controlar el niimero de veces que un ciclo se repite 0 un valor para corrimiento de bits, hacia la derecha © hacia la izquierda. El CX también es usado para muchos eélculos, oe or ECX; Registro DX. El DX es conocido come el registro de datos, Algunas operaciones de entra da/salida requieren su uso, y las operaciones de multiplicacién y divisién con cifras grandes suponen al DX y al AX trabajando juntos. Dx: DH EDX Puede usar los registros de propésito general para suma y resta de cifras de 8, 16 0 32 bits Registras indice Los registras SI y DI estan disponibles para direecionamiemto indexado y para sumas y restas, 16 Introduceién al hardware dela PC Capitulo 1 Registro SI. El registro indice fuente de 16 bits es requerido por algunas operaciones con cadens (de caracteres). En este contexto, el SI estd asociado con el registro DS. Los procesaderes ‘80386 y posteriores permiten el uso de un registro ampliado de 32 bits, el ESI Registro DI. El registro indice destino también es requerido por algunas operaciones con cadenas de caracteres. En este contexto, el DI estd asociado con el registro ES. Los procesadores ‘80386 y posteriores permiten ei uso de un registro ampliado de 32 bits, el EDI. Registro de banderas De los 16 bits del registro de banderas, nueve son comunes a toda la familia de procesadores ‘8086, y sirven para indicar el estado actual de la méquina y el resultado del procesamiemo ‘Muchas instrucciones que piden comparaciones y aritmética cambian el estado de las banderas, algunas de cuyas instrucciones pueden realizar pruebas para determinar la accién subsecuente En resumen, los bits de las banderas comunes son como sigue: OF (overflow, desbordamiento). indica desbordamiento de un bit de orden alto (mas a la izquierda) después de una operacién aritmética DF (direcciém). Designa la direccién hacia la izquierda o hacia la derecha para mover 0 comparar cadenas de caracteres IF (interrupeién), Indica que una incerrupcién externa, como la entrada desde el reclade, sea procesada o ignorada, ‘TF (trampa). Permite 1a operacién del procesadior en modo de un paso. Los programas depuradores, como DEBUG, activan esis banders de manera que usied pueda avanzar en la ejecucién de una sola instruccién a un tiempo, para examinar el efecto de esa instruccién sobre las registrds y la memoria. SF (signo). Contiene el signo resultante de una operacién aritmética (0 = positive y 1 = negativo). ZF (cero). Indica el resultado de una operacién aritmética o de comparacién (0 = resul- tado diferente de cero y 1 = resultado igual a cero) AF (acarreo auxiliar). Contiene un acarrea externo del aritmética especializada. PF (paridad). Indica paridad par o impar de una operacién en datos de acho bits de bajo orden (més a la derecha). 3 en un dato de acho bits, para CF (acarreo). Contiene el acarrea de orden més alto (mais a la izquierda) después de una operacién aritmética; también eva el contenido del ditimo bit en una operacién de corrimiento © de rotacidn. Las banderas estén en ef registro de banderas en las siguientes posiciones: Nim debt: IS72 1 ow 98 8 7 6 8 4 3 2 1 ° vues [T][[Tole[i[rls]z]]allelle] Puntos clave Ww Las banderas mas importantes para la programacién en ensamblador son O, $, Z y C, para operaciones de comparacién y aritméticas, y D para operaciones de cadenas de caracteres. Los procesadores 80286 y posteriores tienen algunas banderas usadas para propésitas internos, en especial las que afectan al modo protegido, Los procesadores 80386 y posteriores tienen un regis- to extendido de banderas conocido como Eflags. El capitulo 8 contiene detalles adicionales acer- ca del registro de banderas. PUNTOS CLAVE ‘» La computadora distingue entre bits 0 (apagado) y 1 (encendido), y realiza aritmética 3610 en formato binario. + El valor de un nimero binario se determina par la ubicacién de sus es igual a? + 240+ 2,013 ‘+ Un mimero binario negative se representa en notacién de complemento a dos: se invierten los bits de su representacién positiva y se suma 1. + Un solo cardcter de memaria es un byte; comprende ocho bits de datos y un bit de paridad. Dos bytes adyacentes comprenden una palabra, y cuatro bytes adyacentes, una palabra doble. + El valor de K es igual a2", 0 1,024 bytes. + El formato hexadecimal es una notacién abreviada para representar grupos de cuatro bits. Los digitos hexadecimales 0-9 y A-F representan los mimeros binarios desde 0000 hasta aL + La representaciGn de datos de caracteres es realizado en el formato ASCII. + El corazén de la PC es el microprocesador. El procesador almacena datos numéricos en palabras de memoria en secuencia inversa de bytes * Los dos tipos de memoria son ROM y RAM. + Un programa en lenguaje ensamblador consiste en uno o mis segmentos: un segmento de la pila para mantener las direceiones de regreso, un segmento de datos para definir éreas de datos y de trabajo y un segmento de oédigo para instrucciones ejecutables. Laé localidades en un segmento son expresadas como un desplazamiento relativo a la direccidn inicial del segment, « Los registros de CS, DS y 8 permiten el direccianamiento de los segmentos de eédigo, datos y de la pila, respectivamente + El registro IP contiene Ia direceiéin de desplazamiento de la siguiente instruccién que es ejecutada, *« Los registros de apuntador SP y BP esuin asociados con el registro 8S y permiten al sistema accesar datos en el segmento de 1a pila. «+ Los registros de prapsito general AX, BX, CX y DX san los caballos de batalla del sistema, El tiltimo byte a la izquierda es 1a parte “alta”, y el dltime byte a la derecha es la parte “baja”. El AX (acumulador principal) se emplea para entrada/salida y para la mayor parte de la aritmética, El BX (registro base) puede ser usado como un indice en direccionamiento extendido. E] CX es conocide como el registro contador y el DX como el registra de datos + Los regisiros SI y DI estin disponibles para direccionamiemo extendido y para sumas y rrestas. Estos registros también se necesitan para algunas operaciones con cadenas de caracteres (cardcter). Asi, 1011 binario 18 Introducci6n al hardware dela PG Capitulo 1 + El registro de banderas indica el estado actual de la computadora y los resultados de ts ejecucién de las instrucciones. PREGUNTAS: 1-1. Determine ta coafiguracin binaria en bits de los siguientes riimeras: (a) 6; (b) 14; (@) 22; (€) 28; (e) 20. 1-2, Sume los siguientes mimeros binarios: (@) 9001010 (&) OOTTIIOL — fe) OOMTTION (ay OON0 ‘0001 101 ‘oo1010r0 000011 oo L 10 13. Halle el complements a dos. de los siguiemes nimeros binaries; (a) OOO10110; (b) OOLII1O1; (c) ooLit 100 1-4, Encuentre el valor positivo (absoluto) de los siguientes nuimeros binarios negativos: (a) 11001000; (b) TOLILLON; (c) LULTLT1O; (@) FELT. 1-8. Determine la represemacién hexadecimal de los valores siguientes: (a) codigo ASCII de la letra Q; (b) cédigo ASCII del ndimero 7; (c) 01011101 binario, (d) 01110111 binari 1-6. Sume los niimeros hexadecimales siguientes (@) 2346 (be) SIED 7779 td) EABE—(@)_:FBAC. +0022 +0003 +0887 $284 +0CBE 1-1. Determine la representacién hexadecimal de los mimeros decimales siguientes. Consulte el apéndice ‘A para ver el métode de conversidin. También debe verificar su resultado al convertir el hexadecimal a binario yal sumar los bits de 1. (a) 19; (b) 33; (¢) 88; (d} 255: (e) 4,095; «f) 63,398 1-4, Proporcione in configuracién ASCH, en bits, de los siguientes caracteres de un byte. Utilice el apéndice B como guia: (a) P; (b) p: (¢) #: (@) 5. {Cust es objetiva del procesador? {Cuiles son las dos clases principales de memoria en la PC y cusles, sus principales uses? Muestre cémo el sistema almacena 012345 hex como un valor en la memoria, Explique lo siguiente: (a) segmento; (b) desplazamiento (offset); (c) Nanite de diveceién, {Cutles son: (a) las tres clases de segmentos; (hb) su tamafio maximo: y (C) ef limite de direceiéa en el que ellos inician? Sefale el objetivo de cada uno de los tres registros de segments, Explique qué registros ve utilizan para los siguientes propésitos: (a) sumar y restar; (b) comar los ciclos; (¢} muliplicar y dividir; (4) segmentos de direccionamiento; (e) indicacidn de un resultado igual a cera; (f) desplazamiento de direccidn de una instruceidn que se va a ejecutar 1A16. Muestre el registro EAX y el tamaiio y posiciin de AH, AL y AX en él. 1.17. Codifique las instrucciones en lenguaje de ensamblador para mover el nidmert 25 a los eegistros femtes: (a) CH; () CL; (6) CX; (@) BCX. CAPITULO 2 Requerimientos de software de la PC OBJETIVO: Explicar et ambiente general de software para la PC. INTRODUCCION En este capitulo describimos el ambiente de software de la PC: las funciones del DOS y sus ‘eomponentes principales. Examinamos el procesa de arrangue (cémo es que el sistema se autocarga cuando usted enciende su computadora) y consideramos cémo el sistema carga un programa para sjecutarlo, cémo utiliza ta pila y emo una instruccién en el segmento de cédigo direcciona datos en el segmento de datos. E} capitulo se completa con Ia explicaciin bisica de! software y hardware de la PC y nos permite continuar con el capitulo 3, en donde cargamos programas clave en la memoria y los ‘¢jecutamos paso a paso. CARACTERISTICAS DEL SISTEMA OPERATIVO El DOS es un sistema operative que proporciona acceso general © independiente de los dis- ‘positives a los recursos de la computadora, Los dispositivos que permite incluyen teclados, panta~ llas y unidades de disco, Por “independencia de dispositivos” debe entender que no es preciso dirigirse especificamente a los dispositivos, ya que el DOS y sus controladores de dispositivos pueden manejar las operaciones a nivel de dispositive. 19 20 Requerimientos de software dela PC Capitulo 2 Entre las funciones del DOS que nos conciernen en este libro, estén las siguientes: + Administracién de archivos. El DOS mantiene los directorios y archivos en los discos de sistema. Los programas crean y actualizan archivos, pero el DOS tiene la responsabilidad de administrar sus ubicaciones en el disco. + Entrada/satida (E/S). Los programas solicitan datos de entrada al DOS o entregan informacion al DOS por medio de interrupciones. E] DOS releva al programador de codificar a nivel de B/S. * Carga de programas, Un usuario 0 programa solicita la ejecucién de un programa; el DOS maneja los pasos necesarios para tener acceso al programa desde el disco, colocatle en la memoria ¢ inicializarlo para su ejecucién. + Administracién de la memoria. Cuando el DOS carga un programa para su ejecucién, asigna suficiente espacio en memoria para el eédiga del programa y sus datos. Los programas pueden procesar datos dentro de su drea de memoria, liberar memoria que no necesiten ¥ solicitar memoria adicional. + Manejo de interrupciones. El DOS permite a Jos usuarios instalar programas residentes ep memoria que se adhieren al sistema de interrupeiones para realizar funciones especiales. Organizackin del DOS Los tres componentes principales de! DOS son 1O.SYS, MSDOS.SYS y COMMAND.COM. EI 10.SYS realize las funciones de inicializacién en el momento del arranque y también contiene importantes funciones de E/S y controladores de dispositives que dan el soporte de E/S bésico en el BIOS de ROM. Este componente esté almacenado en disco como un archivo de sistema oculte y es conocido come IBMBIO.COM en e! PC-DOS. El MSDOS.SY$ actia como el miicleo (kernel) del DOS y se ocupa de ia administracién de archivos, de memoria y de entrada/salida, Este componente esté almacenado en disco como un archivo de sistema y en el PC-DOS se conoce como IBMDOS.COM. (COMMAND. COM és un procesador de comandos shell que actda como la interfaz entre 1 usuario y el sistema operative. Muestra la indicacién del DOS, monitorea el teclado y procesa los:comandos del usuario, como borrado de tn archive o carga de un programa para su ejecucién, EL PROCESO DE ARRANQUE Encender la computadora provoca una “iniclalizacién” (algunos le llaman “arrangue en fio"). El procesador introduce un estado de restauracién, limpia todas las localidades de memoria (es decir, coloca cero en todas ellas), realiza una verificacién de paridad de la memoria y asigna al registro CS la direcci6n del segmento FFFFIOJH y al registro [P el desplazamiento cero, Por tanto, la primera instruccién a ejecutarse esté en la direccién formada por la pareja CS:1P, que es FFFFOH, la cual es el punto de entrada al BIOS en ROM. [La rutina de BIOS que inicia en FFFFOH verifica los diferentes puertos para identificarlos ¢ inicializa los dispositivos que estén conectados a Ia computadora. Después et BIOS establece dos areas de datos: 1. Una tabla de servicios de interrupeién, que en memoria baja en la localidad 0 y contiene las direcciones de las interrupciones que ocurren. 2. Undreade datos de BIOS que inicia en la localidad 40(0), que estd estrechamente relacionada con los dispositivas conectados. Programa cargador del sistema 21 640K — Parte tranaitoria 4el CoMMAND.coM (programas que se estén ejecutande Parte residente dei CommMAND. Com (reside de manera permanente? or Mapa de la memoria convencional A conlinuacién el BIOS determina si est presente un disco que contenga los archivos de sistema del DOS y, en caso de que asi sea, accesa el cargador de arranque desde exe disco. Este programa carga los archivos de sistema I0.SYS y MSDOS.SYS desde e! disco hacia la memoria ¥ transfiere el control al punto de entrada del IO.SYS, el cual contiene los controladores de dispositivos y otro eédigo especificn del hardware, El 10.SYS se reubica él mismo en memoria y transfiere el control al MSDOS.SYS. Este médulo inicializa las tablas internas del DOS y la porcién del DOS de la tabla de interrupciones. También lee el archivo CONFIG.SYS y ejecuta sus comandos. Finalmente, el MSDOS.SYS pasa el control al COMMAND.COM, el cual procesa ¢l archive AUTOEXEC. BAT, muestra su indicaciém y monitorea las entradas dadas desde el veclado. En este punto, Ia memoria convencional hasta los 640K aparece como se muestra en la figura 2-1, Por medio de un administrador de memoria, parte del DOS puede ser reubicado en 1a me- moria alta. INTERFAZ DOS-BIOS. BI BIOS contiene un conjunto de rutinas en ROM para dar soporte a los dispositivos. El BIOS prueba ¢ inicializa los dispositivos conectados y proporciona los servicios que son usados para la lectura y escritura desde los dispositivos. Una tarea del DOS es hacer interfaz con el BIOS cuando cexista una necesidad de accesar estas facilidades ‘Cuando un programa usuario solicita un servicio det DOS, éste podria transferir la solicitud al BIOS, el cual a su vez accesa el dispositive solicitado. Sin embargo, algunas veces un programa hace la peticién directamente al BIOS, especificamente para servicios del teclado y de la pantalla Y en otras ocasiones -aungue es raro y no recomendable- wn programa puede pasar por alto tanto al DOS como al BIOS para accesar un dispositive direetameme, La figura 2-2 muestra estas trayectorias altcrnas. PROGRAMA CARGADOR DEL SISTEMA EL DOS da soporte a dos tipos de programas ejecutables: COM y .EXE. Un programa .COM ‘consta de un segmento que contiene eédigo, datos y la pila. Si se necesita un pequetio programa de utileria oun programa residente en memoria (un programa que es instalado permanentemente y estd disponible mientras otros programas estin ejecutandose), se escribe un programa COM. Un programa .EXE consta de segmentos de eédigo, datos y de la pila separados y es el método usado por la mayorfa de los programas serios, Este libro usa. ambos tipos de programas. 2 Requerimienios de software de laPG Capitulo 2 Programas de usuarios Hardvare/Dispositivos Figura 2-2 Interfax DOS-BIOS ‘Cuando usted le solicita al DOS cargar un programa .EXE desde el disce a la memoria para su ejecucién, ef cargador realiza las siguientes operaciones: 1. Accesa el programa .EXE desde el disco. 2. Construye un prefijo de segmento de programa (PSP) de 256 bytes (100H) en un limite de parrafo en memoria interna disponible. 3. Almacena el programa en memoria inmediatamente después del PSP. 4. Carga la direccién del PSP en los registros DS y ES. 5. Carga la direccién del segmento de cidigo en el CS y establece el IP al desplazamiento de la primer instruccién (por lo comin cero) en el segmento de cédigo. 6, Carga la direccisn de Ia pila en el SS y establece el SP al tamatio de la pila. Transfiere el control al programa para ejecucién, iniciando (por lo comin) con La primer instracciGn en el segmento de cédigo. En.esta forma, el cargador DOS inicializa correctamente los registros CS:IP y SS:SP. Pero note que el programa cargador almacena la direccién del PSP tanto en el registro DS como en el ES, aunque su programa normalmente necesita la direccién del segmento de datos en estos regis- tros. Como consecuencia, sus programas ti¢nen que inicializar el DS con la direccién del segmen- to de datos, como se verd en el capitulo 4, Ahora examinaremos la pila y después los segmentos de cédigo y datos LA PILA (STACK) Los programas .COM y EXE, requieren un rea en el programa reservada como una pila (stack), El propésito de la pila es mantener un espacio para el almacenamiento temporal de direcciones y datos. E} DOS define de manera automdtica la pila para un programa .COM, mientras que para un programa .EXE usted debe definir en forma explicita la pila. Cada elemento de dato en la pila es una palabra (dos bytes). El registro SS, como es inicializado por el DOS, contiene la direccién del inicio de 1a pila. Inicialmemte, el SP contiene ef tamafio de la pila, un valor que apunta al byte que est pasando ¢! final de la pila. La pila difiere de otros segmentos en su método de almacenar los datos: empieza en Ia localidad més alta y almacena los datos hacia abajo por la memoria. a pila (stack) 2 | \ ss sP dlreceid del segmento-de ta pila tope oe ia pita La instruceién PUSH (entre otras) disminuye el SP en 2 hacia abgjo, hacia la siguieme palabra almacenada de la pila y coloca (0 empuja, push) un valor abi. La instruccién POP (entre otras) regresa el valor de la pila © incrementa el SP en 2 hacia arriba, hacia la siguiente palabra almacenada. El ejemplo siguiente ilustra como meter el contenido de los registros AX y BX a la pila y la subsecuente extraccién de ellos. Suponga que el AX contiene 015AH, el BX contiene 03D2H y el SP contiene 28H (aqui no nos concierne la direceién en el SS), 1. Al comienzo, la pila esta vacia y se ve asi: [ I I I 1 1 88 SP =28 direcctéa del segmento de la pila tope de Ia pila 2. PUSH AX: disminuye el SP en 2 (2 26H) y almacena el contenido del AX, O1SAH, en la pila. Observe que la operacién invierte la secuencia de bytes almacenados, de modo que O15A se convierte en SAO1 I I [Tan 1 I ss sP=36 Atirescidn det segment deta pla tape de a pila 3. PUSH BX: disminuye el SP en 2 (a 24H) y almacena el contenido del BX, 03D2H, en la pila: [ I onan ! 1 ss sP=26 siresciin det sapmentoe a pits tope deta pla 4, POP BX: regresa la palabra que se encuentra en la pila, en donde apunta el SP, y la envia al registro BX ¢ incrementa el SP en 2 (a 26H). El BX ahora contiene 03D2H, con los bytes correctamente invertides: i . | pana | SA01 ss SP= 26 Mireceiia del segmente de In. pila ope de ta pala Requerimientos da software de laPC Capitulo 2 5. POP AX: regresa la palabra que se encuentra en la pila, en donde apunta el SP, y la envia al registro AX ¢ incrementa el SP en 2 (a 28H), El AX ahora contiene O1SAH. con los bytes correctamente invertidas: I I bam [sani | 1 | ss SP =28 direcetin del segmento de ta pila tope de la pila ‘Note que las instrucciones POP son codificadas en secuencia inversa a las instrucciones PUSH. Asi, en el ejemplo se guardaron AX y BX, pero se sacaron el BX y AX, em ese orden, Ademés, Jos valores sacados de la pila atin estén alli, aunque cl SP ya no apunta a ellos Siempre debe asegurarse que su programa coordine los valores que guarda en la pila con los valores que saca de ella, Como éste es un requisito directo, un error puede causar que un progra- ma no funcione. También, para un programa .EXE usted tiene que definir una pila que sca suficientemente grande para contener todos los valores que podrian ser guardados en ella, Onras instrucciones relacionadas con los valores que guarda y saca de la pila son: + PUSHF y POPF: Guarda y restablece el estado de los banderas. + PUSHA y POPA (para el 80286 y posteriores): Guarda y restaura el contenido de todos los registros de propésito general DIRECCIONAMIENTO DE PROGRAMAS Normalmente, los programadores escriben.en codigo simbdlico y utilizan ensamblador para tradu- cirlo a cédigo de mdguina. Para ejecutar un programa, el DOS carga slo cédigo de miquina en la memoria. Cada instruccidn consta de al menos una operacién, como mover, sumar 0 regresar. Dependiendo de la operacién, una instruccién también puede tener uno o més operandos que referencian los datos que la operacién procesa. ‘Como se estudié en el capitulo 1, el registro CS proporciona la direceién de inicio de un segmento de cédigo de programa y ¢l registro DS ofrece la direcein de inicio del segmento de datos, El segmento de cédigo contiene instrucciones que serin ejecutadas, mientras que el seg- mento de datos contiene los datos que las instrucciones referencian. El registro IP imdic direc- cidm de! desplazamiento de la instruccién actual, en el segmento de cOdigo, que es ejecutada, Un operando de Ia instruccién indica una direcciGn de despiazamiento en el segmento de datos que es referenciada ‘Considere un ejemplo en el que c] DOS ha determinada que se carga un programa EXE en memoria, iniciando en la localidad O4A POH. El DOS, de acuerdo con esto, asigna el registro CS Ja direccién del segmento 04AF[OJH y al DS con, digamos, la direccién de segmento-04B1[0]H. El programa ya ha iniciado su ejecucién, y el IP actualmente contiene el desplazamiento (023, La pareja CS:IP determina la direccién de la siguiente instruceién a ser ejecutada, como sigue: Direcci6n del segmento CS: 4AFOH Desplazamiento IP: +0013H Direccién de !a instruccién: © 4BO3H Direceionamiento de programas 25 Digamos que la instrucciGn que inicia en 04B03H copia los contenidos de un byte en memoria al registro AL; el byte esti en el desplazamiento 0012H en el segmento de datos. Aqui estén tanto el, Codigo de maquina como el cédigo simbdlico para esta operacion nowzoo Mov AL, [00321 1 Localidad o4no3H La localidad de memoria 04B03H contiene l primer byte (AQ) de la instruccién que el procesador accesa. El segundo y tercer bytes contienen el valor del desplazamiento, en secuencia invertida de bytes (0012 se convierte en 1200). Para accesar el elemento de dato, el procesador determina su localidad de la direccién def segmento en el registro DS més el desplazamiento (0012H) en el operando de la instruccién. Ya que el DS contiene 04B1[0]H, la localidad actual del elemento de dato referenciado es: Direccién del seamento DS: 4BI0H Desplazamiento del segmento: — +0012H Direceién del dato: 4B22H Hagamos que la localidad 04B22H contenga 1BH. Entonces el procesador extrac el 1BH de la localidad 04B22H y la copia en el registra AL, como se muestra en la figura 2-3 Cuando el procesador busca cada byte de la instriccién, incrementa el registro IP de manera que éste contenga el desplazamiento (0016H) para la siguiente instruccidn. El procesador ahora esté preparado para ejecutar la siguiente instruccién, la cual se deriva otra vez de la direccién del segmenio enel CS (04APOH) mis el desplazamiento actual en el IP (0016H) —de hecho, O4BO6H, Una instruceidn también puede accesar mis de un byte ala vez. Por ejemplo, supongamos que una instruccién es almacenar los contenidos del registro AX (0567H) en dos bytes adyacentes en el segmema de datos empezanda en el desplazamiento OO12H. El cédigo simbélico es MOV [0012], AX. El operando [0012] entre corchetes (un operador de indice) indica una localidad de memoria para distinguirlo del simple mimero 12, El procesador carga los dos bytes en el AX en secuencia inversa de bytes como Comenide de los bytes: 7 os | Desplazamiento en el segmento de datos: 0012 0013, ‘Otra instruccién, MOV AX,[0012}, puede recuperar subsecuentemente esios bytes para copiarlos de Ja memoria de regreso al AX. La operacién invierte (y corrige) los bytes en el AX como 05 67 ‘Segmante oe tates Figura 2-3. Segmentos y desplazamientos 26 Requerimiontos de software de laPC — Capitula 2 REFERENCIAS A MEMORIA Y A REGISTROS Una caracteristica para obtener claridad en las instrucciones es ¢| usa de nombres de operandos, de nombres entre corchetes y de mimeros. En los ejemplos siguientes, WORDA esta definida como una palabra (dos bytes) en memoria: WoRDA DW ° sDefine una palabra Mov Ax, BK iMueve low contenido de Bx a AX mov AX, WORDA :Mueve los contenidos de WORDA a AX mov AX, 28 runve el valor 28 3 Ax now Ax, [8] ;Mueve los contenidos de la localidad especificads por BX Los corchetes en el cuarto ejempla definen un operador de indice que significa: wilizar una direecién de desplazamiento en el BX (combinada con la direccién del segmento en el DS, como 1DS:BX)-para tocalizar una palabra en memoria y mover su contenido al AX, Comparese el efecto de esta instruceién con aquella del primer ejemplo, 1a cual simplemente mueve los contenidas del BX al AX. PUNTOS CLAVE ‘+ Los tres componentes principales del DOS son 10,SYS, MSDOS,SYS y COMMAND.COM. + Al encender la computadora $e provoca una inicializacién, también Hamada “arrangue en frio”. El procesador introduce un estado de restauracidm, limpia todas las localidades de memoria poniéndolas en cero, realiza una verificacién de la paridad de la memoria y establece Jos registros CS e IP al punto de entrada del BIOS en ROM. + Los dos tipos de programas del DOS son .COM y .EXE. + Cuando usted solicita al DOS cargar un programa .EXE para su ejecucién, el DOS construye un PSP de 256 bytes (00H) en vn limite de pérrafo en memoria y almacena el programa inmediatamente después del PSP. Después carga la direccién del PSP en los registras DS y ES, carga la diréccién del segmento de cddigo en el CS, establece el IP al desplazamiento de la primera instruccién en el segmento de cédigo, carga la direccién de la pila en el 58 y establece el tamafio de la pila. Finalmente, el cargador transfiere el control al programa por ejecutarse. + El propésito de la pila es proporcionar un espacio para el almacenamiento temporal de direeciones y datos. Cada dato en la pila es una palabra (dos bytes) + El DOS define la pila para un programa .COM, mientras que para un programa .EXE se debe definir de manera explicita la pil + Cuando el procesador busca cada byte de una instruccidn, incrementa el regisiro IP de manera que el IP contenga él desplazamiento para la siguiente instruceisn. Pregumtas 2 PREGUNTAS 241. ;Cuales son las cinco funciones principales del DOS? 2.2, (,Cudles son las tres componenies principales del DOS y cuil es. propssito de cada tuno-de ellos? 2-3. ,Qué pasos realiza el sistema en una inicializacisn (arranque en frio)? 2-4. (a) {Qué drea de datos construye el DOS y almacena en frente de un médulo ejecutable, cuando el modulo es cargado para su ejecucién? (b) {CuAl es el tamafio de esta drea de datos? 2-5, ELDOS realiza ciertas operaciones cuando carga un programa .EXE para su ejecucién, Qué valores inicializa ef DOS (a) en los registeos CS e IP? (b) jen las registros SS y SP? (e} gen los registras DS yES? 2-6. (Cudl es el objetivo de la pila? 2-7, De qué forma se define Ia pila pars (a) un. programa .COM y (b) un programa .EXE? (Esto es, {quién 0 qué define ta pila?) 2-8. (a) {Cuil es el tama de cada entrada de la pila? (b) jin dénde se encvenira inicialmente la parte superior de la pila y c6mo es direccionada? 2.9, Durante la ejecucion de un programa, el CS contiene SA2B(0), el SS contiene SBS3{0), el IP contiene 52H y el SP contiene 48H. (Los valores se muestran en secuencia normal, no en secuencia invertda de bytes.) Calcule las direcciones de (a) la instrucciGm a ejecutarse y (b) Ia parte superior de a pls (Gocalidad actual), E1 DS contiene 5B24{0)] y una instruccién que mueve datos de-la memoria al AL €s ADAOI (donde AO significa “mowver"). Caleule la direccidn de memoria referenciada 210 CAPITULO 3 Ejecucion de instrucciones ‘OBJETIVO -Dar a conocer cémo introducir y ejecutar programas en la me~ moria INTRODUCCION Este capitulo utiliza un programa del DOS llamado DEBUG, que permite visualizar la memoria, introducir programas en ella y rastrear su ejecucién, El texto explica cémo se pueden introducir estos programas directamente en. la memoria en un segmento de cédigo y da una explicacion de cada paso ejecutado, Algunos lectores pueden tener acceso a depuradores sofisticados, como CODEVIEW © TurboDebugger; sin embargo, usaremos DEBUG, ya que es sencillo de usar y esti disponible en cualquier parte. En los ejercicios iniciales se inspeccionan los contenidos de areas particulares de la memo- ria. El primer programa de ejemplo utiliza datos “inmediatos™ definidos dentro de las instruccio- nes para catgar datos en registros y realizar aritmética, El segundo programa de ejemplo utiliza datos definidos de forma separada en el segmento de datos. El rastreo de emo se ejecutan estas instrucciones da una idea de la operaciOn de una computadora y la funcisn de los registras. Usted puede empezar sin el conocimiento previe de un lenguaje ensamblador o de uno de programacién. Todo lo que necesita es una IBM PC o compatible y un disco que contenga el sistema operative DOS. Ne obstante, asumimos que esti familiarizado con el arrangue de la computadora, manejo de discos flexibles y la seleccién de discos y archivos. El programa DEBUG 29 EL PROGRAMA DEBUG E] DOS viene con un programa llamado DEBUG que es utilizado para probar y depurar progra- mas ejecutables, Una caracteristica de DEBUG es que despliega todo el exdtigo del programa y los datos en formato hexadecimal, y cualquier date que se introduzca a ia memoria también estd en formato hexadecimal. Otra caracteristica es que DEBUG permite ejecutar un programa en modo de paso sencillo (un paso a la vez), de manera que se pueda ver el efecto de cada instruccién sobre las localidades de memoria y los registros. Comandos de DEBUG DEBUG proporciona un conjunto de comandos que permiten realizar diferentes operaciones iti- les, Los comandos que nos interesan en este momento son los sigitientes: Ensambiar instrucciones simbélicas y pasarlas a cédigo de miquina. Mostrar el contenido de un area de memoria Introducir datos en memoria, iniciando en una localidad especifica, Correr el programa ejecutable que se encuentra en memoria Nombrar un programa, Proceder o ejecutar un conjunic de instrucciones relacionadas. Salir de la sesién con DEBUG. Mostrar el concenide de uno o mas registras, Rastrear la ejecucién de una instruccién. “Descnsamblar” oddigo de miquina y pasarlo # codigo simbético Escribir 0 grabar un programa en disca BCAMOVZOMOy Reglas de los comandos de DEBUG Para sus propésitos, DEBUG no distingue entre letras minisculas-y maydsculas, de manera que se pueden introducir comandos de cualquier forma, También se introduee un espacio séla en donde sea necesario separar pardmetros en un comando. Los tres ejemplos siguientes utilizan cl coman- do D de DEBUG para mostrar la misma area de memoria, iniciando en el desplazamiento 200H en el segmento de datos (DS): Bb Ds+200 (comando en mayleculas, con un espacio en blanco después de #1) pps: 200 (comando en sayiisculas. con un espacio en blanco después de é1) dds-200 (comando @n sindsculas, sin espacio en blanco después de 61) Note que especifica segmentos y desplazamientos con dos puntos (:), en la forma segmento:desplazamiento. Ademés, DEBUG supone que todos los mimeros estén en formato hexadecimal. El despliegue de DEBUG El despliegue de DEBUG consiste en tres partes. A la izquierda esid la direccién hexadecimal del tiltimo byte de la izquierda que se despliega en la forma segmento:desplazamiento. El dea amplia del centro ¢s la representacién hexadecimal del rca desplegada. A la derecha esta la. representa cién en ASCII de los bytes que contienen caracteres desplegables, los cuales pueden ayudarlo a interpretar el area hexadecimal, En forma de diagrama tenemos: 30 Ejecucién de inst Capitulo 3 Pireccién | rooms om - wo Bt Rene wenni20 se OE eee x yoom:80 2 ceeeess OK “ Cada linea despliega 16 bytes de memoria. La direcciém de la izquierda se refiere sélo al ltimo byte de la izquierda, en la forma segmento:desplazamiento; puede contar atravesando la linea para determinar la posicién de cada byte. El drea de representacién hexadecimal muestra dos caracte~ res bexadecimales por cada byte, seguides por un espacio en blanco por legibilidad. Ademds, un guidn separa a los segundos ocho bytes de los primeros ocho, otra vex por legibilidad. Asi, si Usted necesita localizar el byte en el desplazamiento xx13H, inicie con xxlOH y cuente tres bytes sucesivos a la derecha, Este libro hace un uso considerable de DEBUG y explica en detalle sus comandes conforme se necesitan. El apéndice E proporciona una descripcién completa de los comandos de DEBUG. Inicio con DEBUG Para empezar con DEBUG, cologue el sistema en el directorio del disco duro que contenga DEBUG 0 bien inserte un disco flexible con e] DOS que contenga el DEBUG en la unidad por omisién, Para iniciar el programa, (eclee la palabra DEBUG y presione 1a tecla Enter. DEBUG debe cargarse del disco a la memoria. Cuando el indicador de DEBUG, un guién (.), aparezea en la pantalla, DEBUG esta listo para recibir sus comandas (esto es un guidn, aunque parezca el cursor). Ahora usemos DEBUG para curiosear por ls memoria VISUALIZACION DE LAS LOCALIDADES DE MEMORIA En nuestro primer ejercicio, usted usar DEBUG para ver el contenido de localidades selecciona- das de Ia memoria. El inico comando por el que estard interesado en este ejercicio es D (Display. el cual lista ocho Ifneas de 16 bytes cada una y muestra su representacién hexadecimal Yerificacién del equipo del sistema Primero veamos qué es lo que ha determinada el BIOS que tiene instalado su equipo. Una palabra del estado del equipo en el area de datos del BIOS, ofrece una indicacién rudimentaria de los dis- positivos instalados. Esta palabra esté en las localidades 410H-411H, que puede ver desde DEBUG por medio de una direceidin de dos partes: 40 para la direccidn del segmento (se sobrentiende el {timo cero) y 10 para el desplazamiento desde la direccién de! segmento. Lea la direceién 40:10 coma segmento 40{0]H mis un desplazamiento de 10H, Teclee de manera exacta lo siguiente: 40:19 [y presione 1a teela Eaterl El despliegue debe empezar con algo como esto: ouao:og10 63 46 En este ejemplo, los dos bytes en la palabra del estado del equipo contienen los valores hexadecimales 63 y 44. Invierta los bytes (44 63) y comviérialos a binario: Visualizaci6n de las localidades de memoria at Bit Is 14 13 12 nm 1 9 8 7 6 5 4 3 Binrio: 0 1 09 © O TF 09 0 O FT 1oo 0 1 1 A continuacién est una explicacién del cédigo hexadecimal: BITS DISPOSITIVO 15,14 Niimero de puertos paralelos para impresora conectados = 1 (binario 01) 11-9 Niimero de puertos seriales conectados = 2 (binario 010) 7,6 ‘Nuimero de dispositivos de disco flexible = 2 (donde 00 = 1,01 = 2,10 =3 y 1L=4) 5.4 Mode inicial de video = 10 (donde 01 = 40 x 25 encolor, 10 = 80 x 1225 en color y 11 = 80 X12 25 monocromatico) 1 1 = coprocesador matemtico est4 presente o 1 = unidad de disco flexible esta presente Los bytes no citados no son usados, Puede permanecer en DEBUG para el siguiente ejercicio o introduzea Q para salir. ‘Verificacién del tamafio de Ia memoria El siguiente paso es examinar la cantidad de memoria que ef DOS “piensa” que tiene instalada. Dependienda del modelo de su computadora, el valor puede estar basado en interruptores internos puede indicar menos memoria de la que realmente csté instalada. El valor esté en el drea de ‘datos del BIOS en las localidades 413H y 414H. Teclee lo siguiente exactamente coma lo ve! 2 40:23 fy pregione Enter] Et despliegue debe empezar con algo como es sosa:cora . ee FOR Los primeros dos bytes mostrados en el desplazamiento 0013H son los kilobytes de memoria en hexadecimal, com los bytes en secuencia inverts. Aqui estén dos ejemplos que muestran hexade- scimaies en orden inverso, hexadecimales corregidos y el equivalente en decimal HEXADECIMAL INVERSO HEXADECIMAL CORREGIDO DECIMAL (K) op 02 02.00 512 80 02 02 80 640 ‘Verificacidn del ntimero de serie y de la nota de derechos reservados El mimero de serie de Ia. computadora est4 alojado en cl ROM de BIOS en la localidad FEOOOH, Para verlo, teclee D PRoO:D [y presione Rater] La pantalla debe mostrar un miimero de serie de siete digitos seguido, en méquinas convenciona- Jes, de una nota de derechos reservados. El nimero de serie se muestra como niimero hexadecimal, mientras que la nota de derechos reservados es ms reconocible en el drea ASCII a la derecha. La 32 Ejecucién de insirucciones Capitulo 3 nota de derechos reservados puede continuar pasando sobre lo que ya esté mostrado; para verla, basta con presionar D, seguida de la tecla Enter, VerificaciGn de la fecha en el ROM BIOS La fecha de fabricacién de su ROM BIOS inicia en la localidad FFFFSH, registrada come mm/ dd/aa. Para verla, teclee D PFFF:S [y presions Enter) El conocimiento de esta fecha puede ser wtil para determinar la.edad y modelo de la computadora. Verificacién de la identificacién del modelo Inmediatamente después de la fecha de fabricacién del ROM BIOS esté la identificacin del modelo en la localidad FFFFEH, o FFFF:E. Aqui estén varias identificaciones de modelos conIco. MODELO FB PS/2 modelos 70 y 86 Fo PC convertible FA PS/2 modelo 30 FB PC-XT (1986) FC PC-AT (1984), PC-XT modelo 286, PS/2 modelos 50 y 60, etcétera FE PC-XT (1982), portitil (1982) FF Primera IBM PC Ahora que ya sabe cOmo usar el comande para desplegar informacién, puede ver el conteni- do de cualquier iocalidad de almacenamiento. También puede avanzar por Is memoria con slo presionar D de forma repetida: DEBUG muestra de manera sucesiva ocho Ifneas, continuando a partir de la hima operacién D. ‘Cuando haya terminado de curiosear, introduzca Q (por Quit), para salir de DEBUG 0 continie con el ejercicio siguiente EJEMPLO I DE LENGUAJE DE MAQUINA: DATOS INMEDIATOS Ahora usemos DEBUG para introducir el primero de dos programas directamente en memoria y rastrear su ejecucién. Ambos programas ilustran un sencillo cédigo de lenguaje de maquina y cme aparece en el almacenamiento principal y tos efectos de su ejecucién. Para este propésito, empe- zaremos con el comando DEBUG E (Enter, introducir). Sea muy cuidadoso en su uso, ya que introducir datos incorrectos o en una localidad equivocada puede causar resultados impredecibles. No es probable que cause daftos, pero puede sorprenderse y perder datos que haya intraducido durante la sesién de DEBUG. El primer programa utiliza daias inmediaios, datos definidos como parte de una instruccidn, Mostramos el lenguaje de maquina en formato hexadecimal y para legibilidad en cédtigo simboli- co, junto con una explicacién. Para la primera insiruceidn, el eddigo simbélico es MOV AX0123, la cual mueve (0 copia) el valor 0123H al registro AX (no tiene que definir un valor inmediato en Ejempio | de lenguaje de maquina: datos inmediatos 33 secuencia inversa de byte). MOV es la instruccién, e1 registro AX es ¢l primer operando y el valor inmediato 0123H es el segundo operande. INSTRUCCION DE conico MAQUINA ‘SIMBOLICO EXPLICACION Baa30a MOV AK, 0123 Mover el valor 03238 a Ax. osasoo ABD Ax, 9025 Sumar el valor 0025 a Ax sane MOV Bx, AX Mover el contenide de AK a BX. oana ADD BX, AK Sumar el contenide de A a BE epee MOY Cx, Bx Mover el contenido de BX @ OX ance SB Cx, Ax Restar e1 contenido de AY del de Cx. 2uce SUB AK, AX Resuar Ax de AK (Limpiar AX) 80 nop No eperacion (no hacer nada). Puede haber notada que las instrucciones de maquina pueden tener uno, dos o tres bytes de longitud. El primer byte es la operacién real y cualesquiera otros bytes, si estén presentes, son operandos: referencia a un valor inmediato, un registro 0 una localidad de memoria, La ejecucién del programa empieza con la primera instruccién de méquina y avanza por cada instruccién, una después de otra, Al llegar a este punto no esperamos que tenga mucho sentido el eddigo de maquina, Por ejemplo, cn un caso €l cOdigo de méquina (el primer byte) para mover es BS hex y en otro caso el cédigo para mover es BB hex. (Cémo introducir instruceiones de programa Iniciamos este ejercicio como lo hicimos con él anterior: teclee el comando DEBUG y presione Enter. Cuando DEBUG esté cargado por completo, despliega su indicacién (-). Para introducir este programa directamente en memoria, sélo teclee Ia parte de lenguaje de méquina, pero no-€l c6digo simbdlico o la explicaciéa. Teclee el siguiente comando E (Enter), incluso los espacios en blanco en dénde se indican: B CS;1000 BB 23 01 05 25 00 [presions Enter) C5:100 indica la direccién de memoria inicial en la que los datos se almacenardn ~100H (256) bytes siguiendo al inicio del segmento de cédigo (la direccién de inicio usual para €l c6digo de maquina con DEBUG). El comando E hace que DEBUG almacene cada par de digitos hexadecimales en un byte de memoria, desde C5:100 hasta C5:105, El siguiente comando E almacena seis bytes, empezando en CS:106.a 107, 108, 109, 10A-y 108; E C8.106 wa Da 03 DE 6B CB [eeguido por Enter] El Ultimo comando E almacena cinco bytes, iniciando en CS:10C a 10D, IE, 10F y 110: BCS:10C 28 CB 2B CO 50 [sequido por Enter} ‘Si teclea un comando de manera incorrecta, sélo repitalo con los valores. correctos. Ejecucién de Instrucciones Capitulo 3 pesaicr CL 21Ci:0100 882301 7 AX=0123 BN=D000 DS=21C1 Esa21C1 21ei 0103 a52500 7 AKsO149 Bx=0000 Ds-21cl aang 1C1 Bich o108 T Akeo148 pxa0146 DS221C1 BS=21C1 2LCL 0108 0308 a AK-O148 Bx~0290 Ds=21c1_Eg-21¢2 21011910 @BCB t A048 BXROZIO Bge2ici #62101 wei oie 2ace t Axe0148 ax.0290 DSe2iC1 ES.23c1 2LC1:O108 2BCe T Ax-cou9 ax-0290 Ds-21¢1 gs-21¢1 zicl:9110 99 Figura 3-1 0000 Dx-0009 SP+PFEE $86210L_cS+21c1 1p-0100 Mov AK,0323, ©X-0008 Dx-0000 SPAFFEE S8=21C1_ CS=21C1 _TP=0103 ADD A, 0025. exe0005 Dx-0000 SP+FFEE 88-211 cS-21e1 IP=0106 Mov BEAK Cked000 Ox0000 SP PUNTOS CLAVE + Un comentario esté precedido por punto y coma ( Las palabras reservadas en lenguaje ensamblador son usadas para propésitos especiales, hajo condiciones especiales. + Un identificador es un nombre que se aplica a elementos en sus programas. Los dos tipos de identificadores son nombres, que se refieren a direcciones de datns, y etiquetas, que se refieren a la direccién de una instrucei6n. * Una operacién es usada, por io comiin, para definir dreas de datos y codificar instrucciones. ‘Un operando proporciona informacién para la informacién que acttia sobre é + Un programa consiste en uno o més segmentos, cada uno de los cuales: empieza en un limite de pirrafo. + La directiva ENDS finaliza cada segmento, ENDP termina cada procedimiento y END termina un programa, « La directiva ASSUME asocia los registros de segmentos CS, DS y SS con sus nombres de segmento apropiados. + Los programas .EXE (pero no los .COM) deben proporcionar al menos 32 palabras para el direceionamiemo de la pila. + Para un programa .EXE, por le general se inicializa el registro DS con la direccién de! segmento de datos. + Para las directivas simplificadas de segmentos, antes de definir algin segmemio, se inictaliza el modelo de memoria. Las opciones son SMALL (un segmento de cdigo y un segmento de datos), MEDIUM (cualquier nimero de segmentos de cédigo y un segmento de datos), ‘COMPACT (un segmento de cédigo y cualquier miimero de segmentos de datas) y LARGE (cualquier niimero de seementos de datos y de cédigo). + INT 21H, funcidn 4CH, es la instruccién estindar para la salida de programas + Los nombres de los elementos de datos deben ser sinicos y descriptives. Por ejemplo, un ‘elemento para el salario de un empleado podria ser SAL_EMP. + DB es el formato preferido para la definicién de cadenas de caracteres, ya que permite ccadenas de més de dos bytes de longitud y las convierte a la secuencia normal de izquierda a derecha. + Constantes decimales y binarias (hexadecimales) generan diferentes valores. Considere el ‘efecto de sumar ef 25 decimal en contra de sumar 25 hex: ADD AR.2S :Suma 25 ADD AK,25H 0 sSuma 37 70 Requerimientos de lenguaje ensamblader Capitulo 4 + DW, DD y DQ almacenan valores numéricos en cédigo objeto, con los bytes en orden inverso. ‘+ Los clementos DB son usados para procesar Ia mitad de registros (AL, BL, etc.), DW para registros completos (AX, BX. etc.), y DD para regisiros extendidos (EAX, EBX, etc.). Elementos numéricos mas largos necesitan de manejo especial PREGUNTAS rh teget . Seflale lus diferencias entre un compilador y un ensamblador . Qué es una palabra reservada enti lenguaje ensamblador? De dos ejemplos, . {Cudles son los dos tipos de identificadores? Determine cusiles de tos nombres siguientes son vitidos: (a) PC_AT: (b) $80: (¢) @S_Z: (@) 3487: (e) AX. {Cudles son las diferencias entre una directiva y gna instruccidn? . {Qué comandes hacen que el ensamblador (a) imprima un encaberade en la parte superior de tna ‘pagina en el listado de un programa y (b) salte a una mieva pagina? 47, {Cuil es el objetivo de cada uno de los tres segmentos descritos en este capitulo? 48, El formato de la directiva SEGMENT es nombre SEOMENT alineaciGn combinar ‘clase’ Explique el objetivo de (a) alineacién; (b) combinar; (c) ‘clase’, 4-9. (a) ,Cudl es el objetivo de-un procedimiento? (b) ;Cémo define et inicio y el final de un procedimiento? (c} {Cudndo definiria un procedimieato corso FAR y cuindo como NEAR? 4-10, Explique qué enunciados END particulares tratan la finalizacién de (a) un programa; (6) un rocedimienta: (c) un segment. 4-11, Establezca las diferencias entre Jos enuociados que finalizan un enssmblado y los eounciados que finalizan una ejecuciéa, 4-12, Dé los nombres STKSEG, DATSEG y CDSEG a tos segmentos de la pila, de los datas y del c6digo, respectivamente, y codifique el ASSUME necesaria, 4613, Considere la insirucein MOV AX 4CODH utilizada con INT 21H. (a) ,Qué hace Ia instruccién? (b) {Cull es la finalidad del 4C y ol OO? 4-14, Para las directivas simplificadas de segmentos, la directiva .MODEL proporciona los masleins TINY. SMALL, MEDIUM, COMPACT y LARGE. ;Bajo qué circunstancias se utilizaria cada uno de ‘estos modelos? 4-15, Dé las longitudes, en bytes, generadas por las siguientes directivas de datos: (a) DD; (b) DW; fc) DT; (4) DQ; ¢e) DB. 416, Defina una cadena de carscteres con nombre TITLE! que contenga la constante: RGB Electronics. 417, Defina los valores numéricos siguientes en elementos de datos FIELDA. a FIELDE, respectivamente: fa) Un elemento de cuatro bytes con el equivalente hexadecimal del 215 decimal. (b) Un elemento de un byte con ef equivalente: hexadecimal de! 35 decimal, Preguntas n (e) Un elemento de dos bytes con un valor no-definiso. (d) Un elemento de wn byte con el equivalente binario del 25 decimal {e} Un DW con tos valores consecutives 17, 19, 21, 26 y 31 4-18, Muesire el cédigo objeto hexadecimal generado por (a) DB: "24"; (&) DB 28. 419, Determine el cidigo objeto hexadecimal ensarmblado para (a) DB 28H; (b) DW 2845H; (6) PD: 28733AH; () DQ 28733AH. CAPITULO 5 Cémo ensamblar, enlazar y ejecutar un programa OBJETIVO ‘Analizar los pasos para ensamblar, enlazar y ejecutar un progra- ma en lenguaje ensamblador INTRODUCCION Jo explica el procedimiento para teclear un programa en lenguaje ensamblador y para imbélicas que codifica en lenguaje ensam- blador, son conocidas como el programa fuente. Se utiliza el programa ensamblador para traducir cl programa fuente en cédigo de miquina, conocido como el programa objeto. Por ultimo, se emplea un programa enlazador para completar el direccionamiento de maquina del programa objeto, generando un mddulo ejecutable. Las secciones sobre el ensamble explican cémo solicitar la ejecucién del programa ensam- blador, el cual prover de diagnésticos (incluyendo mensajes de error) y genera el programa objeto. También se explican los detalles del listado del ensamblador y, en términos generales, cémo el ensamblador procesa un programa fuente Las seceiones sobre el enlace explican c6mo solicitar Ia ejecucién del programa enlaza- dor de manera que pueda generar un médulo ejecutable, También son cxplicades los detalles del mape de enlace generado, asi como los diagnésticos, Por Ultimo, una seccién explica emo soli- citar Ja ejecucion de un médulo ¢jecutable, Cémo ensamblar un programa fuente 73 COMO PREPARAR UN PROGRAMA PARA SU EJECUCION La figura 4-2 sélo ilustr6-el e6digo fuente de un programa, todavia no en formato ejecutable. Para teclear este programa, se puede usar un programa editor, tal como el proporcionade con el DOS. En Jos ejemplos siguiemes de comandos DOS, sustinya lo apropiado para su sistema. También puede aumentar mucho la productividad cargando sus programas y archives en. un disco RAM (disco virtual), Llame a su programa editor, teclee los enunciados del programa en la figura 4-2 y al archivo resultante péngale por nombre POSASMI.ASM. ‘Aunque para ¢l ensamblador no es importante el espaciamiento, un programa seré mis egible si mantiene alineados por columnas y de manera consistente el nombre, operacién, operandas y comentarios. La mayaria de los editores tienen marcas de tabulacién eada acho posicianes para ‘facilitar ‘Una vez que ha introducido todas los enunciades del programa, revise el cddigo para ver si es correcto, La mayorfa de los editores tiene una facilidad para imprimir, pero si no la tiene, encicnda su impresora y utilice ¢] programa PRINT del DOS: alineacién de columnas. PRINT 1: POSASML ASM [Enter] Tal como esti, el programa es sélo un archivo de texto que no puede ejecutarse: primero debe ensamblarlo y enlazarlo, 1. El paso de ensamble consiste en la traducciéin del eédigo fuente en eddigo abjew y la gencracién de un archivo intermedio .OBJ (objeto), 0 médulo (en capitulos anteriores ya ha visto ejemplos de eddigo de maquina y de cédigo fuente). Una de las tareas del ensamblador es calcular el desplazamiento de cada elemento en el segmento de datos y de cada instruccién en el segmenta de eédigo. El ensamblador también crea un encabezado al frente del médulo .OBJ generado; parte del encabezado tiene informacién acerca de direcciones incompletas. El médulo .OBY atin no estd en forma ejecutable. 2. El paso de enlace implica convertir el médulo .OBJ en un mddulo de cédigo de méquina -EXE (cjecutable). Una de las tarcas del enlazador es combinar los programas ensamblados en forma separada en un médulo ejecutable. 3, El iltimo paso es cargar el programa para su ejecucién, Ya que el cargador conoce en. d6nde esté el programa a punto de ser cargado, puede completar las direcciones indicadas en el encabezado que estaban incompletas. El cargador desecha el eneabezado y crea un PSP inmediatamente antes del programa cargado en memoria. La figura $-1 proporeiona un diagrama de los pasos implicades al ensamblar, enlazar y ejecutar un programa. COMO ENSAMBLAR UN PROGRAMA FUENTE El programa ensamblador de Microsoft (hasta la version 5.x) ¢s MASM.EXE, mientras que el programa de Borland es TASM.EXE. El ensamblador de Microsoft por lo general utiliza el co- mando ML, pero también acepta MASM por compatibilidad con versiones anteriores. Puede teclear el comando para ejecutar MASM o TASM en una linea de comando 0 por medio de peticiones. Esta seccidn muestra cémo utilizar la linea de comando; véase en el apéndice D el métodg con indicacién. El formato general para un comando de linea para ensamblar un programa es: Cémo ensambiar, enlazar y ejecutar un programa Capitulo 5 Gena wn ogi uit ronmeninse (ABS) Enews st Deograma tent ae Ga nia al ropa (ome. an ch rae lao fete cara yaa Figura S-1 Pasos paca ensamblar, Segoe cenlazar y ejecutar MASH/TASM [opciones) fuente(,cbjeto) [,lietado] [,refcruzedes) + Opciones estipula caracieristicas como configuracién del nivel de mensajes de advertencia y se explican en el apénadice D. Ya que los valores por omisién del ensamblador por lo regular son los adecuados, rara vez necesitard utilizar opciones, + Fuente identifica el nombre del programa fuente, como POSASMI. El ensamblader asume la eXtensién .ASM, de modo que no necesita introducirla. Sino quiere aceptar la unidad de disco por omisién, también puede dar Ia especificacién de una unidad de disco. + Objeto estipala un archivo .OBY generado. La unidad, subdirectorio y nombre de archivo puede ser el mismo o diferente del fuente + Listado estipula un archivo .LST generado que contiene tamo el cédigo fuente como el La unidad, subdirectorio y nombre de archivo puede ser el mismo o diferente del fuente. Listado del ensamblador de las definiciones convencionales de segmentos 75 + Referwcadas genera un archivo de referencias cruzadas con los simbolos usados en el programa, que puode usar para un listado de referencias cruzadas. Para MASM, la extensi6n es CRF y para TASM la extension es .XRF. La tinidad, subdirectorio y nombre de archive puede ser el mismo o diferente del fuente. El nombre del archivo fuente siempre lo debe introducir, y por lo general solicita un archivo OBJ, que es necesario para enlazar un programa en forma ejecutable, Tal vez en algunas ocasio- rcs solicitard archivos .LST, en especial cuando quiers cxaminar el eédigo de maquina generado, Un archivo .CRF es stil para programas grandes en donde quiera ver qué instrucciones hacen referencia a qué datos. También la peticién de un CRF hace que el ensamblador genere nimeros de lineas para tos enunciados en ¢l archive .LST a las cuales el archive CRF se refiera. Secciones posteriores cubren en detalle los archivos .LST y .CRF Ejemplo 1: Especifique el archivo fuente, POSASM1, en la unidad Dy genere archivos objeto, de listado y de referencias cruzadas. $i el nombre de un archivo es el mismo que el del archivo fuente, no necesita repetirlo: basta con la especificacién de la unidad para solicitar un archivo: MASK /TASH D:POSRSML,D: ,Cr,D= Ejemplo 2: Sélo genere un archivo objeto. En este caso, puede omitir Ia referencia a los archivos de listado y de referencias cruzadas: sdlo introduzca el comando MASM/TASW A: POSASML,D: El ensamblador convierte sus enunciados fuente en cédigo de maquina y despliega, si hay, errores en la pantalla. Los errores comunes ineluyen un nombre que viola las convenciones para ja formacién de nombres, una operaci6n que se escribié de forma incorrecta (como MOVE en lugar de MOV) y un operando con un nombre que no est definide. Existen alrededor de 100 mensajes de error, explicados en ei manual del ensamblador. Ya que hay muchas versiones dife- rentes de cnsamblador, no trataremos de listar los ervores. El ensamiblador intenta corregir algu- nos errores, pero de cualquier forma usted debe volver a cargar su editor, corregir el programa fuente ASM y reensamblarlo, LISTADO DEL ENSAMBLADOR DE LAS DEFINICIONES CONVENCIONALES DE SEGMENTOS LLa figura 5-2 proporciona el listado que produce el ensamblador con el nombre POSASMI.LST. Por la entrada PAGE, el ancho de la linea es. de 132 posiciones. Si su impresora puede comprimir Ja linea de impresién, entonces también puede imprimir este listade. Muchas impresoras de im- pacts tienen un interruptor que fuerza la impresién comprimida, o podria solicitar al editor 0 procesador de textos imprimir en modo comprimido, Otra manera es usar ¢l comando MODE del DOS; encienda su impresora, teclee el comando MODE LPT:132,6 para 132 caracteres por linea y seis lineas por pulgada y utilice PRINT del DOS. Note cémo han actuado las directivas PAGE y TITLE en la parte superior de! listado. Ninguna de las directivas, incluyenda SEGMENT, PROC, ASSUME y END, generan cédigo de maquina, ya que slo san mensajes al ensamblador. En el extremo izquierdo esta el nimero de cada linea. La segunda columma muestra, en hexadecimal, las direcciones de los campos de datos y de las instrucciones, La tercera columna muestra el cédigo de maquina traducido en formato hexadecimal. A la derecha se encuentra el cédigo fuente original, 76 Cémo ensamblar, enlazar y sjecutar un programa Capitulo & POSASHI (EXE) Operaciones de mover y sumar Page a-1 1 page 60,132, 2 TrTue —POSASWL' {EIE) operaciones de mover y sumar 3 a aay 7 = 4 ovae BTACKSG SEGMENT PARA STACK ‘Stack’ 5 0000 goz0t ow 32 DUPLO) € 9000 3 1 a 3 op4s eTAcKse ENDS 10 : - 31 sooo DRTASG SEGMENT PARA ‘Data 32 0009 OOeA 13 0002 0970 14 908 9900 as 0006 17 9900 ak 0800 us 20 0000 BB 21 0053 BE DB. 2 23 0005 An 9000 B 34 0908 93 96 opd2 35 0000 AB 9004 36 OODF BB $c0 27 0012 cD 21 2e one 25 0016 30 FLD Dat 350 PLDB Det 135 FLDC be ? DATASG ENDS GODESG SEGMENT PARA ‘Cede! BEGIN © PROC. FAR ASSUME $5: STACKSG, DS ;DATASG, CB: CODESS Mov AK,OATASG " jgatablecer la direccisn de mov Bsa } DATASG en'el registra OS Mov AX, LDA Mover 0250 a AX R ADD AK, FLOB Sumar 0125 a Al Mov FLOC,AK Almacenar suma en FLOC MOY AK,ACDON «Salida a DOS Int 21H Brome = ENDP iFin de procedimiente copesa = ENDS 1Pin de segmente EXD BEGIN iFin de programa Segments and Groups cong... parass | | stacesa’ 2) 1 ‘Synbole eee FUDA ee FUOB poe tt WU serLmoe || Align Combine Claas PARA oN *cone* PARA NONE “DATA PARA STACK “STACK! Type. Value Acer F'BROC 0000, COUESG «= Length = 00nd . 54. L WORD 9900 DATASS. Sif) p worp caez PATASS Si. TE WORD 9904 DATASG ce TEE | OLDZR Cll mxr posaem St Df mmer S20 27 Source Lines 27 Total. Lines 15 Syubols 0 Warning! Error: 0 Severe Errors Figura 5-2 Programa ensambiado con segmentos convencionales Para cada uno de los tres segmentos, ia directiva SEGMENT avisa al ensamblador alinee el segmento a una diteceién que sea divisible entre 10 hex —el enunciado mismo no genera cOdigo de maquina. De forma tedrica, cada direccién de segmento inicia en Ia localidad con desplaza- Listado del ensamblador de las definiciones convencionales de segmentos 7 mienio 0000, En realidad, cuando el programa inicia su ¢jecucidin, el segmento es almacenado en memoria de acuerdo con una direccidn que el DOS carga en el registro del segmenta y es despla- zado cero bytes a partir de esa direccisn, Note que la pila, el segmento de dates y el segmento de cédiga son dreas separadas, cada una con su caracieristico valor de desplazamierto para dalos € instrucciones. Segmento de Ia pila El segmento de la pila contiene una directiva DW (definir palabra) que define 32 palabras, que genera cada una un valor cero designado con (0). Esta definicién de 32 palabras ¢s un tamafo realista para una pila, ya que un programa grande puede necesitar muchas interrupciones para lamadas de entrada/salida a subprogramas, y todas implican el uso de la pila. El segmento de Ja pila termina en el desplazamiento 0040H, que es el equivalente al valor decimal 64 (32 palabras x 2 bytes). Si el tamaio de la pila es demasiado pequefo para contener a todas los elememias que se guardan en clla, ni el ensamblador ni el enlazador le advertiran de esto, y 1a ejecucién del progra- ma puede sufrir una detencién total de una manera impredecible, Segmento de datos El programa define un segmento de dstos, DATASG, con tres valores definidos, toxios en formato DW (definir palabra). FLDA define una palabra (dos bytes) inicializada con el valor decimal 250, que el ensamblador traduce 3 OOF AH (mostrado a la izquierda). FLDB define una palabra inicializada ‘con. el valor decimal 125, ensamblada como 007DH. Los valores reales. almacenados de estas dos constantes son FAOO y 7D00, respectivamente, lo cual puede verificar con DEBUG. FLDC es codificada como una DW con ? en el operando para definir una palabra con una constante no inicializada. Segmenta de cédigo El programa define un segmento de cédigo, CODESG, que contiene et cédigo del programa ejecutable, todo en un procedimienta (PROC). ‘Tres enunciados establecen el direccionamiento del segmento de datos: wow aot, DATASDG booa aE De wow Ds, Ax + La directiva ASSUME relaciona DATASG con el registra DS. Note que el programa no requiere él registro ES, pero como practica usual, algunos programadores lo definen ASSUME slo proporciona informacién al ensamblador, lo que no genera cédiga de maquina. + La primera instruccién MOV “almacena” DATASG en el registro AX. Ahora bien, en realidad una instruccién no puede almacenar un segmento en un registro —e] ensamblador s6lo-reconoce un intento.de cargar la direccién de DATASG. Observe cl cédigo.de maquina ala izquierda: BS —~R. Los cuatro guiones significan que en este punto el ensamblador no puede determinar la direccién de DATASG; el sistema determina esta direccién s6lo cuando sl programa objeto esta enlazado y cargado para su ejecucién. Ya que el cargador del sistema puede ubicar un programa en cualquier parte de la memoria, el ensamblador deja abierta la 76 ‘Céme ensamblar, enlazar y ejecutar un programa Capitulo direceién e indica este hecho con una R; el programa cargadot DOS es para reemplazar (0. reubicar) las direcciones incompletas con las reales. + La segunda instruceién MOV mueve el contenide del registre AX al regisiro DS. Ya que no existe wna instrucei6n vélida para mover de forma directa de la memoris al registro DS, tiene que codificar dos instrucciones para inicializar ef DS. El cargador DOS inicializa de forma automética el 8S y el CS cuando carga un programa para ejecucién, pero es su responsabilidad inicializar el DS y, si se necesita, el ES Para las ditectivas simplificadas de segmentos, la inicializaciGn del DS es como sigue: MOV Ax, edates Mov. Ds, AK ‘Aunque todo estas acciones parecen ser demasiado complicadas, en este momento en reall dad no tiene que entenderlo, Todos los programas en este libro utilizan una definicién e inicislizacién esténdar, y usted s6lo tiene que reproducir el cédigo para cada uno de sus programas, Para este fin, almacene en disco una estructura de un programa ensamblado, y para cada programa nuevo que quiera crear, COPIE Ia estructura del programa en un archivo con su nombre correcta y use su editor para completar las instrucciones adicionales La primera instruccién después de inicializar el DS es MOV AX, FLDA, que empieza en la localidad con desplazamiento O05 y genera el cOdigo de maquina A1 0000. El espacio entre Al (la operacién) y 0000 (el operando) es slo por legibilidad, La instrucelén siguiente es ADD AX, FLDB que empieza en a localidad con desplazamiento 0008 y genera cuatro bytes de c6digo de maquina. En este ejemplo, la longitud de las instrucciones de méquina son dos, tres y cuatro bytes El tiltimo enunciado en el programa, END, contiene ¢] operando BEGIN, que relaciona al nombre del PROC en el desplazamiento 0000, Esta es la localidad en el segmento de cédigo donde el cargador de programa transfiere el control para la ejecucién. ‘A continuacién del listado del programa estin una tabla de segmentos y grupos y una tabla de simbolos. Tabla de segmentas y grupos La primera tabla al final del listado del ensamblador muestra todos los grupos y segmentos defini- dos. Note que los segmentos no estén listades en el mismo orden en que fueron codificados; el ensamblador los tista en orden alfabético por nombre (este programa no tiene grupos, que es un tema posterior). La tabla proporciona la longitud en bytes de cada segmento, la alineacim (ambos son parrafos), el tipo combinar y la clase. El ensamblador ha convertido los nombres de clase a maytsculas, Tabla de simbolos La segunda tabla proporciona los nombres de Jos campos de datos en el segmento de datos (FLDA, FLDB y FLDC) y las etiquetas aplicadas a instrucciones en el segmemo de eddigo, Para BEGIN (la tnica entrada en el ejemplo), Type F PROC significa procedimiento Icjano. La columna vale da el desplazamiento para el inicio del segmento de nombres, ctiquetas y procedimientos. La columna cncabezada con Attr (atributo) proporciona el segmento en el que el elemento esté. definide. Ensamblador de dos pasadas 79 El apéndice D explica todas las opciones de estas tablas, Para que el ensamblador omita las tablas, cadifique la epeiin /N después del comando MASM, esto es, MASM/N. En cuanto a las diltimas tres entradas, @CPU identifica al procesador, @FILENAME da cl nombre del programa y @VERSION muestra la versiGn del ensamblador en la forma n.nn. LISTADO ENSAMBLADOR DE DIRECTIVAS SIMPLIFICADAS DE SEGMENTOS: La figura 4-3 mostré eémo codificar un programa que usa las directivas simplificadas de segmen. tos, La figura 5-3 proporciona el listado ensamblado de ese programa. La primera parte de la tabla de simbolos bajo “Segments and Groups” muestra los tres segmentos renombrados por ¢1 ensamblador y listados de forma alfabética: + _DATA, con una longitud de 6 bytes » STACK, con una longitud de 40H (64 bytes) + TEXT, para el segmento de cédigo, con una longitud de 14H (20 bytes) Bajo el titulo “Symbols* hay nombres definidos.en el programa o nombres por omisién. Las directivas simplificadas de segmentos proporcionan varias equivalencias predefinidas, que empie~ zan con el simbolo @ y que usted tiene libertad de referenciar en un programa. Igual que @datos ellos son: @CODE Igualada al nombre del segmento de oédigo _TEXT @CODESIZE Establece a cero para los modelos pequefio y mediano @cPU Modelo de procesador @DATASIZE Establece a cero para los modelos pequefio y mediano- @FILENAME Nombre del programa @VERSION —_Versién del ensamblador (n.nn) Puede usar @cédigo y @datos en enunciados ASSUME y ejecutables, tal como MOV AX.@datos. . ENSAMBLADOR DE DOS PASADAS Muchos ensambladores dan dos pasadas al programa fuente a fin de resolver referencias hacia adelante (o posteriores) a direcciones que atin no se encuentran en el programa. Durante la pasada 1, el ensamblador lee todo el cédigo fuente y construye una tabla de simbolos de nombres y etique- tas usadas en el programa, esto es, nombres de campos de datos y etiquetas del programa y sus localidades relativas (desplazamiento} dentro del segmento. Usted puede ver tal tabla de simbolos a continuacién del programa ensamblado en la figura 5-3, en donde los desplazamientos de FLDA, FLDB y FLDC son 0000, 0002 y 0004 bytes, respectivamente. Aunque el programa no define eti- quetas de instrucciones, ellas aparecerian en el segmento de cddigo con sus propios desplazamien- tos. La pasada I determina fa cantidad de cédigo que es generado por cada instruccion. MASM inicia la generacién del cédigo objeto en la pasada 1, mientras que TASM lo hace en la pasada 2. Durante la pasada 2, cl ensamblador usa la tabla de simbalos que construyé en la pasada 1. Ahora que “conoce” la longitud y posiciones relativas de cada campo de datos ¢ instruccién, Cémo ensamblar, enlazar y ejecutar un programa Capitulo 5 POSAgM2 (EXE) Operaciones de mover y gumar Page 1-2 page 60,232 TITLE —-POSASM2 (EXE) STACK 54 1Se define le pila SATA 1Se definen datos oaoa ogA FuDA M50 0002 cov FLOR OM A25 ones 008 Pope 188 define cesnente de cOdigo ace ame ® 0a00 Be --- R Rkedata — jEatablecer la direceiéa de oa03 BE De wow DSLAK } DATASG en el registro DS ogos An ooo & Nov AK, PLA Mover 0250 a AK aos 03 G6 Oo0z R ROD AXLPLOB uma 0128 2 AK ogee as pod mov PUbC.Ae = Almacenar suma en PLDC aor Bs 4co0 MOY AK,ACOOH Salida a nos oaa2 ep an mr alt oat secre EDP iFin de procedimiente ED BEGIN irin de programs Seqnents and Groups wane Length Align Combine Cl DOROUP. ono SOMA SS. 2s coaee” = wo PUBL = BATAY Brack 20211. 2 1 lomo | Fame 0 GTACR. © ‘STACK amr Dit Teale = WORD. PUBLIC = “CODE symbole: wane Tyre value actrr BEGIN |e P'PRoc 008 JEXr bength = oid LDA : : Lwoep 9900, BATA, rug : Lword 9002 “DATA, mpg tle worn gece Zp ecoue : Text _vexr ecopestze 211)! mr ery ‘wexr = u01m eoaragize” DD) 2) eer evrnemaee | | : TEXT = posawna 0 Warning Errore 4 Severe Errors Figura 5-3 Programa ensamblado con directivas simplificadas de segmentos puede completar el cédigo objeto para cada instruccién. Después produce, si se solieita, los diferentes archivos objeto (.OBJ), de listado (.LST) y de referencias cruzadas (REF) Un problema potencial en la pasada 1 es una referencia hacia adelanie: Una instruccién de salto en el segmenio de cSdig puede referenciar a una etiqueta, pero ¢! ensamblador ain no ha encontrado su definicién. MASM construye el e6digo objeto con base em lo que supone es la longitud de cada instruccién generada en lenguaje de méquina. Si existen diferencias entre la pasada 1 y la pasada 2, con respecto a la Tongitud de una instruccién, MASM envia un mensaje de Cémo enlazar un programa objeto a1 error “Phase error between passes”. Tales errores son relativamente raros, y si aparecen usted debe buscar su causa y corregirla. Desde la versidn 6.0, MASM hace un manejo mis eficaz de la longitud de las instrucciones, dando tantas pasadas al archivo como sean necesarias, COMO ENLAZAR UN PROGRAMA OBJETO Una vez que su programa queda sin mensajes de error, ¢l siguiente paso ex enlazar ¢l médulo objeto, POSASM!.OBJ, que fue producide por el ensamblador y que contiene sélo cédigo de miquina, El enlazador realiza las funciones siguientes: «Si se pide, combina més de un médulo ensamblado de forma separada en un programa gjecutable, como dos o més programas en ensamblador o un programa en ensamblador con un programa en C. + Genera un médulo .EXE y lo inicializa con instrucciones especiales para facilitar su subsecuente carga para ejecucion, ‘Una vez que ha enlazado uno mis médulos .OBJ en un médulo .EXE, puede ejecutar el médulo EXE cualquier ntimero de veces. Pero siempre que necesite realizar un cambio al progra- ma, debe corregir el programa fuente, ensamblarlo en otro médulo .OBY y enlazar el modulo OBJ en un médulo -EXE. Aunque al principio estos pasos no sean por completo claros, encon- tard que con un poco de experiencia se vuelven automiticos. Puede convertir muchos programas .EXE a programas .COM, Para detalles, véase el cap(- malo 7 La versi6n del enlazador de Microsoft es LINK, mientras que la de Borland es TLINK. Puede teclear LINK 0 TLINK en una linea de comando o por media de peticiones (a partir de MASM 6.0, ¢! comando ML proporciona tanto ¢l ensamble como el enlace). Esta seccién muestra como enlazar usando la linea de comando; para el uso de peticiones véase el apéndice D. La linea de comando para enlazar es LINK/TLIME archobj, archeje, + Archoby identifica al archivo objeto generado por el ensamblador, El enlazador supone la extensién .OBJ, de modo que no tiene que introducirla. Unidad, subdirectorio y nombre de archivo pueden ser iguales o diferentes del archivo fuente. + Archeje estipula que se genere un archiva .EXE, Unidad, subdirectorio y nombre de archivo pueden ser iguales o diferentes del archive fuente * Archmapa estipula que se genere un archivo con extensién .MAP que indica la ubicacién relativa y el tamafo de cada segmento y cualquier error que LINK haya encontrado. Un error comin es el fallo al definir un segmento de pila. Introducir CON (por consola) le indica al enlazador que muestre el mapa en la pantalla (en lugar de escribirlo en tn disco) de forma que se pueda ver el mapa inmediatamemte para los errores. « Archbibi estipula la opcion de bibliotecas, que no necesita én estos primeros pasos de programaciéa en lenguaje ensamblador. ‘Céma ensamblar, enlazar y ejecutar un programa Capitulo § Este ejemplo enlaza el archivo objeto POSASM|.OBJ que fue generado por un ensamble amerior. Al enlazador se le pide escribir el archivo .EXE en la unidad D, desplegar el mapa e ignorar la opcitn de biblioteca: LEME D:POSASHA,D;, CON Si el nombre del archive es el mismo que el del fuente, no necesita repetirlo: basta con la iden- -acién de la unidad para indicar la peticién del archivo. El apéndice D porporciona otras opeiones. Mapa del enlace para el primer programa Para el programa POSASM1, LINK produce este mapa: START = STOP LENGTH «NAME = CLASS OOCH «ODDS «ODOR | STACKSG © STACK Donec © OOBKSH © ODEHEATASG = BATA, copse# © ooDEa © OLEH CODESS cane Punto de entrada del programa en 0003;0000 + La pila es el primer segmento ¢ inicia con un desplazamiemto de cero bytes desde el inicio dei programa. Como estd definida como 32 palabras, es de 64 bytes, como lo indica su longitud (40H). + El segmento de datos inicia en el siguieme limite de pirrafo, desplazamiento 40H + El segmento de cédigo inicia en el siguiente limite de paérrafo, desplazamiento SOH. Algunos ensambladores acomodan los segmentos en orden alfabética + El punto de entrada al programa es 0005:0000, que esté en la forma “relativa (no absolutay segmento:desplazamiento”, se refiere a la direccién de la primera instruccién ejecutable En realidad, la direcciém relativa de inicio es en el segment 5{0], desplazamiento de 0 bytes, que corresponde al Limite del segmento en SOH. El programa cargador utiliza este valor cuando carga el programa en memoria para ejecucién. Eh esta etapa el nico error que puede encontrar es introducir de manera errénea los nom- bres de los archivos, La solucién es reiniciar el comando de enlace. Mapa del enlace para el segundo programa EI mapa de enlace para el segundo programa, que utiliza las directivas simplificadas de segmen tos, muestra una configuracién un poco diferente a la del programa anterior. Primero, el ensamblador ha reacomodade de manera fisica los segmentos en orden alfabético, y segundo, los segmentos sucesivos estin alineados por I{mites de palabras (no de parrafo): START STOP LENGTH NAME CLASS coodge 00013 Ola TEXT cube ooo1gH pon1sH oat SATA DATA 0020H | ODOSFH = OADM STACK STACK. Punto de entrada del programa en 0000:0000 Gémo ejecutar un programa 83 + El segmento de cédigo ahora ¢s el primer segmento ¢ inicia en un desplazamiema de cero bytes desde el inicio del programa. + El segmento de datos inicia en el siguiente limite de palabra, desplazamiento 14H. + La pila inicia en el siguiente limite de palabra, desplazamiento 20H. + El punto de entrada al programa ahora s 0000:0000, lo cual significa que la ubicacién relativa del segmento de cédigo inicia en el segmento 0, desplazamiento 0. COMO EJECUTAR UN PROGRAMA. ‘Una vez ensamblado y enlazado un programa, ahora puede (jal fin!) ejecutarlo. Si el archivo EXE esté en la unidad por omisién, podria usar el DOS para cargarlo para su ejecucidn introdu. siendo: Si omite La exiensidn del archivo, el DOS supone que ¢¢ EXE (0 .COM)}. Sin embargo, ya que este programa no produce resultados visibles, se sugiere que lo ejecute con DEBUG y avance paso Por paso en su ejecucién con comandos de rastreo (T). Teclee lo siguiente, incluyendo la exten- sién EXE: DEBUG D:POSASML.EXE DEBUG carga ¢l médulo del programa .EXE y muestra su indicacién (un guién). Para ver el segmento de la pila, teclee D ssio La pila contiene slo ceros ya que fue la forma de inicializarla. Para ver el segmento de datos, teclee D ps:a La operacién muestra tres elementos de datos FA 00 7D 00 00 00, con los bytes de cada palabra en orden inverso. Para ver el segmento de oddigo, teclee Best Compare el e6digo de maquina mostrado con el del segmento de cédigo en ¢l listado def ensam- blado: Ba----aEDeALO000 .,. En este caso, el listado del ensamblado no muestra de manera precisa el cédigo de maquina, ya ‘que el ensamblador no conoce la direccidn del operando de la primera instruccién. Abora puede determinar esta direccidn examinando el cédigo desplegado. Teclee R para ver los registros, y rastree la ejecucién del programa con sucesivos comandos TA medida que avance por el programa, fijese en el contenido de los registros. Cuando legue ala tltima instruccién, puede utilizar L para volver a cargar y correr el programa o Q para salir de la sesién con DEBUG. a4 Céma ensamblar, enlazar y sjecutar un programa Capitulo § LISTADO DE REFERENCIAS CRUZADAS: El ensamblador genera un archive opcional .CRF o .XRF que puede usar para producir un listado de referencias cruzadas de los identificadores o simbolos del programa. Sin embargo, atin tiene usted que convertir este archivo a un archivo de referencias cruzadas, ordenado de manera ade- cuada, Esta funcién la realiza un programa en cl disco del ensamblador: CREF para Microsoft o CREF para Borland. Puede teclear CREF 0 TCREF con una linea de comando © por media de indicaciones, Esta seccidn utiliza una linea de comando; véase el apéndice D para usar indicacio- nes, El comando para convertir el archivo de referencias cruzadas es CREE /TCREE + archivorefx identifica el archivo de referencias cruzadas generado por el ensamblador. El programa supone la extensién, asi que no necesita inteoducirla. También puede dar una identificacién de la unidad de disco + archivorey estipula que se genere un archivo REF. Unidad, subdirectorio y nombre de archivo pueden ser iguales o diferentes de! archivo fuente. El listado Lafigura 5-4 contiene el listado de referencias cruzadas producido por CREF para el programa de la figura 5-2. Los simbolos en la primera columna estén en orden aifabético. Los nimeros en Ia segunda columna, mostrados como nf, indican la linea en que estén definidos los simbolos en el archivo .LST. Los mimeros a la derecha de esta columna son los niimeros de linea en donde los simbolos estin referenciados. Por ejemplo, CODESG esté definido en Ia linea 17 y se hace rele rencia.a él en las lineas 19 y 29, FLDC esti definido en la linea 14 y referenciado en Ia linea 25-+, en donde “+” significa que su valor es Modificado en esta linea. POAASMI (EXE) Operaciones de mover y sunar Symbol Cross-Reference {W definition, + modification) ecro ns avension oe Bem ee te cone... congsd | Celi i blame as ae DATA... . hh BATASG : Dill lane as ae ae Figura $-4 Tabla de referencias cruzadas Diagnéstico de errores Archivos generados ‘Al ensamblar varios programas puede usar mucho espacio en disco. Es posible, de manera segura, borrar los archives .OBJ, CRF y .LST, Guarde los programas fuente .ASM en caso de cambios futuros y también guarde los archivos .EXE para la ejecucién del programa, DIAGNOSTICO DE ERRORES El ensamblador proporciona un diagnéstico de cualquier error de programacién que viole sus reglas, El programa en la figura 5-5 ese! mismo que el de la figura 5-2, salvo que tiene insertados varios errores intencionales con fines ilustratives. El programa fue corrido con MASM; TASM genera un listado parecido de errores. Aquf estén los crrores, como se codificaron: UNE, EXPLICACION ir) FLDC necesita un operando. 19 ASSUME no relaciona el $5 a STACKSG, aunque el ensamblador no ha detectado esta omisién, 20 DATSEG debe ser escrito coma DATASG. 1 page £0,132 2 TITLE —_-POSASMS' (EXE) Zlustra errores de ensamblade 4 2000 STACKSG SEGMENT PARA STACK ‘Stack’ 5 0000 a020L De 32 DUP (Oy é ‘do00 7 1 a 9 oa40 stages uw re 11 cone ATASG SEGMENT FARA ‘Data’ 42 0000 DOFA PLEA. be 250 23 0902 9070 FLEB ow 128 44 0008 FLDC ow poSaam3 ASML): error A2027; Operand expected 45 0004 DATASG | ENDS 16 ra - 17 0009 GoDESG “SEGMENT PARA ' Code" 48 sano BEGIN © PROC FAR 19 ASSUME C5:CONBSG,DS:DATASG 290000 AL apoo MOV AK, DATEEG' Direccién de BATASG POSaan3.ASWIL7} 1 error A2009: Symbol not defined: DATSEG 210003” a8 DD mov DKA } en el registro Bg 22 a Moy AS, PLDA iMover 0250 = AX PoSasn3.ASMI20): error Az009: Symbol mot defined: AS 24-0005 93 06 902 & 40D AK, FLDB sSumar 0125 a AK 35 0009 A3 900 0 MOV PLBD,AK idmacenar guna en FLOC pOSecs3 .ASM{22): error A2009: Symbol not defined: PLOD a6 000C° BB acco Moy AK, 4cocH +Salida a pos 37 000F cD 2a INT 21H 28 0011 BEGIN ENDP pOSasn3 .ASM(35); error AZ00S: Phase error between passes 35 00! ‘cODESG —BKDS, 30 EXD = BEGIN Figura 5-5 Diagndstico del ensamblado 2 23 25 28 ‘Céme ensamblar, enlazar y ejecutar un programa Capitulo § DX debe ser cadificade como DS, aunque el ensamblador no sabe que éste es un error, AS debe se codificade como AX. FLDD debe se codificado como FLDC. La correecién de los otros errores hard que este diagnéstico desaparezca. El Gltimo mensaje de error, “Phase error between passes”, ocurre cuando las direcciones generadas en la pasada | difieren de aquellas en la pasada 2 en un ensamblador de dos pasadas. Para aislar un error desconacido, utilice 1a opeién /D para que MASM liste un archivo para la pasada | y otro archivo para la pasada 2, y compare los desplazamientos, PUNTOS CLAVE + MASM y TASM proporcionan una linea de comando para ensamblar, incluyendo (al menos) cl nomibre del programa fuente, MASM también proporciona indicaciones para introducir opciones. + Elensamblador convierte un programa fuente a un archivo .OBJ y genera archivos opcionales para el listado y las referencias cruzadas, + La tabla de segmentos y grupos que sigue a un listado de ensamblador muestra los segmentos ¥¥ grupos definidas en el programa. La tabla de simbolos muestra todos los simbolos (nombres de datos y etiquetas de instruccién). + El enlazador (LINK 0 TLINK) convierte un archivo .OBJ en un archivo .EXE. Usted puede enlazar usando una linea de comando o por medio de indicaciones (sélo LINK). + Las directivas simplificadas de segmentos generan los nombres _DATA parael segmento de datos, STACK para cl segmento de la pila y_TEXT para el segmento de cédigo. También ‘generan varias equivalencias predefinidas. + El programa CREF (o TCREF) produce un util listado de referencias cruzadas. PREGUNTAS SL, Couifique la linea de comandos: para ensamblar el programa fuente llamado DISCOUNT. ASM con archivos .LST, .OBJ y .CRF. Suponga que ef programa fuente y e! ensamblador estén en la unidad C, 5.2. Codifique la linea de comando en LINK o TLINK para enlazar DISCOUNT.OBI de la pregunta $-1 5-3, Codifique fos comandos para DISCOUNT EXE de la pregunta 5-2 para hacer lo siguiente: (a) ejecueién por medio de DEBUG: () ejecuci6n directa desde et DOS. $4, Dat el objetivo de cada uno de los archives siguientes: (a) archivo ASM: (b) archivo «CRP: (c) archivo .LST; (4) archivo .EXE; (e) archive .OBI; (1) archive MAP. 5:5, Codifique las dos instrucciones para inicil x el registro DS, Supongs que el nombre del segment de datos es DATSEG. 5-6, Escriba un programa cn ensarmblador usando las definiciones coavencionales de segmentos para lo siguiente: (a} Mover el valor inmediato 40 hex al registro AL; (b) recorrer el contenido.de AL un bit hacia la izquierda (codigo SHL AL.1); (c) mover el valor inmediato 22-hex al BL; (d)-multiplicar AL por BL (cixligo MUL BL). Recuerde las instrucciones necesarias para finalizar la ejecuciéa de un Pr luna estructura de programa y Usitice DEBUG para rastrear y verificar el segmemto de eSdigo y los re ama. El programa no necesita definir o inicializar el segmento de datos. Asegiirese de COPIAR su editor para desarrollar el programa. Ensimblelo y enlicelo. Preguntas a7 5-7. Corrija el programa de la pregunta 5-6 para directivas simplificadas de segmestos. Enséablelo y cenlicelo, y compare el cédigo objeto, las tablas de simbolos y el mapa de enlace con aquellos del programa original 5-8. Agregue un segmento de datos al programa de la pregunta 5-6, para lo siguiente: + Defina un elementa de un byte (DB) Hamado FIELDA con 40 hex y otto con nombre FIELDB con 22 hex. + Defina un elemento de dos bytes (DW) con nombre FIELDC sin constante, + Mueva ef contenido de FIELDA al registro AL, y reodrralo un bit a la izquierda, ‘+ Multiplique ef AL por FIELDB (o6digo MUL FIELDB), + Mueva ef producto en-el AX a FIELDC. Ensamble, enlace y utilice DEBUG para prabar et programa 5-9, Corrija el programa de la pregunta $-8 para directivas simplificadas de sepmentos, Ensimblelo y enlécelo, y compare el cOdigo objeto, las tablas de simbolos y el mapa de enlace com aquetios del programa original. CAPITULO 6 Instrucciones y direccionamiento del procesador OBJETIVO Proporcionar los fundamentos del conjunto de instrucciones de len- guaje ensamblador y los requisitos para el direccionamiento de datos. INTRODUCCION Este capitulo imroduce el conjunto de instrucciones del procesador y enseguida describe tos formatos biisicos de direccionamiento que son usados en el resto del libro. Formalmente, las instrucciones que se tratan en este capftulo son MOV, MOVSX, MOVZX, XCHNG, LEA, INC, DEC e INT. También se puede definir como un valor inmediato una constante en el operando de una instruccion. Por iltimo, el capitulo explica la alineacién de direccitin y el prefijo que invalida el segmento, EL CONJUNTO DE INSTRUCCIONES DEL PROCESADOR La siguiente es una lista de las instrucciones para la familia de procesadores 8086, clasificadas por categorias. Aunque la lista parece enorme, muchas de las instrucciones rara vez se necesitan, Aritméticas » ADC: Suma con acarreos + ADD; Suma nimeros binarios El conjunto de instrucciones del procesador « DEC: Decrementa en 1 + DIV; Divisidn sin signo « IDIV: Divide con signo (enteros) + IMUL: Multiplica con signo (enteros) + INC: Incrementa en 1 + MUL: Multiplica sin signa + NEG: Negacién + SBB: Resta con cl bil prestado + SUB: Resta valores binarios Conversién ASCII-BCD: + AAA: Ajuste ASCII despaés de sumar » AAD: Ajuste ASCII antes de dividir + AAM: Ajuste ASCII después de multiplicar + AAS; Ajuste ASCII después de restar = DAA: Ajuste decimal después de sumar * DAS: Ajuste decimal despues de restar Corrimiento de bit + RCL: Rota a la izquierda a través del acarreo + RCR: Rota a la derecha a través del acarreo + ROL: Rota a la izquierda » ROR: Rota a la derecha * SAL: Corrimiento algebraico a la izquierda + SAR: Corrimiento algebraico a ta derecha + SHL: Corrimiento légico a la izquierda + SHR: Corrimiento légico a la derecha + SHLD/SHRD: Corrimiento en doble precision (80386 y posteriores) Comparacién + BSFIBSR: Exploracién de bit (80386 y posteriores) » BT/BTC/BTR/BTS: Prueba bit (80386 y posteriores) = CMP: Compara + CMPS: Compara cadenas de caracteres + TEST: Prueba bits ‘Transferencia de datos * LDS; Carga el registro del segmento de daios + LEA: Carga una direccién efectiva Instrusciones y direecionamienta dol procesador + LES: Carga el registro de segmento extra + LODS: Carga una cadena + LSS: Carga el registro del segmente de la pila * MOV: Mueve datos + MOVS; Mueve cadenas + MOVSX: Mueve con signo-extendido + MOVZX; Mueve con cero-extendido + STOS: Almacena una cadena + XCHG; Intercambia * XLAT: Traduce Operaciones con banderas CLC: Limpia la bandera de acarreo * CLD: Limpia la bandera de direccién + CLI: Limpia la bandera de interrupeién + CMC: Complements la bandera de acarreo + LAHF: Carga AH de las banderas + POPF: Remueve banderas de Ja + PUSHF: Agrega banderas a la pila + SAHE; Almacena el contenido de AH en las banderas + STC: Establece 1a bandera de acarreo + STD; Establece la bandera de direccisn + STI: Establece 1a bandera de interrupcién Entrada/Salida + IN; Introduce un byte 0 una palabra + OUT: Sac un byte 0 una palabra Operaciones légicas + AND: Conjunei6a l6gica (y) + NOT: Negacién légica (n0) + OR: Disyuncién logica (o) + XOR: Disyuncign exclusiva Cielos + LOOP; Repetir el ciclo hasta que se complete + LOOPE/LOOPZ: Repetir el ciclo mientras sea igual/mientras sea cero Capitulo 6 + LOOPNE/LOOPNZ: Repetir el ciclo mientras no sea igual/mientras no sea cero E1 conjunto de instruccicnas del procesador Control del procesador + ESC: Escape » HLT: Introduce un estado de deteneién + LOCK: Bloquea el bus + NOP: No operar + WAIT: Pone al procesador en estado de espera Operaciones con la pil, + POP: Remueve una palabra de la pila + POPA: Remueve todos los registros generales (80286 y pasteriores) + PUSH: Agrega a la pila + PUSHA: Agrega todos los registros generales (80286 y posteriores) ‘Operaciones con cadenas + CMPS: Compara cadenas + LODS: Carga cadena + MOVS: Mueve cadena + REP: Repite una cadena + REPE/REPZ: Repive mientras sea igual/mientras sea cera + REPNE/REPNZ; Repite mientras no sea igual/mientras no sea cero + SCAS: Explora una cadena + STOS: Almacena una cadena ‘Transferencia (condicional) + INTO: Interrumpe si hay desbordamiento « JA/INBE: Bifurca (salta) si es mayor o salta si no es menor o igual + TAEVINB: Salta sies mayor @ igual o salta si no es menor + JB/JNAE: Salta si es menor o salta si no es mayor o igual + IBE/INA: Salta si es menor o igual o salta si no ¢s mayor + ICIINC: Salta si hay acarreo o salta si no hay acarreo + JCXZ; Salta si CX es cero + JE/IZ: Salta si es igual o salta si es cero + JG/INLE: Salta si es mayor o salta si no es menor o igual + JGE/INL: Salta si es mayor o igual 0 salta si no es menor + ILJINGE; Salta si es menor o salta si no es mayor o igual + JLEVING: Saita si es menor o igual o salta si no es mayor + JNE/INZ: Salta si no es igual o salta si no es cero 92 Instrucciones y direccionamiento del procesador Capitulo & + SNP/JPO: Salta si no hay paridad o salta si la paridad es impar + JO/JNO; Salta si hay desbordamiento o salta si no hay desbordamiento + IP/IPE: Salta si bay paridad o salta si la paridad es par + BS/INS: Salta si el signo es negativo o salta si el signo es positive ‘Transferencia (incondicional) + CALL: Llama a un procedimiento INT; Interrupeién + IRET: Inierrupcién de regreso + IMP: Salto incondicionat + RET: Regreso + RETN/RETF: Regreso cercano o regreso lejano. ‘Conversién de tipo + CBW: Convierte byte a palabra + CDQ: Convierte palabra doble a palabra cuédruple (80386 y pasteriores) + CWD: Convierte palabra a palabra doble + CWDE: Convierte una palabra a una palabra doble extendida OPERANDOS ‘Un operando es una fuente de datos para una instruccién, Algunas instrucciones, como CLC y RET, no necesitan un operanda, mientras que otras pueden tener una o dos operandos, Donde existan dos operandos, él segundo es el fuente, que contiene ya sea datos que s¢rdn cntregados (inmediatos) o bien la direccién (de un regisiro o en memoria) de los datos. El dato fuente no es eambiado por la operacidn. El primer operando es el destino, que eomicne datos en un registro o en memoria y que sera procesado. Examinemos ahora cémo los operandos pueden afectar el direccionamiento de datos. ‘Operandos registro Para este tipo, el registro proporciona el nombre de alguno de los registros de 8, 16 0 32 hits Dependiendo de 1a instruccién, el registro puede codificarse en ¢l primero o segundo operandos, 9 en ambos: WORD DW 7 MOV CX,WORDX Registro en el primer cperando MOV WORD, BX Registro en el segundo operando MOV cL, Alt sRegistros en amboa operandos Operandos 93 El procesamiento de datos entre registros ¢s el tipo de operaciin més rapida, ya que no existe referencia a memoria, Operandos inmediatos En formato inmediato, el segundo operando contiene un valor constante © una expresién constan- te. El campo destino en el primer operando define la longitud de los datos y puede ser un registro 6 una localidad de memoria. A continuacién se dan algunos ejemplos: swe DBO? ABD CK, 12 Suma 22 al Cx Mov SAVE, 25 jMueve 25 a SAVE ‘Una seccién posterior estudia los operandos con mayor detalle, Operandos de memoria directa En este formato, uno de los operandos hace referencia a una localidad de memoria y el otro a un registro, Note que no existen instrucciones que permite que ambos operandos sean direcciones de memoria. Para ef direccionamiento de datos en memoria, el registro DS es el registro por omi: sidn. Aqui estin algunos ejemplos: wonpa om 9 MOY Ax, WORD iCarga WORDL en AX Apb byTEL, cL ;Suma Ch a 8YTEI MOV BY,DS: [3550] ;Mueve una palabra desde la nenoria al desplazamiento 35BOH INC BYTE PTR (2FOH] jtncrementa el byte en el desplazamiente 2F0% LLos ultimes dos ejemplos utilizan corchetes como especificadores de indice para indicar una referencia a memoria (el desplazamiento 8 combinado con la direceién en el DS). La omision de los corchetes, como en MOV BX,38BOH, indica un valor inmediato: note la gran diferencia. El Gitimo ejemplo inerementa el byte en memoria en el desplazamiento 2FOH (el desplaza- miento combinado con la direccién DS), Ya que el operando sélo indica la localidad inicial de memoria, aqui necesitamos el modificador BYTE PTR para definir la longitad. A continuacién, un elemento de dato actiia coma una direccién de desplazamiento en un operando de instruceidn: TABLEX DE 25 DUP{?? MO AL,TABLEX(4] ;Obtiene el cuarto byte de TABLEX MOY AL, FABLEX+4 ;La misma operacién Instrucciones y direccionamiento del pracesador Capitulo 6 El primer MOV usa un especificador de indice para accesar el cuarto byte de TABLEX. El segundo MOV usa un operador + para tener exactamente el mismo efecto. Operandos de memoria indirecta Direccionamienta indirecto es una técnica sofisticada que hace use de las capacidades de la compu- tadora para el direccionamiento de segmento:desplazamiento. Los registras utilizados para este ‘propésito son BX, DI, SI'y BP, codificados con.corchetes como un operador de fndice. BX, Diy SI estdn asociados con el registro DS come DS:BX, DS:DI y DS:SI, para procesamiento de datos ‘en el segmento de datos. El BX, DI y SI estan asociados con el registro DS como DS:BX, DS:DI -y DS:SI para procesamiento de datos en el segmento de datos, El BP esti asociado con el registro SS como SS:BP, para manejo de datos en fa pila, lo cual haremos en el capitulo 23 cuando llamemos subprogramas y pasemos parimetros. ‘Cuando el primer operando contiene una direccidn indirecta, el segundo se refiere a un registro o a un valor inmediato; cuando él segundo operando contiene una direccién indirecta, el primero se refiere a un registro. Una direccién indirecta tal como [BX] le indica al ensaniblador que la direccién de memoria a usar estard en el registro BX cuando el programa la ejecute poste- riormente. Enel ejemplo siguiente, el primer MOV inicializa el BX com la direccion con desplazamien- to de DATAFLD. El segundo MOV utiliza la direcein en el BX para almacenar cera en la localidad de memoria a la cual apunta, en este caso, DATAFLD: DATAFLD DR? MOU BX, OFFSET DATAPFLD ;Carga BX con el desplazaniento wov (Bx), 0 sMueve 0 a DATAFLD El efecto de los dos MOV es el mismo que codificar MOV DATAFLD,0, aunque el uso de direccionamiento indexado por lo comdn no es tan trivial. La siguiente instruccidn mueve cero a la lovalidad que se encuentra dos bytes después de DATAFLD: Mov [BK62),0 Mueve @ & DATAFLD+2 ‘También puede combinar registros en un direccionamiento indirecto, Asi [BX +51] significa la direcciGn en BX més la diteccién en el SI. ‘Note que cualquier referencia en corchetes a los registros BX, Dl, SI o BP implican un operando indirecto, y él sistema trata los contenidos de los registros como una desplazamiento de direeeién, A continuacién estin algunos ejemplos mis: mov BL, [Bx] #08 +Bx SUB BYTE PTR [DI], [81] ;08-p1 y os:81 mov (BP), AL J88-BP Desplazamiento de direccién. Este método utiliza un desplazamiento de direccién para un operando, El cédigo siguiente mueve el contenido del CL a TABLEX (una tabla 26 bytes); exactamente en donde TABLEX est determinada por el contenido de DI cuando el programa est en ejecucion: La instrucei6n MOW 95 TABLEX DB 2S _DUP(2 MOV TABLEX(DT}, CL Indexactén en el 80386 y procesadores posteriores. Estos procesadores permiten una di- reccién que sea generada a partir de cualquier combinaciém de uno o més registros generales, un desplazamiento y un factor de escala (1, 2, 4 u 8) asociado con el contenide de uno de tos registros. Por ejemplo, la instruccién Mov EBX, [ECR*2+ESPea] mueve tna direccién al EBX, la direccién consiste en el contenido de (el ECX por 2) mis el contenido de (el ESP mas 4). LA INSTRUCCION MOV La instrucci6n MOV transfiere (esto es, copia) los datos referenciados por la direccién del segun- do operando a !a direccién del primer operando, El campo que se envia permanece sin cambios. Los operandos que hacen referencia a memoria 0 registros deben coincidir en tamafo (es deci ambos deben ser bytes, ambos deben ser palabras o ambos deben ser palabras dobles). El formato general para MOV es wow | (registro/memoria}, (registro/mesoria/ineediato) Aqui estén cuatro ejemplos de operaciones MOV validas, por categorias, dados los siguien- tes elementos de datos: BYTEVAL DB ? WORDVAL DW ? 1, Mueve datos inmediatos Mov Ax, 25 fInmediate a registro MOV BYTEVAL, 25 iTnmediato a menoria, directo MOV WORDVAL (BXI, 25 rInmediate a memoria, indirect 2, Mueve registros. Mov #AX, Bex iegistre a registro MOV BS ,ax pRagistra a registro 4e segmento MOV BYTEVAL, BH ;itegigtro a memoria, directo mov [sz], ax iRegistre a memoria, indirecto 96 Instrucciones y direccionamiento del procesador Capitulo 6 3. Mueve memoria directa Mow Bi, BYTEVAL Menoria a regiatro, directo MOV AX,MORDVAL [nx] Memoria a registro, indicecto 4. Mueve registro de segmento mov Ax.D5 ‘Registro de seguento a restetre MOV WORDVAL, 05 Registro de sequento a memoria Puede mover a un registro un byte (MOV AH, BYTEVAL), una palabra (MOV AX, WORDWAL} una palabra doble (MOV EAX,DWORDVAL), El operando sélo afecta la parte del registro referenciado: por ejemplo, mover un byte al AH no afecta el AL. Las operaciones MOV que no son permitidas son de memoria a memoria (tenga esto en mente}, inmediato a regisiro de segmento y de registro de segmento a registro de segmento. Para manejar estas operaciones, tiene que codificar mus de una instruccién, INSTRUCCIONES PARA MOVER Y LLENAR Una limitacién de la instrucein MOV es que el destino debe ser de la misma longitud que el fuemte, tal como un byte a byte y una palabra a una palabra. En el 80386 y procesadores posterio- res, las instrucciones MOVSX y MOVZX (mover y Henar) facilitan la transferencia de datos de un byte o palabra fueme 2 una palabra o palabra doble de destino. Aqui esté el formato general de MOVSX y MOVZX: Teciquetal | movsx/mowux | {registro/memoria), (reg MOVSX, para uso con valores aritméticos con signo, mueve un byte o palabra a una palabra © palabra doble de destino y lena con el bit de signo (e] dltimo bit a la izquierda del origen) tos bits de més.a la izquierda del destino. MOVZX, para uso con valores numéricos sin signo, mueve un byte o palabra a una palabra. palabra doble de destino y Ilena con bits cero los bits de mis a Ia izquierda del destino. Como ejemplo, considere mover un byte con 1011 0000 una palabra; el resultado en la palabra destino depende: de la elecci6n de 1a instruccién: MOVSx: 1131 122, 1013 coe Movex: Goo goo 2012 9008 ‘Aqui estin algunos ejemplos del uso de MOVSX y MOVZX WORDVAL DH MOVSX AX, EYTEVAL ;Byte a palabra Cperandos inmediatos. 97 MOVSX BAX, WORDVAL Palabra a palabra dable MOVZx WORDVAL, AH jByte a palabra MOVEX EAX, WORDVAL ;Palabra a palabra deble Los capitulos 8 y 13 cubren con todo detalle los datos con y sin signo. OPERANDOS INMEDIATOS En el ejemplo siguiente de un operando inmediato, la instruccidn mueve la constante inmediata 0123H al registro AX. El cédigo de tres bytes para esta instruccién es BR2301, en donde B8 significa “mueve un valor inmediato al registro AX” y los dos bytes siguientes contienen el valor (2301H, en orden inverso de bytes). Muchas instrucciones estipulan dos operandos; el primero puede ser un registro o localidad de memoria y ef segundo puede ser una constante inmediata. El uso de un operando inmediato da procesamiento més eficiente que definir una constante numérica en el segmento de datos y referenciarla en el operando del MOV, como en el ejemplo siguiente: Segnento de datos: AMT. DW 1228 Define AMT? come palabra Segnente de cédigo; MOV AX, AMT2 Mtueve a AMTL a A Longitud de los operandos inmediatos La longitud de una constante inmediata no puede exceder la longitud definida por el primer ‘operando, En el ejemplo siguiente, no valide, el operando es de dos bytes, pero el registro AL. es de slo un byte: Mov AL,0123H rlongitud as valida Sin embargo, si un operando inmediato es més corto que el operando receptor, como en ABD AX,25H —pLongitud valida ‘el ensamblador expande el operando a dos bytes, O025H, y almacena el cfdigo objeto como 2500H. E1 80386 y procesadores posteriores. permiten operandos inmediatos de cuatro bytes (pale bra doble), tal como en MOV EAX,12345678H © Muove palabra doble Formatos inmediatos Una constante inmediata puede estar en cualquier formato definido vélido, Aqui estin algunos ejempios: 98 instrucciones y direccionamiento dal procesador Capitulo 6 PAGE 60,432 TITLE POSINNED! (EXE) Sjeuploa de operandos inmediatos (Coded for assembly only, NOF for execution) MODEL SMALL STACK 64 1S define 1s pila DATA }Se definen lon dace FLOR DB 2 Fuso ; 306 coon BEGIN PROC PAR MOV AK, 275, sMover innediato ADD AK 125 [Suma insediste suB AK, 200, jResta innediata MOV ERX, 0 iMover inmediats (#0386) ADD BK, 20H jSuma tamedsata (hex) END Figura €-1 Opersciones inmediaus Hexadecimal: 01231 Decimal: 292 (que el ensamblador convierte en 0123H) Binarior 31901000128 (que convierte en 01230) MOY, ADD y SUB son tres de las muchas instrucciones que permiten operancios inmed tos. La figura 6-1 da ejemplos de estas instrucciones. La directiva 386 permite al ensamblador reconocer Ia referencia al registro EBX. No se necesita un 80386 0 procesador posterir para ensamblar este enunciado, pero si para ejecutarlo. Ya que el ejemplo no tiene La intencién de ejecutarse, no se define una pila ni se inicializa el registro DS. Procesar elementos més largos que la capacidad de un registro e tratada en, capitulo posteriores. LA INSTRUCCION XCHG La instruccién XCHG realize otro tipo de transferencia de datos, pero en lugar de copiar tos datos, de una localidad a otra, XCHG intercambia los datos. El formato general para XCHG es (eegleee/ieamareee] [etigueta:i] xCHG] [registro/senori Operaciones vilidas con XCHG implican intercambio de datos entre dos registros y entre un registro y la memoria. Aqui estén ejemplos: woRD OM > HONG AL, AH vintereanbia los contentdes de los dos registros XONG AX, MORDE ;Intercanbia los contenidos del registro y 1a menoria Instrucciones de movimiento extandide 9 LA INSTRUCCION LEA La instruecién LEA es util para inicializar un registro con una direccién de desplazamiento. De hecho, un nombre mas descriptive para esta instruccién seria “Load Offset Address, carga una ireccién de desplazamiento”. El formato general para LEA es Tetiqueca:l | Bh | [registre/menoria} Un uso comin de LEA es para inicializar un desplazamiento en el registro BX, DI o SI para indexar una direccién de memoria, Haremos mucho de esto a lo largo de este libro. Aqui estd un ejemplo: DATABLEDS 20 DUP (7) SAVEYTEDB 7 LEA UX, BATASLE Carga la dizecsidn del desplazamients Mov EAVBYTE, [K) ;Mueve @1 primer byte de DATABLE Una operacién equivalente a LEA o MOV con desplazamiento, se codifica ast: Mov BX, OPESRT DATABLK Carga 1a direceién del desplazamiente LAS INSTRUCCIONES INC ¥ DEC INC y DEC:son instrucciones adecuadas para aumemtar y disminuir en 1 los contenidos de regis- tros y localidades de memoria. El formato general para INC y DEC es fetiqueta:| | INc/oBc | {registro /mamoria) Note que esas instrucciones slo necesitan de un operando, Dependiendo del resultado, la opera~ cin apaga o prende tas banderas OF, SF y ZF, a las que las instrucciones de salto: condicional ‘pueden verificar para menos, cero o mis. INSTRUCCIONES DE MOVIMIENTO EXTENDIDO ‘Los programas anteriores mavieron datos inmediatos a un registro, movieron datos de una locali- dad de memoria definida a un registro, movieron contenidos de registros a memoria y movieron el contenido de un registro a otro, En todos los casos, la longitud de los datos estaba limitada a uno © dos bytes y ninguna operacién movié datos de un area de memoria directamente a otra rea de memoria, Esta seccién explica cémo mover datos que exceden los dos bytes, Otro método, el uso de instrucciones de cadenas de earacteres, es estudiado en el capitulo 12. En el programa de la figura 6-2, el segmento de datos contiene dos campos de nueve bytes definidos como NAME! y NAME2. El objetivo del programa es mover el contenido de NAMEI a NAME2; 100 Instrucciones y direccionamiente del procesador Capitulo 6 page 60,132 TITLE POGMOVE [EXE] Operaciones de movimiente extendides = o | BRGIN PROC FAR tov Abedata —gnicia regiatres i tov Belax ae aegwastee | } OV BSL AK | t Mov cx, 09 Iniciacién para mover # caracteres i TEx Stiwawen —-‘[Tadciacign Hederecelanes pars wis | ia Brine totes p20 nov abtst] ——sGbtener cardcter de NaMs2, mov IDEAL © imovarlo «anne | INC SI Inerementar siguiente cardctsr en WAMEL | me 1ineremedcar, aPatguience postestn, em mame2 | | bec Ge Beceomentar’ contader de teeracionea | ie ato Teontadcr diference de" cera? Si. fterar | Mov Salida a O08 | a | sear END | me | 1 Lu NOFQOR ‘Ya que cada uno de los campos es de nueve bytes, se necesita mas de una instruccién MOV- El programa cantiene varias caracteristicas nuevas. A fin de pasar NAME1 a NAME2, la rutina inicializa el registro CX a 9 (la longitud de los dos campos) y utiliza los registros indice SI y DI. Dos instrucciones LEA cargan las direcciones de desplazamiento. de NAME y NAME2 en SI y DI como sigue: LEA SI,HAMEL =, Carga dezplazanientos LEA DI,MAMR2 © de NAMED y MAMEZ El programa utiliza las direcciones de los registros SI y DI para mover el primer byte de NAMEL al primer byte de NAME2. Los corchetes alrededor de SI y DI en los operandos de MOV signi fican que 1a instruccién es para usar el desplazamiento en el registro dado, a fin de accesar la localidad de memoria. Asi MOV AL, 181) significa “Utilice el desplazamiento en Si (NAMEI +0) para mover el byte referenciado al regis tro AL”. ¥ la instrucciGn Alineacion de direcciones 101 Nov {Dr}, AL significa “Mueva el contenido de AL al desplazamiento referenciado por DI(NAME2+40)". EL programa tiene que repetir estas dos instrucciones MOV nueve veces. una vez para cada cardcter en los campos respectives. Para este fin, utiliza una instrucckén que atin no hemos explicado: INE (Salta si no es igual). Dos instrucciones INC incrementan los registros Sty Dl en 1, y DEC decrementa el CX en 1. DEC también pone a 1 o a 0 la bandera de cero (ZF), dependiende del resultado cn CX; si el ‘contenido no ¢s cero, atin existen caracteres por mover, y INE regresa a la etiqueta B20 para Tepetir las instrucciones MOVE. Y como el SI'y Di han sido incrementados en 1, el siguiente MOV hace referencia a NAME! +1 y NAME2+ 1. El ciclo continia de esta manera hasta qué ha Mmovide nueve caracteres en total, hasta mover NAME] +8 a NAME2+8. (Tal vez. quiera teclear este programa, ensamblarlo y enlazarlo y utilizar DEBUG para rasirearlo, Observe el resultado en los registros, ¢l apuntador de instruccié y la pila, Utilice D S:0 para ver los cambios en NAME2.) LA INSTRUCCI En ejecucién, una instruccidin INT imterrumpe el procesamiento y accesa Ja tabla de servicios de interrupcién en memoria baja para determinar la direocién de la rutina solicitada. Después, la operacién transfiere al DOS o al BIOS para una accién especificada y regresa a su programa para continuar el procesamiento. Con més frecuencia, una interrupcin tienc que realizar los: pasos complejos de una operacién de entrada o salida, Las interrupciones necesitan de un camino que facilite la salida de-un programa y, (ras una terminaci6n exitosa, el regreso.al programa. Paraeste objetivo, INT realiza lo siguiente: IN INT + Decrementa en 2 el apuntador de la pila y mete en la pila el contenido del registro de banderas. + Limpia (pone a 0} las banderas de interrupeién y de teampa (IF y TF). + Decrememta en 2 el apuntador de la pila y mete en la pila el registro CS. + Decrementa en 2 el apuntador de la pila y mete en la pita el apuntador de instruccién. + Hace que la operacién solicitada sea realizada. Para regresar de una interrupcién, la rutina emite un IRET (regreso de interrupeién), el cual saca los registros de la pila y regresa a la instruccién inmediata posterior al [NT en su programa. Ya que el proceso anterior es automdtice por comple, sus tinicas preocupaciones son definir una pila suficientemente grande, para las operaciones necesarias de agregar y remover informacién de ella y utilizar las operaciones INT adecuadas. A partir del capitulo 9, haremos uso considerable de la instruccién INT. ALINEACION DE DIRECCIONES Como ef 8086 y ¢1 80286 tienen un bus de datos de 16 bits (una palabra), ejecutan (trabajan) mas rapido si accesan palabras que empiezan en una direcciGn (palabra) con mimero par. Considere una situacién en la que los desplazamientos OO12H y O013H contienen la palabra 63 ATH, El 102 Instrucciones y direccionamiento del procesader Capitulo 6 procesador puede accesar Ia palabra completa en el desplazamiento 0012H de forma directa a ua. registro, Pero la palabra pudo empezar en una direccién con mimero impar, tal como 00131: Contenido de memoria: [XX @ | AT Desplazamiento: 012 0013 En este caso, cl procesador tiene que realizar dos accesos. Primero, accesa los bytes en.0012H y 0013H y envia el byte de 0013H (63) al registra AL. Después accesa los bytes en 0014H y 0015H y envia el byte de 0014H (A7) al registro AH. Ahora el AX contiene AT63H Usted no tiene que realizar ninguna programacién especial para localidades pares o impares, nil tiene que saber si una direccién es par o impar. La operacién de acceso invierte de forma automética una palabra de memoria en un registro, de manera que retome su orden correcto. £1 80386 y procesadores posteriores tienen un bus de datos de 32 bits. De acuerdo con esto, se prefiere la alineacién de elementos referenciados en direcciones que sean divisibles entre cuatro: (una direceién de palabra doble), (Técaicamente, los procesadores 486 y Pentium prefieren ali- neacién en un limite de 16 bytes [parrafo].) El lenguaje ensamblador tiene una directiva ALIGN que ¢ puede usar para alinear clemen- tos en limites. Por ejemplo, ALIGN 2 alinea en un limite de palabra y ALIGN 4 alinea en un limite de palabra dobie. También, como el inicio del segmento de datos siempre-esté en un limite de pirrafo, podria organizar sus primeros datos con valores de palabras dobles, después con valores de palabra y por ditimo con valores de byte. Sin embargo, el 80386 y procesadores posteriores ejecutan a velocidad tan ripida que usted probablemente nunca notard los efectos de forzar ¢! alineamiento. DIRECCIONES CERCANA ¥ LEJANA En un programa, una direcciém puede ser cercana o Iejana, Una direcciGn cercana slo consiste en la parte de desplazamiento de una direccién. Una instruccién que hace referencia a una direccion cercana supooe al segmento actual —a saber, el DS para el segmento de datos y el CS para el segmento de cédigo. Una direccién Jejana consta de dos partes, la del segmento y la del desplazamiento, en la forma segmento:desplazamiento. Una instrucciém puede referenciar una direccién lejana desde cualquier segmento (incluyenda el actual). ‘Casi toda la programacién en ensamblador hace uso de direcciones cercanas, as cuales genera el ensamblador a menos que se le instruya de otra manera. Programas grandes en los que log segmentos ocupan mAs de 64K de memoria pueden necesitar de direcciones lejanas PREFIJO QUE INVALIDA EL SEGMENTO Para la mayorfa de los propésitos, una referencia a un drea de datos en un programa es a localida- des en el segmento de datos, manejados por medio del registro DS, Sin embargo, existen ocasio- ‘nes —en especial para programas grandes— cuando usted puede tener que manejar datos que estén Puntos clave 103 en otro registro de segment, tal como el ES 0, en ef 80386 y procesadores posieriores, el FS.0 GS. Un buen ejemplo seria una tabla grande de datos cargados del disco a la memoria. Puede utilizar cualquier instruccién para procesar datos en los otros segmentos, pero debe identificar el registro de segmento apropiado. Digamos que la direceién del otro segmento esté en el registro ES y que el BX contiene el desplazamiento dentro del segmento. Suponga que el requisito es mover dos bytes (una palabra) desde esa localidad al registro CX: MOV OX, ES: [BX] june a Cx dende ES: (Bx) La codificacién de ES: indica un operador de invalidacién que significa “Reemplace el uso normal del registro de segmento DS con él de ES”. El ejemplo siguiente mueve un valor de un byte desde el AL a c: desplazamiento formado por ¢l valor en el DI més 24: ‘segmento, en un MOV BS: ([DT+28), AL iMueve a RSs 24] deade AL El ensambiador genera el cédigo en lenguaje de maquina con el operador de invalidaciGm insertado como un prefijo de un byte (26H), precediendo a la instruccién, igual que si hubiera codificado la instruceién como ES: MOV Cx, [BK] jMueve a Cx deede es: (Bx) ES: mov (DIez4] ;Mueve a ES: (DI+24] desde AL PUNTOS CLAVE + Un operando proporciona una fuente de datos para una instrucciém. Algunas instrucciones ng necesitan operandos, mientras que otras pueden tener uno 0 das operandos. + En donde existan dos operandos, el segundo es el fuente, que contiene ya sea datos inmediatos 6 la direcei6n (de un registro 0 de memoria) de los datos, El primer operando es el destino, que contiene datos en un registro en la memoria que serin procesados. + En formato inmediato, el segundo operando contiene un valor constante: o una expresién. Los operandos inmediatos deben coincidir con et tamafio de un registro: una constante de un byte con un registro de un byte (AL. BH) y una constante de una palabra con un registro de tuna palabra (AX, BX) + Bn formato de memoria directa, uno de los operandos hace referencia a una localidad de mentoria y el otro a un registro, + El direccionamiento indirecto utiliza la capacidad de la computadora para direccionamiento segmento:desplazamiento, Los registros usados son BX, DI, SI y BP, codificados dentro de corchetes como un operador de indice, BX, Dl y Sl estan asociados con el DS como DS:BX, DS:DI y DS:SI, respectivamemte, para procesamiento de datos en el segmento de dates. El BP esti asociado con el $$ como SS:BP para manejo dé datos en Ia pila. + Puede combinar los registros en un direccionamiento indirecto como [BX + SI], lo que significa la direceién en BX més la direcci6n en el SI 104 Instrucciones y direccionamiento del procesador Capitulo 6 * La instruccién MOV transfiere (o copia) datos referenciados por la direccién en el segundo ‘operando a ta direccién en el primer operando. + La instruccién LEA es dtil para inicializar un regisiro con un desplazamiento. «INC y DEC son instrucciones adecuadas para incrementar y decrementar en 1 los contenidos de registros y de localidades de memoria + La instruccién INT interrumpe el procesamiemo de su programa, transfiere al DOS o al BIOS para una accién especifiea y regresa su programa para continuar el procesamiento PREGUNTAS ‘6-1, Para una instruceién con das operandos, ;euil es el fuente y cual et destino? €-2, (a) {De qut manera significativa difieren las siguiemes instrucciones en su ejecuckin? MOY AX, 225AK Moy Ax, (22524) (b) Para el segundo MOY, un operando est entre corchetes. ;Cul es el nombre de esta earacteristica? 6-3, (a) ,De que manera significativa differen las. siguieres instrucciones en su ejecucidin? MOV BK, 0 Mov IBxI,0 (b) Para el segundo MOV, jqué lipa de direccionaeiento estd invalucrada.con el primer operando? 4, Expligue la operacitn de la instruccién MOV cx, [Ritesree) 6-5. El enunciado siguiente tiene um error: esto es. so necesita algo para que el ensamblador to traduzca: Mov (Bx), (82) (a) {Cul es el error? th) Cima corregiria el error? 6-6, Dada Ia siguiente definicidn de datos, encventre los errores en los enunciadas y eodifique las sruociones mecesarias para corregirlos: BYTEL DB? BYTE2 DB? WoRDL DW > (a) NOW BYTE, BYTE? (bo) MOV AL, WORDL RL operands 1 ea correcto (c) WoW BL, O34 81 operands 2 em correcto 6-7, Codifique lo siguiente como instrucciones con operandas iamediatos: (a) almacenar 320 en el AX {b) comparar FLDB con cero; {¢} sumar 40 hex at BX; (d) restar 40 hex del CX; (e) reeorrer PLDB. un bit a la izguierda; {F) recorrer ef CH un bit a Ia derecha, Preguntas 105 6-8, Codificar una insarvecign que imercambie los contenidos de una palabra llamada WORDI con el CX. 6-9. Codifique instrucciones para cstablecer BX con la direceién (desplazamiento} de un elemento llamado TABLEX, En términos generales, cull es el objetive de ln instruccién INT? (a) (Como afecta la instruccién ENT a la pila? (bo) ;Céimo afecta la instruccidn IRET a la pila? Codifique, ensamble, enlace y utlice DEBUG para probar el programa siguicme: * Defina elememas byte Hamades BYTEA y BYTEB (con cualquier valor) y una pal WORDC (con cero). + Mueva el contenido de BYTEA al AL. + Sume el contenido de BYTEB al AL. + Mueva el valor inmediato 25H al BL, intercambie tos contenidos del AL y BL. * Multiplique el contenide de BL por el de AL. (MUL BL). + Almacene el producto en AX y envielo s WORDC. a Narmada CAPITULO 7 Escritura de programas .COM OBJETIVO Explicar el objetivo y los usos de programas .COM y cémo preparar un programa en lenguaje ensamblador para ese for- mato. INTRODUCCION Hasta ahora sélo hemos escrito, ensamblado y ejecutado programas .EXE. De forma automitica, ¢lenlazador genera un formato particular para un programa .EXE y, cuando se almacena cn disco, es precedido por un bloque especial de encabezado que al menos es de 512 bytes (el capitulo 24 proporciona detalles de los bloques de encabezado). También puede generar un programa .COM para ejecucién. Un ejemplo de uso comiin de programa .COM es el COMMAND.COM. Las ventajas de programas .COM estén en que son més pequeios que programas .EXE comparables y son mis ficiles de adaptar para actuar como programas residentes en memoria, El formato .COM tiene sus rafces en los dias anteriores al DOS, cuando el tamafio de los programas estaba limitade a 64K. DIFERENCIAS ENTRE PROGRAMAS .COM Y .EXE Algunas diferencias importantes entre un programa que ¢s para ejecutarse como .EXE y una que es para ¢jecutarse come .COM implica el tamafio del programa, la segmentacién y la inicializacién 108 Conversién a formato .COM 107 ‘Tamafo del programa En la practica, un programa .EXE puede ser de cualquier tamano, mientras que un programa .COM esti restringido a un segmenio y a un maximo de 64K, incluyendo el PSP. EL PSP es un bloque de 256 bytes (100H) que el DOS inserta antes de los programas .COM y .EXE cuando los carga en memoria. El limite de 64K es una regia general; puede darle ia vuelta codificando enunciados SEGMENT AT adicionales, una caracteristica que estd fuera del alcance de este capi- tulo. Un programa .COM siempre es mds pequefio que su contraparte .EXE; una razén es que el bloque de encabezado de $12 bytes a un programa .EXE no precede a un programa COM, (No confunda el bloque de encabezado con el PSP.) Un programa .COM es una imagen absoluta del programa ejecutable, pera sin informacién de direcciones reubicables, Segmentos El uso de segmentos para programas .COM es muy diferente (y més facil) que para programas -EXE, Segmento de la pila. Usted define un programa .EXE con un segmento de pila, mientras ‘qué tun programa .COM genera de manera automiética una pila. Asi, cuando escribe un programa en lenguaje ensamblador que serd convertido a formato .COM. omite la definicién de la pila. Si Jos 64K del tamafo del programa no es suficiente, el ensamblador establece la pila fuera del Programa, ea memoria superior. Segmento de datos. Un programa .EXE por lo comin define un segmento de datos ¢ inicializa el registro DS con la direccién de ese segmento. Ya que los datos para un programa .COM estin definidos dentro del segmento de cédigo, tampaco tiene que definir el segmento de datos. Como verd, existen formas. sencillas de manejar esta situacién. ‘Segmento de eédigo. Un programa .COM completo combina el PSP, la pila, el segmento de datos y el segmento de cédigo en un segmento de cédigo de un méximo de 64K. Inicializacién ‘Cuando ¢] DOS carga un programa .COM para ejecucién, inicializa de forma automatica todos los registras de segmentos con la direceién del PSP. Ya que los registros CS y DS contendrin la direccién de segmenta inicial correcta, su programa no tiene que cargarlos Pucsto que el direccionamiento comienza en un desplazamienio de 100H bytes desde el inicio del PSP, codifique una directiva ORG como ORG 100H inmediatamente después de SEGMENT (segmento de cédigo) 0 el enunciado CODE. La directiva ORG le indica al ensamblador que empiece la generaciGn. del cédigo objeto en un desplazamiento de 100H bytes pasando el inicio del PSP, en donde el programa .COM real inicia, CONVERSION A FORMATO .COM. Si su programa fuente ya estd escrito en formato .EXE, puede utilizar un editor para convertir las instrucciones a formato .COM. Los formatos de codificacién de MASM y TASM para progra- mas .COM son idénticos, aunque sus métodes de conversidn difieren. Cuando la conversién a formato .COM esté completa, puede borrar los archivos .OBS y .EXE. 108 Escritura de programas COM — Capitulo 7 Conversién con Microsoft Para ambos programas, .EXE y .COM, con MASM de Microsofi se ensambla y produce un archive .OBJ y después se enlaza para producir un programa .EXE. Si escribié el programa para ejecutarse como un programa .EXE, ahora puede ejecutarlo. Si escribié el programa para ejecu- ‘arse como un programa .COM, el enlazader produce un mensaje Advertencia: No exiete segnento de la pila (STACK) Puede ignorar este mensaje, ya que se supone que no debe existir definida una pila. Un programa con nombre EXE2BIN convierte programas .EXE a programas .COM. (En realidad, convierte programas .EXE a un archivo .BIN binaria; el nombre de! programa significa “convierte EXE a BIN", pero debe poner a su archivo de salida la extensién .COM.) Suponiendo que EXE2BIN est en la unidad por omisiém, y que el archivo enlazado llamado CALC.EXE esté en la unidad D, teclee. EXE2RIN D:CALC D-CALC.COM (ENTER) ‘Ya que el primer operando del comando siempre se refiere a un archivo .EXE, no codifique la ex- tensién .EXE. El segundo operando puede ser un nombre diferente a CALC.COM. Si omite la extensién, EXE2BIN supone que es BIN, que después tendria que renombrar como .COM a fin de ejecutar el programa (alguien, en algdn lugar, debi6 pensar que esta forma era una buena idea), Conversién con Borland Con tal de que su programa fuente esié codificado de acuerdo con los requisites COM, usted puede convertir en forma directa su programa objeto en programa .COM. Uiilice la opcién /T para TLINK: LINK /T DLeALe EJEMPLO DE UN PROGRAMA .COM El programa de la figura 7-1, llamado EXCOML, es el mismo de la figura 5-2, pero ahora esti corregido para ajustarse a los requisitas .COM, Note los cambios siguientes de la figura 5-2. + No existen definidos una pila o un segmenta de datos, + Un enunciado ASSUME le indica al ensamblador que inicie los desplazamientos desde el inicio del segmento de cédigo. El registro CS también tiene esta direccidn, que es la del PSP, Sin embargo, la directiva ORG hace que | programa empiece 100H bytes desde este punto, inmediatamente a continuacién del PSP. + ORG LOOH establece un desplazamiento para el inicio de ejecucién. El cargador de programa jmacena esta direccién en el apuniador de instrucekén, + Una instruccién JMP transfiere ¢! control a la ejecucidin pasando los datos definidos. Algunos programadores codifican los datos después de las instrucciones, de manera que la instrucciGn inicial JMP no es necesaria. Codificando primero lox datos puede acelerar ligeramente ¢] proceso de ensamble, pero no da ninguna otra ventaja. Lapita de COM 409 page 60,192 gyre bovcow programa .COM para mover y sumar CODESG SEGMENT PARA ‘Code’ ASSUME C5: CODESG, DS CODESG, Si +CODESG, BS :CODESG ORG 100K Inieia al final de PSP BEGIN: UMP MAIN Salte pasando los datos fupa owe 286 iDefiniciones de dator eRe Mov AX, FLDA Mover 0250 a ax ADD AX, FEDB Sumar 0125 a Ax MOV FEED, A Almacenar suma en PLDC wOV AX.4COGH = jcalida a DoS mr END BEGIN Figura 7-1. Programa fucnic COM con segmentos. convencionales ‘+ INT 21H, funcién 4CH, finaliza el procesamiemto y sale al DOS. Para este propésito, también puede usar Ia instruccién RET. Aqui estin los pasos para convertir el programa para MASM y TASM: asm TASH MASH D:BXCOM,D ASN D:EXCOML, Ds LI D:exCOM ,D TLINE /T D-EXCOML,D: EXERBIN DsBXCOML D+EXCOME.COW Los programas EXE y .COM son de 792 bytes y de 24 bytes, respectivamente. La diferen- ‘cia es en gran parte causada por el bloque de encabezado de 512 bytes almacenado al inicio de los médulos .EXE, Teclee DEBUG D:EXCOM1.COM para rastrear la ejecucién del programa COM ‘hasta (pero no incluyendo) la dltima instrucci6n ‘Cuando codifique un programa .COM, también puede utilizar directivas simplificadas de segmentos, como se muestra en fa figura 7-2, Una vez més, s6lo define un segmento de codigo, no una pila ni un segmemo de datas. LA PILA DE. .COM Para un programa COM, el DOS define de manera automética una pila y establece la misma direccién de segmento en los cuatro registros de segmento. Si el segmento de 64K para el progra- ma ¢s suficientemente grande, el DOS establece Ia pila al final del segmento y carga cl registro SP con FFFEH, la parte superior de la pila (el tope de la pila). Si el segmento de 64K no contiene espacio suficiente para una pila, el DOS establece la pila, al final de la memoria. En cualquier caso, el DOS mete después una palabra con cero a la pila, Ia cual achia como un desplazamiento para el IP, si usted utiliza RET para terminar la ejecucién del programa, Si su programa es grande, o si la memoria est limitada, debe tener cuidado al enviar palabras a Ia pila. El comando DIR indica el tamafio de un archivo y le dard una idea del espacio +10 Escritura de programas .COM — Capitula 7 page 60,132 Tre Povcom2” Programa .COM para mover y sumar datos MODEL SHALL. cone orc 100 vinieto BEGIN: GMP = MAIN final de_psP mA Dt WAIN PROC NEAR MOV AX,FLOA «Mover 0250 a AK ADD AX, FLOB. Sumar 0125 a Ax Mov PLDC, At macenar suma en FLOC MOV AX,4G00H = Volver @ DOS ee) MAIN EXDP: { esp Beorw Figura 7-2. Programa fuente .COM con directivas simplificadas de segmento. disponible para una pila. La mayoria de los programas mis pequefios en este libro estin en formato .COM, que deben ser distinguidos con facilidad de los de formato .EXE. SUGERENCIAS PARA LA DEPURACION PUNTOS CLAVE + Un programa .COM esté restringido a un segment de 64K + Un programa .COM es mis pequefio que su programa .EXE contraparte, = Un programa escrito para correr como .COM no define una pila.o un segmento de datos ni inicializa cl registro DS. «Un programa escrito para correr como .COM utiliza ORG 100H inmediatamente después del enunciado SEGMENT. El enunciado establece Ia direccién de desplazamiento al inicio de la ejecucién que sigue al PSP. + Para MASM de Microsoft, el programa EXE2BIN convierte un archivo EXE a formato .COM. TLINK de Borland puede convertir un programa objeto directamente a formato .COM. + E] DOS define una pita para un programa .COM al final del programa. La omisién de un solo requisito .COM puede provocar que un programa falle. $i EXE2BIN encuentra un error, sélo le notifica que no puede convertir el archive, pero no da la razén, Verifique los enunciados SEGMENT, ASSUME y END. Si omite ORG 00H, de forma inco- rrecta el programa se refiere a los datos en el PSP, con resultados impredecibles. Si ejecuta un programa .COM con DEBUG, utilice D CS:100 para ver los datos « instruc- ciones. No siga el programa hasta su (erminacion; en lugar de eso, utilice el comando Q de Un intento de ejecutar un médulo .EXE de un programa escrito como .COM fallard Preguntas Wt PREGUNTAS Tel, Cuil es el tamafio méxime de un programa .COM 7-2. Para-un programa fuente que serd.convertido a formato .COM, qué segmentos puede definir? 7.3. ;Por qué debe codificar ORG LO0H al inicio de un programa que seré comvertide formato .COM? 7-4, ,Cémo maneja el sistema el hecho de que usted no define una pila para ua programa COM? 7-5. Un programa fuente tiene por nombre SAMPLE,ASM. Proporcione Ins comandos para convertir & formato .COM bajo (a) MASM; (b) TASM. 746, Cori el programa din pregus 6-12 par formama .COM. Enso, enliceloyeecno con DEBUG. CAPITULO 8 Légica y control de programas OBJETIVO Cubrir los requisitos para control de programas (ciclas y trans- ferencia de control (saltos]), para comparaciones légicas, para operaciones légicas entre bits y para organizacién del programa INTRODUCCION 12 Hasta este capitulo los programas que hemos examinado han sido ejecutados en forma lineal, esto s, con una instrucciéin secuencialmente a continuacién de otra, Sin embargo, rara yez un proble- ‘mz programable es tan sencilla. La mayoria de los programas constan de varios ciclos en los que una serie de pasos se repite hasta alcanzar un requisito especifico y varias pruebas para determinar qué accidn se realiza de entre varias posibles. Una practica comin es verificar si un programa est al final de su cjecucién, Requisitos como éstos implican la transferencia de control a la direccién de una insirwecién ‘que no sigue dé inmediato de la que se esté ejecutando actualmente, Una transferencia de control puede ser hacia adelante, para ejecutar una serie de pasos nuevos, o Aacia atrds, para volver ejecutar los mismos pasos. Ciertas instrucciones pueden transferir el control fuera del flujo secuencial normal afadien do un valor de desplazamiento al [P. A continuaciGn estén las instrucciones introducidas en este capitulo, por categorias: Etiquetas de instrucciones 113, OPERACIONES OPERACIONESDE © OPERACIONES §=—-CORRIMIENTOY DE COMPARACION TRANSFERENCIA LOGICAS ROTACION owe cm ap san/su, TEST one nor SAL / SH, Jann OR RCR/ROR oor oR ROU/ROL DIRECCIONES CORTA, CERCANA Y LEJANA Una operacién de salto aleanza una direcciGn corva por medio de un desplazamiento de un byte limitado a una distancia de -128 a 127 bytes. Una operacién de salto alcanza una direceién cercana por medio de un desplazamiento de una palabra, limitado a una distancia de ~32,768 a 32,767 bytes dentro del mismo segmento. Una direccién Jejana puede estar en otro segmento y cs alcan- zada por medio de una direccién de segmemo y un desplazamiento; CALL es a instruccién normal para este propésito. La tabla siguiente indica las reglas sobre distancias para las operaciones JMP, LOOP y CALL. Hay poca necesidad de memorizar esta reglas, ya qué el uso normal de estas instruceiones en rara ocasién causa problemas. Conta, Cercana Lejana Mismo segmento Mismo segmenta Instrucciones 128 a 127 32,768 a 32,767 Ovo segmento IMP si sf sf Inna si sf: 80386 y posteriores no Loop si 110 fo CALL NIA a ETIQUETAS DE INSTRUCCIONES ‘Las instrucciones IMP, Jnnn (salto condicional) y LOOP requieren un operando que se refiere a la etiqueta de una instruceién. El ejemplo siguiente salta a ASQ, que es una etiqueta dada a-una instruccién MOV; ome ANB MOU. aso 5H, 08 ‘La etiqueta de una instruccién, tal como A90:, terminada con dos puntos (:) para darle el atributo de cercana —esio ¢s, la etiqueta esta dentro de un procedimienio enel mismo segmento de-cédigo. ‘Cuidado: Un error comin es Ia omisién de los dos puntos. Note que una etiqueta de direceién en ‘un operando de instruccién (como JMP A20) no tiene un caracter de dos puntos. ‘También puede codificar una etiqueta en una linea separada como En ambos casos, la direccién A9O se refiere al primer byte de la instruecién MOV. 114 Légica y control de programas Capitulo & LA INSTRUCCION JMP ‘Una instrucci6n usada comiinmente para la transferencia de control es la instruccién JMP Gump, salto, bifurcacién). Un salto es incondicional, ya que la operacién transfiere el control bajo cual- quier circunstancia. También, JMP vacia el resultado de la instruccién previamente procesada; por lo que, un programa con muchas operaciones de salto puede perder velocidad de procesamien- to. El formato general para IMP es [etiqueta:] [owe [direccién corta, cercana o lejana| Una operacién IMP dentro del mismo segmento puede ser corta o cercana (o de manera técnica, lejana, si €l destino ¢s un procedimiento con el atributo FAR). En su primer paso por un programa fuente, el ensamblador genera la longitud de cada instrucciéin. Sin embargo, una ins- truccién IMP puede ser de dos o tres bytes de longitud. Una operacién JMP a una etiqueta dentro de~128 a +127 bytes es un salto corto. El ensamblador genera un byte para la operacién (EB) y un byte para el operando. El operando actiia como un valor de desplazamiento que la computador suma al registro IP cuando se ejecuta el programa. Los limites son de OOH hasta FFH, o de ~128 hasta +127. El ensamblador ya puede haber encontrado el operando designado (un salto hacia atrés) dentro de ~128 bytes, como en Asay En este caso, el ensamblador genera una instruccién de méquina de dos bytes. Una JMP que excede 128 a +127 bytes se convierte en un salto cercano, para el que el ensamblador genera un cédigo de maquina diferente (E9) y un operando de dos bytes (8086/80286) o un operando de cuatro bytes (80386 y procesadores posteriores). En un salto hacia adelante, el ensamblador atin no ha encontrado el operando designado: amp AO ago. ‘Ya que algunas versiones del ensamblador no saben en este punto si el salto es corto o cercano. generan de forma automética una instruccién de tres bytes. Sin embargo, estipulando que en realidad el salto es corto se puede utilizar el operador SHORT para forzar un salto corto y una instruccién de dos bytes codificando aso Ejemplo de un programa que utiliza JMP El programa .COM de la figura 8-1 ilustra el uso de la instruccién JMP. El programa inicializa los registros AX, BX y CX con el valor de 1, y un ciclo reatiza lo siguiente La instruceién IMP 5 page £0,132 TITLE POBJUNP’ (COM) Uso de JNP para iverar | MODEL SMALL CODE 190 ong 0H e100 PROC NEAR #100 mov) AK,OL i Imiciacién de AX, 0103 mov BKOL 7 BX ¥ 106 mov | Kol Cha ad 109 108 ADD AKO jSumar 01 a at boc ‘ROD OBXLAX ;Sumar AK a BE 108 SEL CK, ;Multiplicar por dea a cx p10 CMP R20 ;Saltar a la etiqueta A20 ona Mam ENDP ND MAIN Figura 1 Use de la instruccin IMP + Suma | a AX «= Suma AX a BX + Duplica el valor en CX ‘Al final del ciclo, la instruccin IMP A20 transftere el contrat a la instruccién etiquetada con A20. El efecto de repetir el ciclo hace que AX se incremente como 1, 2, 3, 4, BX aumente de acuerdo a la suma de los primeros nimeros naturales, obteniéndose 1, 3, 6, 10, ...; y CX se uplique como 1, 2, 4, 8, ... Ya que este ciclo no tiene salida, el procesamiento es infinito —por Jo comin no es una buena idea. Enel programa, A20 es -9 bytes desde el IMP. Puede confirmar esta distancia examinanda el cédigo objeto para JMP:EBF7. EB es el eédigo de méquins para un IMP cercano y F7 hex es la notacién en complemento a dos del -9. El IP comtiene el desplazamiento (0112H) de la siguien- te instruccién a ejecutarse. La operacién IMP suma cl F7 (técnicamente, FFF7, ya que el IP es de tamafio de una palabra) al IP, que contiene el desplazamiemto 0112H de la siguiente instruccién al IMP: DECIMAL HEXADECIMAL Apuntador de instruccién: an Operands de TMP: “5 (complement = dom) Direceisn de salta: 265 errrery ‘La direccién de salto es calculada O109H, en donde se ignora el acarreo externo de 1 (como lo ‘muestra una revisién del listado dei programa para la direcciin de desplazamiemo de A20). La operacién cambia ¢l valor del desplazamiento en el IP y salta la instruccién de la cola, Como éste sun salto hacia atrés, el operando FFF7 es negativo, mientras que para un salto hacia adelante sera un valor positivo. ‘Como una experiencia til, teclee el programa, ensimblelo, enldcelo y canviértalo a forma- to .COM. No se necesitan definiciones. de datos, ya que los operandos inmediatos generan todos Jos datos. Utilice DEBUG para rastrear el médulo .COM para varias iteraciones. Una vez que el AX eontenga 08, el BX y CX serdn incrementados a 24H (36 decimal) y 80H (128 decimal), repestivamente, Teclee Q para salir de DEBUG, 116 Logica y control de programas Capitule 8 LA INSTRUCCIGON LOOP Como se mencioné en la figura 8-1, la instrucci6én JMP provoca un ciclo infinito. Pero es mas probable que una rutina realice un ciclo un mimero especifico de veces 0 hasta que se alcance una condicién particular. La instruccién LOOP, que sirve para este propésito, requiere un valor inicial en el registro CX. En cada iteraciGn, LOOP de forma automatica disminuye 1 de CX. Siel valor en el CX e5 cero, el control pasa a la instrucciGn que sigue; si el valor en el CX no es cero ef control pasa a la direccida del operando. La distancia debe ser un salto corto, desde ~128 hasta +127 bytes. Para una operacién que exceda este limite, el ensamblador envia un mensaje coma “salto relativo fuera de rango” . El formato general para LOOP es [[etiqoctest [2208 [aivecci@n corte El programa en 1a figura 8-2 itustra el uso de LOOP y realiza la misma operacién que la del programa de la figura 8-1, salvo que termina después de 10 vueltas. Una instruccién MOV inicializa e1. CX con el valor 10. Como LOOP utitiza el CX, este programa usa ahora DX en lugar de CX para duplicar el valor inicial de 1. La instruccién LOOP reemplaza JMP A20.y, para un procesa- micnto mas rapido, INC AX (incrementa el AX en 1) reemplaza ADD AX.01 Igual que para IMP, el operando del eddigo de mdquina contiene 1a distancia desde el final de la instruccién LOOP a la direceién de A20, la cual es sumada al IP. Come un ejercicio tril, modifique su copia de la figura 8-1 con estos cambios y ensamble, enlace y convierta el progeama a COM. Utilice DEBUG para rastrear a lo largo de los 10 cicios. ‘Una vez que CX es reducido a cero, tos contenidos de AX, BX y DX son, OOOBH, 0042H y O400H, respectivamente. Presione Q para salir de DEBUG. Existen dos variaciones de la instruccién LOOP, ambas también dectementan el CX en 1 LOOPE/LOOPZ (repite ci ciclo mientras sea igual o repite el ciclo mientras sea cero) comtintia el ciclo mientras que el valor en el CX es cero 0 la condicién de cero ext establecida, LOOPNE! LOOPNZ (repite el ciclo mientras no sea igual o repite el ciclo mientras sea cero) continda el ciclo mientras el valor en cl CX no es cero 0 la condiciéin de cero no esté establecida page 60,132 TITLE POSLCOP' (CoM) Ilustraeién as LOOP MODEL SMALL co e100 ORG (00H 0190 Be 4002 mov Ax, 02 Hiniciar ax, | D103 BR do01 Mov Bx, on By, y 010g BA aD01 Mev Bx, a2 1 BE con D109 BS gona Mov ex, 10 Hnietar proc a0: j_nimero de Lteraciones D10¢ 40 mo Ax }Sumar OL a 2 p10 a3 pe ADD BX.A Sumar AX a 5X DIOP Di E2 SHL BK, Multiplicar por dos a DX o1ii B2 FS Looe 20 Decrementar o% ‘ters: ai ee diferente de cero 9213 Be 4c00 Mov AX, 4C00H Salida a DoS 2116 CD 22 INP (218 Figura 8-2 Uso de la instruccién LOOP Registro de banderas uz Ni LOOP ni sus variantes LOOPax afectan ninguna bandera en el registro de banderas, que serian cambiados por otras instrucciones dentro de Ja rutina del ciclo. Coma consecuencia, si la rutina no tiene instrucciones que afecten la bandera ZF (cero) entonces el uso de LOOPNE/ LOOPNZ seria equivalemie a usar LOOP. REGISTRO DE BANDERAS El resto del material de este capitulo necesita de un conocimiento mas detallado del registro de banderas. Este registro tiene 16 bits, los cuales varias instrucciones ponen a | para indicar el estado de una operaciéa. En todos tos casos, una bandera permanece en 1 hasta que otra instruceién lo cambia, El registro de banderas para modo real tiene los siguientes bits usados comiinmente: Bat ness Soflalizador (CF (Bandera de acarreo). Contiene un acarreo (0-0 1) del bit de orden alto (el mas ala izquierda) después de operaciones aritméticas y algunas operaciones de corrimiento y rotacisn. PF (Bandera de paridad). Contiene una verificacién de los acho bits de arden bajo de ‘operaciones de datos. La bandera de paridad no debe ser confundida con e! bit de paridad y rara vex interes en programacién convencional. Un néimero impar de bits en 1 limpian la bandera a ‘cero (Jo ponen en 0), y un nimero par de bits en 1 Io establecen en | (lo ponen en 1) AF (Bandera de acarreo auxiliar). Tiene que ver con aritmética en campos ASCII y BCD empacados. Una operacién que provoca un acarreo externo en el bit 3 (el cuarto bit desde la derecha) de un registro de un byte pone en 1 esta bandera. ZF (Bandera de cero). Como resultado de una operacién aritmética o de comparacién, esta bandera se pone en 10 en 0. De moda inesperado, un resultado no cere pone en 0 la bandera y un resultado-cero lo pone en 1, Sin embargo, 1a configuracién, que en apariencia no cs correct, es correcta ligicamente: 0 significa no (el resultado no es igual a cero) y 1 significa si (el resulta- do es igual a cero). JE y JZ prueban esta bandera, SF (Bandera de signo). Se establece de acucrdo-con el signo (el bit de orden mis alto o de més a la izquierda) después de una operacién aritmética: Positive pone la bandera en 0 y negativo lo pone en I. JG y JL prueban esta bandera ‘TF (Bandera de trampa), Cuando est en 1, hace que el procesador ejecute en modo de un solo paso, esto es, una instrucciém a la vez bajo el control del usuario. Ya establecié esia bandera cuando ingresé el comando T en DEBUG, y ése e¢ casi el tinico lugar en donde esperaria encontrar su uso. IF (Bandera de interrupeién), No permite interrupcidn cuando esté en 0 y permite inte- rrupeién cuando est en 1. En programacién convencional, esta bandera rara vez es utilizada, DF (Bandera de direecién), Utilizado en operaciones de cadenas para determinar la reecién de transferencia de datos. Cuando la bandera es 0, 1a operaci6n incrementa los registros SI y DI, haciendo que la transferencia de datos sea de izquierda a derecha; usando la bandera en 1, a operacién decrementa el S$] y DI haciendo que la transferencia de datos sea de derecha a izquierda. 118 Légica y control da programas Capitulo B OF (Bandera de desbordamiento). Indica un acarreo interno y uno externo en el bit de signe de alto orden (dé mis a la izquierda) después de una operacién aritmética con signo. LA INSTRUCCION CMP La instruceidm CMP por lo comin es utilizada para comparar dos campos de datas, uno 0 ambos de los cuales estin contenicos en un registro. El formato general para CMP es [fettquera:) | cw] {regtstro/sesorsa), (registro/nenoria/ inmedsato) | El resultado de una operacién CMP afecta las banderas AF, CF, OF, PF, SF y ZF, aunque hho tiene que probar estas banderas de forma individual. El cédiga siguiente prueba el registro BX por un valor cero: x Me BY,00 ;Compara 8X con cero SZ BO 784 es cero salta a BSE (accidn oi ex diferente de cere) aso, . ;Destino del salto, si 8x ea cero Si el BX tiene cero, CMP establece el ZF a { y puede 0 no cambiar la configuracién de otras banderas. La instruccién JZ (salta si es cere) s6lo prueba la bandera ZF. Ya que ZF tiene t (que significa una condicién cero), JZ transfiere el control (salta) a la direceién indicada por el operan- do BSO. Observe que la operacién. compara el primer operando con el segundo: por ejemplo, cei ‘valor del primer operande es mayor que, igual a o menor que el valot del segundo operando? La seccién siguiente porporciona las diferentes formas de transferencia de control con base en condi- cciones. prabadas, INSTRUCCIONES DE SALTO CONDICIONAL El ensamblador permite usar una variedad de instrucciones de salto condicional que transfieren el control dependiendo de las configuraciones en el registro de banderas. Por ejemplo, puede com- parar dos campos y después saltar de acterde con los valores de las banderas que la comparacién establece. El formato general para el salto condicional es Tetiqueta-][gnan | direccién corta Como ya se explicé, ta instruccién LOOP disminuye el registro CX; si es diferente de cero, transfiere el control a la direccién del operando. Podria reemplazar el enunciada LOOP A20 de la figura 8-2 con dos enunciados —uno que decremente el CX y otro que realice un salto condicional: Instrucciones de salto condicional 119 pec cx rBquivalente a LOOP DEC y JNZ realizan exactamente lo que hace LOOP. DEC dectementa el CX en 1 y pone a 1 oa O la bandera de cero (ZF) en el registro de banderas. Después INZ prueba la configuracién de la bandera de cero; si el CX es diferente de cero, el control pasa a A20, y si el CX es cero el control pasa. a la siguiente instruccién hacia abajo. (La operaci6n de salto también brinea la linea de espera cola de instruccién de prebisqueda del procesador.) Aunque LOOP tiene usos limitados, en este ejemplo es mis eficaz que el uso de las instrucciones DEC y JNZ. ‘AL igual que para JMP y LOOP, e1 operando en eédigo de mAquina contiene 1a distancia desde el final de la instruccién JNZ a la direccién de A20, la cual es sumada al apuntador de instruccidn. Para el 8086/286, la distancia debe ser un salto corto, desde —128 hasta +127 bytes. Si una operacién excede este limite, el ensamblador envia un mensaje “salto relativo fuera de ran- 0". El 80386 y procesadores posteriores proporcionan desplazamientos de 8 bits (corto) o de 32 bits (cercano) que permiten alcanzar cualquier direccién dentro del segmento Datos con signo y sin signo. Distinguir el propésite de los saltos condicionales debe clarificar su uso. El tipo de datas (sin signo 6 con signa) sobre los que se realizan las comparaciones o la aritmética puode determinar cual es la instruccién a utilizar. Un dato sin signe trata todos los bits como bits de datos: ejemplos tipicos son las cadenas de caracteres, tal como nombres o direcciones, y valores numéricos tal como mimeros de cliente. Un dato con signo trata el bit de mds a la izquierda como un signo, en donde 0 ¢s. positive y 1 es negative, Muchos valores numéricos pueden ser positive o negativo En el ejemplo siguiente, ¢l AX contiene 11000110 y el BX contiene 00010110. La siguiente instruccién emp ax, Rx. compara el contenido del AX con el contenido de] BX. Para datos sin signo, el valor AX es mayor; sin embargo, para datos con signo cl valor AX ¢s menor a causa del signo negativo. Saltos con base en datos sin signe Las instrucciones siguientes de salto condicional se aplican a datos sin signo: SIMBOLO DESCRIPCION BANDERA EXAMINADA JB/3z Salta si es igual © salts si es cero aP aue/gwz Salta si no es igual o salta i no es cero oF JA/MWE Bifurca i es mayor © galta i no es menor o igual cr, oF SAE/IWB Salta si ee mayor o igual o galta si no es menor oF JB/NAE Salta si e8 menor o alta si no es mayor o igual or JBE/GNA Salta si ex menor o igual o galta si no es mayor cr, aF 120 Lagica y control de programas Capitulo & Cada una de estas pruebas las puede expresar en uno de das céidigos simbélicas de epera- cia. Seleccione aquel que sea mis claro y mas descriptive. Por ejemplo, aunque JB y INAE generan el mismo cédigo objeto, 1a prueba afirmativa JB es mis ficil de entender que la prueba negativa JNAE. Saltes con base en datos con signa Las instrucciones siguientes de salto condicional se aplican a datos con signo: SiIMBOLO DESCRIPCION BANDERA EXAMINADA ge/dt Salta ef es igual o gaita ei es cero ar SWE/JHZ Salta si no es igual o salta si no es cero ar G/ML Salta ei es mayor o salta ei ne es menor o igual 2F, SP, oF JGR/JNL Salta ai es mayor o igual 6 salta si no es menor er, oF GL/INGE Salta ei es menor o galta si ne es mayor o igual SF, OF SJLR/JNG Salta Bi es menor o igual o salta ai no €6 sayor ay, se, oF Los saltos para la prueba de igual o cero (JE/KZ) y para la prueba de no igual @ cero (JNE/ JNZ) estin inclnidos en las listas de datos sin signo y datos con signa, ya que una condicién de igual o cero ocurre sin importar la presencia de signo, Pruchas aritméticas especiales Las siguientes instrucciones de salto condicional tienen usos especiales ‘siMBoLo DESCRIPCION BANDERA PRQBADA ss Salta si el sign es negative se us Salta ei el sign es positive sr se Salta si hay acarres (igual que JB) ee one falta si no hay acarrec cr 30 Salta 21 hay desbordanients or ame Salta ef no hay desbordamiento oe sp/are Salta pi hay partdad o salta ci ia paridad ox par PP JNP/JPO Salta at no hay paridad o salta si la paridad es impar er JC y INC con frecuencia son usados para probar el éxito de operaciones en disco. Otra salto eondicional, JCXZ, prueba el contenido del registro CX contra cero. Esta instruccién no necesita ser colocada inmediatamente después de una operacién aritmética o de comparaciém. Un uso de JCXZ podria ser al inicio de un ciclo, para asegurarse de que en realidad CX contiene un valor diferente de cero, No espere memorizar todas estas instruceiones; sin embargo, como recordatorio nove que tun salto para datos sin signo es igual, superior o inferior, mientras que un salto para datos con ‘signa es igual, mayor que o menor. Las saltos que prucban las banderas de acarrea, de desborda- miento y de paridad tienen propésitos inicos. El ensamblador traduce el cédigo simbélico en Llamada a procedimientos 124 cédigo objeto, sin importar qué instruccién utilice, pero, por ejemplo JAB y JGE: aunque en apariencia son similares, no prucban las mismas banderas. El 80386 y procesadores posteriores permiten salios condicionales lejanos, Puede indicar un salto corto 0 lejano, por ejemplo, JME direcciém sorta (SHORT) JAE direceién lejana (FAR) LLAMADA A PROCEDIMIENTOS. Hasta ahora los segmentos de cédigo han consistido sélo en un procedimiento, codificado como BEGIN PROC PAR BEGIN EXDE En este caso cl operando FAR informa al sistema que la direcciém indicada es el punto de entrada para la cjecucién del programa, mientras que la directive ENDP define el final del procedimiento, Sin embargo, un segmento de cOdigo puede tener cualquier mimero de procedimientos, todos dis- tinguidos por PROC y ENDP, Un pracedimiento llamado (o subrutina) es una seccidn de cédigo que realiza una tarea definida y clara (tal como ubicar el cursor o bien obtener entrada del teclado) La organizacion de un programa en procedimientes proporciona los beneficios siguientes: + Reduce fa cantidad de cédigo, ya que un procedimiento. comin puede ser Hamado desde cualquier lugar en el segmento de cédigo. + Fortalece la mejor organizacién del programa + Facilita Ia depuracién del programa, ya que los errores pueden ser aislados con mayor elaridad. + Ayuda en el mantenimiento progresivo de programas, ya que los procedimientos son identificados de forma répida para su modificacién Operaciones CALL y RET La instraceién CALL transfiere el control a un procedimiento famado, y la instruccién RET Fegresa del procedimiento llamado al procedimienta original que hizo la llamada. RET debe ser la liltima instruecién en un procedimiento Hamado. Los formates generales para CALL y RET son. Tetique letiqueta:] | RET El cédigo objeto particular que CALL y RET generan depend de si la operacién implica un procedimiento NEAR (cercatio) 0 un procedimiento FAR (Iejano). Liamada y regreso cercanos. Una llamada (CALL) a un procedimiento dentro del mismo segmento es cercana y realiza lo siguiente: 122 Légica y control de programas Capitulo 8 + Disminuye el SP en 2 (una palabra). + Mete el IP (que contione el desplazamiento de la instruccién que sigue al CALL) en ia pila, + Ingerta la direccién del desplazamiento del procedimiento Hamado en el [P (esta operacin vacia el resultado de la instruccién previamemte procesada) Un RET que regresa desde un procedimiento cercano realiza lo siguieme: + Saca el antiguo valor de IP de la pila y lo envia al IP (lo cual también vacia el resultado de la instruccién previamente: procesada). + Incrementa el SP en 2. Ahora el C3:IP apunta a la instrocciGn que sigue al CALL original en Ja Hamada del procedimien- to, en donde se reasume la ejecuci Llamada y regreso lejanos. Una Hamada (CALL) Iejana llama a un procedimiento eti- quetado con FAR, tal vez en un segmente de codigo separade. Un CALL. lejano mete a la pila al CS y al IP, y RET tos saca de La pila. Las Hamadas y regresos lejanos son tema del capitulo 23. Ejemplo de una llamada y regreso cereanos Una organizacién comtin de llamadas y regreso cercanos aparece en la figura 8-3. Advierta las caracteristicas siguientes: + El programa esti dividide en un procedimiemto lejano, BEGIN y dos procedimientos cercanos, B10 y C10. Cada procedimiento tiene un nombre tinico y contiene su propio ENDP para finalizar su definicign. page 60,192 TITLE POSCALLP (EXG) Llamaga a procedimiente: NODE, SMA Senck 4 BAIA 000 snorm “Proc aR B00 Ee cose Le Alanna a Bao 2002 pe scoo Wor ax coon jsatida « os | fooe @@ 2 te he aoae 0008 Es COOC R CALL C10 amada a ClO | 1 * 008 3 sat pe regress a ooo mo EP pyuen Lema 5 = Lies voc Gia pac ea ooce 3 ee Be regreso a boop cio ENP “allt vies mmo CBEOIN Figura $3 Liamada a procedimientos Efectos en ta pila de ta ejecucién de programas 123 Las directivas PROC para BIO y C10 tienen el atributo NEAR para indicar que estos pro- cedimientos estin dentro del segmento de cédigo actual, Puesto que la omisiéa del atributo hace que¢l ensamblador por omisin tome NEAR, muchos ejemplos subsiguientes Jo omiten. + En el procedimiento BEGIN, Ia instrucciéa CALL transfiere el control del programa al procedimiento B10 e inicia su ejecucién. + Enel procedimiemo B10, la instruccién CALL transfiere el contro! al procedimiento C10 inicia su ejecucién + En el procedimiemto C10, la instruccién RET hace que el control regrese: a Ia instruccién que sigue a CALL C10. + Enel procedimiento B10, la instruccién RET hace que el control regrese la instruccién que sigue a CALL BIO. + Entonces el procedimiemo BEGIN reasume el procesamiento desde ese punto, + RET siempre regresa a la rutina que llama, Si B10 no termina con una instruccién RET, las instrucciones se ejecutarian pasando B10 é irian directamente a C10. De hecho, si C10 no iene un RET el programa ejecutaria, pasando el final de C10, todas las instrucciones (si hay) que estuvieran ahi, con resultados impredecibles ‘Técnicamente, puede transferir el control a un procedimiento cercano por medio de una instruccién de salto o incluso por cédigo normal en linea. Pero por claridad y consistencia, utilice CALL para transferir el contro! a un procedimiento y utilice RET para terminar la ejecuci6n de un procedimiento. EFECTOS EN LA PILA DE LA EJECUCION DE PROGRAMAS Hasta este punto nuestros programas han tenido poca necesidad de meter datos en la pila y, en consecuencia, hemos definido una pila muy pequefia. Sin embargo, una Ulamada a procedimiento puede llamar (CALL) a otro pracedimiento, el cual a su vez aun puede llamar (CALL) a otro procedimiento, de manera que la pila debe ser los. suficientemente grande para contener las direc- siones guardadas. Toda esto llega a ser mas facil de lo que parece a primera vista, y para la mayoria de nuestros propésites una definiciéa de Ja pila de 32 palabras es suficiente. CALL y PUSH almacenan una direccidn de una palabra o valor en la pila. RET y POP sacan de la pila y accesan la palabra previamente guardada. Todas estas operaciones cambian la direc- cidn del desplazamieno en el rigistro de SP para la palabra siguiente. A causa de esta caracteris- tica, las operaciones RET y POP dehen coincidir con sus operaciones originales CALL y PUSH. Como un recordatorio, al cargar un programa .EXE para ejecucién el cargador de sistema esiablece los valores siguientes en los registros + DS y ES; La direccitn del PSP. un area de 256 bytes (100H) que precede un médulo de programa ejecutable en memoria. + CS: La direccién del segmento de cédigo —el punto de entrada a su programa + IP: Cero, si la primera instruccién ejecutable esté en el inicio del segmento de cédigo * 8S: La direccién del segmento de Ia pila + SP: Desplazamiento del tope de la pila. Por ejemplo, para una pila definida como STACK ‘64 (64 bytes o 32 palabras), en un inicio SP contiene 64, 0 40H, Rastree el programa sencillo de la figura 8-3 a lo largo de su ejecucién. En la prictica, las lamadas procedimientos tendrian cualquier nimero de instrucciones 124 Légica y control de programas Capitulo & La localidad disponible actual para agregar 0 remover es el tope de la pila, Para este ejem- plo, ¢l cargador tendria establecido el SP al tamaiio de Ia pila, 64 bytes (40H). El programa realiza las operaciones siguientes: + CALL B10 disminuye en 2 el SP, de 40H a 3EH. Despuds mete el IP (con 0003) en el tope de la pila en el desplazamiento 3EH. Este es el desplazamiento de la instruccidin que sigue ala instruccién CALL. El procesador utiliza 1a direccién formada por CS:IP para transferir el control a B10. Las palabras en memoria contienen bytes en orden inverso; por ejemplo 0003 se convierte en 0300. CALL B: (ete 0003): XN RNR NK KKK ONO I I | I | Desplazamiento de la pila; | 00%: OBO OIC OBE, B00H + Enel procedimiento B10, CALL C10 disminuye en 2 el SP, a 3CH. Después agrega el IP (con 0008) en e! tope de la pila en el desplazamiento 3CH, El procesador wiliza las direcciones (CS:IP para transferir el control a C10. CALL B10 (mete 0008); XXXX OXAKX OK oBoO ao ' 1 | I | Desplazamiento de la pita: 00% = OBE OBA OC OE, ‘ Para regresar de C10, la instruccién RET remueve el desplazamiento (000B) del tope de la pila a 3CH, la inserta en el IP ¢ incrementa el SP en 2 a 3EH. Esto provoca un regreso automético al desplazamiento OOOBH en e! procedimiento B10. RET (remueve 0008) XOKN ONKXN OMNRX —OBOO 0300 | SP = IDOE | 1 | | | (Denpinznmicaso do ta pile: os ORAS + El RET al final del procedimiento B10 saca la direccién (0003) del tope de la pila en 3EH y la envia al IP ¢ incremenia en 2 el SP a 40H. Esto provoca un regreso automdtico al desplazamiento 0003H, en donde el programa termina su ejecueién. RET (remaeve 0003) XOX XK NK BOND 9300 | SP = 400UH 1 | It t I Desplazamicnio de In pila: 003 (OS OA OIC OE, Si utiliza DEBUG para ver le pila, puede encontrar datos irrelevantes a la izquierda de un programa previamente ejecuiado, Operaciones booteanas, 125 OPERACIONES BOOLEANAS La logica booleana es importante en el disefio de circuitos y tiene un paralelo en la légica de Programacién. Las instrucciones para l6gica booleana son AND, OR, XOR, TEST y NOT, que pueden usarse para poner bits cn 0 0 1 y para manejar datos ASCII con propésitos aritméticos (capitulo 13), El formato general para las operaciones booleanas es operacian | (regintro/menoria), {regietro/mencria/innediave} | ise iquer! El primer operando se refiere a un byte 0 palabra en. un registro 0 memoria y ¢s el Gnico valor que es cambiado. El segundo operando hace referencia a un registro o a un valor inmediato. La operacién compara los bits de los dos operandos referenciados y de acuerdo con esio establece las banderas CF, OF, PF, SF y ZF (AF esté indefinido). + AND. Si ambos bits comparados son 1, establece el resultado en 1. Las demis condiciones dan como resultado 0, + OR. Si cualquiera (6 ambos) de los bits comparados es 1, el resultado es 1. Si ambos bits estin en 0, el resultado cs 0. + XOR. Si uno de las bits comparados es 0 y el otro {, el resultade es 1. Si ambos bits comparados son iguales (ambos 0 o ambos 1), él resultado s 0, + TEST, Establece las banderas igual que lo hace AND, pero no cambia los bits de los operandes Las operai ‘operandos s siguientes. AND, OR y XOR ilustran los mismos valores de bits como AND GR OR 10s 9102 302 Boar goat goaz Resultade; 001 91a 0120 Es itil recordar In siguiente regla: el empleo de AND con bits 0 es 0 y el de OR con bits | esl ‘Ejemplos de operaciones booleanas Para los siguientes ejemplos independientes, suponga que el AL contiene 1100 101 y el BH contiene O101 1 AL, BH sBetablece AL a 0100 0100 Au,00H ;Retablece AL a aooo gooe OFM ;Egtablece AL a goog 0202 ;Rotablece WN a 1291 1203 chee :Pone en uno SF y ZF AL, AL iRetablece Al a 9090 9000 EES SEES z AL,OFFH ;Establece AL a abit i010 126 Logica y control de programas Capitulo & Los ejemplos 2 y 6 muestran formas de limpiar un registro, y ponerlo a cero. El ejemplo 3 pone cere los cuatro bits més a la izquierda de AL. Aunque el uso de CMP puede ser mis claro, puede utilizar OR para los siguientes fines: 2, OR Cx,CK ierifica cx contra cero a roita ai es cero 2.0R ex.cx HMerifies el signa de cx 3B, rSalta ai 68 negative TEST actia igual que AND, pero sélo establece las banderas. Aqui estén algunas ejemplos: 1. FEST BL,121100008 ©; gAgune de lee bite de nde a la mm. } dzquierda es BL en diferente de cero? 2. TEST AL,000¢00018 =, ZAL cont iene ome un nGmero inpar? 3. Test ox, oreH :4B1 DX contiene m : } Ma valor cero? La instruccién NOT La instruccién NOT sélo invierte los bits en un byte o palabra en un registro o en memoria: esto 3, convierte los ceros en unos ¥ fos tinos en ceros, El formato general para NOT es ietiquetari [Hor | (registre/menorial Por ejemplo, siel AL contiene 1100 0101, la instruccién NOT AL cambia el AL a 0011 1010 (el resultado es el mismo de XOR AL.OFFH del anterior ejemplo 7). Las banderas no son afectadas. NOT 00 €s lo mismo que NEG, que cambia un valor binario de positive a negativo y viceversa, invirtiendo los bits y sumando 1, CAMBIO DE MINUSCULAS A MAYUSCULAS: Existen varias razones para realizar Ia conversién entre letras mayisculas y mindsculas. Por ejemplo, puede haber recibido un archivo de datos de un sistema que procesa slo letras maytiscu- Jas, O un programa tiene que permitir a los usuarios ingresar de forma indistima maytisculas © mindsculas (como *YES’ o ‘yes') y para facilitar las comparaciones, convertirlas « maytisculas. Las letras maydsculas de A a la Z. son desde 41H hasta SAH, y las letras minisculas de a hasta la z son desde 61H a 7AH. La Unica diferencia es que el bit 5 de una mayiscula esté en 0 y para mindsculas esti en 1, como se muestra a continuacién: MAYUSCULAS. MINUSCULAS Letra A. 01000001 Letra: 01100001 LewaZ: — O1011010 Lewaz: — OL111010 Bit 76543210 Bit: 76543210 Corrimiento de bits 137 ‘TITLE POSCASE (CoM) Cambio de nindsculas a sayisculas MODEL SMALL CODE BEGIN: JMP MAIN ‘Change te uppercase letters’ MAIN PROC) NEAR Fee ac brines cordcter « cmblar ™Ov ‘Aut, [BX] Mees ey | a, Be ON | tbh sc stabiecer pare pigviante cartcter | | SS th scunlesee part PE scxon sais stiea | ier o7it am Bee | | END BEGIN. Figura 84 Cambio de minusculas 4 maydsculas El programa .COM de la figura 8-4 convierte el contenido de un dato, TITLEX, de minds- cula a mayéscula, empezando en TITLEX +1. El programa inicializa el BX con la direccién de TITLEX +1 y utiliza la direccién para mover cada caricter al AH, iniciandoen TITLEX +1, Siel valor esta entre 61H y 7AH, una instruccién AND establece el bit 5 en amp AH, 220213118 Todos los demas caracteres distinios de a hasta z permanecen sin cambio, Después la rutina mueve el cardcter cambindo de regreso a TITLEX, incrementa el BX para el siguiente carécter y repite el ciclo. Usado de esta manera, ¢! registro BX funciona como un registro de indice para las localida- des de memoria direccionadas. Para el mismo fin, también se puede utilizar SI y DI. CORRIMIENTO DE BITS Las instrucciones de corrimien realizar las siguientes acciones: que son parte de 1a capacidad légica de la computadora, pueden *+ Hacer referencia a un registro o diteccion de memoria. + Recorre bits a la inquierda o a la derecha. + Recorre hasta 8 bits en vn byte, 16 bits en una palabra y 32 bits en una palabra doble (80386 y procesadores pasteriores) + Corrimiento Kigico (sin signo) o aritmético (con signo), El segundo operando contiene el valor del corrimiento, que €s una constante (un valor inmediato) 0 una referencia al registro CL. Para les procesadores 8088/8086, la constante inme- 128 Légica y control de programas Capitulo 8 diata solo puede ser 1; un valor de corrimiento mayor que 1 debe estar contenide en el regisiro Cl Procesadores posteriores permiten constanics de corrimicnto inmediato hasta de 31, El formato general para el corrimiento es leciquata:} | corrim, | (regiatro/menoria), {€L/iamediato}| } Corrimiento de bits hacia la derecha Los corrimientas hacia la derecha (SHR y SAR) mueven los bits hacia la derecha en el registro designado. El bit recorrido fuera del registro mete la bandera de acarreo. Las instrucciones de ‘corrimiento a la derecha estipulan datos ligicos (sin signo) o aritméticos (con signo! SHR: desplnzamient Wigice 2 [a dececha o|> ac SAR: dexplazamienmo arumético 1 laderecta | § | a Las siguientes instrucciones relacionadas ilustran SHR y datos sin signo: INSTRUCCION aL COMENTARIO Mov CL, 03 Wav AL,20u9121B ©; 10120232 SHR AL, OL 2 01012032 Un corrimiento a la derecha SUR AL, Ch } 00eDL022 Tree corrimientos adicionaies a im derecns SHR Ax, 03 Vélido para 80186 y procesadores posteriores El primer SHR desplaza ef contenido de AL un bit hacia la derecha. El bit de més a la derecha es enviado a Ia bandera de acarreo, y cl bit de mas a ta izquierda se tlena con un cero. E1 segundo SHR desplaza tres bits mas al AL. La bandera de acarreo contiene de manera sucesiva 1, 1 y 0; ademés, tres bits 0 son colocados a la izquierda del AL. SAR difiere de SHR en un punto importante: SAR utiliza el bit de signo para tienar el bit vacante de més a la izquierda. De esta manera, los valores positives y negatives. retienen sus signos. Las siguientes instrucciones relacionadas ilustran SAR y datos con signa en los que el signo es un bit INSTRUCCION aL COMENTARIO Mov AL,1O120L12B ; Loua@aI% SAR AL, @2 ; 22012011 Un corrimiento @ la derecha SAR AL, Che ; 12022012 Tres corrimientos a la derecha SAR AX,a3. Para 80186 ¥ procesadores poatericres En especial, los corrimiemos a la derecha son ttiles para (dividir entre dos) obtener mitades de valotes y son mucho m4s rApidas que utilizar una operacién de: divisién. En los ejemplos de corrimientos de tres bits a la derecha, el primer corrimiento de un bit a la derecha ¢n realidad divide entre dos, y el segundo y tercer corrimiemtos a la derecha en realidad dividen entre & Rotacién de bits (desplazamiento circular} 129 ‘Al obtener la mitad de ntimeros impares tales como 5 y 7 se genera 2 y 3, respectivamente, y la bandera de acarreo se pone en 1. También, si tiene que desplazar dos bits, es més eficaz la codificacién de dos instrucciones de corrimiento que almacenar 2 en el CL y codificar un corri- miento. Al terminar una operacién de corrimiento, puede utilizar la instruccién IC (salta si hay acarreo) para examinar el bit desplazado a la bandera de acarreo. Corrimiento de bits hacia la izquierda ‘Los corrimientos hacia la izquierda (SHL y SAL) mueven los bits a la izquierda, en cl registro designado. SHL-y SAL son idénticos en su operacién. El bit desplazade fuera de! registro ingresa ala bandera de acarteo. Las instrucciones de corrimiento hacia la izquierda estipulan datos logi- cos (sin signo) y aritméticos (con signo): SHL; desplazamiento légico a la izquierda SAL: desplazamiento aritmético a la izquierda [e]+ «(Lo Las siguientes instrucciones relacionadas ilustran SHL para datos sin signo: iNSTAUGCION aL (COMENTARIO. MOV cL, 03 Mov AL, 1oLioaiim 0720: SL AL, OF 2202120 Un corrimiente a la iaquierda SHL ALCL 02120000 Tres corrimientos mis SHL AK, 02 + Para 80166 y pracenadarea postericrea El primer SHL desplaza cl contenido de! AL-un bit hacia Ia izquierda. El bit desplazado de més a la izquierda ahora se encuentra en la bandera de acarreo, y el ultimo bit a la derecha del AL se lena con cero. El segundo SHL desplaza tres bits més el AL. La bandera de acarreo contiene en forma sucesiva 0, | y 1, y se rellena con tres ceros a la derecha del AL. Los corrimienios a la izquierda llenan con cero el bit de mds a la derecha. Como resultado de-esto, SHL y SAL. son idémticos. Los corrimientos a la izquierda en especial son itiles para duplicar valores y son mucho més tipides que usar una operacién de multiplicacion. En los ejemplos de la ‘operacin de corrimiento a Is izquierda, el primer corrimiemo de un bit a la izquierda en realidad multiplica por 2, y el segundo y tercer corrimientos de tres bits a la izquierda en realidad multipli- can por 8. También, si tiene que desplazar dos bits, es més cficar 1a codificacién de dos instruccio- nes de corrimiento que almacenar 2 en el CL y codificar un corrimiento, Al finalizar una operacién de corrimiento, puede utilizar la instruccién JC (salta si hay acarreo) para examinar el bit que ingresé a la bandera de acarreo. ROTACION DE BITS (desplazamiento circular) |Las instrucciones de rotacién, que son parte de la capacidad ldgica de la computadora, pueden realizar las siguientes acciones: 130 Logica y control de programas Capitulo 8 + Hacer referencia a un byte o a una palabra, + Hacer referencia a un regisiro 0 a mem + Realizar rotacién a la derecha a la izquierda. El bit que es desplazado fuera llena el espacio ‘vacante en la memoria 9 registro y también se copia en la bandera de acarreo. Véanse las. figuras de las das seceiones siguientes. + Realizar rotacién hasta de & bits en un byte, 16 bits en una palabra y 32 bits en una palabra doble (80386 y procesadores posteriores), + Realizar rotacién légica (sin signa) aritmética (con signo). El segunda operando contiene un valor de rotacién, el cual es una constante (un valor inmediato) o una referencia al registro CL. Para los procesadores 8088/8086, Ia constante inme~ diata sélo puede ser 1; un valor de rotacién mayor que 1 debe estar en el registro CL. Procesadores. més recientes permiten constantes inmediatas hasta el 31. El formato general para la rotacién es: (etaqueta;| | rotacion | (registre/namoria), (c/innediata} Rotacién a la derecha de bits Las rotaciones a la derecha (ROR y RCR) desplazan 4 la derecha los bits en el registro designa- do. Las instrucciones de rotacién a la derecha estipulan datas \égicos (sin signa) 0 aritméticos (con signo}: ROR: Rotacin Iigica «la derecha 4 RCR: Rotcidn a ia derecha con acarreo > Las siguientes instrucciones relacionadas ilustran ROR: INSTRUCCION: BH (COMENTARIO. Mov ch, a3 Mov BH,1p220111B ; Loiu0aI ROR BH, a1 12011011 Una rotacién a la devecha ROR BH, CL ; O1M2012 Tres rotaciones a ia derecha ROR Bx, a3 ; Pare Q0106 y procesadores postertores El primer ROR desplaza el bit de muis a la derecha del BH a fa posicién vacante de mas 2 la izquierda. La segunda y tercera operaciones ROR realizan 1a rotacién de los tres bits de mas a la derecha. RCR provoca que la bandera de acarreo participe en la rotacidn. Cada bit que se desplaza. fuera por la derecha se mueve al CF y el bit del CF se mueve a la posicién vacante de Ia izquierda Rotacton a la izquierda de bits Las rotaciones a la izquierda (ROL y RCL) desplazan a la izquierda los bits del registro designa- 40. Las instrucciones de rotacién a la izquierda estipulan datos légicas (sin signo) y aritméticos {con signo): ROL: Rotacién Kigica a Ia izquierda c <[ Ct: Rance siaieguertrcon cree Po je fT] Tablas de bifurcacion 131 ‘Las siguientes. instrucciones relacionadas ilustran ROL: INSTRUCCION aL COMENTARIO Mow ct, 03 MOV BL,20i10221B —, 1o1nazaa ROR BL, 0% lnoniea2 ona rotacién a le isquierda ROR BL, CL 92111021 Tres retaciones a la izquierda ROR Bx, 02 1 Para 80186 y procesaderes posteriores El primer ROL desplaza el bit de ms a la inquierda de! BL a la posicién vacante de més a la derecha. ‘La segunda y tercera operaciones ROL realizan la rotacién de los tres bits de més a {a irquierda. ‘De manera similar a RCR, RCL también provoca que la bandera de acarreo participe en la rotacién. Cada bit que se desplaza fuera por la izquierda se mueve al CF, y el bit del CF se mueve a la posiciin vacante de la derecha. ‘Puede usar la instruccién JC (salte si hay acarreo) para comprobar el bit rotado hacia la CF en el extremo de una operacién de rotacién, Desplazamiento y rotacién de palabras dobles ‘También puede utilizar tas instrucciones de rotacién y para desplazar a finde multiplicar y dividir centre muiltiplos de 2, valores en palabras dobles. Considere un valor en 32 bits en el que los 16 bits de més a la izquierda estin en el DX y los 16 bits de mas a la derecha estén en el AX, como DX:AX. Las instrucciones para “multiplicar” ese valor por dos podria ser: SHL At, 8a desplazamiente a la dequierda para RCL Di,1 ; multiplicar por dos el par DILAX EL SHL desplaza a la izquierda todos los bits del AX, y el bit de mas a la izquierda lo envia ala bandera de acarreo. El RCL desplaza ¢l DX a la izquierda ¢ inserta e1 bit del CF en el bit wacante de mas a la derecha, Para multiplicar por 4, haga seguir a la pareja SHL-RCL por otra pareja SHL-RCL. Para divisién, otra vez considere un valor en 32 bits en DX:AX. Las instrucciones para “dividir" entre dos el valor serian SAR DE, /Usa desplazamiento a is derecha para ROR AK, 2 | dividiy entre dos el par DXA Para dividir entre cuatro, haga seguir a la pareja SAR-RCR por otra pareja SAR-RCR. Los desplazamientos de doble precision para el 80386 y procesadores posteriores son SHRD y SHLD. TABLAS DE BIFURCACION Un programa puede tener una rutina para probar varias condiciones relacionadas, de las que cada luha Recesita un salto a otra rutina. Por ejemplo, considere un sistema para una compafila que ha -establecido cédigos especiales para los clientes con base en su nivel de crédito y volumen de ventas. Los cédigos indican la cantidad de descuento ofrecido y otros pracesos especiales que ‘pueden necesitarse para el cliente. Los oédigos de los clientes son, 1, 2, 3 y 4. 192 Logica y control de programas Capitulo § Una manera convencional de manejar cédigos es comparar de manera sucesiva contra cada c6digo de cliente: MP CUSCODE,0 ..06aige = 97 38 poopsct cme cUSCODE,2 1 ,C5digo = it se popscr OMB CUSCODE,2 4 ,08aigo = 27 se p2onscr CHP CUSCODE,3 — ;.C0digo = 37 ge ps0DscT MP CUSCODE,4 =; UCédigo = 47 se paonser Con este enfoque, es grande la ocasién para errores: s6lo considera la comparacién de los codigos correctos contra sus valores y salta a la rutina correcta. Una solucién més elegamte involucra una tabla de direcciones de salto. Como se muestra en el programa parcial de la figura 8-5, CUSTTBL define de manera sucesiva las cinco direcciones en palabras (dos bytes cada una). La rutina en DIQJUMP access los cédigos (come valores hexadlecimales 00-04) en el registro BX. El valor es duplicado, de manera que 0 permanece como Q, 1 se convierte en 2. 2 se convierte en 4, y asi sucesivamente. El valor duplicade proporciona un desplazamiento en la tabla: CUSTTBL+0 es la primera direccién, CUSTTBL +2 es la segunda, CUSTTBL+4 es la tercera, y asi sucesivamente. El operando de ia instraccién JMP, (CUSTTBL +BX). forma una direccién con base en el inicio de la tabla mas un desplazamienco en la tabla. Después la operaciGn salta de manera directa a la rutina apropiada, Una restriccién importante en el programa es que los cédigos sdlo pueden ser valores hexadecimales 00-04; jeualquier otro valor causaria terribles resultados! Si utiliza DEBUG para ejecutar este programa, para verificar el resultado de la légica ingrese valores hexadecimales validos (00-04) en CUSCODE, Para el 80386 y procesadores posteriores podria reemplazar las dos instrucciones en DIQUUMP, esto ex; wov BL, CUsCODE sObtiene el eédigo de descuente xOR BH, BH itimpia la parte superior de 8x con una instruccién: MovEx AK, CUSCODE © --Ohtiene cédigo de descuenta ORGANIZACION DE UN PROGRAMA Lo siguiente son los pasos comunes al escribir un programa en lenguaje ensamblador: 1, Tenga una idea clara del problema que el programa va a resolver. 2. Esbace sus ideas en términos generales y planee la ldgica general. Por ejemplo, siun problema es examinar las operaciones de movimiento de milltiples bytes, inicie definiendo los campos Organizacién de un programa 133 PAGE 60,132 TITLE POMJMPTE [EXE] Wao de ona tabla de saltos MODEL SMALL STACK 64 99e@ oo2m ® CUSTTBL DM = DOONGUSC ;Tabla de direceiones 9002 001d R ba = DionscT. 0004 0021 B ow = DZ0Dscr 0006 0024 & Da =“ DRODScr BOOk 0027 R Dy = -DAODSCT 800K 04 cuscope DR o4 CSdige de deecuento gooo BEGIN FAR ‘ao00 Mi@data =; Iniciar 9003 DB AK registros ago SAK ; de segnento 9007 . DLOgUMP Tnvocar rutina de saltes @OOA BB 4c00 . NOV AK, ACOOH =, Salida a dos onoD cD 22 INT 2a o00F BRON ENDP gu0F DLOJUMP PROC NEAR O00R $A 1E 000K R ov BL, CUSCOME © Gbtener cédige de descuento 0013 33 FF xo BH, BR rbimpiar parte alta de Bx 9015 Da ES 5HL BX, 01 rMaltiplicar per dos el valor 0017 FF A? 0000 R IMP (CUSTFBL+Sx] ;A rutina de tabla oom poowonse. pRutina eSdige 9 001R EB OD 90 : D9ORET BOLE miopscr: iRutina efdigo 2 OME EB OA 90 : ab nsoReT. 9022 paopscr: —; @2 sistema contiene un VGA 2, Para determinar si estd instalado un EGA; Mov Alt, 22m sPetictém de la funeisn Ba Mov BL, 10H ;Cantidad de sexoria BOA THT 108 ;bllama al BIOS Determinacién dl tipo de adaptador de video 179 TITLE —-PLOGRAPX (COM) Despliegue grafico MODEL SMALL, cop ORG 100K BEGIN = PROC NEAR MOV AH, OF conserva Int 10H » made de video PUSH AK eriginal ALL BLOMODE iBesigna el modo grafico ALL © CLODISP MBeapliegue grafico en color CALL DLOKEY MGbtiene respuesta del teclado POP AK FRestaure. . Mov AH, 0oH 7 @l mode original Ikt 10H Fen XL) mov Rt, acooH jae al. Dos Ir ui BEGIN = ENDP BLOMODE ROC NEAR wOv AI, OO iEstablece el moda grafico BGA/VGA wou AL, 107 }40 cols x 380 renglones INT 10H Mov AH, ORE ;Deaigna la paleta para el fondo wou BH OO Fondo wov BL O7H ot INP 10H RET BLOMODE ESDP. CLODISP PROC NEAR wv Bx, 00 sDesigna la pagina inicial mov Cxyea } seler, columa mov Dx, 70 oY renglén co: ov Aw. jacribe #1 pixel punto voy AL, Designa #1 color INF 10H Be conservan BX, Cx y DX mc | Gx incrementa la columna oe xB TE fe la columna 5767 awe cz ing, repecir MOY Ox, 64 si, restaurar 1a columma mC BL iCambiar el color mc Dx HInerementa el renglén OP Dx, 280 iaEe el renglén 260? aME cat ho, repetix ai) terminar clepisp —ENDP DLOKEY © PROG MEAR mov’ AH, 10H sPetici6n para entrada INT 16H i desde ef teclado DioKEY —-ENDP END BEGIN Figura 10-6 Despliegue gréfico en color CMP BL, 20H s84 el BL ya no contiens 10m, JHE EGAFOUND ; oh sistema tiene un &GA Ya que un EGA puede estar instalado junto con un MDA o un CGA, puede necesitar determinar si el EGA esta activo. El area de datos del BIOS en 40:0087 contiene un byte de instruceién EGA. Verifique el bit 3, donde 0 significa que el EGA estd activo y 1 significa que esté inactivo. 180 Procesamiento avanzado de la pantalla Gapitulo 10 3. Para determinar si esté instalado un CGA o un MDA, examine Ia palabra en la localidad 40;0063, que contiene a direccién base: del controlador de memoria. Observe que 3BxH significa MDA y 3DxH significa CGA. PUNTOS CLAVE + Bl byte de atributo para modo de texto proporciona intermitencia, video inverse ¢ intensidad. Para texto en color, los bits RGB permiten seleccionar colores pero no subrayado, + La INT 10H de BIOS proporciona funciones para el procesamienta completo de la pantalla, come configurar ¢l modo de video, establecer la posicién del cursor, recorrido de la pan talla, lectura desde el teclado y escritura de caracteres. + Si su programa despliega lineas en la parte inferior de la pantalla, utilice la funcién 06H de la INT 10H del BIOS para recorrer hacia arriba la pantalla antes de que el despliegue alcance la parte inferior. + Para los servicios de la INT 10H que despliegan un cardcter, tiene que avanzar ¢l cursor y tal vez repetir el cardcter en la pantalla + La memoria de 16K para despliegue en color permite: almacenar “paginas” o “pantailas* adicionales. Existen cuatro paginas pars pantallas de 80 columnas + La manera mas ripida de desplegar caracteres en pantalla (texta o gréficos) es transferi de forma directa al rea de video apropiz + Un pixel (elemento grafico) consiste en un nimero especificade de bits, dependiende del adaptador gréfico y de la resoluciém (baja, media o alta). * Para los modos grificos 04 y 0S puede seleccionar cuatro colores, de los cuales uno es cualquiera de los 16 colores disponibles. y los otros tres son de una paleta de colores, PREGUNTAS 10-1. Proporcione los bytes. de atributo, en binaria, y para pantallas Wonocromsiticas, para lo siguiente: (a) S610 subrayado: (b) blanco y negro, con intensidad normal; (c) video inverso, con iensidad alt 10-2. Proparcione tos bytes de atributo, en binario, para lo siguiente: éa} magenta snbre cian claro: (bY café sobre amarillo; (¢) roja sobre gris. incermitente, 10-3. Codifique las rutinas siguiemes: (a) Establezca el made monocromitice de 80 columnas: (b} establezca el tamafio del cursar con inicio en fa tinea cinco y linea final 12: (c) recorra ta pantalla hacia arriba 10 lineas: (4) despliegue 10 “puntos” intermitentes con medios puntos (hexadecimal Bi} encima. 10-4, En el modo de texto 03, jeudntos colores estén disponibles para el fondo y el primer plano? 10-5. Codifique las instrucciones para desplegar cinco caracteres de diamante en modo de texto con verde claro sobre magenta ‘Qué modo le permite el uso de péginas de paralla? 10-7, Escriba un programa que utilice la funcidn OAH de la ENT 21H, para aceptar datos desde ef teclado y la funcion OOH para desplegar Ins caracteres, El programa limpiard la pantalla, estableceris los colores (selecciGnelos) y sceptard un conjunto de datos desde e! teclade empezando en Ia posicién actual del eursor. El coajunto de datos podria ser de cuatro o cinco Hineas (digamas, de una lonpitud de hasta 25 caeacteres) ingresados desde el teclado, cada conjunto seuido de un Enter. Puede usar diferentes colores, video inverso o sonido, para experimentar. Después coloque el cursor ef un Preguntas 10-8. 10-9, 10-10. 10-4 10-12. 10-13, 10-4 rengldn y column diferentes (usted decida) y despliegue los datos ingresados en esa posicidn, El Programa sirve para aceptar cualquier némero de conjunios de datos. Puede terminar cuando el ‘usuario presione Emer sin datos. Escriba el programa con una pequefia rutina con la \igiea principal yuna serie de subrutinas Hamadas, Incluya algunos comentarios concise, Corrija el programa de la pregunta 10-7, de manera que utilice la INT 16H para entrada desde el twelade y la funcidn O9H de la INT 10H para el despliegue, Explique cdimo el byte de aiributo limita ef nimero de colores disponibles. Codifique las instrucciones para establecer el modo grafico para estas resoluciones: {a) 320 x 200; (b) 640 200; (c} 640 x 480 Codifigue las instrucciones para seleccionar ef fondo en azul en modo grifico. Codifique las instrucciones. para leer un punto del rengldn 12, columaa 13 en modo gritico, Corrija el programa de la figura 10-6 de manera que proporcione lo: siguiente: (a) un modo grifice adecuado para su monitor; (b) fondo en color rojo; (c} renglén de inicio 10 y final en 30; {d) cial en 20 y Final en 300, . Con base en las cambios hechos ex: la pregunta 10-13, corrija el programa para desplegar una columina de puntos (en lugar de an renglén} 3 un tiempo, Esto es, despliegue puntos hacia abajo en la pantalla, después avance a la columina siguiente, y asl sucesivamente CAPITULO 11 Procesamiento avanzado del teclado ‘OBJETIVO Estudiar todas las operaciones del teclado y tas caracteristicas avanzadas de entrada desde el teclado, incluyendo el estado del shift, el bifer del teclado y los cédigos de rastreo. INTRODUCCION 182 Este capitulo describe las diferentes operaciones para manejo del teclado, algunas de las cuales tienen usos especializados. De estas operaciones la funcién OAH de la INT 21H (estudiada en el capitulo 9), y la INT 16H (estudiada en este capitulo) deben proporcionarle casi todas las opera- clones con cl toclado que usted nocesitara. Oxros temas en el capitulo incluyen los bytes de estado del shift del teclado, eédigos de rastreo y el érea dei béfer del teclado. Los bytes. de estado del shift en cl area de datos del BIOS permiten a un programa determinar, por ejemplo, si las teclas Ctrl, Shift o Alt han sido presiona- das. El cédigo de rastreo es un mimero tinico asignado a cada tecla en el teclade que permite al sistema identificar e! origen de wna tecla presionada y permite a un programa verificar las teclas de funcivén extendidas, como Inicio, AvPag y Flechas. Y el rea del biifer del teclado ofrece espacio en memoria para que usted teclee por adelantado antes de que un programa solicite en realidad una entrada, Las operaciones introducidas en este capitulo son las siguientes: FUNGIONES DE LA INT 21H DEL DOS O1H Entrada desde el teclado con repeticién en Ia pantalla Elteciado Os o7H o8H OAH oBH ocH 183 EJS directa a la consola Entrada directa desde ¢l teclado sin repeticién Entrada desde el teclado sin repeticién en pantalla Entrada al bifer del teclado ‘Verificacién del estado del teclado Limpiar e] biifer del teclado y Hamar una funcién FUNCIONES DE LA INT 16H DEL BIOS: OOH o1H oH OSH 10H LH 1H EL TECLADO: ‘Lee un cardcter ‘Determina si un cardcter esté presente Regresa el estado actual del shift Escribe en el teclade Lee un cardcter desde el teclado Determina si un carscter esté presente Regresa el estado actual del shift del teclade El teclado proporciona tres tipos Ibisicos de teclas: 1. Las letras desde la A hasta la Z, los ntimeros desde ¢] 0 hasta el 9'y caracteres como %, Sy # 2. Las teclas extendidas de funcién, que consisten en: + Teclas de funcién de programa (Fl, ete., Shift+F1, ete.) + Teclas del pane! numérico con BloqNum apagado (Inicio, Fin, Flechas, Supr, Ins, RePig y AvPag) y las teclas repetidas en el teclado de 101 teclas. + Alt+letras y Alt+tectas de funciéin de programa 3. Teclas de control para Alt, Ctrl y Shifi, que funcionan en conjuncién con otras teclas, El BIOS las trata de manera diferente de las otras teclas actualizando su estado actwal en bos bytes de estado del shift em el érea de datos de BIOS. El BIOS no las envia como caracieres AS a su programa. La PC original con sus 83 tectas sufrié Ia consecuencia de una decisién miope que provocd que las teclas en el llamado panel (0 teclado} numérico realizaran dos acciones. Asi, los nimeros ‘compartian teclas con Inicio, Fin, Plechas, Supr, Ins, RePag y AvP4g, con la tecla BlogNum para -conmutar entre ellas. Para resolver este problema, los diseftadores produjeron el teclado extendi- do con 101 teclas. De las 18 teclas nuevas, 3610 dos, F1l y F12, proporcionan una funcién nueva, cel resto duplican la funcidn de teclas en el teclade original. Si sus programas permiten presionar FI, F12 © alguna de las nuevas combinaciones de tecias, los usuarios deben tener un teclado: ampliado y una computadora con. un. BIOS que pueda procesarlas. Para la mayorfa de las otras ‘operaciones con el teclada, sus programas no necesitan interesarse en cl tipo de teclado instalado 184 racesamiento avanzado del tectado Capitulo 11 ESTADO DEL SHIFT DEL TECLADO EJ direa de datos del BIOS en el segmento 40(0]H contiene varios elementos tiles. Estos incluyen el primer byte del estado actual del shift del teclado en 40:17H en donde, cuando esta en uno, los bits indican lo siguiente: Be Aecidin [7 tmcrciSn activa AW presionaaa | 6 Estado de BisaMaytis active = 2 Cit presionada } 5 Estado de BlogNum activa 1 Shift szquierdo.prestonado | 4 Eso de Seroll Lock activa © Shift derecho presionade | Puede utilizar la funcién 02H (estudiada més adelante} de la INT 16H para examinar estos valores, Note que “activa” significa que el usuario en ese momento est manteniendo oprimida Ia tecla; al soltar la tecla pone en cero el valor del bit. El teclado de 83 teclas s6lo necesita este byte de estado del shift, El teclade ampliado de 101 (eclas tiene teclas Ctrl y Alt duplicadas (izquierdas y derechas), de medo que se necesita informacién adicional para examinarlas, El segundo byte de estado de! teclado necesario para el teclado de 10) teclas esti en 40:18H, en donde un bit en uno indica lo. siguiente: Ins peesionada [BlogMayis presiomada BlogNam presionada Scroll Lock presionads SysReg pressonada ‘Ale izquicrda prestonada Curt iaquieeds prestonada Los bits 0, 1 y 2 estén asociados con el teclada ampliado (de 101 teclas). Ahora puede, por ciemplo, examinar si esta presionada Cir] o Alto ambas. ‘Otro byte de estado de! teclado se encuentra en 40:96H. Aqui el elemento de interés para nosotros €3 el bit 4; cuando esta en uno, indica que esté instalado un teclado de 101 teclas. Ejercicio con el estado del shift Para ver el efecto de las teclas Cirl, Alt y Shift sobre los bytes de estado del shift, cargue DEBUG para ejecucién. Introduzea D 40:17 para ver el contenido de los bytes de estado. Presione las teclas BloqgMaytis, BlogNum y SctollLock y otrit vez introdurca D 40:17 para ver el resultado en ambos bytes de estado, El byle 40;17H debe mostrar 70H (0111 0000B) y el byte en 40:18H es quizé 00H. El byte en 40:96H debe mostrar la presencia (0 ausencia) de un teclado de 101 teclas Intente cambiar el contenido del byte de estado en 40; 17H —introduciendo E 40:17 00, Si su . teclado tiene indicadores tuminosos para las teclas de blogue, deben apagarse. Ahora inente introduciendo E 40:17 70 para volverlas a encender Debe intcntar con diferentes combinaciones, aunque cs dificil teclear un comando ¥: DEBUG mientras mantiene oprimidas las teclas Ctrl y Alt, Introduzca Q para salir de DEBUG. Interupeién 21H del DOS para entrada desde 6! teclado 185 BUFER DEL TECLADO Un elemento de interés en e] rea de datos del BIOS en 40:1EH es el buffer del teclade. Esta caracteristica nos permite teclear hasta 15 caracteres antes que el programa solicite alguna entra da, Cuando presiona una tecla, el procesador del teclado genera el eddigo de rastreo de la tecla (su ‘inico niimero asignado) y de manera automdtica solicita la INT 09H. En términos sencillos, fa rutina INT 09H del BIOS obtiene el c6digo de rastreo del teclado, Jo conviere en un cardcter ASCII y to envia al area del tnifer del teclado. A continuaciéa, la INT 16H del BIOS (la operaciGn de mas bajo nivel del veclado) tee ef cardécter del bifer y lo envia a su Programa. Su programa nunca necesita solicitar la INT O9H, ya que el BIOS lo hace de forma automdtica cuando usted presiona una tecla, Una seccién posterior cubre la INT O9H y el biter del teclado con mayor etal INTERRUPCION 21H DEL DOS PARA ENTRADA DESDE EL TECLADO. Esta seccién trata los servicios del DOS que manejan entrada del teclado. Todas estas operacio- nie#, excepto Ia funcién OAH, s6lo aceptan un canicter. (Para mancjar una cadena de caracteres, debe codificar un ciclo que acepte un cardcter, verificar las teclas de Retrocesa y Enter, si es ecesario, repita el cardcter en Ia pantalla y avance el cursor.) Para entrada desde el teclado con €1 DOS, inserte una funcidn en el AH y solicite la INT 21H. En el estudio de las operaciones que siguen, el término “responder a una peticién Ctri+-Break” significa que el DOS terminara el programa si cl usuario presiona juntas Ctrl + Break o Ctrl+C. Estas operaciones han sido sustitui- das por la funcién 3FH (estudiada en el capitulo 10), pero para que el estudio esté complete se incluyen aqui Funcién O1H, de la INT 21H: Entrada del teclade con eco (repeticién en pantalla) Esta operacin acepta un caricter desde el buifer del teclado 0, si no esti presente ninguno, espera tuna entrada del teclado. La operacién regresa uno de dos cédigos de estadk * AL = un niimero distinto de cero significa que un cardcter ASCII estindar esta presente, como una letra o un oimero, que la operacién repite en la pantalla. + AL = cero significa que ef usuario ba presionado una tecla de funcidn extendida, como cio, Fl o RePag, y el AH ain tiene In funcién original. La operacién maneja las funciones ampliadas de manera ineficiente, intentando enviarlas ala pantalla. Y para obtener el codigo de rasireo para la tecla de funcién en el AL, tiene que repetir de manera inmediata la aperacién INT 21H. La operacién también responde a una peticién Ctrl +Break El cédigo siguiente ilustra esta funcién: WOU AH,G1H pReticién de entrada del teclade Int 21H yblama al DoS CMP AL,0D 4288 Bresioné una tecla de funcién? uz 1 no, entonces es un cardcter ASCII 186, Procesamiento avanzade del teciado Capitulo 11 INT 21H 1 af, entonces repite 1 cperacién para el cédige de rastreo Funcién 06H, de Ia INT 21H:B/S directa de In consol Esta operacign desconocida, si no-rara, puede iransferir cualquier cardcter 0 c6digo de control sin imerferencia del DOS. Existen dos versiones, para entrada y para salida. Para entrada, carga OFFH en el DL. Si-ningiin carécter esté en el biifer del teclado, la operacién pone en uno la bandera de cero y na espera entrada, Si un cardcter esti esperando en el buifer del teclado, la operacién almacena el carcter en el AL y pone en cero la bandera del cero. La operacién no repite en la pamalla el cardcter y no verifica por Curl + Break Curl+-PrSc. Un niimero diferente de ceroen el AL representa un cardcter ASCII esténdar, como una letra o un niimero. Cero en el AL significa que el usuario ha presionado una tecla de funcién tal como Inicio, F1 o RePig. Para obtener el cédigo de rastreo en el AL, repita de manera inmediata la operacién INT 21H: mips MOV. AH, ost rPatician directa a 1a consola erada del teclado. wr au 1Elama al Dos oz mo FRepetix si el bifer esta vacto cue AL. 00 1¢Se presions una tecla de funciéa? oz x30 | mo, antences 2 un cardcter ASCIZ aw aun 1 i, entonces repite la operacién + para ei cédigo de ragtreo Para salida en la pantalla, cargue el caracter ASCII (no OFFH) en el DL. Funcién 07H de la INT 21H: Entrada directa desde el teclado sin repeticién en la pantalla Esta operacién funciona igual que la funcién 01H, excepto que el cardcter ingresado no se repite en la pantalla y la operacién no responde a una peticién Ctri+Break. Podria utilizar la. opera para introducir una contraseiia (0 password} que sea invisible o en donde no quiere que la pantalla sea perturbada. Funcién 08H de la INT 21H: Entrada desde el teclado sin repeticién en la pantalla Esta operacidn funciona igual que la funcidn 01H, salvo que el cardcter ingresado no se repite en a pantalla, Funcién OAH de la INT 21H: Entrada del teclado mediante el biifer Estd operacidn til del teclado es estudiadla con detalle en el capitulo 9, Sin embargo, su capacidad std limitada por ne poder aceptar teclas de funcion extendida, Funcién OBH de la INT 21H: Verificacién del estado del teclado: Esta operacién regresa FFH en el AL si un cardcter esta disponible y 00H si ningiin cardcier esta disponible, La funcién estd relacionada a aquellas otras que no esperan por entrada del teclado. Interrupei6n 16H del BIOS para entrada desde ol teclada 187 Funcién OCH de la INT 21H: Limpia el bifer del ieclado y Hama a una funcién Puede utilizar esta operacién en asociacién con la funcién O1H, 06H, OTH, 08H o OAH. Cargue la funcién que necesite en el AL: Mov AM, oc rPeticién de entrada del teclado MOV AL.funcién ;Funcién que se necesita MOY DX,RBAREA ;Area de entrada dei teclado INT 24M ;Ulama al Dos La operacidn limpia el biifer del teclado, ejecuta la funcién que estd en AL, y acepta {0 espera) un caréeter, de acuerdo a la peticién en AL. Podria utilizar esta operacién para un programa que no permite que el usuario teclee por adelantado. INTERRUPCION 16H DEL BIOS PARA ENTRADA DESDE EL TECLADO La INT 16H del BIOS, la operacin bisica de teclado del BIOS utilizada de manera extensiva por desarrolladores de software, proporciona los servicios siguientes de acuerdo con la funcién que esté en el AH. Funcién 00H de la INT 16H: Lee un cardeter Esta operacién maneja Jas teclas del eclado de 83 teclas, pero no acepta entrada de las teclas adicionales en el teclade ampliado de 10] teclas. (Para una entrada que pueda utilizar todo ¢] teclado, vea la funcién 10H.) La operacién verifica el biifer del tweelado por la entrada de un caracter. Si ninguno esta presente, la operacién espera a que el usuario presione una tecla. Si un cardcter estd presente, la operacién lo regresa en el AL y su eédigo de rastreo en el AH. (Una seccién posterior cubre los ‘sédigos de rastreo.) Si la tecla presionada es una funcién extendida, como Inicio o FI, el cardcter enel AL es OOH. Aqui estin las dos posibilidades: Tecla presionada AH | AL Canicter ASCH norma: Césdigo de rastreo wheter ASC ‘Tecla de funciénemendida: | Cédigo de rast El siguiente eédigo examina el AL. contra OOH para determinar si el usuario ha presionado una tecla de funcién extendida: Mov AH,DSH —-;Peticién a1 BIOS de entrada desde «1 teclado INT 16H sama al 80s CNP AL OOH 74s una tecla de funcin extendida? ve 8a a Como Ia operacién no repite el cardcter en ia pantalla, tiene que emitir una interrupcién de despliegue en pantalla para ese propésito 188 Procesamiento avanzade del teciado Capitulo 11 Funeién 01H de la INT 16H: Determina siun cardcter ests presente Esta operacign es semejante a la funcién 00H, pero con una diferencia importame. Si un carécter ingresado estd presente en el bufer del teclado, la. operacién pane en cero la bandera del cero (ZF = 0) y envia el cardcter al AL y su cédigo de rasireo al AH; el cardcter ingresado permanece en el bifer. Si no esta preseme algin carécter, Ia operacidin pone en uno la banders del cero y no espera. Observe que la operaciém proporciona una caracteristica de anticipacién, ya que el cardc- ter permanece en e| biifer del teclado hasta que la funcién OOH In lee Funcién 02H de la INT 16H: Regresa el estado actual de las teclas shift Esta operacién regresa a AL el estado de la tecla shift del teclado desde e] drea de datos de! BIOS en la localidad 417H (40:17H). (Una seccién anterior describe e| byte de estado.) El cédigo siguiente examina si !a tecla shift izquierda (bit 1} 0 derecha (bit 0) estén presionadas Mov AH,o2H ;Peticién de eetade del shite INT 16H rhlama al s10s GR AL,00000D12B ;4Se prestoné #1 shite izq. o der? SE ooo pas ‘Véase Ia funcién 11H para manejo del estado del shift en la lovalidad 418H para funciones extendidas en el teclado ampliado. Funcién 05H de la INT 16H: Escritura en el teclado Esta operacién permite que su programa inserte caracteres en el bifer del teclado como si el usuario hubiera presionado alguna tecla. Cargue el cardcter ASCII al CH y su eddigo de rastreo al CL. La opetacion le permitirs ingresar caracteres en el biifer hasta que esté leno, Funcién 10H de la INT 16H: Lectura de un cardcter de! teclado La operacién es la misma que la de la funcidin OOH, salvo que también acepta las teclas adicionales de funcién extendidas (como F11 y F12) desde el teclado ampliado, mientras que la funcién 00H no lo permite. La operacién verifica el bifer del teclado para un cardcter ingresado. $i ninguno esti pre- sente, la operacién espera a que ¢l usuario presione una tecla. Si un cardcter esta presente, Ja operacién lo regresa en e! AL y su cédigo de rastreo en el AH, Si la tecla presionada es una tecla de funcién extendida, como Inicio o F1, ef carécter en el AL es OOH. En el teclado ampliado, FL1 y P12 tambi¢n regresan QOH en el AL, pero otras teclas de control (duplicados}, come Inicio y RePag, regresan EOH. Aqui estén las dos posibilidades: Tels pesinata [an =] ‘Carkcter ASCII normal: | Codigo de rastreo Cardcwer ASCH Teen de Rein euuntste: | Casi de aes | ED Tectas de funcién extendidas y cédigos de rastreo 189 Puede examinar el AL contra OOH o EOH para determinar si el usuario ha presionado una tecla de funcién extendida: MOV AM, 10H ;Peticidn al BIOS para una entrada del teclado INT 16H itlama al 270s OM AL,OOH ;g8 una recla de funcién extendida? JE a40 2 oat MP AL, OBoH ,g82 una recla de funcién extendida? ‘Ya que la operacién no repite et cardcter en lapamalla, debe emitir una interrupcién de despliegue en pantalla para ese propésito. Funcién 11H de la INT 16H: Determina si est presente un cardcter Esta operacién es la misma que la funcidn O1H, excepto que reconoce las funciones extendidas del teclade ampliado, mientras que 01H ne le hace. Funcién 12H de la INT 16H: Regresa el estado presente del shift del teclado Esta operacién es semejante a la funcién 02H, que regresa al AL el estado del shift del teclado desde el drea de datos det BIOS en la localidad 417H (40:17H). La operacin también envia el estado del shift extendido a AL: Bie ‘Accita |? 3 derechea presionada | & ——BlogMayis presionada 2 | derecha piresmonada } 5 Blaghtum presionads 1 Altiequierda presionads 4 ScrollLock presionada 0 Ciel inquienda ipresionada TECLAS DE FUNCION EXTENDIDAS Y¥ CODIGOS DE RASTREO- Una tecla de funcidn extendida como FI o Inicio solicita una accién en lugar de enviar un cardc- ter, No existe nada en el disefo del sistema que obligue a estas teclas a realizar una accién espe- ccifica: como programador, usted determina, por ejemplo, que presionando la tecla Inicio se coloque ef cursor en la esquina superior izquierda de la pantalla © que presionando la tecla Fin colo- que el cursor al final del iexto de la pantalla. Podrfa programar con facilidad estas teclas para que realicen operaciones sin relacién alguna Cada tecla tiene un cddige de rasireo disefado, empezando con 01 para Esc, (Véase en el apéndice F una lista completa de estes cédigos.) Por medio de los eédigos de rastrea, un progra- ma puede determinar el origen de cualquier tecleo. Por cjemplo, un programa podria emitir la funcién 10H de 1a INT 16H para solicitar la entrada de un cardeter. La operacién responde en una Procesamiento avanzads del teciade Capitulo 11 de dos formas, dependiendo de si presiona una tecla de cardcter o una tecla de funciGn extendida, Para un caracter, como Ia letra A, la operacién envia estos dos clementos: 1. Enel registro AL, el carécter ASCII de ta A (41H). 2. Enel regisiro AH, el cédigo de rastreo para la leira A, LEH. an | at! ze] a) El teclado tiene dos teclas para caracteres tales como ~, + y *. Por ejemplo, presionando la tecla del asterisco se establece el cédigo del cardcter en 2AH en el AL y uno de dos cédigos de rastreo en el AH, dependiendo de qué tecla fue presionada: 09H para el asterisco que esté arriba del mimero 8, 0 29H para el asterisco del panel numérico. El eddigo siguiente prueba el cédigo de rastreo para dererminar que asterisco fue presionado: WP ALQAK Rs un asterieco? SME EXIT: mo, entonces salir CMP AH,O9H —;gCuAL ea el cOdigo de rastreo? se RxIT2 Si presiona una tecla de funcién extendida, como Ins, la operacién envia estos dos ele- mentos: 1, Enel registro AL: Cero, o EOH para una nueva tecla de control en teclado ampliado 2, Enel registro AH: El codigo de rastreo para Ins, 52H. an | ay s2 | 09 Por ianto, vege de una operacién INT 16H (y algunas operaciones de la INT 21H), se puede examinar el AL. Si contiene OOH o BOH, la peticién es para una funcién extendida; de otra manera, la operacién ha enviado un carcter, Lo siguiente prucha una tecla de funcidn extendida: MOV AH.10H —;Peticién para entrar desde ef teclado mr 16H Liana al 816s MP AL, oon ns funciéa extendide? Jz ali + sf, antonces gait MP AL,OROH —j2E8 una funeiGn excendida? g2 salir 1 ef, entonces salir En el cédigo siguiente, si un usuario presiona la tecla Inicio (eddigo- de rastreo 47H), el cursor se coloca en el renglén 0, columna 0: Seleccién de un meni 191 MOV AH,LOR ;Petici6n de entrada ivr 16H sLlama al Bros CMP AL. cOH ; 48s una Funeién extendida? ge ano ) af, entonces pasarlo CMP AL, BOOH ;2Es una funcién exvendida? ome 0. } fo, entonces salir G30: CMP AM ,A7H j4Es el cédigo de rastreo de Inicio? wwe G30 1 no, entones ar Mov AH,OIN ;Peticién Mov BEE, 00 para colocar el cursor MOV PK,00 ; en 0,0 INT 198 vilama al 8x05 Las teclas de funcidn programable F1-F10 generan cédigos de rastrea 3BH-44H, respecti- vamente, y FI1 y FI2 generan 85H y 86H. El cédigo siguiente prueba la tecla de funcién ‘programable F10: CNP AH 4¢H 7uRs la cecla de funcién #107 JE EXIT, + ef, entonces salir En EXITI, el programa podria realizar cualquier acciGn necesaria Ejercicio det teclado EI ejercicio siguiente con DEBUG examina los efectos de introducir varios caracteres con el teelado. Para un teclado de 83 teclas, utilice Ia funcién OOH; para un teclado de 101 teclas, emplee la funcién 10H. Utilice el comando A 100 para introducir estas instrucciones; MOV AW, 00 0. MOW AM, 10 ome 100 Utilice el comando P (Proceder) para ejecutar la operacién INT. Teclee varios caracteres y com- pare los resultados en el AX con el listado del apéndice F. SELECCIGN DE UN MENU El programa parcial de la figura 11-1 ilustra el despliegue de un ment y permite al usuario presionar las teclas direccionales (hacia arriba y hacia abajo) para selecctomar un elemento de él. El mend esté definido en el segmento de datos dentro dé una caja con dobles Iineas (como se explicé en el capitulo 10). Los procedimientos y las acciones que realizan son los siguientes: 192 Procesamiento avanzado del teclade Capitulo 11 page 60,132 TITLE «= PLISELMU (EXE) Seleceion ae una opcign del mend “MODEL SMALL ISTACK 64 =DATA, ToPRON -EQU 90 jWilera superior del meng BoTROW 07 fHilere inferior del mend LEFeOD as FColumna izquierds del mend con 08 HColumna de pantalla Row a0 Hijora de pantalla cour ? HCaracteres por linea EINES > Lineas exhibidas ATTRIB ? Atribute de pantalla NINTEER 1 ancho del mend Mee ‘OCsH, 17 DOPtacnH) , OBB OBAY, ‘ Add records‘, OBAH OBAH, ' Delete records "| OBAK ‘ORAM, ‘ Enter orders =", OBAH ‘OBAH, ‘ Print reper", OBAH ‘ORAM, * Update accounte ‘; OBAH ‘ORAM, * View records ", OBAH ‘OCBH, 17 DUP{OCDH), OBCK PROT 98, ‘To awlect an item, use up/dow: arro ‘Presa Esc to exit EEECLEEELLE LE GES SERRRRERRREe sees. asorw pInicier registros b de segmento sDespejar pantalla OW, BOTROW«2 cou, a9 g20cuns rPigar cursor A, 408 ;Beticién de exhibicién ‘ax.o2 Manejo de pantalla exlas Hinero de Caracteres Bx, PROMPT Hindicacién It oat ALoLooRs CALL © BLoMen iExhibieign de mend NOV" COL, LEFCOL+1 CALL g20cuRs sFigar cursor MoV! ROW, TOPROW2 iFijar hilera a opeién superior MOV ATTRIB, 16H iPijar video inverse CALL «© HLODIS? pRenaltar la linea de mend CALL DLOINPT iPropercionar para 1a seleccién de mend MP AL, oH seEnter presionade? JE —-RLOLOoP ei, continuar Mov. AX, 08008 Rac presionado {indica fin) ALL guécuR iOespejar pantalla mov x, «com Salida a DOS INT 2 BEGIN = ENDP Mostrar todo el mend Blower PROC | NEAR Mov ROM, TOPROK HPijae bilera superior MOV LINES, 08 iWamero de 1ineas Figura 11-1 Seleccidin de un elemento desde el meni Seleccién de un ment B20 BLOMENT Daginet p20 pags so Do DLOINET ineprar LEA vov caus ov wow Mov Mov Mor iwc 4 PRoc BEARS 193 yAzul sobre blanco :Fijer columna izquierda del mend q2ccume ;Fijar cursor en la siguiente columa ‘a, OH, jPeticién de exhibicién AL, (ST) jObtener cardcter del mend BE, 00 [Pagina 0 BL, 71 jMuevo atributo x, 01 Un cardcter Lo ou Siguiente columa St Fijar siguiente carécter com pg0ltino cardcter? 30 iio, repetir ROW pSiguiente hilere LINES B20 148 imprimieron todas las Lineas? [Si ee ast, regresar Aceptar entrada a pedido EAR AML, 208 :Peticién de entrada isi : dal teclade AN, 50H paFlecha hacia abajo? B20 aK, aah eePlecha hacia arriba? Be AL, OOH eTecia Rnter? Bed, AL, 1H ieTecla escape? Da Diomer ;Winguna, procesar de nuevo ATTRIB, 73K pAgul sobre blanco mioorsP [Fijar Ja linea anterior a video normal ROW ROW,BOTROW-1 ;4Se pas6 1a hilera interior? Bao no, muy bien ROM, TOPROMe2 si) restablecer Dao ATTRIB, 725 :Video normal H1opIsP. IPSjar linea anterior a video normal RoW ROW,TGPROW+2 ©; gAbajo de 1a hilera superior? an imo, muy bien ROW,BOTROW-1 ©; ai, reatablecer Fijar cursor Video inverse iPijar sueva Linea & video inverse AG, ROW rLa Mera dice qué linea fijar NIWTEEX imuitiplica per la longieud de la linea 1, MEN +2 + Bor Ja Jinga de mend seleccionada 81,20 COUNT, 17 sCaracteres a exnibir Figura 11-1 (continvacién) 194 rae: CALL mov Mov “ov ov INT mc Ic BEC aa Mov CALL rer miopisP ENDP @20cLR PROC giochR = ENDP pee aocURS PROG qzocuns ENDP Procesamiento avanzado del teciado Capitulo 11 ge20cuRs ;Fijar cursor en segmento columna AR 9H iPeticién de exhibicisn AL, (SE) ;Obtener caracter del mend BE, 09 Pagina 0 BL,ATTRIB iMuevo atrébute: x, ea 1Un caxdcter 10H oo Siguiente columna iFijar para el siguiente cardcter Sour g0timo cardeter? 20 No, reperir COL, LEPEOLSL jRestablecer columna a la izquierda Ga0cURS: ;Pijar cursor Despejar pantalla Ax, 06008 2H, 618 vhaul sobre cage cx, oggn DX, 1e4FH 10H iblamar a Bros DL, COL Colma Figura 11-1 {comtinuacién) + BEGIN llama a QUOCLR para limpiar la pantalla, lama a BIOMENU para desplegar los elementos del met y establecer el primer elemento en video inverso y llama a DIOINPT para aceptar entradas del teclado. + BIOMENU muestra el conjunto completo de selecciones de! mend + DIOINPT jiza la INT 16H para entrada: La flecha hacia abajo para bajar por el mend, la flecha hacia arriba para subir por el mend. Enter para aceptar un elemento del meni y Esc para salir. Las demas entradas del teclado son ignoradas. La rutina da vuelta alrededor del cursor, de manera que tratar de mover el cursor por arriba de la primera linea del mens lo coloca en Ia titi linea y viceversa. La rutina también llama a HIODISP para restaurar la linea anterior del ment a video normal y la nueva linea del ment (seleccionada) a video inverso. + HIODISP muestra la linea actualmente seleccionada de acuerdo con un atribute (normal o ‘en video inverso) que haya ido proporcionads. + QIOCLR limpia toda la pantalla y Ia establece en primer plano azul y fondo cafe. El programa ilustra la seleccién de memi en una forma sencilla; un programa completo ejecutaria una rutina para cada elemento seleccionads. Entenderd mejor este programa tecleéndo- lo y verificéndolo. Interrupcin OSH y @! biter del teclado 195 INTERRUPCION 09H Y EL BUFER DEL TECLADO ‘Cuando presiona una tecla, ¢] procesador del teclado genera el codigo de rastreo de la tecla y solicita la INT O91, Esta interrupcidin (en la posicién 36 de 1a tabla de servicios de interrupcién) ‘apunta a una rutina de manejo de interrupeién en el BIOS de ROM. La rutina emite una peticién de entrada desde el puerto 96 (60H): La rutina de BIOS lee el cédigo de rastreo y lo compara con entradas en una tabla de cédigos de rastreo para el caréeter ASCII asociada (si existe). La rutina combina el cédigo de rastren con su cardcter ASCII asociado y cnvia los dos bytes al béfer del teclado, La figura 11-2 ilustra este procedimiento. Observe que la INT 09H mancja los bytes de estado del teclado en 40:17H, 40:18H y 40:56H para Shift, Alt y Ctrl, respectivamente, Sin embargo, aunque la presidn de estas teclas genera la INT O9H, la rutina de interrupeiéa establece los bits apropiades en los bytes de estado, pero no envia ningiin caricter al bifer del teclado. Tambien, 1a INT O9H ignora combinaciones de tecleo no definidas. ‘Cuando se presiona una tecla, el procesador del teclado de manera automdtica genera un cédigo de rastreo y la INT 09H. Cuando se swefta © libera la tecla en un periode de medio segundo, genera un segundo eédigo de rastreo (el valor del primer eédigo sumado a 128 (1000 0008), lo que pone en uno el bit de la extrema izquierda] y emite otra INT O9H. El segundo cédigo de rastreo indica a la rufina de interrupcign que ha liberado 1a tecla. Si mantiene oprimida la tecla por mas de medio segundo, el proceso de teclada se convierte en tecleo automitico, y repite de manera automética la operacién de la tecla. Et biifer del teclado El biifer del teclado necesita una direccién para indicar ala INT OOH en dénde insertar el siguiente earacter y otra direccién para indicar ala INT 16H de dénde extraer el cardcter siguiente, Las dos direcciones tienen desplazamientns dentro del segmento 40{0]H. Lo siguiente describe el conteni- do de! bifer: DIRECCION —EXPLICACION 41AH Direceién del inicio actual del bufer, la posicién siguiente para la [NT 16H para lees 41CH Direccién del final actual del bifer, 1a posicién siguiente para la INT 09H para almacenar un cardcter ingresado. 41EH Direcei6n, del inicio det bifer del teclado: 16 palabras (32 bytes), aunque puede ser mis largo. El bifer retiene los caracteres del teclada y los cédi- 208 de rastreo como son introducidos para lectura posterior por medio de la INT 16H, Se necesitan dos bytes para cada cardcter y su cédigo de rastreo asociado: Dicecciin de la Direcewia de ln —_Direccivn parte inicial parte final del baer | “1A, ac ug 196 Procesamiento avanzado del teclado Capitulo 11 Cierare renee detpea niet tte 2G) smpem mse seem armor m8 ae ‘Un INT g008e8 weORe yn CAE kL yw coma Figura 11-2 Bafer del teclado sma Cuando se teclea un cardcter, la INT 09H avanza la parte final. Cuando la INT 16H lee un cardcter, avanza la parte inicial. De esta manera, el proceso es circular, con la parte inicial siguiendo de manera continua a la parte final. Cuando el bufer esté vacfo, la parte inicial y la parte final estén en la misma direccién, En el ejemplo siguiente, un usuario tecles 'abed < Enter >", La INT 09H ha almacenade los caracteres enel bifer y ha avanzado la parie final a 428H. (Por simplicidad, el ejemplo no muestra las cédigos de rastreo asociados.) El programa ha emitido In INT 6H cinco veces para leer todos los carac: eres y ha avanzade la parte final a 428H, de manera que e| bifer estd vacio ahora: a boc a <0DH> | | | | t i 41E 420 422 424 426 428 Cuando ¢! buifer esté Ueno, la parte final est4 inmediatamente atris de Ia parte inicial. Para verlo suponga que ahota teclea “fghijkimnopgrs'. Entonces la INT 9H almacena los caracteres empezande en Ia parte Final en 428H y dando vuelta para almacenar la ‘s’ en 424H, inmediata- mente antes de la parte inicial en 4264. po oq 6 s e f g bh i j kl mao fot totet Pobobtot ad todd hotlol 41E 420 422 424 426 428 42A 42C 426 430 432 434436 438 434 43C En este punto, 1a INT 09H no acepta ningin cardcter mis que se teclee por adelantado, y aunque el bifer tiene 16, acepta sélo 15 a lo mis. (;Puede decir por qué?) Si la INT O9H captara Cémo ingresar e! conjunto completo de caracteres ASCII 197 ‘otro caricter, avanzaria la parte final a la misma direccidn de la parte inicial y la INT 16H supondria que el biifer esti vacio. Las teclas Ctrl, Shift y Alt ‘La INT OOH también maneja el byte de estado del shift en 40:17H en el drea de datos del BIOS [Shift derecho (bit 0), shift izquierdo (bit 1}, Ctrl (bit 2) y Alt (bit 3). asi come 40:18 y 40:95 para e! teclado ampliado. Cuando presiona una de estas teclas, la rutina del BIOS pone en uno et bit apropiado, y cuando libera la tela pone en cero el bit. Su programa puede examinar si alguna de las (eclas anteriores estin presionadas ya sca por medio de la INT 16H (funcién 02H) 0 por referencia directa a la byte de estado. El siguiente programa parcial COM ilusira el uso directo de la referencia directa al byte de estado: BIOQDATA SEGMENT AT 49H ;Posiciona el drea de datos del aros ong 17% ty KESTATE DBF + el byte de estado BIODATA ENDS SODESG SEGMENT PARA ASSUME © CS:CODREG, DS: BIODATA ons roan BEGIN Mov AX, BIODATA. «= Indctaliza 1a direccisn de sov Ds.ax } BIODATA ea Ds MOV Ab, EBSTATE sOptiene e1 byte de estado del ceclads TEST AL, 900000128 -Prusha af algin shift o# preaiens oe wot + sf, entonces, El programa utiliza la caracteristica SEGMENT AT para definir el dérea de datos del BIOS ‘como, en realidad, un segmento ficticie. KBSTATE identifica la posicidn del byte de estado del teclado en 40:17H. El segmente de cédigo inicializa la direccién dé BIODATA en el BS y almacena el byte de estado del teclado en el AL. Una operacién OR prueba si alguna de las teclas shift fue presionada. Puede modificar este cédigo para examinar también los bytes de-estndo de teclado ampliado ven 40;18H y 40:96H. COMO INGRESAR EL CONJUNTO COMPLETO DE CARACTERES ASCH El conjunto completa ASCII consta de 256 caracteres numerados desde el 0 hasta el 255 (FFH). Muchos de éstos son caracteres estindar desplegables, desde el ASCII 20H (espacio) hasta el ASCH 7EH (el cardcter de tilde, ~}. Como el teclade esta limitade a 83 0 101 teclas, la mayoria 198 Procesamiento avanzado del teciado Capitulo 11 de los 256 caracteres ASCII na estén representadas en éi, Sin embargo puede introducir cualquie- ra de los cédigos desde 01 hasta 255 manteniendo oprimida la tecla Alt ¢ ingresando el cédigo apropisdo como un valor decimal por medio det panel numérica. F! sistema almacena los valores, ‘que ingres6 como dos bytes en el biifer del teclado: el primero es el cardcter ASCII generado y el segundo, es cero. Por ejemplo, Alt+001 envia 01H, y Alt+255 envia FFH, Puede utilizar DEBUG para ¢xaminat el efecto de introducir diferentes nimeros: oo MOV AML, 1a ao2 mmr 16 ios MP 109 PUNTOS CLAVE + Los bytes de estado del shift en el drea de datos del BIOS indican el estado actual de Ctrl, Alt, Shift, BloqMayés, BlogNum y ScrollLack. + Las operaciones de la INT 21H del DOS proporcionan diferemes servicios con o sin repeticién en la pantalla, para reconocer © ignorar Curl+Break y para aceptar eédigos de rastreo, » LaINT 16H del BIOS proporciona la operacién hisica de! BIOS paral teclada para aceptar caracteres desde el biifer del teclado. Para una tecla de carécter, Ia operacién envia el carécter al AL y el cédigo de rastreo de la tecla al AH. Para una tecla de funcién extendida, la operaciéin envia cero al AL y el cddigo de rasireo al AH. + El cédigo de rastreo es un nlmero Gnico asignado a cada tecla, que Ie permite al sistema idemificar el origen de una tecla presionada y permite a un programa verificar las teclas de funcidn extendidas tales como Inicio, AvPag y las flechas. + El drea de datos del BIOS en 40:1EH contiene el bnifer del teclado, Esta drea le permite teclear hasta 15 caracteres antes que el programa solicite una entrada. + Cuando presiona una tecla, e! procesader del teclado genera el cédigo de rastreo de ta tecla (su dnico ndmero asignado) y solicita la INT 09H. Cuando suelta la tecla genera un segundo cédigo de rastreo (cl primero més 128: pone en uno el bit de Ia extrema izquierda) para indicarle a la INT 09H que la tecla ha sido soltada, + La INT 09H del BIOS obtiene un eddigo de rastreo det teclado, y o bien genera un carécter ASCII asociado y envia el cédigo de rastreo al drea del biifer del teclado, o establece el estado de Ctrl, Alt, Shift. PREGUNTAS AI-L, (a) {Cuil es Ia Jocalidad en el Area de datos del BIOS, del primer byte del estado del shift del teclado” (b) (Qué significa el contenido 000011007 (¢) {Qué significa el contenido 000000107 11-2. Explique las caracteristicas de las funciones siguientes para entrada desde el tectado con la INT 21H (2) OH; (b) OFH; (c) O8H; (d) OAH. 11-3. Explique fas diferencias entre las funciones OOM, O1H y 10H de la INT 16H. Preguntas Ad. 11-6. 1-7. 18, 1-9. 1140, 1a, 199 Proporcione Jos cOdigos de rastren para las funciones extendidas siguientes; (a) Flecha hacia arriba: (b) recla de funcidm programable; (c) inicio (Home); (d) RePig (PgUp). Utilice DEBUG para examinar los efectos de los tecleos introducidos. Para solicitar entrada de una instrucci6n en lenguaje cnsamblador, tcclee A 100 € introduzca las instrucciones siguientes: Mov AH.00 fe AN, 20) INT 16 mmr 190 Utilice U 100,104 para desensamblar el programa, y utilice el comando P para hacer que DEBUG ejecute toda la interrupei6n. La ejecucion se detiene en espera de su entrada. Presione cusiquier tecla para cxaminar los registros AH y AL. Continde introduciendo diferentes teclas. Presione Q para sai de DEBUG. Codifique las instrucciones para introducir un solo tecleo; si la tecla es AvPig(PgDn), cologue cl cursor en el renghin 24, cohamea 0. Corrija el programa de la figura 11-1 para proporcionar las caracterfsticas siguientes: (a) Después de! borrado inicial de la pantalla, mostrar una peticidn que pida al usuario presionar Fl para un mend de pantalla. (} Cuando se presione FI, desplegar el mens, (c) También permitir a los usuarios seleccionar clementos del ment presionando el primer carscter (maytiscula.o mimiscula) de cada elemento. (d) A soliciwud de wn elemento, mostrar un mensaje para esa seleccidn en particular, como “Procedimiento para eliminar registros”, fe) Permitir » los usuarios presionar la tecia Esc para regresar al mend principal de fa rutina seleccionada, {Bajo qué circunstancias ocurre una INT 09H? Explique en términos sencillos cdma fa INT O9H maneja las teclas Ctrl y Shift de manera diferente a 1a forma de manejar 185 teclas del teclado esténndar (3) {En donde estd la posicidn en memoria det BIOS del biter del teclado? (b) En bytes, jcual es el tamafo del béfer’ (c) (Custos caracteres. de teclado puede tener? {.Qué significa que la direcei¢n de ta cabeza y de-la cola en el tiifer del teclada sean iguales? (6) {Qué significa que la direccin de Ia cola siga de manera inmediata de la cabeza? PARTE D — Manipulacién de datos CAPITULO 12 Operaciones con cadenas de caracteres INTRODUCCION Explicar las instrucciones especiales u tos de cadenas de caracteres, OBJETIVO En este punto, las instrucciones presentadas han manejado datos definides como un sole byte, pala- bra o palabra doble. Sin embargo, a veces es necesario mover 0 comparar campos de datos que ‘excedan estas longitudes, Por ejemplo, puede querer comparar las descripciones o nombres a fin de clasificarlas en orden ascendente. Los elementos en este formato son conocidos como datas de cadena de caracteres (0 9610 datos de cadena) y puede ser de caricler 0 numérico. Para procesar tuna cadena de caracteres, el lenguaje ensamblader proporciona cinco instrucciones para cadenas: MOVS Lops STOS MPS SCAS Mucve un byte, palabra o palabra doble desde una localidad en memoria a otra, (Carga desde memoria un byte en cl AL. una palabra enel AX o.una palabra doble enel EAX, Almacena el contenido de los registros AL, AX o EAX en memoria, ‘Compara localidades de memoria de un byte, palabra palabra doble. Compara cl contenido de AL, AX o EAX con el contenido de una localidad de memoria, REP; Prefijo de repeticidn de cadena 201 Una instruceién asociada, el prefijo REP, proveca que una instruccidn para cadena se realice de manera repetitiva un numero espeeifico de veces. CARACTERISTICAS DE LAS OPERACIONES CON CADENAS DE CARACTERES Una instruceién de cadena puede especificar el procesamiento repetitiv de un byte, palabra o (en el 80386 y procesadores posteriores) palabra doble a un tiempo. Asi, puede seleccionar una operacién de byte para una cadena con un mimero impar de bytes y una operacién de palabra para una cadena con un ndmere par de bytes. Cada instruccin de cadena tiene una versin para byte, palabra 0 palabra doble y supone el uso de las registros ES:DI o DS:SI. El Di y SI deben contener direcciones de desplazamiento-vilidas. Basicamente existen dos maneras de codificar instrucciones de cadena. En la tabla siguiente, la segunda columna muestra el formato bisico para cada operacién, la cual utiliza los operandos implicades listados en la tercer columna (par ejemplo, si codifica una instruccifin MOVS, incluya ‘operandos.como MOVS BYTEL BYTE2, en donde la definicién de los operands indican la longi- mud del movimiento): Tsruccioa Operciée —Operacida ———Operacién ‘Operaciin basin con bytes con palabra com palabra dotle | Mover movs MOvSE: MOvSH MOVED: ! carga ‘Le0s Lanse Loose uwosn | Rimacenar — STOS. STOsB sTosw sTosD ! Comparar — CMPS ows, comes cups | seas sca seas CAS ‘La segunda manera de vodificar instrucciones de cadena es la préctica usual, como se mostrd en las columnas cuarta, quinta y sexta. Usted carga las direcciones de los operandos en los registros Dly Sly codifica, por ejemplo, MOVSB, MOVSW y MOVSD sin operandos. Las instrucciones de cadena suponen que el Di y el SI contienen direceiones de desplaza- miento vilidas que hacen referencia a bytes cn memoria. El registro SI esti asociado por lo comtin con el DS (segmento de datos) como DS:SI. El registro DI siempre esta asociado con el registro ES (segmento extra) como ES:DI. En consecuencia, MOVS, STOS, CMPS y SCAS necesitan que un programa .EXE inicialice el registro ES en general pero no necesariamente, con la misma direccién que la del registro DS: wov Ax.adata ;Obtiene la direccién del seguento de datos NOV DB,AK plo almacena en DS Woy BS, ax yen BS REP: PREFIJO DE REPETICION DE CADENA. El prefijo REP inmediatamente antes de una instruccidn de cadena, como REP MOVSB, proporcio- nna una ejecuci6n repetida con base en. un contador inicial que usted establece en el registro CX. REP ejecuta la instruccién de cadena, dismimuye el CX y repite 1a operacién hasta que el contador snel CX seacero, De esta manera, puede manejar cadenas de caracteres de casi cualquier longitud. Operaciones con cadenas de caracteres Capitulo 12 La bandera de direccién (DF) determina la direcciém de la operacién que se repite: + Para procesamiento de izquierda a derecha (la manera normal de procesar), utilice CLD para poner en cero a DF + Para procesamiento de derecha a izquierda, utilice STD para poner uno en DF. El ejemplo siguiente mueve (a mejor, copi los 20 bytes de STRING! a STRING2 (suponga que el DS y ES ambos han sido inicializados con la direccién del segmento de datos, como ya se mostré); STRING. DB STRING? DB ou nov mn ue 20 DURI"#*) 2 DUP(" *) rPane en cera 1a bandera de direceién cx,20 sInicializa para 20 bytes DI,STRING2 ;Inictaliza el nombre receptor 8I,STRINGL ©; Inictaliza 1a direccién emisora woven pCopia STRING en STRING? Durante la ejecucién, las instrucciones CMPS y SCAS también establecen las banderas de estado, de mado que la operacién puede terminar de manera inmediata al encontrar una condi- cidn especificada, Las variaciones de REP para este propésito son las siguientes: + REP Repite la operacién hasta que el CX Hegue a cero, + REPE oREPZ Repite la operacién mientras la bandera de cero (ZF) indique igual o cero. Se detiene cuando la ZF indica diferente a cero o cuando CX Mega a cero. + REPNE o REPNZ Repite la operacién mientras la ZF indica diferente @ cero. Se detiene cuando la ZF indica igual 0 cero o cuando CX Mega a cero, Para el 80286 y procesadores mis avanzades, el uso de las operaciones con palabra o palabra doble puede proporcionar un procesamiento més rapido. Ahora examinaremos en detalle las opera- ciones de cadena. MOVS: MOVER UNA CADENA DE CARACTERES: MOVS combinada con un prefijo REP y una longitud en el CX puede mover cualquier nimero de caracteres. Aunque usted no codifiea los operandos, la instrucci6n se parece a esto: [etiqueta:] REP MovSa [B5:D1, 8-51) Para la cadena receptora, los registros segmento:desplazamiento son ES:DI; para la cadena emisora los registros segmento:desplazamiento son DS:S1. Como resultado, al iio de un progra- ma .EXE inicialice el registro ES junto con el registro DS-y, antes de ejecutar el MOVS, utilice LEA para inicializar los registros DI y SI. Dependiendo de la bandera de direccidn, MOVS incremema o disminuye los registros DI y SI en | para un byte, en 2 para una palabra y en 4 para una palabra doble. El cédigo siguieme es ilustrativo: MOVS: Mover una cadena de caracteres 203 NOV CX,niimero iMémero de byte/palabras LEA DI, STRING? sPixeccién de STRING? LER ST, STRINGL Direceién de STRINGL REP NovSa iMueve n bytes/palabras Las instrucciones equivalentes para REP MOVSB son; exe LABEL Salta, oi Ck es cero LABEL: MOY AL, [ST] tiene el cardcter de STRINGL wow (DT) , RL yAlmacena el cardcter en STRING? mic or 20 DEC Dr me st 20 DEC St LOOP LABEL La figura 6-2 ilustré céimo mover un campo de 9 bytes. El programa también pudo haber utilizado MOVSB para este objetivo, En la figura 12-1 el procedimiento CIOMVSB utiliza MOVSB para mover de byte en byte un campo de 10 bytes NAME! a NAME2. La primer instruceién, CLD, one en cero la bandera de direccién de modo que el MOVSB procesa los datos de izquierda a derecha, Al inicio de Ia ¢jecucién, porlo regular la bandera de direocién se encuentra en cero, pero aqui por precaucidin estd cadificado CLD. Las.dos instrueciones LEA cargan los registros SI y Dl con los desplazamientos de NAME1 y NAME2, respectivamente. Ya que el cargadar del DOS para un programa .COM de manera auto- mitica inicializa los registros DS y ES, las direcciones segmento:desplazamiento son correctas para ES:D1 y DS:SI. Una instruccién MOV inicializa el CX con 10 (la longitud de NAMEL y de NAME2). Ahora la instruccién REP MOVSB realiza lo siguiente: + Mueve el byte de la extrema inquierda de NAMEI (direecionado por DS:SI) al byte de ‘extrema izquierda de NAME2 (direccionado por ES:DI). + Incrementa ef DI y Si en uno para los siguientes bytes a la derecha. + Dismimuye el CX en 1. + Repite esta operacién, 10 ciclos en total, hasta que el CX se convierte en cero. Puesto que la bandera de direccién es cero y MOVSB incrementa Dl y SI, cada iteracién process un byte mas a la derecha, come NAMEI +1 » NAME2+1, y asi en forma sucesiva. Al final de la ejecucidn, el CX contiene 00, el DI contiene la direccién de NAME2+10, y el SI contiene Ia direcciém de NAME! +10 —ambos un byte después del final del nombre. Si la bandera de direccién es uno, MOVSB disminuirfa I y SI, provecando que el procesa- miento ocurriera de derecha a izquierda, Pero en ese caso, para mover los contenidos de manera adecuada tendria que inicializar el $1 con NAME +9 y el DI con NAME2+9. El procedimiento siguiente de la figura 12-1, DLOMVSW, atiliza MOVSW pata mover cinco palabras desde NAME2 a NAME3. Al final de 1a ejecucién, el CX contiene 00, el DI contiene la direccidn de NAME3+10, y el SI contiene la direccién de NAME2 +10. 204 ‘Operaciones con cadenas de caracteres Capitulo 12 [ rms rimmover (com operaciones de cadenas con NOvS CMODEL SHALL | cone ona OMe ;Blementos de datos pa 30 DUPY" 20 BURY’ waite sProcedistiente principal DSubrutina NVSB SSUrutina NVSW | jgalir a Dos | MAtE | cromven Azquierds a derecha iMover lee bytes + de MANE: a MANES cows Sioevsw cu jInquierda a derecha MOV ex, a8, jMover 5 palabras EEA DI NAMER de NAMED a MAME? LEA SE,NAME2 Figura 12-1 Uso de operaciones. con cadena MOVS ‘Ya que MOVSW incrementa los registros DI y ST en 2. la operacién s6lo necesita de cinco ciclos. Para procesar de derecha a izquierda, inicialice el ST con NAMEI+8 y el DI con NAME? +8. LODS: CARGA UNA CADENA DE CARACTERES LODS carga el AL con un byte, el AX con una palabra o el EAX con una palabra doble desde la memoria, LadireceiGn de memoria esid sujeta a los registros DS:S1, aungue puede pasar por alto el SI. Dependiendo de la bandera de direccién, a operacién también incrementa o disminuye ei SI en I para byte, en2 para palabra y en 4 para palabra doble, ‘Ya que una operacién LODS lena el registro, no existe razén préctica para utilizar con ella el prefije REP. Para la mayor parte de los propésitos, una sencilla instruccién MOV es adecuada, Pero MOV genera 3 bytes de cOdigo de maquina, mientras que LODS silo genera uno, aunque necesita ‘que inicialice el registro St. Podria utilizar LODS para recorrer una cadena un byte, una palabra 0 ‘una palabra doble a la vez, examinindola de forma sucesiva contra un valor particular. STOS: Almacenar una cadena de caracteres 205 (Crerie Pazuons? ico so de 00s en operaciones ae cadens | MODEL SMALL. | C008 org (1008 BEGIN: IMP = SHORT MAIN FLELDA DB ‘angerblere! rRlementos de datos FIELDB DB 10 DUP (20H) MAIN PROC REAR sProcedinie P eo [Isquierda a derecha mov CX,10. | URR ST, FIELDA Carga: direceign de FISLDA | LEA DE) FIELDB+S Cargar direceion de FIELDB+9 | azo: LOOSE Obtensr vardeter en AL, | Mov (DT) ,AL : ge almacena en PIELDE, DRC ODT [ Squierda a derecha wor AZo i2i0 caracteres? mov AK, 400 iar, ealida INT at Mam ENDP END BEGIN Figura 12-2 Uso de la operacién de cadena de-caracteres LODSW Las instrucciones equivalentes a LODSB son: Mov AL, (81) Carga un byte en AL INC ST HIncrementa SI al byte siguiente En la figura 12-2 el drea de datos define un campo de 10 bytes llamado FIELDA, con el valor “Assemblers” y otro campo de 10 bytes lamado FIELDB. El objetivo es transferir los bytes de FIELDA a FIELDB en secuencia inversa, de manera que FIELDB contenga “srelbmessA" LODSB es utilizada para accesar un byte a la vez de FIELDA al AL y la instrucciin MOV {DI}.AL transfiere los bytes a FIELDB de derecha a izquierda STOS: ALMACENAR UNA CADENA DE CARACTERES: STOS almacena los contenidos del regisiro AL, AX o EAX en un byte, palabra o palabra doble en memoria. La direccién de memoria siempre esta sujeta a los registros ES:DI. Dependiendo de la bandera de direccién, STOS también incrementa o disminuye el registro DI en I para byte, 2 para palabra y 4 para palabra doble, Un uso practica de STOS con un prefijo REP es para inicializar ¢] area de datos a cualquier valor especificado, tal come limpiar cl érea de despliegue a blancos. Puede establecer el mimero de bytes, palabras o palabras dobles en el CX. Las instrucciones equivalentes a REP STOSB son. JCMZ LABEL? =| $i CK @s cero, entonces salta LABEDA: MOV (DIl,AL —;Almacena AL en memoria rNc/nec or pTncrenenta o diseinuye Loop LABEL. LABEL 206 Operaciones con cadenas de-caracteres Capitulo 12 [srr eazetoer toon) oporaciconn 60 cadena con vom ieee onset | so 100% pBlomentos te dates Procedimienta principal Taquierda a derechs ax, 2020H Mover Mev Cx,05 5 blancos LEA Dr, HAMEL a MAME oo air a Dos Figura 12-3 Uso de la operaci6n de cadena de caracteres STOSW La instruccién STOSW en la figura 12-3 almacena de forma repetida una palabra con 2020H (blancos) cince veces en NAME1. La operacién almacena el AL-en el primer byte y el AH en el byte siguiente (esto ¢s, en orden inverso). Al final, NAME| esta en blanco, ¢] CX contiene 00 y el DI contiene la direccién de NAME1+10. COMO TRANSFERIR DATOS CON LODS Y STOS El programa de Ia figura 12-4 ilustra ef uso de ambas instrucciones, LODS y STOS. El ejemplo es semejame al del programa de la figura 10-4, que transfiere caracteres y atributos de manera directa al dea de despliegue de video, excepto que en Ia figura 12-4 contiene estas diferencias , utiliza Ia igina mimero 02, en lugar de Ia O1 STOSW para almacenar caracteres y atributos asociatlos en el area de video, en lugar de esta instruccién y sus dos intrucciones DEC acompafiantes que disminuyen el DI: MOV WORD PTR (VIDAREA + DI“}, at + Enel segmento de datos, define un elemento llamado PROMPT, solicita al usuario “Presionar ‘cualquier tecla ...", para ser utilizada al final del procesamiento, + Al terminar el procesamiento, el procedimiento DIOPROMPT transficre la indicacién definida al drea de despliegue de video. Para este fin, utiliza LODSB para accesar caracteres, uno a la vez, desde PROMPT al AL y utiliza STOSW para transferir cada cardeter y su atributo asociado desde el AX al area de video. CMPS:; COMPARAR CADENAS MPS compara el contenido de una localidad de memoria (direceionada por DS:S1) con el de otra localidad de memoria (direccionada por ES:DI). Dependiendo de la bandera de direccién, CMPS incrementa o disminuye también los registros SI y DI en 1 para bytes, en 2 para palabras y en 4 MPS: Comparar cadenas. TITLE —-PLZORVID (EXE) Exhibicién de video directo “MODEL SMALL VIDSEG SEGMENT AT ORAOM ©; Pagina 2 del Area de video VEDAREA Da 1000 DUP(?7) VIDSEG = ENDS -cODE Becre = PROC FAR. MOV AK,e@data = Direceionamiento mov DS.AK ‘del segmente de datos, Mov AK.VIDSEG =; y del Mov ES.AK + Srea de video ASSUME ES: VIDSEO MOV AM, OFH rPatieidn obtiene INE 0H iy guards PUSH Ax + mode ¥ PUSH Bx i pagina presente OAH, OOH ipaticién f4ja Moy AL,03 i mode 03, despejar pantalle ier 10H mov RH, OSH Peticién fija Moy AL, 02H : pagina 02 eT 10H cant Procesar Grea de exhsbicién cant Mostrar indscacién ai usuario cat Proporcionar para entrada nov TReataurar POP Timere de pagina mov original, INT ror Ax sRestaurar video voy AH, 00H 7 modo (en RL) INT 10H Mov AK,#COGH =; Bair @ DOS mmr 2H BESTH = -ENDP Almacenar cargcter y atributo en frea de video iCardter a mostrar phEribbuto) Hnicie de drea de exhibicien }Caracteres por hilera [Aon Svea de exhibition FRepetir 60 veces rBiguiente atribute rSiguiente cardéeter apo OT, Sanger para siguiente hilera cP AL, Su Meine cardcter a mostrar? mz O20 mo, repetir RET i oat, regresar cLoproc EXD? : tndicacién a usuarie para presionar tecla DIGPROMPT PROC NEAR Mov Gk, 26 iCaracteres » exhibir EBA SI/PROMPT «= jDireccién de le indicacién Figura 12-4 Despliegue directo en video ‘Operaciones con cadenas decaracteres Capitulo 12 Mov BE, aReo PMBicacién en el Srea de exhibicisn Mov AK, GaRE Mieve atributo en AH Daa tose rOargcter en AL sTosW Almacenar en Area de exbibicion LOOP B20 as veren RET Begresar DLOPROMPT ENDP a ,ormpr pac mov Petieién del teelade IST entvada RET suorxer ENDP END (BEGIN Figura 12-48 (continuacién) para palabras. dobles. La operacién establece las banderas AF, CF, OF, PF, SF y ZF. Cuando se combinan con un prefijo REP y una longitud en el CX, de manera sucesiva CMPS puede compa- rar cadenas de cualquier longitud. Peto observe que CMPS proporciona una comparacién alfanumérica, esto es, una compa- acid de acuerdo con los valores ASCII. La operacién no es adecuada para comparaciones algebraicas, que consisten en nuimeros con signo. Considere la comparacién de dos cadenas que contienen JEAN y JOAN. Una comparacién de izquierda a derecha, tiene el resultado siguiente: J) Iguales E:O _ Diferentes (E es menor) A:A — Iguales N:N — Iguales. Una comparacién de los cuatro bytes termina con una comparacién de N con N (iguales). Ahora, ya que los dos nombres no son idénticos, la operaciém debe terminar tan pronto como 1a compa- racidn entre dos caracteres sea diferente, Para este propésito, REP tiene una variacién, REPE (Repite cuando sea igual), que repite la operacin mientras la comparacién entre caracteres sea igual, o hasta que el registro CX sea igual a cero. El cédigo para la comparacién repetida de un byte es REPE CMPSB. La figura 12-5 consta de dos ejemplos que utilizan CMPSB. El primero compara NAMEL con NAME2, que contienen los mismos valores. Por tanto, la operacién CMPSB se realiza con Jos 10 bytes, Al final de la ejecucién, el CX contiene 00, e1 DI contiene la direcciém de NAME2 +10, el SI contiene la direceién de NAME +10, la bandera de signa es positiva y la bandera de cero indica igual 0 cero. EI segundo ejemplo compara NAME2 con NAME3, que contienen valores diferentes. La operacién CMPSB termina después de comparar el primer byte resultando una condicién alta 0 diferente: E] CX contiene 09, el DI contiene la direccién de NAME3+1, cl SI contiene la direccién de NAME2+ 1, la bandera del signo es positiva y la bandera del signo indica diferente El primer ejemplo resulta igual o cero y (sélo por razones de ilustracién) mueve O1 al registro BH. El segundo ejemplo resulta diferente y mueve 02 al registro BL. Si utiliza DEBUG para rastrear las instrucciones, al final de Ia ejecucién verd 0102 en el registro BX. jAdvertencia!: Estos ejemplos ulilizan CMPSB para comparar datos de byte en byte. Inicialice CX en 5, si utiliza CMPSW para comparar datos una palabra a la vez. Pero éste no es el problema. SCAS: Busqueda en cadenas 209 TITLE PA2EMPST (COM) Uso de CHPS para operaciones en cadenas jinn ve peipetpal Hiquierda s defed Hoafelar para 10 bye ;Compare NAME1: MAMEZ no es igual, saltarlo igual, fijar BH a0: iInteiar para 10 bytes Compare NAME2: NAMES > igual, salir } me es 4gual, fijar BL | a0 Moy AK, 4cooH a way Mt iSalir a DOS | Mun ENDP "ND BEGIN | Figura 12-5 Uso de lis operaciones de cadena de caracteres CMPS ‘Cuando compara palabras, CMPSW invierte los bytes. Por ejemplo. compare los nombres SAMUEL y ARNOLD. Para la comparacién inicial de las palabras, én lugar de comparar SA con AR la operacidn compara AS con RA. Asi, en lugar de que el nombre SAMUEL indique un valor mayor, seré menor, ¢ incorrecto. CMPSW funciona de manera correcta s6to si las cadenas comparadas contienen datos numéricos sin signo definido come DW, DD o DQ. SCAS: BOSQUEDA EN CADENAS SCAS difiere de CMPS.en que SCAS busca una cadena por un. valor de byte, palabra o palabra doble especifice. SCAS compara el contenido de la localidad de memoria (direccionsdo por ES:DI) con el contenido del registro AL, AX o EAX. Dependiende de la bandera de direccién, SCAS también incrementa o disminuye el registro Di en 1 para byte, 2 para palabra y 4 para palabra doble Al final de la ejecuci6n, SCAS establece las banderas AF, CF, OF, PF, SF y ZF, Cuando se combina con ¢] prefijo REP'y una longitud en el CX, SCAS puede buscar en cadenas.con cualquier longitud 'SCAS cs util en particular para aplicacin de edicion de texto, en la que el programa tiene que buscar signos de puntuacjén, como puntos, comas y blancos. El cédigo en la figura 12-6 rastrea NAME] por la letra mintiscula ‘m”. La operacién en este caso es REPNE SCASB, ya que la operacién SCASB es para una bisqueda continua, mientras la ‘comparacion no sea igual 0 hasta que CX sea cero, ‘Como NAMEI contiene “Assemblers”, SCASB encuentra una coincidencia en la quinta comparacién, Si utiliza DEBUG para rastrear las instracciones, al final de la ejecucion de Ia 210 Operaciones con cadenas decaracteres Capitulo 12 TITLE PL2ECAST (COM) Operaciones de cadenas con Scas MODEL SMALL. CODE Gag 1008 OMB SHORT MAIN 2 anetpal cu iNeguierda a derechs nov nov sBecudritar *n ten een ues ne oun 51 se encontsé how alsacenar 03 en Ab Hb: wow ar ssalir a Des yarn EDP END Figura 12-6 Uso de la operacion de cadena de caracteres SCASB operacién REP SCASB verd que Ia bandera del cero muestra cero, el CX esté disminuido en 05 y el Dl estd aumentado en 05. (El DI esté incrementado en un byte pasando 1a posicién actual de la ‘m’.) E] programa almacena 03 en el registro AL (por razones ilustrativas) para indicar que se encontré una “m", ‘SCASW busca una palabra en. memoria que coincida con la palabra en el registro AX. Si utiliza LODSW 0 MOV para transferir una palabra al registro AX, el primer byte estaria en el AL y el segundo en el AH. Como SCASW compara los bytes en orden inverso, la comparaci funciona de manera correcta. BUSCAR Y REEMPLAZAR ‘También puede necesitar reemplazar un cardcter especifico con otro cardcter, por ejemplo, para borrar de un documento caracieres de ediciém, como simbolos de pérrafo y de fin de pagina. El siguiente programa parcial busca en STRING un ampersin (4) y lo reemplaza con un blanco. Si SCASB localiza un ampers4n, termina la operacién. En este ejemplo, existe uno en STRING +8, en donde se inserta un blanco, aunque al final SCASB haya incrementado el registro Di a STRING +9, Disininuir el DI-en uno proporciona la direcci6n correcta para insertar el blanco que reemplaza al candcter, El oddigo es el siguiente: STRLEN BQU 15 Hlongitud de STRING staia 08 The timesie now cup iDe isquierda a derecha vow AL,"G? ;Busea el cardcter Cémo duplicar un patron au WOW Cx, STREES stongitud de STRING BRA DI, STRING Direccién de STRING REPKE SCASB Busca oz 20 {Se encontré el cardcter? pee pr ef, ajuste dixeceién NOV BYTE PTR(DI],20H ;Reemplace con un blanco CODIFICACION ALTERNA PARA INSTRUCCIONES DE CADENA DE CARACTERES ‘Como vimos, si codifica de manera explicita con una instruccién. para byte, palabra o palabra doble, como MOVSB, MOVSW 0 MOVSD, cl ensamblador supone la longitud correcta y no necesita operandos. También puede utilizar los formatos bisices de la instruccién para las opera- cciones con cadenas de caracteres. Para instrucciones tales como MOVS, que no tienen sufijo para indicar byte, palabra o palabra doble, debe indicar la longitud de los operandos, Por ejemplo, si FLDA y FLDB estén definidas como byte (DB), la instruccién REP MOVS FULDA; FLDB implica un movimiento repetido del byte que inicia en FLDB al byte que inicia.en FLDA. Si carga los registros DI y SI con las direccienes de FLDA y FLDB, también puede codificar ta instruc- cién MOVS como REP MOVS RE:BYTE PTR (DE) ,DS: [ST] Pocos programas estin codificades de esta manera, y el formato se trata aqui slo para informacion, COMO DUPLICAR UN PATRON La instruceién STOS es ctil para eodificar un drea de scuerds con un valor de byte, palabra 6 bra doble especifico, Sin embargo, para repetir un patron que exceda estas longitudes puede utilizar MOVS con una pequetia modificacién. Digamos que tiene que establecer una linea de des- pliegue al siguiente patrén:, aeenuneees eeRS REESE RS En lugar de definir el patrén de manera repetitiva, slo necesita definir las primeros seis bytes que estin al inicio de la linea de despliegue, Aqui esté In codificacién necesaria: PATTERN DB Ht DISAREA DB 42 DUP(?) 212 Operaciones con cadenas de caracteres Capitulo 12 cup be izquierda a derecha Mov cx,an 191 palabras EEA DI, DISAREA LEA ST, PATTERN pOrigen REP MOVEW pMueve los caracteres En la cjecucién, MOVSW mueve la primer palabra de PATTERN (**) a la primer palabra de DISAREA y después mueve la segunda (*#) y tercer (#i) palabras: seepuRe saan ' i PATTERN DISAREA En este punto, el DI contiene la direcciém de DISAREA+6, y el SI contiene la direccién de PATTERN +6, que también es la direccién de DISAREA. Ahora la operacién duplica de manera automatica ¢ patrén moviendo ia primer palabra de DISAREA a DISAREA+6. DISAREA+2 4 DISAREA +8, DISAREA +4 a DISAREA + 10, y asi sucesivamente, Final, el patrén estd duplicade hasta el final de DISAREA: sun aueeeoney eR 1 1 I PATTER DIEAREASE DISAREASI? — DISAREAS42 Puede utilizar esta técnica para duplicar cualquier atimero de veces un patron. El patron puc- de ser de cualquier longitud, pero debe preceder de manera inmediata al campo destino COMO ALINEAR A LA DERECHA EN LA PANTALLA, I programa de la figura 12-7 ilustra la mayor parte del material descrito en este capitulo. El-proce- dimiento realiza lo siguiente: + BIOINPT acepta un nombre de hasta 30 caracteres de longitud en la patte superior de la pantalla, + DIOSCAS utiliza SCASB para barrer el nombre y evitar cualquier entrada que contenga un asterisco, + EIORGHT utiliza MOVSB para alinear a la derecha de la pantalla cada nombre que es ingresado, uno debajo del otro. La longitud de ACTNLEN en la lista de pardmetros de entrada es utilizada para calcular el cardcter de més a la derecha en el nombre, como sigue: Babe Ruth Mickey Mantle Reggie Jackson + FIOCLNM utiliza STOSW para borrar el campo de entrada del teclado. Cémo alinear ala derecha en la pantalla 213 TITLE —-PAIRIGHT (EXE) Nonbres exhibidos justificados a ia darecha MODEL SMALL STACK 64 DATA MaMEPAR LABEL BYTE Lista de parémetros de nombres wooREN 0B 31 Lengitid mieime ACTMLEN «0B? iMp. de caracteres intraducidos MANEPLD DB 31. DUR(" Nombre PROMPT DH tMane?", 8" MANEDSP DB 31 DUP(! "J, 43, 10, *g* ROW DB OD sectu = PROC. FAR Procedimiento principal MOV AX, edata Iniciar mov DS|Ax } Begmento de datos nov ES AK MOV AX O60oH CALL Loser :Despesar pantalla SUB) DX, Ox SPigar curser ea 00,00 CALL Qz0CURS AnoLooP: CALL BLoINeT iPeticién de dar el nonbre TEST ACTHLEN, OPFH }aNlo hay nombre? (indies fin) vz So iat, agli FALL DLnscas iRecudr iar asterieco oP AL, jade encontré? ce -ALoLOOR igh, saltado cALL EnoRawr hiustitiear nombre a la derecha CALL Flocking ‘Pespejar nowbre Swe -ALoLoor a30 Nov RX, 40D Halix a 008 Iwt 2 Bsorw -FHDP indicacién pare entrada Bioiner pBxhibir indicacién Aceptar entrada BLOINPT . ' Rocudriflar asterisce en nombre Dioscas = PROC ew sEaquierda a derechs MOV Ab, ' 8" iCardcter escudrifiar Mov CK,20 iFijar 30 bytes a escudrifiar LgA DI, NAMEFLD REPNE SCASB 4282 encontré un asterises? ye bag ino, ealir Mov AL, 208 i sf, despejar * en AL pao: RET DLOScAS “ENDP 5 Justifiesr a la derecha y exhibir nombre ELORGHT © PROC Figura 12-7 Justificaci6n a ta derecha en la pantalla 214 name dete B20: ELORGHT Foca FA0eLAM Quoses guoscr Gaacons ozecus s70 Mov cH, 00 Mov CL, ACTNLEN LEA ST, NAMEFLD ADO SICK Dec ost. LEA DE, NAMEDSP+30 REP MOVSB Mov DH, ROW CALL gnécuRS MOV AM Om LEA DX, NANEDSP INT 2 cue Row, 20 AR E20 mc | ROW oHP B80 Mov AX, 0601 CALL guoscH mov DH,ROW Mov DL, 09 CALL Qz0cuRS RET END? Clear nae. proc cup Mov AX, 20208 Woy &x,1s) ERA O1,NAMEDSP REP sTosW RET NDP Seroll acreen: Proc vey BH. 30 Mov Cx,00 Mov DK, L84FH Wr 10k eT NDP sec cureer row/soh BREE Mov AN. o2H Int 16h RET NDP EXD BEGIN Operaciones con cadenas decaracteres Capitulo 12 iizquierda @ derechs. rlengitud en CK para REP Calewlar Ja posicién mia a la derecha Ge] nombre que se ingresa [posicién la derecha de exhibicaén Mover cadena derecha a. ;Pijar cursor jRxhibir nombre Parte inferior de la pantalla? 2 inérementar hilera st. recorrer y ) fijar cursor sIaquierda a derechs sDespejar 15 palabras fija al inicio ‘Atributo’de color 10K 9@ fiJa al inieso Figura 12-7 (continuaciéa) Preguntas 215 PUNTOS CLAVE + Para las instrucciones de cadenas de caracteres MOVS, STOS, CMPS y SCAS, asegiirese de que su programa .EXE inicisliza el registro ES. += Para instrucciones de cadenas, utilice los sufijos B, W o D para manejo de cadenas de byte, palabra o palabra doble, * Ponga en uno {CLD) en cero (STD) la bandera de direccién para la direcci6n necesaria de » Verifique dos veces la Procesamiento, uicializaciém de los registros DI y SI, Por ejemplo, MOVS implica los operandos DI,SI, mientras que CMPS implica los operandos S1,DI. + Iniciatice el registro CX de REP para procesar el mimero necesario de bytes, palabras o palabras dobles. + Para procesamienta normal, utilice REP con MOVS y STOS, y utilice un REP condicional (REPE o REPNE} con CMPS y SCAS. + CMPSW y SCASW invierten los bytes de las palabras que son comparadas. + En donde necesite procesar de derecha a izquierda, tenga cuidado con la direccién ini del campo de byte de la extrema derecha, Por ejemplo, si el campo es NAME) y tiene una Jongitud de 10 bytes, entonces para procesar los bytes, la direccién que carga para LEA es NAME+9, Sin embargo, para procesar palabras In direccién que carga para LEA es NAME-+8 ya que la operacién de cadena de caracteres accesa NAME+8 y NAME+9. PREGUNTAS 12. 12-2. 123. 124. 125. 126, + Las operaciones con cadena de caracteres suponen q Dio SL. Ideruifique estos registros para lo siguieme: Ly 2); (6) SCAS (operando 1). Para operaciones con cadenas usando REP. ;e6mo define el nimera de repeticiones que ocurren? Para operaciones con cadenas usando REP. emo establece el procesamiento de derecha a izquierda’ El capitulo da las instrucciones equivatentes a (a) MOVSB, (b) LODSB y (c) STOSB, cada ania con prefijo REP, Para cada caso, proporcione el cédigo equivaleate para procesamiento de palabras. ‘Corrija el programa de la figura 12-1. Convierta el prograima de formato COM a EXE, y asegirese de ‘micializar el registro ES. Cambie las operaciones MOVSB y MOVSW para mover datos de derecha 2 izquierda. Utilice DEBUG para rastrear los procedimientos y observe ef contenido del segmento de datos ¥ de fos registeas. ‘Utilice lu definicién de datos siguiente y codifique operaciones con cadenas para las partes (3) -(f}: los operandes estin relacionados com los regisiros 1) MOV (operands I y 2); (b)CMPS (operands DATASG SEGHENT PARA CONAME DB "SPACE LAUNCHES, LAUNCHES, INC’ PRLINE DB 20 DUPC' *) {@) Mover CONAME a PRLINE, de izquierda a derecha. (0) Mover CONAME a PRLINE, de derecha a mquierda (©) Cargar el rercer y euarto bytes de CONAME en el AX (d) Almacenar el AX empezando en PRLINE +5, 216 Operaciones con cadenas decaracteres Capitulo 12 te} Comparar CONAME con RLINE (serin diferentes), (0) Rastrear CONAME por un caricter blance y, si se encuentra uno, moverto al Bl 12-7, Corregir el programa de la figura 12-6 de manera que ta operaciin rastree en NAMEI la cadena “er*, Un examen de NAMEI revela que los-caracieres “er” no aparecen como una palabra, como se ‘muestra a continuacién: /As/se//mbfle/rs/, Existen dos posibles soluctones; {a} Utilizar SCASW dos veces, Fl primer SCASW inicia en NAMEL y el segundo SCASW inicia en NAMEI+1 (b) Ubiizar SCASB y, al encontrar una "e", comparar el siguiente byte contra una "#” 12.8, Definie un campo de cuatro bytes con el valor hexadecimal 03040SB4. Urilice MOVSW para duplicar este earapo 20 veces en un rea de 80 bytes y despliegue el resultado CAPITULO 13 Aritmética: I—Procesamiento de datos binarios OBJETIVO para la suma, resta, mult ios. Cubrir los. requ sién de datos INTRODUCCION Este capitulo estudia la suma, resta, multiplicacién y divisién, y el uso de datos con y sin sign. ‘También ofrece muchos ejemplos y advertencias sobre varios errores al viajero inexperto en el reino de los microprocesaderes, El capitulo 14 cubre los requisitos especiales para la conversién entre formato de datos binarios y ASCII ‘Aunque estamos acostumbrados a realizar aritmética en formato decimal (base 10), un microprocesador realiza su aritmética sélo en binario (base 2). Adem, ia limitacién es de regis tros de 16 bits en procesadores anteriores al 0386 exige un tratamiento especial para nimeros grandes. ‘Las instrucciones introducidas en. este capitulo son: ADD Suma SUB Resta MUL —Multiplica sin signo IMUL Multiplica con signe DIV Divide sin signo IDIV Divide con signo CBW Convierte byteen word = NEG Niega 217 218 Ariimética: |~Procesamiento de datos binarios Capitulo 13, SUMA ¥ RESTA, Las instrucciones ADD y SUB realizan sumas y restas sencillas de datos binarios. Como se des- cribio en capftulos anteriores, los mimeros binarios negativos estan representados en la forma de complemento a dos: Invierta todos los bits del mimero positive y sume 1. Los formatos generales para las instrucciones ADD y SUB son: ~ letiqueta:] ADD/SUB —{ registro, registro) fettgqueca:) ADD/suB{menoria, registro} fettqueta:] ADD/SUB —{registro,menoria) lettquera:] ADE/suB {regi stro, innediato) fetiquera:] app/sua —{memoria, inmediato} Como con otras instrucciones, no existen operaciones directas de memoria a memo ejemplo siguiente utiliza el registro AX para sumar WORDA a WORDB: WORDA DW 123, Define WORDA woRDB DM a5 sDefine WORDS Mov At, WOREA iMueve WORDA al AX ADD ct, WORDE Suma WORD a1 AX wow WORDE, aa rMueve AX a WORDD La figura 13-1 proporciona ejemplos de ADD y SUB para el procesamiento de valores en un byte y en una palabra, El procedimiemto BIOADD utiliza ADD para procesar bytes y el procedi- miento CIOSUB utiliza SUB para procesar palabras. Desbordamientos Esté alerta con los desbordamientos en las operaciones aritméticas. Ya que un byte s6lo permite el uso de un bit de signo y siete bits de datos (desde -128 hasta +127), una operacidn aritmética puede exceder con facilidad la capacidad de un registro de un byte. Y una suma en el registro AL que exceda su capacidad puede provocar resultados inesperades. Por ejemplo, suponga que el AL contiene 60H. Entonces la instruccién ‘ADD. AL, 208 genera una suma de 80H en el AL. Como; hemos sumado dos niimeros positivos, esperamos que la suma sea positiva, peco la operacisn pone en. uno la bandera de desbordamiento y la bandera de signo en negativa. La razén? El valor 80H, 0 10000000 binario, es un mimero negative: en lugar de +128 la suma es -128. El problema ex que el registro AL es muy pequefio para la suma, que debe estar en el registro AX completo, como se muestra en la seccidn siguiente. ‘Suma y rest as ‘TITLE PEIADO (COM) Operacienes ADD y suB SHALL “MOBEL icone ORG) 100H BEGIN: IMP SHORT MAIN BYTRA DB aH pDates BYTER DB (40H BYTEC DB 18H woRDA DM = 4000H woros bw = 2000 WORDC Dw = 10008 MAIN BROC NEAR #Provedimiento principal: CALL = B10AbD iDlama a la rutina ADD CALL © C1DaUB lama a la rutina SUB Mov AX, 4couR fsale al bos mr 21 MAIN -ENDP Hjewplos de SUmA (ADD) de byte: BLOADD PROC Mov AL, BYTER Mov BL BYTES ADD AL, BL Registro a registro ADD AL, BYTEC Menoria a registro ADD BYTEA,BL rRagistro a memoria ADD BL, 108 Hinmediate a registro ADD -BYTER, 25H ;inmediato a memoria RET BICADD ENP : Bjemplog de RESTA (SUB) de palabré crosus, Registro de registro Menoria de registro Registro de nenoria HInmediate de registee FInmediato de memoria cnosue, Figura 13-1 Ejemplos del uso de ADD y de SUB Extensién de un mimero en un registro En Ia secci6n anterior vimos cémo al sumar 20H al mimero 60H en el AL provoca una suma incorrecta, Una mejor solucién serfa que el AX representara la suma de manera adecuada. La instruccién para este propdsito es CBW (convierte byle cn palabra), que de forma automé- tica envia el bit de signo del AL (0 0 1) al AH. Observe que el CBW esti restringido para el uso del AX, En el ejemplo siguiente, CBW extiende el signo (0) en el AL al AH, que genera OOS0H en el AX. Después, el cédigo suma 20H al AX (en lugar de al AL) y genera el resultado correcto en el AX:0080H, 0 +128: 220 Aritmética: Procesamiento de datos binarios Capitulo 13, AH AL cow yExtiende el signo de AL al AH 00 60 ADD AK, 20M) Suma al Ae oo ao El resultado numérico en el segundo ejemplo ¢s el mismo, pero la operacion en el AX no lo trata como desbordamiento 0 negative. Aun asi, aunque una palabra complete en el AX permite un bit de signo y 15 bits de datos, el AX est limitado a nimeros desde ~32,768 hasta +32,767 La seccién siguiente examina eémo manejar mimetos que excedan estos limites ARITMETICA CON PALABRAS MULTIPLES Como hemos visto, valores numéricos grandes pueden exceder la capacidad de una palabra, y en realidad se necesita la eapacidad de palabras multiples. Un requisito principal en aritmética de palabras miltiples es el byte y palabra en secuencia inversa. Recuerde que ¢] ensamblador con- vierie de manera automatica el contenido de las palabras numéricas definidas ¢n secuencia inversa de bytes. asi que, por ejemplo, una definicién de O134H se convierte en 3401H. Pero en los valores en palabras dobles, es responsabilidad de wsted definir el par relacionado de palabras en secuencia inversa de palabras. Digamos que un par de palabras dobles es como éste: Hex | 01 23 | Bc 62 | Entonces usted tiene que: definir las palabras en orden inverso: Bw BCE Dw o1zaH Entonces el ensamblador convierte estas definiciones en secuencia inversa de bytes, adecuada para aritmética con palabras dobles: Mex | 62 Be] 23 on | Examinemos das maneras de realizar aritmética de palabras maltiples. La primera es senci- Ha y especifica, mientras que Ia segunda es mas elaborada y general. En la figura 13-2, el procedimiento D1ODWD ilustra la suma de un par de palabras (WORDIA y WORD!B) a un segundo par (WORD2A y WORDZB) y almacena la suma en un tercer par (WORD3A y WORD3B). En efecto, Ia operacia es para sumar los mimeros, tal como lo siguiente: Nimero dniciel: 0125 BCE2H Sumar: 0012 SS3AH Total 0136 119eH A causa de la secuencia inversa de bytes en memoria, el programa define los niimeros con las palabras al reves: BC62 0123 y 553A 0012, respectivamemte. Entonces el ensamblador almacena en la memoria valores de palabras dobles en la secuencia inversa de bytes correcta: Aritmética con palabras mitiples 21 TITLE PLADBADD (COM) Suma de palabras debles MODEL SMALL CODE ORG (10H UMP SHORT MAIN onceae jDatos geE292 Procedimiente principal lama al primes ADD lama al segundo ABO } DLoDwD CALL ELODND MOV AK, 4COOH fale al Dos INT 2H $ Ejenplo de SUMA (ADD) de palabras deblea: MOY AX, MORDIA ;Suma la palabra de extrema izquierds ADD AX, WORDZA Mov AX, NORDLE :Suma 1a palabra de extrema derecha mov = WORDS, A DLOOWD ENDP Operacion de suma generalizada. BiouMD PROC auc’ ;pone en cero 1a bandera de acarreo Mey cx,a2 [Degigna el contador del ciclo | LEAR ST; WORDLA slapra de 1a izquierda j LER DE /WORDIA [Palabra de Ia izquierda CEA BK; WORDIA [palabra de la izquierda de la suns mov Ax, [St] eve a palabra al AX apc AX, EE] yuma con acarreo al AX mov Tek] AX dmacena la palabra mc | AT [Ajusta lap direcciones para iwc St Pls siguiente palabra de la derecha Isc DT IEC DT | mc BK | | tre BK | ocr B20 sRepite para le palabra siguiente | RET BL0DKD ENDP END BEGIN Figura 13-2 Suma de palabras mdltiples WORDIA y WORDIB; — ¢2BC 2302 WORDIA y WORDIB: GASES 1200 El primer procedimiento suma WORD2A a WORDIA en el AX (em realidatt son las partes de bajo orden) y almacena la suma en WORD3A. A continuacién suma WORD2B a WORDIB (las partes de orden superior) en el AX, junto con el scarreo de 1a suma anterior. Después almacena 1s ‘Afitmética: |—Procesamiente de‘dates binarios Capitulo 13, suma en WORD3B, Examinemos las operaciones en detalle. El primer MOV y la operacién ADD invievten los bytes en el AX y suman Ins palabras de la extrema izquierda: WORDIA: Bcs2H Fatal: (1)219CH (91a ee almacenade en WoRDIA) Ya que la suma de WORDIA mas WORD?A excede la capacidad del AX, ocurre un acarreo y la bandera de acarreo es puesta en uno. Ahora, el ejemplo suma las palabras de la derecha, pero esta vez utilizando ADC (sumar con acarreo) en lugar de ADD, ADC suma los dos mimeros y ya que la bandera de acarreo est en uno, suma uno a la suma: WORD 1B: o1zaH WOREZE: soonze Masel acarres: + iH Total. O136H (36014 28 almacenade en WORDIB! Por medio de DEBUG rastree la aritmética: puede ver Ia suma 0136H en el AX y los valores en orden inverso 9C1L1H en WORDSA y 360] H en WORD3B ‘También en la figura 13-2, el procedimiento mAs elaborado E10DWD proporciona un enfo- que para sumar ndmeros de cualquier longitud aunque aqui, como antes, se sama la misma pareja de palabras WORD1A:WORDIB y WORD2A:WORD2B. El procedimiento wiliza el SI, DI y BX como registros base para las direcciones de WORDLA, WORD2A y WORDSA, respectiva- mente. Se realiza una iterackin a través de las instrucciones por cada par de palabras que se suman en este caso, dos veces. El primer ciclo suma las palabras de la extrema izquierda, ¥y el segundo summa las de la extrema derecha, Ya que el segundo ciclo es para procesar las palabras de la derecha, Ins direcciones en los registros SI, DI y BX se incrementan en 2. Para cada registro, dos instrucciones INC realizan esta operacién. Se emplea INC (en lugar de ADD) por una buena razén: ta instruc- cin reg,02 limpiaria la bandera de acarreo y causaria una respuesta incorrecta, mientras que INC no afecta la bandera de acarreo. A causa del ciclo, s6lo existe una instruccién ADC. Al inicio, una instruccién CLC (pone encero el acarreo) asegura que la bandera de acarreo esté inicialmente-en cero, Para hacer que ¢si¢ método funcione, asegirese de (1) definir palabras adyacentes una de otra, (2) procesar palabras de izquierda a derecha y (3) inicializar el CX al mimero de palabras que serén sumadas. Para resta de miiltiples palabras, la instruccién equivalente a ADC es SBB (restar con prés- tamo), En el procedimiento E10DWD, sélo reemplace ADC con SBB ‘Aritmética en registros de 32 bits El 80386 y procesadores posteriores proveen registros de 32 bits para aritmética con palabras dobles. Por ejemplo, para sumar el EBX al EAX sclo codifique ADD BAX, EBX ;registros de 32 bite Puede sumar palabras cuddruples uilizando la técnica estudiada antes para sumar palabras multiples. Datos con signe y sin signo 223 DATOS CON SIGNO Y SIN SIGNO Algunos campos mimericos carecen de signo; por ejemplo, un mimero de cliente y una direccién de memoria. Otros campos numéricos pueden tener mimeros positivos o negativos; por ejemplo, el saldo de un cliente y un mimero algebraico, Y otros campos numéricos con signo —por ejem- plo, el sueldo de un empleado, el dia del mes y el valor de pi— se supone que siempre son positives. Para datos sin signo, todos los bits tienen el propésito de ser bits de datos; de aqui que, en lugar de un maximo de 32,767, un registro de 16 bits puede contener 65,535. Para datos con signo, el bit de la extrema izquierda es un bit de signa, Pero observe que las instrucciones ADD y SUB no distinguen ente datos con y sin signo: en realidad, s6lo suman y restan bits. El ejemplo siguiente ilustra la suma de dos mimeros binarios, con los valores tomados sin signo, primero, y después con signo. El mimero de arriba tiene un bit en I a la izquierda; para datos sin signo, los bits representan 249, mientras que para dates con signo los bits representan ~7. La suma no pone ‘en uno las banderas de acarreo ni de desbordamaiento: DECIMAL DECIMAL, BINARIO = SINSIGNO.«CONSIGNO. «OF» CF auanieo1 20 7 +o0009019 #2 cre aaanz0a3 aaa “ Cr) El resultado binario de la suma en este ejemplo es el mismo tanto para datos con signo como datos sin Signo. Sin embargo, los bits en el campo sin signe representan el 21 decimal, mientras que Jos bits en el campo con signo representan cl 5 decimal, En realidad, el contenido de un campo significa cualquier cosa que usted quicra que signifique. Aritmética con acarreo- Una operacién aritmética que causa un acarreo externo (hacia afvera) del bit de signo también pone en uno la bandera de acarreo. Si ocurre un acarreo en datos sin signo, cl resultado no es ‘ilido. E! ejemplo siguiente de una suma provaca un acarreo: DECIMAL = DECIMAL BINARIO SINSIGNO CON SIGNO OF CF sunit100 252 “4 soao00103 +s “ (ayoanoooe, z 7 oon ino valide) (valider La operacia sobre los datos sin signo-no es valida a causa del acarreo externo-de un bit de datos, mientras que la operacién en datos con signa es valida. Desbordamiento aritmético Una operacién aritmética pone en uno la bandera de desbordamiento cuando se tiene un acarreo hacia el bit de signo (acarreo interno) y no s¢ tiene un acarreo hacia afuera, o bien ocurre un acarteo externo sin acarreo interno, En donde ocurra un desbordamiento en datos con signo, el resultado ¢5 no vélide (a causa de un desbordamiento en ¢l bit dé signo), como lo muestra este ‘ejemplo: 224 Aritmética: |—Procasamienio de datos binarios Capitulo 13, DECIMAL == DECIMAL BINARIO SINSIGNO CONSIGNO OF CF onaa2003, an na soeao1021 + 2 ot 1oanorae 132 viz roo (vélideh tne valado) Una suma puede poner en uno las dos banderas, la de acarreo-y la de desbordamiento. En el ejemplo siguiente, el acarren hace que la operacién sin signa sea no vélida, y asi mismo el des- bordamiento hace que la operacién con signo sea no valida: DECIMAL DECIMAL BINARIO SINSIGNO CONSIGNO OF CF aaaao110 246 - a +10002002, ange te (ayoraaaiia a +7 toa ine valido} ine valide) El resultado de todo esto es que tsted debe tener una buena idea de cufl es a magnitud de los riimeros que su programa procesari, y debe definir el amaito de los campos de acuerda con esta MULTIPLICACION Para la multiplicacion, 1a instruceién MUL maneja datos sin signo y la instruccin IMUL (imulti- plicacién entera) maneja datos con sign. Ambas instrucciones afectan las handeras de acarreo y de desbordamicnto, Como programador, usted tiene ¢l control sobre cl formato de los datos que procesa, y tiene la responsabilidad de seleccionar la instruccién de multiplicacién apropiada. El formato general para MUL e IMUL es. (atiqwetas | wou/awo [rasistee/eenaris | Las operaciones de multiplicacién basicas son byte por byte, palabra por palabra y (para el 80386 ¥ procesadores posteriores) palabras dobles por palabras dobles. Byte por byte Para multiplicar dos ndmeros de un byte, el multiplicando esté en el registro AL y el multipticador ¢5 un byte en memoria o en otro registro. Para la instruccién MUL DL. la operacién multiplica el contenido del AL por el contenido del DL. El producto generado esti en el registro AX. La ‘operacién ignora y borra cualquier informacién que pueda estar en el AH. AH AL Antes de multiples Multipicando AX Desputs de makiplicar: | Prod LSPs —> | Muttipticacién 225 Palabra por palabra Para multiplicar dos nimeros de una palabra, ¢1 multiplicando esté en el registro AX y el multi- plicando es una palabra en memoria oen otro registro. Para la instruccién MUL DX, la operaciGn multiplica el eontenide del AX por el contenido del DX. El producto generado es una palabra doble que necesita des registros: la parte de orden alto (més a la izquierda) en el DX y la parte de orden bajo (mas a 1a derecha) en ef AX. La operacién ignora y borra cualquier informacién que pueda estar en el DX. Dx Ax {__"*__y Antes de multiplicar: “gparado Muliplicando Después de ruttiplicar: | Parte alta de producto Palabra doble por palabra doble Para multiplicar dos mimeros de palabras dobles, el multiplicanda esté en ef registra EAX y el licador es una palabra doble en memoria o en otro registro. El producto es generado en el par EDX:EAX. La operacién ignora y borra cualquier informacién que ya esté en el EDX. EDX BAX Anies de roultipbicar: Tgnorade. Desputs le nultiplicer i alta de preducwo | Parte baja de producto Tamafio de campo El operando de MUL 0 IMUL sélo hace referencia al multiplicador, que determina el tamatio de! campo, En los ejemplos siguientes, el multiplicador esté en un registro, el cual especifica el tipo de operacién: INSTRUCCIGN MULTIPLICADOR = MULTIPLICANDO PRODUCTO. vo. cu byte at ax van Bx palabra a brat vn ex palabra doble ex eo at En los ejemplos siguientes, los muhtiplicadores estén definides en memoria: BYTE: 0B? worpa OK? DwoRDL 0D? OPERACION MULTIPLICADOR MULTIPLICANDO PRODUCTO ub BYTE, BYTRL aL aK MUL WORD worpa aa xa MUL pwoRDL WORD mAK DK FAX 226 Avitmética: |—Procesamiento de datos binaries Capitulo 13 Multiplicacién sin signa: MUL, El objetivo de la instruccién MUL es multiplicar datos sin signo, En la figura 13-3, CIOMUL da tres ejemplos del uso de MUL: byte por byte, palabra per palabra y palabra doble por palabra doble. El primer ejemplo multiplica 80H (128) por 40H (64). El producto en el AX ¢s 2000H (8,192). El segunda ejemplo genera 1000 O000H en los registros DX:AX. El tercer ejempla maltiplica una palabra por un byte y necesita extender BYTE! a una palabra, Ya que los niimeros se suponen sin signo, el ejemplo supone que los bits en el registro AH son cero. (Aqui el problema con el usa de CBW es que el bit de la extrema izquierda del AL. podria ser uno, y la propagacién de bits uno en el AH gencraria en un numero sin. signo mayor.) El producto en el DX:AX es 0040 0000H. ‘Multipticacién con signo: IMUL El objetivo de la instruccién IMUL (multiplicacién entera) es multiplicar datos con signo. Ea la figura 13-3, DIOIMUL da los mismos tres ejemplos que CIOMUL, pero reemplaza MUL con IMUL. El primer ejemplo multiplica 80H (un mimero negative) por 40H (un ndmeco positive), El producto en el registro AX es BOOOH. Usando los mismos datos, MUL genera un producto de 20001, asi que puede ver Ia diferencia entre el uso de MUL y de IMUL. MUL trata 80H como +128, mientras que IMUL lo trata como 128. El producto de —128 por +64 es -8192H, que es igual a EOQOH, (Intente convirtiendo ED0QH a bits, invierta los bits, sume 1 ¥ sume los valores de fs bits.) El segundo ejemplo multiplica 8000H (un nimero negative) por 2000H (un mimero positi- vo), El producto en e] DX:AX es F000 O000H, que es el negativo del producto generado. por MUL. Ei tercer ejemplo extiende BYTE! 8 una palabra en el AX. Ya que los niimeros se suponen con signo, el ejemplo utiliza CBW para extender el bit del signo de la extrema izquierda en el registro AH: 80H en el AL se convierte en FF80H en el AX. Ya que el multiplicador, WORD!, también es negativo, el producto debe ser positive. Y en realidad ast es: 0040 OO00H en el DX:AX, el mismo resultado que MUL, que multiplicé dos mimeros sin signo. En efecto, si el multiplicande y el multiplicador tienen el bit del mismo signo, IMUL y MUL generan el mismo producto. Pero si ¢l multiplicando y el multiplicador tienen bits de signos diferentes, MUL produce un producto positive e IMUL produce un producto negative. El resulta- do €8 que su programa debe conocer el formato de los datos’ utilizar las instrucciones apropiadas. Puede encontrar itil usar DEBUG para rastrear estos ejemplos. MULTIPLICACIGON DE PALABRAS MULTIPLES La muttiplicacién convencional consiste en la multiplicacién byte por byte, palabra por palabra, 0 bien, palabra doble por palabra doble, Come ya se ha viso, cl niimero maximo con signo ec. una palabra cs +32,767. La multiplicacién de nimeros mayores en procesadores anteriores al 80386 exige pasos adicionales. El enfoque en estos procesadores ¢s multiplicar cada palabra por separa- do-y después sumar cada producto. El ejemplo siguiente multiplica wn ndmero decimal de cuatro digitos por tin némero de dos digitos: Multipicacién de palabras mattiples TITLE PL2MULT (COM) Operaciones MUL = IMUL sMQDEL SMALL icone cag 200m BEGIN: GMP © SHORT MAIN ByTeL 0B BOW BYTEZ DB 40H WORD DW = BOGOH WoRD2 DW © 2000H Peoc NEAR :Procedimiento principal CALL cloWL shlama a la rutina MOL CALL DLonNUL. sLlana & la rutina MUL Moy’ AK, 4CoOK rBale al DOS INT 2a MAIN -ENDP. Bjemplos de MUL Crow, PROC MOV AL, BYTEL iByte por byte woL BYTE2 1 producto en AX Mov AX, WORDL sPalabra por palabra MUL = WORD? ) @l producto en DK:Ax Mov AL, BYTEL shyte Ror palabra | sup AH, AHL } sxtiende #1 multiplicando en Al MUL = WORDL + el producto queda en DX:AK RET CLOMOL ENDP 1 Ejemplos de TMU DIOTHUL PROC Mov AL, BYTE2 iByte por byte TMUL BYTE2 1 ‘el preducte en ae oy At, WORDS jalabra por palabra wut woRD2 el preducte en DHLAX Mov AL, BYTEI mayte por palabra com } extiende el multiplicando en AK MUL woRDL i @] producto queda en Di:AX RET DioIML ENDP {Qué pasa si usted sélo puede multiplicar nimeros de dos digitos? Entonces podria multiplicar por ‘Figura 13-3. Multiplicacién con signo y sin signe 1,365 x 12 16,380 separado el 13 y el 65 por 12, como: 13 65 x 12 x 12 156 780 Avitmética: Procesamiento da dates binarios Capitulo 13 Y después sumar los dos productos; pero recuerde, ya que el 13 son los cientos, su producto en realidad ex 15,600: (13 & 12 x 100) (65 x 12) ‘Un programa en ensamblador puede usar esta misma técnica, salvo que los datos consisten de palabras (cuatro digitos) en formato hexadecimal. Examinemos ahora los requisitos para mul- liplicar una palabra doble por una palabra y una palabra doble por wna palabra doble. Palabra doble por palabra En Ia figura 13-4, EIOXMUL multiplica una palabra doble por una palabra. El multiplicando MULTCND, consiste en dos palabras con 3206H y 2521H, respéctivamente, La raz6n de definir dos DW (palabras) en lugar de una DD (palabra doble) es para facilitar el direccionamiento para las instrucciones MOV que mueven palabras al registro AX. Los niimeros estin definidos en secuencia inversa de palabra, y ¢l ensamblador almacena cada palabra en secuencia inversa de byte. Asf MULTCND, que tiene un valor definido de 32062521H, es almacenado como 21250632H. TITLE —-PLADWMUL, (COM) Multiplicacién de palabras dobles *MODEL SMALL cope ORG 1008 BEGIN: © IMP SHORT MAT MULTND Dw 28218 jDatos Da 3206 MULTPER DM = OAQ6HL Da 5800 pRowuctT oH OO DW Dy oo ware PROC NEAR 1Procedimiento principal CALL FLoxMU, fElama a la primera multiplicacién CALL | 210ZERO Hiepia el producto CALL PLOXMUL Holema ela segunda multiplicacién Mov Ax, acoat }Sale al Sos er 2H Mare END? t Palabra doble alabra EioxMuL PROC Ax, MULTEND sMultiplica la palabra de 1a izquierda MOLTELR42 F det multipiicando PRODUCT, AX iAlmacena el producto: PRODUCT=2.Ox AX, MULTEND+Z Multiplica 1a palabra de la devecha MULTE ‘dei multiplicands PRODUGT+ 2 , aut pSuna el predueto alsacenade RODOGT+ SRRERE S558 ELOXMUL Figura 13-4 Multiplicacin de palabras multiples Multiplicacién de palabras multiples 229 : Palabra doble por palabra doble FLowML PROC OV AX, MULTCHD sPalabra uno dei multiplicands por MOL = MULTPLR } palabra uno del multiplicador MOV PRODUCT+0, ax inimacena el producto MOV PRODUCT+2, DK wov Ax, MuiTeND :Palabya uno del multiplicando por me MULTPLR+2 } palabea dos del multiplicador ADD PRODUCT+2,AK 2Suma al producto almecenado Apc) PRODUCT 4, Dx ADC PRODUCT+6, 09 s8uma con acarres ov AK, MULTCND+2 sPalabra dos dei multipiicande por wo MUL TPL palabra uno del multiplicador ADD PRODUCT +2, AX ieuma al producto almacenado ADC BRODUCT+4 DE ADC BRODUCT+€/ 09 :Suma con acarreo Mov AX, MULTewD+2 ;Palabra dos del multiplicando por MUL MULITPLte2 ‘palabra dos del muitiplicador ADD PRODUCT 4, ax }Suma al producto ADC PRODUCT.6 Dx ker FLOMUL — ENDP 3 Limpia el area del producto: ziozero "proc Mov PRODUCT, cone stimpia las palabras MOV PRODUCT+2,0000 ©; de inguierda a derecha MOV PRODUCT+4,0900, Mov PRODUCT+5,0900 rer 2L0ZERO ENDP END BEGIN Figura 13-48 (continuacién) E] moltiplicador, MULTPLR+2, contiene 6400H. El campo 1 producto generado, PRODUCT, mantiene tres palabras. La primera operacién MUL multiplica MULTPLR +2 y la palabra izquierda de MULTCND; ¢l producto es E80 ES00H hexadecimal, almacenado en PRODUCT +2 y PRODUCT+4, El segundo MUL multiplica MULTPLR +2 y la palabra dere- cha de MULTCND; ¢l producto es 138A 5800H. Enionces, la rutina suma los dos productos asi: Producto 4 eco © Oso OD Producto 2, «138K 5800 Total 138A 6680 EMCO (Come el primer ADD puede provocar un acarreo, Ia segunda suma es ADC (suma eon acarreo) ‘Ya que los datos auméricos estan almacenados en formato inverso de bytes, PRODUCT cn re idad contiene OOE4 8066 8A13. La rutina necesita que la primer palabra de PRODUCT al p cipio contenga cero, Palabra doble por palabra doble La multiplicacién de dos palabras dobles en procesadores ante multiplicaciones; 230 Aritmética: |—Procesamiento de datos binarios Capitulo 13 MULTIPLICANDO ‘MULTIPLICADOR palabra2 x palabra 2 palabra 2 « palabra 1 palabra 1 x palabra 2 palabra 1 x palabra | Se suma cada producto en el DX y AX para la palabra apropiada en el producto final. En la figura 13-4, FIOXMUL da un ejemplo, MULTCND contiene 3206 252]H, MULTPLR contiene 6400, 0A26H y PRODUCT mantiene cuatro palabras. Aunque la logica €s semejante a la multiplicacién de una palabra doble por una palabra, este problema necesita una caracteristiea adicional. Después de la pareja ADD/ADC esta otra ADC qué suma cero 4 PRODUCT. El primer ADC puede provocar un acarreo, que instrucciones siguientes limpiarfan. Por lo tamo, el segundo ADC suma cero si no hay acarreo y uno si existe alguno, La dtima pareja ADD/ADC no necesita un ADC adicional: Ya que PRODUCT es sufi- cientemente- grande para la respuesta final gencrada, no cxiste acarreo. El producto final es 138A 687C SESC CCES, almacenado en PRODUCT con los bytes invertidos. Trate de usar DEBUG para rastrear este ejemplo. INSTRUCCIONES ESPECIALES DE MULTIPLICACION 1 80286 y procesadores posteriores tienen formatos adicionales para IMUL que proporcionan operandos inmediatos y permiten generar productos en registros distintos del AX. Puede utilizar estas instrucciones para muliplicar datos con y sin signo, ya que los resultados son los mismos. Todos los rrimeros deben tener ia misma longitud: 16 0, para el 80386 y provesadores posterio- res, 32 bits, Operaciéa IMUL en 16 bits Para el IMUL en 16 bits el primer operando (un registro) contiene el multiplicande y el segundo operando (un niimero inmediato) es el multiplicador. El producto es generado en el primer ope- rando. Un producio que excede el registro causa que las banderas de acarreo y de desbordamiento se pongan en uno. El formato general para esia operacién de IMUL de 16 bits es fetiqueca:} | m4uL Operactén IMUL en 32 bits EI IMUL en 32 bits tiene tres operandos: ef segundo operando (memoria) contiene ¢! multiplican- doy el tercer operando (un nimero inmediato) contiene el multiplicador. El proxucto es generado en el primer operando (un registro), El formato general para el IMUL de 32 bits €s ¥0,dunediato] Tetiqueta:) | twOL| registro, memoria, inmediato | Operacién IMUL en 16/32 bits E] 80386 y procesadores posteriores proporcionan otro formato IMUL para las operaciones de 16 9 32 bits. El primer operando (un registro) contiene el multiplicande y el segundo operando (wegisiro/memoria) contiene el multiplicador. El producto ¢s. generado en el primer operando. Multipicacién por cortimiento 231 [Tetiquetas iWul [ registro, {zagtstroymemoria) | He aqu{ ejemplos de estas tres instrucciones IMUL: Muleiplicands Multiplicador Prexiucto Lei MR: IML BK, 28 aK 8 oa Yo-bic TM, IML BCE, MOLTCAND,25 MULTCAND 25 ex 6st IMG, MUL BX,CH CI e Bt MULTIPLICACION POR CORRIMIENTO Para multiplicar por una potencia de 2 (2, 4, 8, etc.) es més eficiente sélo correr el nimero necesario de bits a la izquierda. Para el 8088/8086, un corrimiento mayor a uno necesita que cargue el mimero de corrimientos en el registro CL.. En los ejemplos siguientes, el multiplicande esta en el AX: Multiplicar por 2 (un corrimiento a la izquierda): SHL AX,O1 Muttipticar por 8 (tres corrimientos a la izquierda): MOW CL,03 ;8088/8086 SHL AX,CL Muhtiplicar por 8 (tres corrimientos a la izquierda): SHL AX.03 :80286 y posteriores Corrimiento en los registros DX:AX ‘La rutina siguiente puede ser util para obtener un producto por corrimientos a la izquierda en los registros DX:AX. Puede idear un método mas eficiente, pero este ejemplo ¢s. generalizado a cualquier nimero de ciclos (y corrimientos) en el CX. Observe que un bit 1 earrido fuera del registro entra a la bandera de acarteo, Ia cual es utilizada por RCL: MOV €x,04 : Indcialiga para cuatro cicios 20: SHU AX,0L —-:Corrimiento del ax RCL DK, 02 Loop 20 El método siguiente para corrimientos a la izquierda necesita de un 80286 0 procesador posterior y no requiere: de ciclos. Aunque ¢s especffico para un corrimiento de cuatro bits, puede ser adaptado a otres. valores: SH DX, 04 —;Corrimfento del DX 4 bits a la inquierda ov BLAH ;Allsacena el AH ea el BL SHL -AX,O4 —;Corrimfenta del AK 4 bits 4 le ieguierds SUR -BL,O4—pCoxrimiente del Bb 4 bits 4 la derecha oR «DL, BL = -Ingerta el BL 4 bite en el DL 282 Aritmética: [Procesamiento de dates binarias Capitulo 13 DIVISION Para la divisién, la instruceién DIV (dividir) maneja datos sin signo y la IDIV (divisidn entera) mancja datos con signo. Usted es responsable de scleccionar la instruccién apropiada. El formato general para DIV/IDIV es Las operaciones de divisién basicas son palabra entre byte, palabra doble entre palabra y (para 80386 y posteriores) palabra cuddruple entre palabra doble. Palabra entre byte ‘Aqul, el dividendo esti en el AX y el divisor es un byte en memoria 0 en otro registro. Después de la division, e1 residuo esta en cl AH y el cociente esti en el AL. Ya que un cociente de un byte €s muy pequefio —si es sin signo, un méximo de +255 (FFH) y con signa +127 (7FH)— esta operacién tiene un uso limitado. ‘Antes de la divisia: AX Despats de ta divisién an aL Residua | Cocienwe Palabra doble entre palabra Para esta operacién, el dividendo estd en el par DX:AX y el divisor es una palabra en memoria.o en otro registro. Después de la divisidn, el residuo esté en el DX y el cociente esté en el AX. El ccaciente de una palabra permite para datos sin signo un méximo de +32,767 (FFFFH) y con signo +16,383 (7FFFH). Tenemos: ‘Abites de la divs: Parte alta del dividendo | | Parte baja del dividendo. Residue Cocteme Después de In divs: Palabra cuddruple entre palabra doble Al dividir una palabra cuédruple entre una palabra doble, el dividendo est en ¢l par EDX:EAX y el divisor esté en una palabra doble en memoria o en otro registro. Después de la divisién, el residuo esta en el EDX y el coviente en el FAX. Ames de la divisign: Dx [ AX _*__| ‘actaaivision; | PAT© alta del dividers | [Parte baja del dividendo. Residoo | |___—Caciente Division ‘Tamatios del campo El operando de DIV 0 de IDIV hace referencia al divisor, que especifica el tamafio del campo. En os ejemplos siguientes de DIV, los divisores estin en un regisiro, que determina el tipo de ope- racion: OPERACION ——DIVISOR: DIVIDENDO GOCIENTE RESIDUO DIvcL byte at AL at DIVCx palabra DEAK Bx ox DIV EBX palabra doble | EDY-EAX AK, ex En los ejemplos siguientes de DIV, los divisores estin definides en memoria: BYTE: 0B 7 worn. Dw ? pwonD1 0D > DIVISOR —-DIVIDENDO.«COCIENTE = RESIDUO piv BYTBI BYTE a a ait piv woRDI worDt Dasax ae x Div DWORDS.«sDWORDL. «= EDEVEAX = BAX ED Residuo. Si divide 13 entre 3, et resultado -es 4} , donde el cociente es 4 y el residuo es 1 Note que una calculadora (y un lenguaje de programacidn de alto nivel) enviarfa como cociente 4.333... que consiste en una parte entera (4) y una parte fraccionaria (.333...). Los mimeros 4y 333 son fracciones, mientras que 1 es un residuo Divisién sin signo: DIV El objetivo de la operacin DIV es dividir datos sin signo, La figura 13-5 da cuatro ejemplos de DIV en el procedimiemo DIODIV: una palabra entre un byte, un byte entre un byte, una palabra doble entre una palabra y una palabra entre una palabra. El primer ejemplo divide 2000H (8092) entre 80H (128), El residuo en el AH es OOH y el cociente en el AL es 40H (64). El segundo ejemplo necesita extender BYTE! a una palabra. Como el valor'se supone sin ssigno, el ejemplo supone que los bits en el registro AH son cero. El resido en el AH ¢s 12H y et cociente en ef AL es OSH. En el tercer ejemplo, el residuo en el DX es 1000H y el cociente en el AX es OOOH. El cuarto ejemplo necesita extender WORD! a una palabra doble en el registro DX. Des- pués de Ia divisién, el residua en el DX es OOOOH y el cociente en el AX es 0002H. Divisién con signo: IDIV El objetive de la instruccidn IDIV es dividir datos con signo. En la figura 13-3, ELOIDIV da los mismos cuatro ejemplos que DIODIV, pero reemplazando DIV con IDIV. El primer ejemplo divide 2000H (positivo) entre 80H (negativo). El residuo-en el AH es OOH, y el cociente en el AL 5 COH (64) . (Con los mismos datos, DIV dio como resultado un cociente de: +64.) Aritmética: Procesamiento de datos binaries Capitulo 13, ‘TITLE PLSDIV (COM) Operaciones DIV @ IDIV “MODEL | SMALL CODE oR 00H BEGIN: IMP SHORT MAIN , BYTE, DB 80H Dates BYTES 0B lex MORDi OM 20008 WORD? DW O10 WORDS DW 10008 bata PROC NEAR :Procedimiente principal CALL DLoprv vbdama ala rutina DIV CALL FLOIDIY vblana ala rutina IDIV mov AK.ACOOH isale al pos wr ai MAIN BNDP. Ejemplos de DIV Bropry pace NON aac, WORDS Palabia / byte Drv BYTE residuo:cociente en AH:AL | Nov AL, BYTE Byte / byte SUB ALAR extiende el dividendo en DX:Ax Iv BYTES Tesidve cociente en AH;AL mov Dx, WoRDZ alabra doble / palabra ov AK; WORDS dividendo en bi Drv woaDR yesiduo:cociente #n OX:AX mov AX, WoRDD Patabra / palabr: sup DK. x extiende ef dividendo en Dx Drv Woks Fesidua cociente en OX.AX RET BioDry NDF | i Ejenplos de 1D1v | Eom } MOV) Ax, WORDL Labra / byte apiv ByTEL i_ residue eociente en ANVAL mov) AL, BYTEL yee / byce cow pextiende el dividendo en A IBIV BYTES f Fesiduo'cociente en ANAL [Palabra doble / palabra Mov Dx, WORDZ [dividends en DKA MOV AK, WORD J. wesiduo:cociente en DXsAx Tory Wok wo, WORDS sPalabra / palabra om } extiende cl dividendo en ox IDTV woRDS j Feeiduo:ecesente en DX:AK RET morDIv EXDP END BEGIN Figura 13$ Divisién con signe y sin signo ‘Los resultados en hexadecimal de los tres ejemplos restantes de [DIV son: EJEMPLO DEIDIV — RESIDUO COCIENTE 2 FE (-18) FR (-5) a 1000 (4086) 0080 E128) ‘ coon oooz Division 235 Sélo el cvarto ejemplo da el mismo resultado que el que dio DIV, En efecto, si el dividendo y et divisor tienen el mismo bit de signo, DIV e IDIV generan el mismo resultado, Pero si el dividendo y el divisor tienen bits de signo diferentes, DIV genera un cociente positive, mientras que IDIV genera un cociente negativo Puede encontrar til usar DEBUG para rastrear estos ejemplos. Desboradamientos ¢ interrupciones Las operaciones DIV € IDTV suponen que el cociente es mucho menor que el dividendo original Como consecuencia, la operaciin puede causar con facitidad un desbordamiento; cuando lo hace, ocurre una interrupeién con resultados impredecibles, La divisién entre.cero siempre provoca una izquierdo (AH) del di si el divisor es una palabra, su contenido debe ser mayor que la palabra izquicrda (DX) del dividendo; si el divisor es una palabra doble, su contenido debe ser mayor que la palabra doble izquierda (EDX) del dividendo, Veamos un ejemplo. que utiliza I como divisor, aunque también pueden servir otras cifras: LA OPERACION DIVIDE DIVIDENDO © DIVISOR = COCIENTE Palabra entre byte: 0123 o1 a3 Palabra doble entre palabra: 0001 4026 0001 = (14026 En ambos casos, el cociente generado excederia su espacio disponible, Puede ser prudente incluit una prueba antes de las operaciones DIV 0 IDIV, como se muestra en los dos ejemplos siguientes. Enel primero, DIVBYTE es un divisor de un byte, y el dividendo ya esta en cl AX: cup AM DrvaYTS ;Compara 1 AH con el divisor THB Autina-deabordaniento Si ne es menor sala ory DIverTE ;Ptvide una palabra entre un byte En el segundo ejemplo, DIVWORD es un divisor de una palabra y el dividendo estd en el DX:AX. MP DK, DIVWORD Compara €1 DX con el divisor ONS Rutina-deshordasiento Si no es menor walta piv prvwoRD Divide una palabra DOBLE entre una palabra Para IDIV, la logica debe tener en cuenta que el dividendo o el divisor pueden ser negalivos. ‘Ya que el valor absoluto de! divisor debe ser el menor de los dos, puede utilizar la instruccién NEG para convertir temporalmente un niimero negativo én positivo y después de la division restau- rar ef signo, Divisién por medio de restas Si un cociente es demasiado grande para el divisor, puede realizar la divisién por medio de restas sucesivas. Esto es, restar el divisor del dividendo, incrementar en uno el cociente y continuar 236 ‘Aritmética: |—Procesamiento de datos binarios Capitulo 13. restando hasta que el dividendo sea menor que el divisor. En el ejemplo siguiente, el dividenda esté en el AX, el divisor est cn el BX y el cociente se desarrolla en el CX: ste Cx,Ce © rtnicia ell cociente en cero C20: OMB OAK, BK 8H dividendo « divisor, meena } entence salir SUE AX,BX ;Rastar el divisor del dividends ie cx iSumar uno al coctente mp 20 rReperir cao: RET 1B cociente esta en CX, #1 residue en AK Al final de la rutina, el CX contiene el cociente y el AX, el residuo. Con toda intenciéa el ejemplo es muy simple para demostrar s6lo 1a técnica. Si el cocieme estd en la pareja DX:AX, incluya estas dos operaciones: 1, En C20, comparar AX con BX s6lo si DX es cero. 2. Después de la instruccién SUB, insertar SBB DX.00. Observe que un cociente muy grande: y un divisor muy pequeilo pueden pravocar que se realicen miles de ciclos a un gran costo en tiempo de procesamiento. DIVISION POR MEDIO DE CORRIMIENTOS Para Ia divisién entre una potencia de dos (2, 4, 8, etcétera), es mas eficiente realizar sélo corrimientos la derecha el niimero necesario de bits, Para el 8088/8086, un corrimiento mayor que | necesita un valor de corrimiento en el registro CL. Los ejemplos siguientes suponen que el dividendo esta on el AX: wvide entre 2 (1 corrimiento aladerechay: SHR AK, 01 Divide entre 8 (3 corrimiemos a Is derecha): MOV CL,03 ;8088/8086 SHR AX, CL Divide entre 8 (3 corrimientos a a derecha): SHR CL,03 ;80286 y posteriores ‘Corrimientos en los registros DX:AX ‘La rutina siguiente puede ser Util para obtener una divisida por corrimientos a la derecha en los registros DX:AX. Puede idear un métoda mis eficiente, pero este ejemplo es general pars cual- quier mimero de ciclos (y corrimientos) en el CX. Observe que un bit I desplazado fuera del registro enira en la bandera de acarreo, Ja cual ex utilizada por RCR: MOY Cx,04 © jInicializa para cuatro cicles 2: SAR BE,01 — :Corrimiento del Dx ROR AK,01 © ;Rota €1 AX a la derecha Loop p20 sRepite Procesadores numéricos de datos (coprocesadores) 237 CAMBIO (INVERSION) DEL SIGNO La operacién. NEG (negar) invierte el signo de un nimero binario, de positivo a negativo y viceversa, En realidad, NEG invierwe los bits, igual que NOT, y después suma | para una correcta notacién en complemento a dos. El formato general para NEG es: [ieciavetent [ne [[vogivere/eeaoeial] ‘Veamos algunos ejemplos: wes AK p26 bite NEG Bu iB bate NBG BINANT Byte @ palabra en memoria WEG RCK 132 bite Invertir el signo de un nimero de 32 (o mas) bits implica mAs pasos. Suponga que el par DX:AX contiene un niimere binaria de 32 bits. NEG no puede actuar sobre el par DX:AX de manera concurrente, y usarla en ambos registros significarfa sumar 1 a ambos. En lugar de eso, lice NOT para cambiar los bits, uilice ADD y ADC para sumar el uno para el complementa a dos: NOT DK Cambia los bits NOT AX; Cambia los bits ROD AX, puma i al AK ADC DA, Suma con acarree al DX ‘Queda un problema menor: todo estd muy bien para realizar aritmética con datos binarios ‘que cl programa se define o con datos que ya estin en forma binaria den un archive de disco. Sin embargo, los datos que introduce un programa desde una terminal estén en formato ASCII. Aun- «que los datos ASCII son adecuados para desplegar ¢ imprimir informacién, requieren de un ajuste especial para la aritmética, un tema que se estudia en el capitulo siguiente. PROCESADORES NUMERICOS DE DATOS (COPROCESADORES) Esta seccién da una introduccién general a los procesadores numérices de datos; un estudio com- pleto queda fuera del alcance de este libro. La tarjeta de sistema tiene un enchufe para un Procesador ‘Numérico de Datos de Intel, conocido como coprocesador. El coprocesador 8087 opera en con- juncidn con un 8088/86, e! 80287 con un 80286, e! 80387 con un 80386, y asi sucesivamente: El coprocesador tiene su carscteristica conjunto de instrucciones y hardware para punto flotante a fin de realizar operaciones como exponenciaciones y operaciones logaritmicas y rigonomeétricas. Los ocho registros de 80 bits de punto flotante puede representar nimeros hasta 10 elevado al exponenie 400, es decir, 10°, El procesamiento matemético del coprocesador es alrededor de 100 veees mas répide que el procesador normal. Avitmética: |—Procesamiento de datos binarios — Capitula 15 El 8087 consta de ocho registros de 80 bits, R1-R8, en el formato siguiente: 8 exponente isatisa 7 [18 ot | 69 @ Cada registro tiene asociado un indi 00 Contiene un némero vélido 01 Contiene un valor cero 10 Contiene un némero no valido 1 Esti vacio dor de 2 bits, que indica su estado: El coprocesador reconoce siete tipos de datos numéricos: « Word integer (palabra): 16 bits de datos binarios. 8 dinero 1s [14 - Short integer (entero corto}: 32 bits de datos binarios. |. Long integer (entero largo): 64 bits de datos binarios. |. Short real (reat corto}: 32 bits de datos de punto flotante. sh . Long real (real fargo}: 64 bits de datos de punto flotante. 8 exponeate 63 | 62 of st o . Temporary real (real ‘emporal}: 80 bits de datos de punto flotante, s lexponente evans 1 [78 oa | 63 0 Preguntas. 239 7. Packed decimal (decimal empacado}: 18 digitos decimal significativas s a 13 | 78 72/71 Los tipos 1, 2 y 3 son los formatos comunes de binarios ¢n complemento a dos, Los tipos 4, 5.y 6 representan niimeros de punto flotante. El tipo 7 contiene 18 digitos decimales de 4 bits-cadla uno. Puede cargar cualquiera de estos formatos desde memoria a un registro del coprocesador y almacenar el contenido de un registro en la memoria, Sin embargo, el coprocesador convierte para sus cAlculos. todos los formatos en sus registros a real temporal. Los datos estdn almacenados en memoria en secuencia inversa de byte. EI procesador solicita una operacién especifica y envia datos numéricos al coprocesador, que realiza la operacin y regresa el resultado. Para ensamblar, utilice la directiva -80x86 apro- piada, La instruceién INT 11H puede ayudar a determinar la presencia de un coprocesador. La operacién envia el estado del equipo al AX, en donde un bit en | significa que est presente un coprocesador. PUNTOS CLAVE + Los mimeros con signo méximos para acumuladores de un byte son'+127 y -128 + Para sumar en varias palabras miltiples, utilice ADC para tomar en cventa cualquier acarreo de un ADD anterior. $i la operacién se realiza dentro de un ciclo, utilice CLC para inicializar la bandera de acarreo en cera. + Utilice MUL para datos sin signo ¢ IMUL para datos con signo. * Con MUL, si un multiplicador esta definide como un byte, el multiplicando es AL; si el multiplicador es una palabra, el multiplieando es AX; si el multiplicador es una palabra doble, el multiplicando es BAX, * Utilice corrimiento a la izquierda (SHL o SAL) para multiplicar por potencias de 2. + Utilice DIV para dates sin signo e IDIV para datos con signo. + En la divisién tenga cuidado especial del desbordamiento. El divisor debe ser mayor que ¢l contenido del AH si el divisor es un byte, que el DX si el divisor es una palabra, 0 que el EDX si el divisor es una palabra doble + Con DIY, si el divisor estd definido come un byte, el dividendo es AX: si el divisor es una palabra, el dividendo es DX: AX; sil divisor es una palabra dable, el dividendo es EDX:EAX. * Utilice corrimiento a Ix derecha para dividir entre potencias de 2:—SHR para campos sin signo y SAR para campos con signo, PREGUNTAS 13-1. (a) {Cudles son ios mimeros méximas en un byte para datos con signo y para datos sin signo? (b) {Cuil es el ndémero miximo en una palabra para datos con sigho ¥ sin signo? 13-2, Eseriba la diferencia entre un acarreo y un desbordamiento, 240 aritmsti (Procesamiento de datos binarios Capitulo 13 [Las preguntas 13-3 basta la 13-7 se refieren a los datos siguientes, con palabras definidas en orden inverso: 33. Id. 1365, Codifique las instrucciones para multiplicar (MUL) lo siguiem DATAX DW o16aH pw a3i6H DATAY Bw O237H Dw s0szH DATAZ DW ¢ pw oe mye (Codifique las instrucciones para sumar Io siguiente: (a) Ia palabra DATAX a ta palabra DATAY; (6) la palabra doble que empieza en DATAX a la palabra doble en DATAY, Explique el efecto de las instrucciones siguiemtes relacionadas: ste MoV. Bx, DATA ADE 8x, DATAY ‘a) la pulabra BATAX por la palabra ‘DATAY: (b) la palabra dable que empieza en DATAX por la palabra doble en DATAY. Almacene el producto en DATAZ. 13-6, Ademds del cera, iqué divisores provocan un error por desbordamiento? 13-7. Codifique fas instrucciones para dividir (DIV) lo siguiente: (a) la palabra DATAX entre 23; (b} la palabra doble que empieza en DATAX entre la palabra DATAY. 13-8. Corrija el programa de la figura 13-2 de modo que ta rutina sume tres pares de palabras en lugar de dos. Ponga por nombre WORD3 y WORD3B, a las palabras adicionsies. 13-9, Refigrase 4 In secci6n "Multiplicacién por corrimiento”. La segunda parte contiene un métode mis ceficiente de corrimienta a ta izquierda de cuatro bits. Corrija el ejemplo para un corrimienta a ta derecha de cuatro bits. CAPITULO 14 Aritmética: II—Procesamiento de datos ASCII y BCD OBJETIVO Examinar los formatos de datos ASCII y BCD pata realizar arit- mética, y estudiar las conversiones entre estos formatos y el binario. INTRODUCCION En las computadoras el formato natural para la aritmética es el binario, Como se vio en el capitulo 13, el formato binario no causa mayores problemas, siempre y cuando ¢l programa defina sus datos. Sin embargo, para muchos propésitos, los datos numéricos se introducen desde el teclado como caracteres ASCII, en formato de base 10. De manera similar, el despliegue de valores numéricas en la pantalla es en formato ASCII. Un formato relacionado, decimal codificada en binaria (BCD), tiene uso ocasional y apare- ce como desempaquetado y empaquetado, La PC proporciona varias instrucciones que facilitan la aritmética sencilla y la coaversién entre formatos. Este capitulo también trata las técnicas para la conversién de datos ASCII a binario para aplicar la aritmética, asi como las técnicas para convertir los resultados binarios de regreso a formato ASCII para su visualizacién. El programa final del capftule combina mucho del material que se ha estudiado en los capitulos 1 a 13. Si ha programado en un lenguaje de-alto nivel, camo C, usted esta acostumbrado a que el compilador tome en cuenta el punto base (decimal o binaria). Sin embargo, la computadora no reconace un punta base en un campo aritmético, asi que como programador tiene que tener en cuenta su posicién. 2at 242 Aritmética: II-Procesamiento de datos ASCII y BCD Capitulo 14 Las instrucciones introducidas en este capitulo son: AAA Ajusta ASCII después de sumar AAS — Ajusta ASCII después de restar AAM Ajusta ASCII después de multiplicar AAD Ajusta ASCII para dividir DAA Ajusta decimal después de sumar DAS Ajusta decimal después de restar DATOS EN FORMATO DECIMAL Hasta este punto, hemos mangjado valores muméricos en formatos binario y ASCII. El sistema de la PC también permite usar formato decimal codificado en binario (BCD), que facilita algunas ‘operaciones aritméticas limitadas. Dos usas del formato BCD son: 1, EL BCD permite un redondeo apropiada de nimeros sin pérdida de precisidn, una caracteristica que es particularmente Util para manejo de cantidades monetarias (pesos y centavos). (El redondeo de niimeros binarios que representan pesos y cenlavos puede provocar ‘una pérdida en la precisién.) 2. Con frecuencia es mas sencillo realizar aritmética con niimeros pequefios introducidos desde ‘el teclado © que son escritos en la pantalla o en la impresora. Un digito BCD consiste en cuatro bits que pueden representar los digitos decimales desde el O hasta el 9: [sino Digito BCD Birario Digi BCD T0000 ° a1 s | | O01 1 OL 6 oo10 2 ont 1 | OO! 3 1000 & | 0100 4 1001 9 Puede almacenar digitos BCD como desempaquetado 0 empaqvetado: 1. BCD desempaquetado tiene un solo digito BCD en los cuatro bits inferiores de cada byte, con ceros en los cuatro bits superiores. Observe que aunque el formato ASCII también es “desempaquetado” no se le Hama asi, 2. BED empaguetada contiene dos digitos BCD, uno en los cuatro bits superiores y uno en los ‘cuatro bits inferiores, Este formato es muy comin para la aritmética que utiliza coprocesador aumérico, definido como 10 bytes con la directiva DT. Examinemos la representacién del nimero decimal 1,527 en los tres formatos decimales: + ASCII 31 35 32 37 (cuatro bytes) + BCD desempaquetade O1 05.02 07 (cuatro bytes) «BCD empaquetado 15 27 (dos bytes) EL procesador realiza aritmética en valores ASCII y BCD un digito a la vez. Usted tiene que usar instruceiones especiales para convertir de un formato al otra. Procesamiento de datos ASCII 243 PROCESAMIENTO DE DATOS ASCII ‘Ya que os datos que usted ingresé desde un teclado estén en formato ASCH, la representacién en memoria de un niimero decimal ingresado tal camo 1234 es 31323334H. Pero realizar aritmética sobre tal mimero implica un tratamiento especial. Las instrucciones AAA y AAS realizan aritmé- tica de manera directa sobre mimeros ASCII: —— [etigueta:) [Aaa [etiqueta:| Estas instrucciones estén codificadas sin operandos y ajustan de manera automatica un valor ASCII que se encuentre en ef registro AX. El ajuste ocurre porque un mimero ASCH representa un ndmero de base 10 desempaquetado, mientras que: cl procesador realiza aritmética en base dos. ‘Suma ASCIL ‘Considere el efecto de sumar los mimeros ASCII & (38H) y 4 (34H): 38 hex 34 hex Chex La suma 6CH fo es correcta ni en ASCII ni en binario. Sin embargo, ignore el 6 de la extrema, iequierda, y sume 6 al C hex: C mis 6 hex = 12 hex, la respuesta correcta en términos de nnimetos decimales. {Por qué afladir 6? Porque éa es la diferencia entre hexadecimal (16) y decimal (10). Esto es muy simple, pero indica la forma en la que AAA realiza su ajuste. La operacién AAA verifica el digito hex en la extréma derecha (cuatro bits) del registro AL, Si el digita esté entre A y Fo la bandera de acarreo auxiliar es 1, la operaciéin suma 6 al registro AL, suma | al registro AH y pone en uno las banderas de acarreo y acarreo auxiliar, En todos lox ‘casos, AAA pone en cero el digito hexadecimal en la extrema izquierda del AL. ‘Como ejemplo, suponga que et AX contiene 0038H y el BX contiene 0034H. El 38 en el AL y el 34 enel BL representan dos bytes ASCII que serin sumados. La suma y el ajusie son como sigue: ADD AL, BL :Suma 34H 4 38H, igual a oo6cH AAA saduava pars suma ASCIT, igual a 0102" Ya que el digito hexadecimal en la extrema derecha del AL es C, AAA sama 6 al AL, suma | al AH, pone en uno las banderas de acarrea y de acarreo auxiliar y pone en cero el digito hexadecimal en la extrema izquierda del AL. El resultado en el AX ahora es 0102H. Para restaurar la representaciin ASCII, sélo inserte 3 en los digitos hexadecimal en la extrema izquierda del AH y del AL para obtener 3132H o 12 decimal: OR AX,3030H /E1 resultade ahora ea 31321 Todo esto est muy bien para sumar miimeros ASCH de un byte. Sin embargo sumar mime- fos ASCII de varios bytes necesita un ciclo que procese de derecha a izquierda (de orden bajo a Aritmética: |I—Frocesamiento de datos ASCII y BCD Capitulo 14 TITLE PL4ASCAD (00M) Suma de ndmeres ASCIT *MODEL SMALL CODE, ors) (00H BEGIN: MP SHORT MATE Asti ba S78 iDakos ASC? DR ' 634" ‘AScSUM DB ‘00an" MAIN PRO WEAR cue sLinpia bandera de acarres LEA SI, ASCL+2 iInkelaiizacion de LEA DI ASC2s2 : Rimeros ASCII LEA BK, ABCSUM+2 mov ox,a3 Inievalizacion de 3 cicles Abs yoy AH, pLimpia 21 aN mov AL, (Sr) farga un byte ASCTz Abc kL, (DED }Suma {con acarrecl AAA juste para ASCIT Mov (Bx) AL ‘Almacens la sume Dect Dec | Dr DEC BK Loop Az0 /Realiza ¢1 ciele 3 veces mow (BX), AH vA tinal, almacena el acarreo EEA BK, ASCSUMN3 Convierte ASCSUM MOV Ex,a4 2 aSCIT a30. oR aYTE PrR[ax},204 Looe AIO iRealiza el ciclo 4 veces Woy AK, acoow Sale al bos eT) NAT ENDP ND BEGIN Figura 14-1 Suma ASCIT alto) y tome en cuenta los acarreos. E] cédigo en la figura 14-1 suma dos ndimeros ASCII de tres bytes cada uno, ASCI y ASC2, y produce una suma de cuatro bytes, ASCSUM, Observe los puntos siguientes + Una instruccién CLC al empezar inicializa la bandera de acarreo en cero, + A continuacién en A20, ADC es utilizada para sumar ya que un ADD puede provocar vn acarreo que debe ser afiadido al siguiente byte (de Is izquierda) « Una instruccién MOV limpia el AH en cada ciclo, ya que cada AAA puede sumar uno al AH, Sin embargo, ADC toma en cuenta cualquier acarreo. Note que el uso de XOR o SUB para limpiar el AH cambiaria la bandera de acarreo. + Cuando el ciclo se ha completado, la rutina mueve el AH (que contiene un 00 final 0 01) al byte en la extrema izquierda de ASCSUM. + Al final, ASCSUM contiene 01020702H. Para insertar el 3 ASCIL-en cada byte, el programa pasa a través de ASCSUM en memoria y reatiza un OR en cada byte con 30H. El resultado es 31323732H 0 1272 decimal. Procesamiento de datos BCD desempaquetados La rutina no wilizé-OR después de AAA para inscrtar los 3 de més a la izquierda, ya que OR pone en uno la bandera de acarreo y cambia el resultado para las instrucciones ADC. Una solucién que guards la configuracién de las banderas es enviarla (PUSHF) al registro de banderas, ejecutar el OR y después sacar (POPF) las banderas para restaurarias: ac AL, (Dz 1Suna con acarreo AMA rajugta para AscrT PUSH ;Guarda lag banderas on AL, 20H pinperta el 3 ASCIT POF sMestaura las banderas mov tax] aL y2omecena La suma Resta ASCII La instruccién AAS funciona igual que AAA. El AAS verifica el digito hexadecimal (cuatro bits) de mas a la derecha del AL. $i el digito estd entre A y Fo la bandera auxiliar de acarreo esta en uno, ta operacién resta 6-del AL, resta uno del AH y pone en uno las banderas auxiliar (AF) y de acarreo (CF). En todas los casos, AAS pone en cero el digito de mas a la izquierda de! AL. ‘Los dos ejemplos siguiemes suponen que ASC! contiene 38H y ASC2 contiene 34H. El primer ejemplo resta ASC2 (34H) de ASC (38H). AAS no necesita hacer un ajuste, ya que el digito de ta derecha es menor que A: ax Mov AL,ASCL j0038 SUR AL,ASC2 0004 nas 008 OR AL,SOH 0004 El segundo ejemplo resta ASC1 (38H) de ASC? (34H). Como el digito de mas a la derecha es C hex, AAS resta 6 del AL, resta uno del AH y pone en uno las banderas AF y CF. La respuesta, que debe ser —4, ¢s FFOSH, su complemento a 10, que tiene valor pequefo: ax MOY AL,ASCD ; 0034 SUB AL,ASCL 00FC ans sepee PROCESAMIENTO DE DATOS BCD DESEMPAQUETADOS ar a 1 ‘La multiplicacién y divisién de ndmeros ASCII necesita que primero los ndmeros sean converti- dos al formato BCD desempaquetado. Las instrucciones AAM y AAD realizan aritmética de forma directa sobre nimeros BCD desempaquetados: Aritmética: il—Procesamiento de datos ASCII y BCD Capitulo 14 ant jletiqueca:} he | teciqueta:) Jaap | ,ajusta ASCIT antes de aiviaiy a ASCTE multiplicar Multiplicacién ASCIT La instruccién AAM corrige el resultado de la multipticacion de 8 ASCII en el registro AX. Sin embargo, usied primero debe limpiar el 3, de cada byte, en el digito hexadecimal de mas a la izquierda, asi se convierte el valor en BCD desempaquetado. Por ejemplo, el nimero ASCII 31323334 sc convierte en 01020304 como BCD desempaquctade. También, ya que cl ajuste no es sino de un byte ala vez, sélo puede multiplicar campos de un byte y tiene que realizar la operacién de forma repetida en un ciclo, Sélo utilice la operacién MUL, a0 la operacién IMUL. AAM divide el AL entre 10 (OAH) y almacena el cociente en el AH y el residuo en el AL Por ejemplo, suponga que el AL contiene 35H y el CL contiene 39H. El cédigo siguiente multi- plica ef contenido det AL por el de CL y convierte el resultado » formato ASCII INSTRUCCION COMENTARIO AX cL AND CL,OFH — ;Convierte CL a 09 ans ns AMD AL,OPH — )Convierte AL @ 05 eons wu ct sMultiplica AL por cL en2p ant Convierte a BCD desempaquetado 0408 OR AX,3030H ;Convierte a ASCIT 3435 La operacién MUL genera 45 (Q02DH) en el AX. AM divide este nimero entre 10, generando un cociente de 04 en el AH y un residuo-de 0S en el AL. Después, Ia instruceién OR convierte cl valor BCD desempaquetado a formato ASCII. La figura 14-2 deseribe la multiplicacién de un multiplicanda de cuatro bytes por un multiplicador de un byte. Ya que AAM tiene capacidad para operaciones con un byte, !a rutina pasa por el multiplicando un byte a la vez, de derecha a izquierda. Al final, el producto BCD desempaquetado es 0108090105, que un ciclo convierte a un formato real ASCII como 3138393135, 9 18,915 decimal Si cl multiplicador es mayor que un byte, tiene que proporcionar otra ciclo mas que pase per el moltiplicador. Puede ser més sencilla convertir e] dato ASCII a formato binario, como se estudia em una seccién posterior. Divisi6n ASCIL La instruceién AAD proporciona una correccién de un dividendo ASCII ames de hacer la divi- sidn, Igual que con AAM, primero usted debe limpiar Jos 3 de la izquierda de los bytes ASCI para crear un formato BCD desempaquetado. ADD permite un dividende de dos bytes en el AX El divisor s6lo puede ser un dinico byte con 01 2.09. Suponga que el AX contiene el valor ASCII 28 (3238H) y cl CL contiene al divisor, 7 ASCII (37H). Las instruceiones siguientes realizan el ajuste y la divisién: Procesamiento de datos BCD desempaquetadas. 247 TATUR PLAASGMU (COM) Muitaplicacién de nuneros ASCIT | "MODEL SMALL | COO | | oko 00H | secim: wp AIM | | moprowo Dp '3783" | MuLTeLR OB +5! | BRooucT BES DUPis) Moy Cx,Da rinicializa 4 etelos LEA ST, MULTCHD+3 EEA DI) PRODUCT.g AND -MULTPLA, OF sLimpia el 3 ASCIT a0 MOV AL, (81) ;Carga el cardcter ASCIE ASD AL, OFH pLimpia el 3 ASCTZ MOL MULTPLR sMultiplice A pRjusta para ASCIZ ADD AL, (Dz) :Suma para a ‘almacenar MOV [DI] AL el producto } DEC Or Mov [DT] an palmacena el producto con acarreo Dec st | Lode Ago Realiza el ciclo 4 veces | | LEA BX, PRODUCT. pConvierte PRODUCT | MOV CK,0s om ASCTT | Ok BYTE PTRLAXI 208 DEC BX Loop A3D (Realize el ciclo ¢ veces Mov Ax, acooEt ifale al Dos int ait MAIN -ENDP. END RESIN Figura 14-2 Multiplicacién ASCH INSTRUCCION (COMENTARIO Ax CL AND CL.OFK =) Comvierte a BCD desempaquetads 1238 07 AND AX,OFOEH ;Convierte » BCD desempaquetado 9208 map :Convierte a binario ooac pry cL sDivide entre 7 004 AAD multiplica el AH por 10 (AH), suma el producto 20 (14H) al AL y limpia el AH. £1 resultado, OO1CH, es Ia representaciGn hexadecimal del 28 decimal. La figura 14-5 permite hacer Ia divisién entre un divisor de un byte y un dividendo de cuatro bytes. La rutina pasa por el dividendo de izquierda a derecha, LODSB obtiene un byte de DIVDND para el AL (via el SI) y STOSB almacena bytes del AL en QUOTNT (via el DI). El residuo permanece en el registro AH de modo que AAD lo ajustard en el AL. Al final, el cociente, en formato BCD desempaquetado, es 00090204 y ci residuo en el AH es 02. Otro ciclo (no codificado} podria convertir el cociente a formato ASCII como 30393234, Sicl divisor es mayor de-un byte, usted tiene que proporcionar otro ciclo mis para pasar por el divisor. Mejor alin, vea la seccién posterior, “Conversién de formato ASCII a binario”. 248 Aritmética: l—Procesamionta de datos ASCII y BCD Capitulo 14. TITLE —-PLGASCDV (COM) Division de mimeres ASCII “MODEL SMALL :000E oc 100K JME SHORT MAIN Dp +3698" sDates BB 4 pUPio) HEAR Moy CX,04 Inicislizacion para 4 ciclos SUB AR, AR iLimpia el byte izquierde del dividends AND -DIVEGR, OF jEtmpia el divieer del 3 agcir LEA SE, DIVDND, EEA DE, QUDTNT aaos Loose ;Carga el byte ASCII, AxD AL, OFHL pLimpia el 2 ASCIE aD pAjuata para dividir Biv DEVBOR Divide Tose pAlmecena #1 cociente Loor Aa¢ e¥a von cuatro veces? INE 2H si, entoncer salir al pos MAIN ESDP END BEGIN Figura 143° Divisidn ASCH PROCESAMIENTO DE DATOS BCD EMPAQUETADOS: Enel ejemplo precedente de division ASCH, el cociente fue 00090204, $i tuviera que condensar este valor conservando el digito derecho de cada byte, el resultado seria 0924, ahora en formato BCD empaquetado. También puede realizar sumas y restas sobre datos BCD empaquetados. Para este objetivo, existen dos instrucctones de ajuste: tetiquece:} tetiqueta:t DAA corrige el resultado de la suma de das mimeros BCD empaquetados en el AL, y DAS corrige el resultado de su resta, Una vex mis, tiene que procesar los campos un byte a la vez. El programa en la figura 14-4 ejemplifica la suma BCD. El procedimiento BIOCONV convierte los nimeros ASCII ASCI y ASC2 a mimeros BCD empaquetades BCDI y BCD2, respectivamente. El procesamiento, que es de dececha a izquierda, podria ser tan facil de izquier- da a derecha. También el procesamiento ue palabras es mds ficil que el procesamiento de bytes, ‘ya que necesita dos bytes ASCII para generar un byte BCD empaquetado. Sin embargo, el uso de palabras requiere de un niimero par de bytes en el campo ASCII. El procedimiento C1OADD reatiza un ciclo tres veces para sumar los mimeras BCD empa- quetados a BCDSUM. El total final es 00127263. DAA | ;Ajuste decimal después de la auna 1 pas | jAjuste decimal después de La resta Procesamiento de datos BCD empaquetados TITLE —PLAHEDAD (COM) Conversién de ASCII @ BCD y sume “MODEL SHALL cone one Loo MP SHORT MAIN be Sas 7ea6" DB taea427" Bafana! Ba sano! «DUP (0) EROC NEAR LER ST, ASCL#g sInietaliza aSCL LEA DE, BCD1+2 CALL BLOCONY Llama la rutina para convertir LER ST, ASCZ04 Hinieializa agC2 LEA DE, BCD2~2 CALL © BLACONY pLilama la rutina para convertir CALL CARD Liana la rutina pars eumar Moy AX, 4COOr Bale al DOS INT TAH warm ENDP Comvierte ASCII a BCD Biocomm eta ueactor de corrimento DK,03 imGm. de palabras a convertir 220: ax, ft] jObtiene 1a pareja ASCII AAD ALCL icorrimiento de aon pa ascrd (oil , AH jAlmacena los digitos BCD st Bi Dx Bro sSon tres veces iad, entences regresar qhacony Suma de nineres BCD CROADD BROS HOR AH, AI pLimpia el Alt LEA ST, BCD1+2 pinictaliza LEA DY, BCD242 dizecciones ae EEA -BX.BeDSMea 1 MED. MOV Cx,03 feampoa de 3 bytes cue AL, f sObtiene BCDL (o LODSB) abc AL, (Bz) Syma _8cD2 DRA Suaca el decimal ay [px] ,AL imacens en BCDSUM BEC OBL Bee BK Lar 70 Realize el ciela 3 veces RET cLoADD -ENDP END BEGIN Figura 14-4 Conversiin y aritmética en BCD 250 Aritmética: II—Procesamiento de datos ASCII y BCD Capitulo 14 CONVERSION DE FORMATO ASCII A BINARIO Realizar aritmética en formato ASCII o BCD sélo es adecuado para campos pequefios. Para muchos propésitos aritméticos, es mis préctico coavertir tales nlimeros a formato binario. De hecho, es mds facil convertir desde ASC a binario, de manera directa, que convertir de ASCII 2 BCD y luego a binario El método de conversion esta basado en el hecho de que un mémero ASCII esta en base 10 yy la computadora realiza la aritmética en base 2. Agui esté el procedimiento: 1, Inicie com el byte de mas a la derecha del niimero ASCII y procese de derecha a izquierda 2, Quite el 3 del digito hexadecimal de la izquierda de cada byte ASCII, para formar un ndmero BCD empaquetado. 3, Multiplique-e! primer digito BCD por 1, el segundo por 10 (OAH), el tercero por 100 (64H) y asi sucesivamente, y sume los productos. El ejempto siguieme convierte ef nimero ASCII 1234 a binario Hexadecimal Producto Ps rodeo 4 4x0lH= 4H 30 3x0AH= 1EH 2000 0« 2K 6MH = CBH 1000 «1X SESH = © 3E8H Total: 1234 O4D2H ‘Verifique que la suma 04D2H sea en realidad igual a 1234 decimal. En la figura 14-5, el progra- ma convierte el nimero ASCII 1234 a su equivalente binario, Una instruccién LEA inicializa la direccién de! byte mas a la derecha del campo ASCII, ASCVAL +3, en el registro SI. La instruc cidn en B20 que mueve el byte ASCII al AL es MOY AL, ist) La operacién utiliza la direccién de ASCVAL +3 para copiar el byte de la extrema derecha de ASCVAL enel AL. Cada iteracién del cielo disminuye en uno el SI y se refiere al siguiente byte a Ia izquierda, El ciclo se repite para cada uno de los cuatro bytes de ASCVAL. Ademds cada jiteracién multiplica MULTLO por 10 (OAH), dando los multiplicadores 1, 10 (OAH), 100 (64H). sucesivamente. Al final, BINVAL contiene el nimero binario correcto, D204H, en secuen inversa de byte La rutina est codificada en términos de claridad; para un procesamiento més répido, el multiplicador puede ser almacenado en el registro DI. CONVERSION DE FORMATO BINARIO A ASCII Pata imprimir o desplegar el resultado de aritmética binaria, tiene que convertirlo en formato ASCII. La operacién implica el inverso de los pasos anteriores: En lugar de multiplicar, se debe dividir de manera continua entre 10 (OAH) hasta que el cociente sea menor que 10. Los residuos, Gorrimiente y redondeo 251 | TITLE PI4ASCBL (COM) Conversidn de formato ASCII a bi | So ae" 00K wears Su | econ | Brana, | Rscusn | woure NEAR miente principal ‘BX, 10 actor de multiplicactén mov cx,o8 ;Contader del ciclo LEA ST,ASCVALI3 ;Pireccién de ASCVAL B20; | Mov AL, IST] rSelecciona el cardcter ASCIT 1 ML MULTag Multiplica por un factor 10 ADO -BINVAL, AK guna al binaric AX, MULTLO Calcula e) siguiente factor de 26 AND AX, OOOH Borta la zona 3 | jake #1 Gleimo cardcter ASCII? Figura 14-5. Conversién de formato ASCII a binario que sélo puede ser del Q al 9, generan de manera sucesiva e! nimero ASCII. Como un ejemplo, ‘convierta 4D2H de regreso a formato decimal: DIVIDEENTRE 10 © COCIENTE —-RESIDUO A [4D2 7B 4 AB c 3 ATC” 1 2 ‘Como el cociente (1) ahora es menor que el divisor (OAH) la operacién esti terminada, Los residuos, junto con el Gtimo cociente, forman ef resultado BCD, de derecha a inquierda: 1234. Todo lo que resta por hacer es almacenar estos digitos en memoria, con los 3 ASCII, como 31323334, El programa de Ia figura 14-6 convierte el ndmero binario O4D2H a formato ASCII. La rutina divide el mimero binario de manera sucesiva entre 10, hasta que el cociente que queda sea menot que 10 (OAH) y almacena los digitos hexadecimales generados en formato ASCII como 31323334. Si no completamente divertide, puede encontrar iii! reproducir este programa y ras- ‘rear su ejecucién paso por paso. (CORRIMIENTO Y REDONDEO Suponga que usted est redondeando a dos decimales un. producto que contiene tres posiciones decimales, Si el producto es 12.345, sume 5 a la posicidn decimal de mis a la derecha y recorra tun digito a la derecha: Asitmética: Il—Procesamiento de datos ASCII y BCD Capitulo 14 P BINVAL DW © 4D2i farm PROC REAR Procedimiento principal Mov ct, onze Factor de division LEA SI, ASCVAL+} MBireccién de ASCVAL MOV AK, BINVAL Obtiene campo binaric cao CMP AK. Ox i¢81 nGmera en menor a 107 BGO i eg, entonces saliy Kor Bik, ox iuimpiar el cocseate superior piv cx iDivide entre Lo OR Ok 30 mov [sit pu yAlnacena ol cardcter asczt SMB CaO cas oR AL. 30m Almacena #1 ditimo cociente Mov (Si].AL cone cardctex ASCIT MoV AK, acoOH Sale al DOS mt ait MAIN BNOP END UBOIN Figura 14-6 Conversién de formato binario 2 ASCIL Product 12,345 Suma 5; + 5 Producto redondeado; 12,350 = 12.35 Si el producto es 12.3455, sume 50 y recorra dos digits, y si el producto es 12.3455, sume 500 y recorra tres digitos; 12,3455, 12.34555 + 50 + 500 12.3905 = 12.35 12.35055 = 12,35 Ademis, un ndmero con scis lugares decimales necesita sumar 5,000 y recorrer cuatro ddigitos, y asi sucesivamente. Ahora, ya que por lo regular una computadora procesa dates binarios, 12.345 aparece como 3039H. Sumando $ a 3039H da 303EH, o 12350 en formato decimal. Hasta ahora todo va bien. Pero, del corrimiento de un digito binario resulta 181FH, 0 6175, de hecho el corrimiento séle divide entre dos al aimero, Nosotros necesitamos un corrimiento que sea equi: valente a recorter a la derecha un digito decimal. Puede realizar este corrimiento dividiendo el valor redondeado entre 10, 0 A hex: 303E hex dividido entre A hex = 4D3H, 0 1235 decimal. La conversion de 4D3H a un niimero decimal da 1235. Ahora s6lo inserte un punto decimal en la posicién correcta y puede desplegar un valor redondeado como 12.35. De esta manera, puede redondear y recorrer cualquier nimero binario. Para tres lugares decimales, sume $ y divida entre 10, para cuatro lugares decimales, sume 50 y divida entre 100. Programa para convertir datos ASCII 253 Tal vez. haya notado un patrén: el factor de redondeo (5, 50, SOO, ete.) siempre es la mitad del facior de corrimiento (10, 100, 1,000, etcétera). Por supuesto, el punto decimal en un niimero binario es implicado y en realidad no esta presente PROGRAMA PARA CONVERTIR DATOS ASCID El programa de la figura 14-7 permite a los usuarios ingresar el niimero de horas trabajadas y el sueldo por hora de los empleados y desplicga el salario calculado, Por brevedad, el programa omite algunas verificaciones de error que de otra forma serfan incluidas. Los procedimientas son como sigue: BIOINPT Desde el teclado, acepta horas y sueldo por hora en formato ASCII. Estos valores pueden tener punto decimal, DiOHOUR —_Inicializa la conversiGn de horas ASCII a binario. EIORATE ___Inicializa la conversiéa del sueldo ASCII a binario OMULT —_Realiza la mubtiplicacién, redondeo y corrimiento. Un sal o.com cero, uno page 60,232 TITLE —-BLASCREME (EXE) Introdurca horas y sueldo, despliega salario MODEL SWALL STACK 64 LEFCOL = BQU 28 Bquivalencia para la pantalla RITCOL = BQU 52 Tormow = QTD BOTROW = BQU 1a WRSPAR LABEL BYTE sLisca de pardmetros de her MAMLEN DB 6 3 veer ~ ACTHLEN «DB? MRSFLD) «DB & DUP(?) RATEPAR LABEL BYTE ita de parémetres de auelée por hora MAXRLEN «=ODB - = ACIRLEN DB? RATEFLD DB & DUP(?) : MESSGL «DB = 'Horam trabajadas ', +5 esac DR Sueldo per hora 10g Messo3 On Salario s+ ASOIAGE DR «10 DUPY3aH), 13, 10,19 Messce |B Presione cualquier tecla para continuar o Bsc para salir apmsT DM? Bates BINVAL «= DMD Bris ow a3 BINRATE DH 90, BEcImD = Daa MOLTIO. «DM OL NODEC 8 DMO. Ba (80 ‘CODE BEGIN PROC FAR Mov AK pedace HInicializa los Mov DB,Ax regiatros BS y ES Moy ES! at caLL g16scR pbimpia ta pantalla Figura 14:7 Despliegue de los salarios de los empleados azouoor BLOINPT BLOINPT Bi cHOUR PLOHOUR, peupengaaseapespass S25 SSERREREEEE 5 BREEPEEROEE Bs i § ADD Raa Asitmétice: || Procesamiento de datos ASCII y BCD Capitulo 14 guswix Hiimpia la ventans QzocuRs ioloca el cursor BLOENPT: raeepta laa horas y ¢l sueldo por hora DLOHOUR iConvierte lag horas a binaric BLORATE, ;Convierte #1 guelde a binaric FAOMULT Calcula #1 #alario, redondeado GLOWAGE Convierte salario a ASCIT RLODIS?: Despliega ef salaric LAOPAUS para el usuario AL, 18H iPrestond. Esc? AZoLooP F fio, #ntonces continuar i af, entoncea fin de la entrada uoscr rLimpla la pantalla AK, ACOH, Sale al DOS 2k Ingreso de horas y aueldo por hora NEAR ‘ROW, TOPROMs2 sCeleca el cursor ‘Cou; LEFCOL+3 ‘920cuRs ow A, O91 Dx;MESSO% iIndicactén del miimero de horas aut ‘Ae OA DX, HRSPAR Acepta el nimero de horas ait ob, LERCOLE sDenigna 1a colunna g20cuRS Ait, 0381 DX, MESsc2 Indieacién del aueldo por hora alt ‘a, OAH Tx, RATEPAR sAgepta el sueldo por hera Procesa las hor WEAR wOnEC, oa CL, ACTHLEN cH, cH ST, HRSPLD-2 sDesigna 1a posici6n derecha 51, cK } do horas muoases iPonvierte a binaric AX, BENVAL BINERS AK Procesa ¢1 susido por hora HEAR CL, ACTRLEN cue 81, RATEPLD-1 ;Pesigna la posicién derecha 8r,c% ) de guelde por hora Mioasar itonvierte a binaric AX, BIRVAL, BINRATE AX Figura 14-7 (continuacidin) Programa para. convertr datos ASCII 255 ELORATE ENP Wultiplica, redondea y recorre PLOMULT © PROC _NEAR MOY CK,0S LEA DI, ASCWAGE. Designa el salaric ASCII MOV AK, 30308 boa jos $e cup REP STOSW Mov SHIPT, 10 Moy ADJUST, a0 Mov CX, NODEC MP CL og 4 hay mas de © JA FAO + decimaies, error Dec peo Ox TLE 30. 184 hay 0, 1, 2 decimales, salvar Mov -NODEC,9z MOY AK,OL F20: ML TENWD sCaleula el facter de corrimiente Loop F20. MoV SHIFT, ax SHR AK)2 realcula el valor redondeado mov ADJUST, Ax FIO: mov AX, Biwuns mu BEATE sCaleula #) salaric ADO AX, ADJUST pRedondes #1 salario ADC DK, 0 CMB DX, SHTFT ieRl producto es muy grande va FSO i para DIV? Fads oMP P76 FSO cue = apguer, oo uSe requiere corrimiento? cz Pao f no, entonces paltar Drv SxIFT Morrimiento de salaric Fro SUB DX, DX pbimpiar el residuo. Feo RET PLOMULT — ENDP 7 Converssén a ASCIZ GLOWAGE PROC NEAR LEA ST, ASCWAGE+7 rPija el punto decimal MOY BYTE PTRISH], ADD «81, NODEC ija 1a inicial deracha de tnicio a0 cee gyre erutenl +. a St eetd en La entonces saltar BE oa posicion dec, ent: Le a4 cup ox, 09 184 DEAK © 10 mz as CHP AK, 0020 + operacién terminada ct) esa Dry TEMWD TEL residue es un dfgite ascrr OR = DL, 20H voy [si], DL sAlmacenar 1 cardcter ASCIT pec St sua DX, Dx sLimpiar el residue op 03a Figura 14-7 (continuacisn) ceo: kaonrer Kaa; rao: mLODISE: inorans aoraus ML OASBE mao mao Hae; voy RET ENP Proc vow CALE voy LEA ow ev THe ENDE PROC ov CALL Mov LEA it INT RET ENDP PROC 588 so6 BSG58 REQGASGAE 28298 Aritmética: |—Procesamienta de datos ASCII y BCD. Capitulo 14 AL, 208 sAkmacena el Gitimo [st] an + eardcter ASCTr Despliega el salario: WEAR COL, LEPCOLS3 mMesigna la columa qzocurs: cK, 09 ST ,ASEAGE Blimina loa ceros iniciales BYTE PTR(St] , 208 x0 } eambidndoles por blancos BYTE PTR(ST] ,208 ar 0 2a, O91 iPeticten de desplieque DK, MESS? isslarie Pousa para el usuario HEAR cob. 29 icoloca ei cursor ROW, 22 2cuRs ‘AH, OSH Dx, Msc :Despiiega pausa aun AH, 308 sPeticién de despliegue Lei Convierte ASCII a binaria MULT19, 0004 ‘BINVAL| 60 DECIND, 09 ‘BE, 5X AL, [81] pObriene el cardcter ASCIT AL, *. :S{ es punto decimal, saltar mo DECIND, 02 ma0 2x, O00FH woLTia jultiplica por factor ast, MULTEO pealcsia el factor ‘TEIMD } wiguiente 16 MOLTO, AX BECIND, 00 g5e Ilegé al punto decimal? Meo aK 2 ef, entonces sumar a la cuenta sr 20 BECIND, 00 rPin dei ciclo mio0 aMay algan punte decimal? NODEC, BX fof, entences aumar al total Figura 14-7 {continuaci6n) Programa para convertir datas ASCII 257 mico: RET wacasei END? Recorre toda la pantalla ficscr PROC mov mov phtribute toe eT RET qosce © ENDP 1 de desplingue: OWEN Pmoc ~ ov ;Cinco renglones “oy pheributo ov wor vor NT RED, oiswie ENDP Gaccums FROC 1ov S05 wow Designa el rengién mew gna la columna INT RET w2ocuRs EMD? END BEGIN Figura 14-7 (continuacién) EIORATE _Inicializa la conversién del sueldo ASCII a binario FIOMULT —_ Realiza la multiplicacién, redondeo y corrimiento. Un salario con cero, uno co dos lugares decimales no requiere de redondeo 0 corrimiento. GIOWAGE —_Inserta el punto decimal, determina la posicién de mas a la derecha para ‘empezar & almacenar caracteres ASCII y convierte el salario binario a ASCII. KIODISP —_—_Camibia por espacios en blanco los ceros iniciales de salario y lo despliega. LIOPAUS —_Despliega el salario calculado hasta que el usuario presione una tecla. Pre sionando Esc se le indica al programa que interrumpa el proceso, MIOASBI —Convierte ASCII a binario (una rutina comin para horas y sueldo por hora) y determina el ndmero de decimales en el mimero ingresado. Q10SCR Recorre toda ia pantalla y la establece a negro sobre cian. QISWIN Recorre una ventana en la mitad de la pantalla en donde horas, sueldo por hora y salario son desplegadios en café sobre azul. Limitaciones. Una limitacién de este programa es que sélo permite un total de seis luga- res decimales en el salario caleulado. Otra es la propia magnitud del salario y el hecho de que el corrimiento exige la divisién entre un miltiplo de 10 y convertir a ASCII implica division entre 10, Si horas y sueldo por hora contienen un total que exceda seis decimales o si el salario excede Aritmética: Procesamiento de datos ASCII y BCD Capitulo 14 acerca de 655,350, el programa limpia e! salario a cero. En la prictica, un programa imprimiria un mensaje de advertencia o tendria subrutinas para superar estas limitaciones. Verificacién de errores. Un programa disefado para otras usuarios, ademés del progra mador, no s6lo debe producir mensajes de advertencia, sino que también debe validar las horas y el sueldo por hora. Los tinicos caracteres validos son los ndimeros desde el 0 hasta el 9 y un punto- decimal. Para cualquier otro caracter, el programa debe mostrar un mensaje y regresar a la peticién de entrada, Una instruccién itil para la validacién es XLAT, que se estudia en el capitulo 15. Come prictica, prucbe su programa completamente para todas las posibles condiciones, como valores cero, ntimeros en extremo grandes 0 pequefios y ntimeros negativos Niimeros negativos. Algunas aplicaciones imptican cantidades negativas, en especial para invertir y corregir entradas. Usted puede permitir un signo menos después de un valor, como 12.34-, 9 precediendo al niimero como ~12.34. El programa entonces puede verificar un signo menos durante la conversién a binario, Por otra parte. puede querer dejar el némero binario- positive y s6lo establecer un indicador para registrar el hecho de que la cantidad es negativa. (Cuando la aritmética ha terminado, el programa, si se requiere, puede insertar un signo menos en el campo. ASCIL Si quiere que el ndmero binarie sea negativo, convierta la entrada ASCII a binario de la forma usual. (Véase ia seccién “Inversi6n del signo” en el capitulo 13 para cambiar el signo de un campo binario.) ¥ tenga cuidade al usar IMUL e IDIV para manejar datos con signo. Para redon- dear cantidades negativas, reste 5 en lugar de sumar 5. PUNTOS CLAVE + Un campo ASCII necesita un byte para cada caricter. Para un campo numérico, la mitad derecha del byte contiene el digito y la mitad izquierda ua 3. * Cambiando los 3 ASCH a ceros se convierte el campo a formato decimal codificado en binario (BCD) desempacado. + Comprimir los caracteres ASCH a dos digitos por byte convierte el campo a dato decimal codificado en binario (BCD) empacado, + Después de una suma ASCII, utilice AAA para ajustar la respuesta: después de una resta ASCI], utilice AAS para ajustar la respuesta, + Antes de una multiplicacién ASCH, convierta el dividendo y divisor a BCD desempacado poniendo los 3 hex de la izquierda en cero, Después de una multiplicacién, emplee AAM para ajustar el producto. + Antes de una divisién ASCII, convierta el dividendo y el divisor a BCD desempacado limpianda los 3 hex de la extrema izquierda y use AAD para ajustar el dividendo. « Para casi todos los propésitos aritméticos, convierta los aimeros ASCII a binario. Cuando convierta de formato ASCII a binario, verifique que los caracteres ASCII sean vilidos: de 30 hasta 39, un punto decimal y tal vez un signo menos. Preguntas PREGUNTAS 144. 142. 14.3. 144, 145. 146. Suponga que el AX contiene ® ASCH (0039H) y que el BX contiene 7 ASCII (0037H), Explique las resultados exactas de las operaciones independicates siguientes: (a) ADD AK,33H fh) ADD Ax, Bx aan AAR (©) sue AK,Bx 14) SUB AX, oDH aas ans Un campo BCD desempacado llamado UNPAK contiene O1040703H. Codi que sv conenido sea el apropiado ASCII 31343735H. Un campo Uamado ASCA conticne el mero decinal ASCII 173 y otro campo llamado ASCB contiene el 5 ASCIL. Cadifique instrucciones para multiplicar los niimeros ASCH juntos y almacenar el producto en ASCPRO. Utilice los mismos campos de la pregunta 14-3 para dividir ASCA entre ASCE y almacene el cociente en ASCQUO, Proporcione los cilculos manuales para lo siguiente: (a) Convertir el mimero decimal ASCIE 46328 a binario y mostrar el resultado en formate hexadecimal; (b) convertit el valor hexadecimal de regreso a ASCH. Codifique y corra un programa que determine el tamaiio de la memoria de la computadora (véase la INT 12H en el capitulo 3}, convierta el tamao a formato ASCII y despligguelo en panialla como se muestra ique un ciclo que haga El tamafio de la meworia es de nnn bytes CAPITULO 15 Procesamiento de tablas OBJETIVO Cubrir los requisitos necesarios para definir tablas, realizar bis- quedas en tablas y ordenar tablas. INTRODUCCION Muchas aplicaciones de programas necesitan tablas que contengan datos como nombres, descrip- clones, cantidades y precios. La definicién y el uso de tablas requiere mucho de la aplicaciém de lo que usted ya ha aprendido. Este capftulo empieza por definir algunas tablas convencionales y después trata métodos para buscar en cllas. Las técnicas para esta bisqueda estan sujetas a la manera en que las tablas estén definidas, y son posibles muchos otros métados para definir y ‘buscar ademas de los dados aqui. Otras caracteristicas muy usadas son él ordenamiento, que reacomoda la secuencia de datos en la tabla, y el uso de listas ligadas, que utilizan apuntadores para localizar elementos en una tabla, La tinica instruccién introducida en este capitulo es XLAT (Traducir). DEFINICION DE TABLAS Para facilitar ta busqueda en ellas, se acomoda la mayoria de las tablas de manera consistente: cada entrada se define con e! mismo formato (cardcier © numérico), con la misma longitud y en orden ascendente 0 descendente, Definicién de tablas 261 Una tabla que ya se-ha usado a lo largo del libro es la pila, que en lo que sigue es una tabla de 64 palabras no inicializadas (el nombre STACK se refiere a la primera palabra de 1a tabla): STACK Dw 64 DUP?) Las dos tablas siguientes, MONTAB y EMPTAB, inicializan valores de.cardcter y numéri- cos, respectivamente. MONTAB define abreviaturas alfabéticas de Tos meses, mientras que EMPTAB define una tabla de mimeros de empleado: MONTAR DB ‘Jan’, ‘Feb’, “Mar’, ‘Dec’ BMPTAB DB 205, 208, 209, 212, 215, 224, ... ‘Todas las entradas en MONTAB son de tres earacteres, y todas las entradas en EMPTAB son de tres digitos. Pero observe que el ensamblador convierte los nitmeros decimales a formato binario, y sino exceden de 255, almacena cada uno de ellos en un byte, Una tabla también puede tener una mezcla de valores numéricos y de caracteres, con tal de que estén definidos de manera consistente, En la tabla siguiente de elementos en existencia, cada entrada numérica (admero de existencia) es de dos digitos (un byte) y cada entrada de cardcter (descripcidn de 1a existencia) es de mueve bytes. Los cuatro puntos que siguen a “Paper” son para ‘mostrar que-deben aparecer espacios; esto es, deben teclearse espacios, y no puntos, en fa descripcién: STOKTML DB 12, ‘Computers’ 14, ‘Paper....",17, “Diskectes*, Por claridad, también puede codificar las entradas de la tabla en lineas separadas: STOKTBLDB 12, ‘Computers’ DB as, DR 17, ‘Diskettes’ EL ejemplo siguiente define una tabla con 50 entradas, cada una inicializada a 20 blancos: STORETAR DB $0 DUP(20 DUP{" *)) Un programa podria usar esta tabla para almacenar hasta 50 valores que se hayan generado de ‘manera interna 0 para almacenar hasta 50 entradas que se lean de un archivo en disco. ‘Tablas en disco En situaciones de] mundo real, muchos programas estin dirigidos por medio de tablas. Las tablas son almacenadas en archivos en disco, que cualquier rimero de programas puede leer de ahi a su segmento de datos para procesamiento. La razén de esta prictica es que el contenido de las tablas cambia con el tiempo. Si cads programa define su propia tabla, cualquier cambio requerirfa que todes los programas redefinieran las tablas y que se reensamblaran. Con tablas ef archivos en disco, slo necesita cambiar ef contenido det archivo, En el capitulo 17 hay un ejemplo de un archivo de tabla. Ahora examinemos maneras diferentes de utilizar tablas en programas. Procesamiento de tablas Capitulo 16 DIRECCIONAMIENTO DIRECTO DE TABLAS ‘Suponga que un usuario introduce un mes numérico tal como 03 y que hay programa para conver- tirlo a formato alfabético —en este caso, March. La rutina para realizar esta conversion pide definir una tabla de meses alfabétices, todos de igual longitud. La longitud de cada una de las entradas es el del nombre mds largo, September: MONTAB DB “yanuary..* DB ‘December. La entrada ‘January’ esté en MONTAB+00, ‘February’ esid en MONTAB+09, ‘March’ en MONTAB + 18, y asi sucesivamente. Para localizar el mes 03, el programa tiene que realizar las. acciones siguientes: 1. Convertir el mes ingresado de ASCII 33 a binario 3. 2. Descomar I de este nimero: 3-1 = 2 (ya que el mes 01 esté en MONTAB +00). 3. Multiplicar ¢l nuevo nimero por 9 (Ia longitud de cada entrada); 2 x 9 = 18. 4. Sumar este producto a [a direccién de MONTAB; el resultado es la direccidn de la descripeidn Fequerida: MONTAB-+ 18, en donde empieza “March” Esta iécnica es conocida como direccionamiento directo de tabla. Com el algoritmo calcu- la de forma directa la direcci6n de la tabla que se necesita, el programa no tiene que buscar de forma sucesiva en cada entrada de ta tabla. Direccionamiento directo, ejemplo 1; Tabla de meses EL programa de fa figura 15-1 proporciona un ejemplo de acceso directo a una tabla con los aombres de los meses. El procedimiento CIOCONY utiliza !2 (December) como entrada y con vierte el mes asf (los nimeros estén en hexadecimal): Carga el mes ASCII en AX: 3132 Utiliza 3030 para KOR: 3030 Desempaqueta el mes: o10z el byte de més a la izquierda né es cero, 0002 impiar y sumar OAH (10 decimal) 000C (12 decimal) El procedimiento DIOLOC determina la posicién actual de las entradas en la tabla: Restar 1 del mes en el AX 000B.(11 decimal) Multiplicar por 9 (longitud de las entradas) 0063 (99 decimal) Sumar la direccién de la tabla(MONTAB) MONTAB+63H. Una manera de mejorar este programa es aceptar meses numéricos desde el teclado y verifi- ear que sus valores estén entre 01 y 12, inclusive. Direccionamiento directo, de tables. TITLE PLSDIREC (COM) -MODEL SMALL oa 1008 BEGIN; JME © SHORT MAINE wimg a. MORIN DB ALPHON DB MORTAR DB 0B 0B DB MATH «= PROC) NEAR CALL © clocoxy CALL = DIOLOC’ CALL «© FLODISP Moy! AX, 400% ier 21H MAIN ENDP. Crocory PROC Moy AML. MowEW MOY AL, Motrrns2 OR AK, 30308 CMP AH oo Se ead Bus AA ADD AL, 10 cag; RET chacory ENDP Drones PROC LEA Dec AL MUL NINE MOvEX Cx, NINE Lp LEA DI, ALFMON REP MOVES’ RET DioLoc | ERDP ODISP PROC wow ERA Ixt RET EXD BEGIN Figura 15-1 Direccicnamiento directo de tabla fonvierte ASCIT a binario: 1g ‘February ", "March ¢ "may june ‘august *, "September! ‘December ' “neverber ° Procedimienta principal Convierte a binaric Localiza el mez Despliega mea en forna alfabética ‘Sale al Das sConfigura el mes jLimpia loa 3 ASCII jgBe del wes 01 al 037 fet, entonces cont inuar ho) entonces Limpiar el AH, corregiy para binario mes en la tabla Corregir para la tabla iMuLeiplics AL por § jIniclaliza el movimiento de $ cars iMueve 9 caracteres A fabsriee) » sPeticién de desplieaue Direccionamiento directo de tablas: ejemplo 1 Direceionamiento directo, ejemplo 2: Tablas de meses y dias El programa de figura 15-2 recupera fecha actual del DOS y la despliega. La funcién 2AH de Ia 21H del DOS envia los siguiemes valores binarios: BEOIN BLoBAYWE BLODAYHR ca onowTe Clomowrnst 366 DLotAMHO Procesamiento de tablas Capitulo 15 PLSDISDA (EXE} Despliega el dia de la semana y el mes MODEL SHALL ISTACK 64 io aL 2 ‘Bunday, § ', ‘wonday, $ ‘Iueeday, $ '; ‘Wednesday, $° Pwreday, ¢ 1) peidays 6) ‘gazurday, # tJanuary $0", ‘February $ ', ‘march ¢ papi § Ort imay 3. t) Sunes) ‘oly 3 Kugust $ ‘! ‘September 5° ‘october § *! ‘November $ ') ‘December 9 PROC PAR MOV AKadata = Intesaliza Mov DS.AK J registra de segnentos MOV ES.AX MOV AK, O690H, CALL QLOSCR Hmpia 1a pantalla CALL Q20CURS iGeleca el curaer mov A, 2a iGbtiene la fecha de hoy INT aut Mov BAVENON,DH Guarda el wes MOU SAVEDAT.DL « fouarda el dia del wes CALL BIODAYR = ;Dempliega cl dia de la semana CALL CLOMONTH «=: Deapliega el nes CALL DIODAYNO = ;Deapliewa el dia CALL BLOINET ifepera por una entrada CALL QLOEGR Hiimpia ia pantalla Mov AK,ACDOH = Sade al DOS ier 2it mor ROE sDeapiiegs #1 dia de la semana a Dia (en aL) «3a LEA Direccién de 13 tabla ADD i mda el deaplazasiento a [Deapliegs eT RET ExoP PROC NEAR sDespliega el mes NOV AL.SAVEMON jobtiene el mes DEC AL sDisminuye en uno MUL ELEVEN SMultipfica por la longitud de la entrads EEA -DU,MONTAR —«“/Direceién de la tabla ABD EXLAK. 1 nds deeplazamionte MOV AL Oa iDesphiega met iit RET NDF PROC NEAR sDespliega dia del aes MOVEX AX, SAVEDAY Obtiene dfa piv TEx Honvierte de binarto OR | -AX,3030H yw ASCIT Mov BXLAK rOuarda el dia en AScIE Figura 15-2 Direccionamiento directo de tablas: ejemplo 2 Direccionamiento directo de tablas 265 Mov AH, O2E espliega Mov DL. Bt Primer digito ir 23H Mov ai, o2e :Despliega Nov BL, BH p segunde digito mt oak RET DiepAYMO | ENDP B1DINeT PROT NEAR vBspera por entrada desde @1 teclade Mov AH, LOH pPeticién de entrada ier leit phlama al BIOS RET e1erwer | BOP Qlosce = PROC NEAR Recorre la pantalla Mov Ax, 06008 Mov BH, 17H rBlance sobre azul Mov Cx, o0g0 Mov DK, 184FH INT 10H rLlama al Bros Qroscr BND Qzocuas PROC NEAR MOV AK, 02H sPeticién para colecar el cursor MOY BH, 00 NOV DH,ia mov DL,24 Int b0i RET qzocuns = ENDP END 0 BEGIN Figura 18-2 (continuacién) AL Dia de la semana (donde Sunday = CX Afo (noes DH Mes (01-12) DL Dia del mes (01-31) ) izado en este programa) El programa utiliza estos valores para desplegar el dia alfabético de la semana en Ia forma “Wednesday, September 12”. Para este fin, el programa define una tabla de dfas de la semana amada DAYSTAB, iniciande con Sunday, y una tabla de meses llamada MONTAB, iniciando en January. Las entradas en DAYSTAB son de 12 bytes, y a cada descripcidn sigue una coma, un ‘blanco, un signo $ y-con blancos a la derecha. La funcién O9H de la INT 21H del DOS, despliega todos los-caracteres hasta el signo $; la coma y el espacio en blanco son seguidos en la pantalla por el mes. El procedimiento BIODAYWK multiplica el dia de la semana por 12 (la longitud de ‘cada entrada en DAYSTAB). El producto es un desplazamiento en la tabla, donde, por ejemplo, Sunday esti en DAYSTAB+0, Monday en DAYSTAB +12, y asf sucesivamente. El dia es des- plegado direciamente de la tabla. Las entradas en MONTAB son de 11 bytes, con cada descripcidin seguida por un blanco y un igno $y espacios en blanco a la derecha, El procedimiento CLOMONTH primero disminvye el 266 Procesamiento de tablas Capitulo 15 mes en uno de manera que, por ejemplo, el mes 01 se convierte en la entrada cero en MONTAB. Después multiplica el mes por 11 (la longitud de cada entrada en MONTAB). El producto esté en. un desplazamicnto de la tabla donde January esti en MONTAB +0, February en MONTAR +11, ete. El mes es desplegado directamente de Ia tabla. E| procedimiento DIODAYMO divide el dia del mes enire 10 para convertirlo de formato binaria a ASCII. Come el ndimero miiximo para dia es 31, tanto el cociente como el residuo sé pueden ser de un digito. (Por ejemplo, 31 dividido entre 10 da un cociente de 3 y un residue de 1.) La funcién 02H de! DOS despliega cada uno de estos dos caracteres, incluyendo el cero inicial para los dias menores a 10; la supresién del cero inicial implica algunos pequefios cambios en e! programa. Al final, el programa espera a que el usuario presione una tecla antes de salir al DOS. Aunque el direceionamiento directo de tabla es muy eficiente, funciona mejor cuando las ‘entradas son secuenciales y en un orden predecible. Por tanto, funcionaria bien para entradas que estan en el orden 1, 2, 3, ...,. 0 106, 107, 108, ...,.0 alm para 5, 10, 15, .... Desafortunadamente, pocas aplicaciones proporcionan un arreglo tan ordenado de valores en la tabla. Una seccién posterior examina tablas con valores que son secuenciales, pero no en un orden particular. BUSQUEDA EN UNA TABLA ‘Algunas tablas consisten en néimeros tinicos sin patron aparente. Un ejemplo tipico es una tabla de ‘elementos en existencia con nimeros no consecutives como 134, 138, 141, 239 y 245. Otro tipo de tabla —come una tabla de ingresos gravables— contiene mérgenes de valores. Las siguientes secciones ¢xaminan ambos tipos de tablas y los requisites para buscar en ellas. ‘Tablas con entradas tinicas En la mayor pane de las compaiiias, los mimeros de inventario por lo comiin no estin en orden ‘consecutivo. En tugar de eso, tienden a estar agrupadas en categorias, con un mimero inicial para indicar mueble © accesorio o para sefialar que esté localizado en cierto departamento. Ademés, ‘con el tiempo algunos elementos son eliminados del inventario y otros son agregados. Como ejemplo, definamos una tabla con mimeros de inventario y sus descripciones relativas. Estas podrian ser definidas en tablas separadas, como STORNOS DB *05',*20", "12" STORDESC DB “Excavators: ‘Lifters’, "Presses ‘Cada paso en 1a busqueda podria incrementar en dos la direceiGn de ta primera tabla (Ia longitud de cada entrada en STOKNOS) y Ia direccién de la segunda tabla en 10 (la longitud de cada entrada en STOKDESC). Otro procedimiento podria mantener un conteo del mimero de ciclos sejecutados y encontrar wna coincidencia con cierta llave de mimero de existencia, multiplicar el contador por 10-y utilizar el producto-como un desplazamiento de la direccién de STOKDESC, Por otra parte, puede ser mas claro definir niimeros de inventario y descripeiones en la misma tabla, con una linea para cada par: STORTAR DB ‘05', Excavators’ ba ‘15 pa ‘a2 ‘Lifters: Bosqueda en una tabla 267 E] programa en la figura 15-3 define esta tabla con seis pares de niimeros de inventario y deseripciones. El ciclo de busqueda en A20 compara el primer byte del miimero de inventario de entrada, STOKNIN, con el primer byte de los mimeros de inventario en la tabla, Si la compara- cidn es igual, fa rutina compara los segundos bytes. Si estos son iguales, el mimero de inventario ha side encontrado y en ASO el programa copia la descripcién de 1a (abla a DESCRN, donde es desplegada, Si la comparaci6n del primero o segundo byte es menor, se sabe que el numero de inventario no esti en la tabla y, en A40. el programa puede desplegar un mensaje de error (no codificado). Si la comparacin del primero o segundo byte ¢s alfa, ¢l programa tiene que continuar la biisqueda; para comparar el nimero de inventario de entrada con el siguiente mimero de inventa- 0 en la tabla, incrementa el SI, que contiene la direccién de la tabla. El ciclo de busqueda realiza un méximo de seis comparaciones. Si el ciclo excede a seis, se sabe que el mimero de inventario no esta en La tabla Verificamos esta légica comparando de forma sucesiva los ndmeros de inventaria 01, 06 y 10 con los elementos en la tabla: * Numero de inventario OF con elemento OS de ia tabla. El primer byte es igual, pero cl segundo byte es menor, asi que el elemento no estd en la tabl + Mimero de invensarie 06 con elemento 05 de ia tabla, El primer byte es igual pero el segundo ¢3 mayor, asf que comparamos la entrada con el siguiente elemento en la tabla: mimero de inventario 06 con elemento de la tabla 10, El primer byte es. menor, asf que el elemento no estd en la tabla. + Nimero de inventario 10 con elemento 05 de la tabla. El primer byte es mayor, asi que comparamos la entrada con el siguiente elemento de Ja tabla: nimeto de inventario 10 con elemento 10 de la tabla. El primer byte es igual y el segundo también, asi que el elemento se ha encontrado ‘La tabla también puede definir precios unitarios. El usuario ingresa un mimero de inventa- rio y la cantidad vendida, El programa podria localizar el elemento del inventario en la tabla, calcula ta cantidad de la venta (cantidad vendida por precio por unidad} y despliega la descripeién y la cantidad de Ia venta, En la figura 15-3, el nimero de elemento es de dos caracteres y la descripcidn es de 10. La programacién de detalles varia para diferentes mimeros de entradas y diferentes longitudes de entradas. Por ejemplo, para comparar campos de tres bytes paxiria utilizar REPE CMPSB, aunque ta instruccién implica al registro CX, el cual LOOP ya utiliza. Tablas con intervals ‘Los ingresos gravables proporcionan un ejemplo caracteristico de una tabla con intervalos de valores, Considere la siguiente tabla hipotética de ingresos gravables, tasas de impuesto y factores de ajuste? INGRESO GRAVABLE($) TASA FACTOR DE AJUSTE. 0-1, 000,00 20 9,00 1,000.01-2, 560.06 as 050.08 2,500.01-4,250.00 1 128.00 4/250.01-6,000.00 20 360.00 6,000.02 y mas 2 390.00 268 Procesamiento de tablas Capitulo 15 rm BROTH: ‘STORTAR | sso | aso: t | vat | PISTABSR (COM) Tabla de :MODEL SMALL CODE, cre (300H OMP SHORT MATE be aae DB '05', "Excavators! DB '10"S+Eifters DB. DB DB DB DB y AL, STORNIEE AL, (St) ae AL, STONING AL, (SIe1] aso ao 3,22 Baa: SESSRRES & BG *98N98 & bésqueda que utiliea CMe pEntrada de nda. de inventaric fInicio de la tabla Bin de la tabla pAeea para guardar pIndetalisa comparacién s#Bxigtencia (2) : rable WNo ag igual, walir igual: Wexistencia(?) - tabla igual, encontrada iMencr, no se encuentra en la tabla iMayor, obtener la siguiente entrada, iNe aptd en la tabla Mostrar mensaje de error jbongitud de la descripeite pDireceién de 1a deseripeién jExtraer la descripcién } de la tabla }Peticién para desplegar descripeiéa de 1a existencia sSale al BOs Figura 15-3 Tabla de basgoeda que usa CMP En la tabla de impuestos, las tasas se incrementan conforme lo hacen los ingresos gravables, El factor de ajuste compensa nuestro impuesto calculado en tasas altas, mientras que las tasas bajas se aplican a niveles menores de ingresos. Las entradas para los ingresos geavables contienen él ingreso maximo para cada paso TAXTAB bo bo po po Bo 1oan90, 20, o9000 250000, 35, 05000 425000, 18, 12500 soana0, 20, 25000 geass, 23, s9000 BOsqueda en una tabla 269 Para realizar una bisqueda en la tabla, el programa compara el ingreso gravable del contribuyente con las emiradas en la tabla y hace lo siguiente, de acuerdo con los resultadns de la comparacién: + Mayor: Incrementa para la entrada siguiente de la tabla, * Menor o igual: Utiliza la tasa y ¢! factor de ajuste asociados Calcula la deduccién de impuesto como (ingreso gravable x tasa de la tabla) ~ factor de ajuste. Observe que la ditima entrada en la tabla contiene el valor miximo (999999), que siempre finalizaria de manera correcta la bisqueda Basqueda en una tabla usando comparaciones de eadenas REPE CMPS es itil para comparar mimeros que son de dos o més bytes de longitud. El programa de [a figura 15-4 define STOKTAB, pero esta vez corregido como un niimero de inventario de tres bytes. Ya que STOKNIN es el primer campo en el drea de datos y STOKTAB es el siguiente, aparecen en el sepmento de datos como sigue: s[O3abitoors...[D49Presses vce [joe La titima entrada de la tabla contiene ‘999° para que termine la busqueda, ya que REPE hace que el CX no esté disponible para la instruccién LOOP. La rutina de busqueda compara STOKNIN (definide de manera arbitraria con 123) con cada entrada de la tabla, come sigue: STOKNIN ENTRADADELATABLA RESULTADO DE LA COMPARACION 123 035 Mayor: examina entrada siguiente 123 038 Mayor: examina entrada siguiente 123 49 Mayor: examina entrada siguiente 13 102 Mayor: examina entrada siguiente 123, 123 Igual: entrada encontrada Bl programa inicializa el Di al desplazamiento de la direceién de STOKTAB (003), el CX a Ja longitud (03) de cada mimero de inventario y el SI al desplazamiento de STOKNIN (000). La ‘operacion CMPSB compara byte por byte, hasta que los bytes sean iguales ¢ incrementa de mane- ra automatica los registros DI y SI. Una comparacién con la primer entrada de la tabla (123:035) ‘causa la terminacién después de un byte; el DI contiene 004, el SI contiene 001 y el CX contiene 02. Para la comparacién siguiente, el Di debe contener 010 y el SI debe contener 000. La correc- ‘cin del SI s6lo implica volver a cargar la direccién de STOKNIN, Sin embargo, para la direccién de la entrada de la tabla el incremento depende de si la comparacién terminé después de uno, dos ‘0 ues bytes, El CX contiene el nimero de bytes que quedan sin comparar, en este caso 02. Sumando el valor de CX mds ta longitud de la deseripcién del inventario da el desplazamiento del ‘elemento siguiente de la tabla, como sigue: 270 ag00 33 32 9003 30 33 & 76 RB eo. a0 33 74 65 20 woup 30 34 na ap Te 68 20 037 31 32 6a 63 7 nots 31 32 073 20 post 39 39 ‘00at 9058 Q00AL a 000 000 ma 9003 BE Da 9005 BE co 9007 Fe 33 35 a 28 a a8 s 3 u " 27 20 as 20 2 45°78 74 GF 4c 69 73 20 so 72 7 20 so 72 7 oF 50 75 20 20 9008 8D 3E 0003 R g00c 200¢ BP oge: 3 900% BD a6 D000 2013 Fy AS 2028 7408 0017 73 019 03 Fo 0015 83 C7 OO1F EB EC 020 2020 we ooo: 0023 8B F? on, Ss 0025 8D 3E COSE R 0038 #3/ a8 oo2a 0020 0031 9033, 2036 os 03s Q035 wa sco aoa 0038 ooac ag 16 OSE R 63 ” 66 20 6s 20 sc 26 “or n 6D 20 Tite STORNIN ‘STORTAB Alo: Aaa: Aso BEGIN Procesamionta de tablas Capitulo 15 page 60,122 PissTneR’ (EXE) BGsqueda utilizando CHPSR MALL MODEL STACK 64 DATA be "123" DB 1035", "Excavators' ;Tnicio de la tabla Da '03a", "Lifters be '049, ‘Presmes op 1203! ‘Valves: De 1123), "Processors: pe 1127", *Pumpa De 1989", 19 DUP(” De 29 DUPI?, '$* PROC FAR MOV AT, edata el ax BS.AK wow HOV cup EBA DI, STORTAR Mov cx,03 EBA $1, S70KNIN se a0 ga Mo. DI,cx prii0 aad Sr, DE ADD ADD owe Moy cx,o5 mov ERA Mov AR, OSH. LEA DX, DRSCRN INT 2 oMP ASO Moy AX, AcoOH INT 2 RET EDP BD BEGTW spin de la tabla sieea para guardar pTnicializa Fegistros de segnentos. snicializa direcctén + de la table. icompara 2 bytes Finke. direccién de gixist }#Exiet + tabla igual, salix |_mener, no hay entrada }Sumar Cx al desplazamiento jSiguiente elemento de la tabla sEatablecer para 5 palabras sDiree. de deserip rObtener descripcién de la tabla Peticién de desplegar ‘Geserip. de exiscencia ptr a ealiz plisga mensaje de errors isale al pos Figura 15-4 Bisqueda cn una tabla usando CMPSB. La instruccion XLAT (traducir) ant Direceion en DI después de CMPSB: 004 Suma la longitud restante en CX: + OH Suma Ia longitud de la descripeién: + OAH Direeci6n del elemento siguiente: O10H Ya que el CX contiene e! mimero de bytes que quedan por comparar (si existen), la aritmética funciona para todas los casos y termina después de una, dos 0 tres comparaciones, En una compa- racién que resulte igual, el CX contiene 00 y el DI ya esti incrementado a la direccién de Ia descripcidn requerida, Entonces, una operacién REP MOVSW copia la descripcién en DESCRN, donde es desplegada. ‘Tablas con entradas de longitud variable Es posible definir una tabla con entradas de longitud variable. Un caricter delimitador especial, como OOH, puede seguir a cada entrada, y FFH podris distinguir el final de la tabla, Sin embargo, debe ascgurarse de que ningén byte dentro de-una entrada contenga la configuracién de bits de un delimitador; por ejemplo, una cantidad aritmética binaria puede comener cualquier configuracién posible de bits. instruceién SCAS para buscar los delimitadores. LA INSTRUCCION XLAT (TRADUCIR) La instruceién XLAT traduce el contenido de un byte a otro valor predefinide. Usted puede utilizar XLAT, por cjemplo, para validar el contenido de los elementos de datos o, si‘transfiere datos entre una PC y una macrocomputadora IBM, para traducir entre formatos ASCII y EBCDIC. E] formato general para XLAT es [[eekaoeear paar [rein operandos] El ejemplo siguiente convierte los niimeros 0-9 ASCH a EBCDIC, Como la representacidn en ASCII es 30-39 y en EBCDIC es FO-F9, puede utilizar una operacién OR para realizar ef cambio. Sin embargo, también convertiré todos los otros caracteres en blanco, EBCDIC 40H. Para XLAT, se define una tabla de traduccién que toma en cuenta todos los 256 posibles caracte- res, con cédigos ERCDIC insertados en las posiciones ASCII: XETBL DB 48 DUP(0H) seepacios en blanco EBCDIC DE OFOH,OF1H,OFZH,OFIH, ...,0P9M | BECDIC 0-# DB Ape DUP(40K) seepactos en blanco ERCDIC XLAT espera que Ia direcciém de la tabla esté en el registro BX y el byte que se va a waducir (lamémoslo ASCNO) esté en cl AL. Lo siguiente realiza Ia inicializacién y traduccién RR BX, XLTBL iCarga 1a direceién de 1a tabla Mav AL, ASCH sCarga el cardcter a ser traducido aur sTraduce a EBCDIC 272 Procesamiento de lables Capitulo 15 TETLE PISXLATE (COM) Traduce ASCE = RECDIC MODEL SMALL Gag 2008 + sElemente ASCII a convertir 6_DURI: +) FELemen eo BBCOLC convert ids MLTAB DB 45 DOP L40R) iTable de traduersén DS SOM, 4nN pa 4H DB OFOH, OF IH, OFZH, OPIN, Pat DB OFSH, OF EH, OP 7H, OFAN, OP SHE DB Ege BUP (ADH) MAIN PROC LEA sDireccidn de ASCNO LER iDireceign de ERCHO mov Huengicud do lor elenentos: aso, pDireccidn de la tabla uppsa, :Obtener carécter en AL maT. [Traducir el cardcter STE [Almacenar AL en ERCNO wor AZo pRepetiy & veces Moy AK, acooH sSalir al pos NT 2H wun -ENDP END BEGIN Figura 18-5 Conversign de ASCII a EBCDIC XLAT uiliza el contenido del AL como un desplazamiento de direceién; en realidad, cl BX contiene fa direccién de inicio de !a tabla y el AL contiene un desplazamiento dentro de la tabla. Si, por ejemplo, el valor en AL es 00 ta direccién de la tabla seria XLTBL+0 (el primer byte de XLTBL con 40H), XLAT reemplazaria el 00 en el AL con 40H desde la tabla Observe que el primer DB en XLTBL define 48 bytes, con direcciones desde XLTBL+00 hasta XLTBL+47. El segundo DB en XLTBL define datos empezando en XLTBL+48. Si el niimero ¢s.32H (50 decimal), la direcci6n de la tabla es XLTBL +50; esta localidad contiene F2 (2 EBCDIC), que XLAT insertard en el registro AL. Ey programa en la figura 15-5 extiende este ejemplo pata convertir el signo menos ASCIL (2D) y el punto decimal (2E) a EBCDIC (60 y 4B, respectivamente) y repetir el proceso en un campo dé seis bytes. En un inicio, ASCNO contiene ~31.5 seguido por un blanco, 6 2D33312E3520 hexadecimal. Al final del ciclo, EBCNO debe contener 60F3FI4BFS40, DESPLIEGUE DE CARACTERES HEXADECIMALES Y ASCII EI programa de la figura 15-6 despliega los 256 nimeros hexadecimales (00-FF), incluyendo Ia mayoria de los simbolos ASCII relacionadas. Por ejemplo, el programa despliega el simbelo ASCII S junto con su representacién hexadecimal, 53. El desplicgue completo aparece en la pantalla como una matriz de 16 por 16: Despliegue de caracteres hexadecimales y ASCII page 60,132 Time | BIEASC# (com La siguiente entrada? Si: Intercanbiar entradas Hacer SWAF igual a st Incresentar a la siguiente entrada de la tabla aBs el final de la tabla? Wo: Pasar 9 G30 Si: gBs SWAP = sf? Si; Pasar a G20 (repetir el ordenamiience) Mo: Terminar el ordenaniento El programa de la figura 15-7 permite al usuario ingresar hasta 30 nombres desde el teclaco, que el programa almacena de manera sucesiva en una tabla llamada NAMETAB, Cuando se han ingresado todos los nombres, el usuario sélo presiona la tecla Enter, sin ningiin nombre, Enton- ces, el programa ordena {a tabla de nombres en secuencia ascendente y los desplega en 1a pantalla. ‘Observe que las entradas de la tabla son todas de longitud fija de 20 bytes, Una rutina para cordenar informacién de longitud variable seria mas complicada. LISTAS LIGADAS (ENLAZADAS) Una iista tigada contiene datos llamados celdas, al igual que las entradas de una tabla, pero sin secuencia especifica. Cada celda contiene un apuntadar (puntero) a la celda siguiente para facili- tar lag bisquedas hacia adelante. (Una celda también puede contener un apuntador a la celda precedente de manera que la bisqueda pueda realizarse en cualquier direceién.) El método facilita agregar y eliminar de tuna lista sin la necesidad de expandirla o contracrla. Para nuestros propésitos, la lista ligada contiene celdss con un niimero de parte (un valor ASCII de cuairo bytes), precio por unidad (palabra binaria) y un apuntador (palabra binaria) ala ceelda siguiente en la lista, que comtiene el siguiente nimero de parte en la secuencia, Por tanto Ia entrada es de ocho bytes de longitud. El apuntador es un desplazamiento desde el inicio de la 276 Procesamiento de tables Capitulo 15 page 60,122 TETLE —-PISNNSRT (EXE) Ordena nombre ingreeadoe deeds la terminal MODEL SMALE STACK 64 MAMEEAR LABEL BYTE jLdsta de pardmetros de nombre MAXHLEN BR 21 } Tongitud maxima NAMELEN DR? nim: de caracteres ingresados para ¢) NAMEPLD «BR 21 DUR,’ *) ) nombre cane DB 33, 20, *$* ENDADDR DW? MESSCL «0B "Name? ', 15° MANECTR «0B 00 MANBTAB «DB = 30 DUP(20 OUP(* ')} ;Tabla de nombres MAMESAY DB = 20 DUP(?1, 1, 39, 8 00 BEGIN = BROC. FAR MOV AX, edaca Inicialize los regiatros Mov DS, AX DS y BS Mov BS, AK eu CALL grocuR rbimpia la pantalla CALL GuocuRs yCoheea el cursor EEA DE, NAMETAB azovogP: ADL BLOREAR iAcepta un nombre GP RAMELEN, 00 iExiaten nde nombres? uz AMO ino, ir @ ordenar GaP NAMECTR, 10 feHan ingresado 30 nombres ce 3a ist, ir a ordenar, CALL Drastor iAlmacenar en la tabla ¢l nombre ingresads UMP RZGLOOF ano: vPin de la entrada CALL g1ocuR sLampiar 1a pantalla CALL QgocuRs jy colocar el cursor CMP RAMECTR, 02 jaSe dngres6 uno o ingtin nombre? JRE AAO bah, salir SAGL | GAGSORT jOrdenar los nombres almacenados SRL KAODISP [Mostrar los nombres ordenades ago MOV AK. 4cooH pSalir al Dos) Ter 218 BEGIN = -ERDP 7 Avepta nombres come entrada, BLoREAD PROC nov LEA DK, MESSCL sDespliega indscacion NT 22K Dic, awe racepta nombre DX, CRLE pRetorao/avance de linea BH, oo Limpia los caracteres después del nonbre BL, NANELEN Obtiene ef contador de cars E25 SbSs8 cx.ax iealovia La lengicud restante Figura 15-7 Ondena una tabla de nombres Listas ligadas (eniazadas) Bae BLOREAD biostoR PLosTOR GiosoRT GLosoRT inoxcus oxcus magpie Mov NAMEFLE(BE),20H ;Deeigna e1 nombre en blanco: mC BK Looe Bao RET BROP. :Almacena nombre en la tabla: PROE ENC) BAMECTR 7Suma al ndmero de nombres cw CEA MOV cx, 20 sBiez palabr: REP MOVSW Hombre (61) a 1a tabla (DI) RET ENDP Ordena los nombres de la table PRoc SUB Dr,40 fDesigna 1a direccién de detencidn MOV ENDADOR, DT mov gwapeeD.oo sDeaigna e1 snieso Tin SEURAMETAE tet tanta moe cx.29 jLongitud de comparact én moo r39 Twonbre siguiaste por aoepalar fev cbr eve oxra Compara el nomhre con el siguiente fee, “See ne hay intereambio eat tdxcus + Tneertanbis vov tax or ‘SI, ENDADDR jake @l fin de la tabla? eet tine! woneionar Gar Sxappun, 0 | aahbe Sigte intercenbio? ie Ste (ak continua ser | Rol fin de!" Sedgnanianto Boe Intercanbia entradas de la tabla PROC Mov oko ridmere de caracteres mov SI;BE REP Movsw" ;Mueve e1 elemento menor para guardarlo voy cx.ug Winere de caracteres Mov BI.ax REP Movs Mueve 1 mayor al menor mov ox.10 LEA 81, NAMESAY REP MOVEW sMusve el guardado al elerento mayor MOY SWAPPED, 03 jSehala que se realizé un intercanbic REY, ENP espliegs los nombres ordenados Roc LEA SI, NAMETAR Figura 15-7 _(continuaciin) 278 Procesamienta de tablas Gapitula 15. R20 LEA DT. NAMESAY Tnicialica el principio de la tabla Moy cx; 10 Cuenta los ciclos REP MOVE Moy AH, os ;Peticin de deapliegue LEA DX, aus INT 2a Dec NAMECTR 283 el Gitime? aNzZ R20 7 RG, tepetir el ciclo RET : aalir kagprsp ENDP. : Limpia la pantalla Qrocna poe MOY AK, OS COR Mov BHI 61H Noy cx. O0 MoV it PE DK, 1547H 10H QuoczR — ENDP Coleca el cursor Qaocurs proc mov AN, 02H sPeticién de colecar el cursor hey BH, 00 iPagina © mov 5x.00 sPosiekGn 00:00 mr 10H RET Qzecuxs END? END Ream Figura 18-7 (continuacién) lista, La lista ligada inicia en el desplazamiento 0000, el segundo elemento en Ia serie esté en 0024, el sercero en 0032, y asi sucesivamente: DESPLAZAMIENTO NO. PARTE PRECIO SIG. DIRECCION 0000 103 12.50 0024 0908 1720 08,95 o016 O016 1827 03,75 0000 024 0120 13.80 0032 0032 o20s 25.00 008 El elemento del desplazamiento 0016 contiene cero como la direccidn siguiente, para indiear q ese! final de 1a lista o para crear una lista circular. El programa en la figura 15-8 utiliza el contenido de la lista ligada definida, LINKLST. para localizar un niimero de parte especifico, en este caso 1720. La busqueda empieza con el primer elemento de la tabla. La légica para usar CMPSB es similar a la de la figura 15-4. El programa compara e] ntimero de parte (1720) con cada elemento de ta tabla y hace lo siguiente, de acuerdo com el resultado de la comparacién: * Igual: La bisqueda ha terminado. * Menor: El elemento no esté en la tabla. * Mayor: El programa obtiene el desplazamiento de la tabla para cl clemento siguiente a ser -comparado. Si ¢l desplazamiento no es cero, la comparacién se repite para cl siguiente elemento; si el desplazamiento es cero, la bésqueda termina sin encontrar al elemento. Puntos clawe 279 ‘Un programa més completo podria permitir al usuario introducir cualquier mimero de parte desde el teclado y desplegar el precio como una cifra ASCII. TIPO, LONGITUD Y¥ TAMANO DE LOS OPERADORES El ensamblador provee de varios operadores especiales que usted puede considerar tiles. Por ejemplo, la longitud de una tabla puede cambiar de vex en vez, y tal vez haya que modificar un programa para tomar en cuenta is nueva definicién y agregar rutinas que verifiquen el final de la tabla, El uso de los operadores TYPE, LENGTH y SIZE puede ayudar a reducir e] nimera de instrucciones que tienen que ser cambiadas Considere esta definicién de una tabla con 10 entradas: TABLEX DW 19 DUR(?) Table con diez palabras El programa puede usar el operador TYPE para determinar la definicidn (en este caso DW), el ‘operador LENGTH para determinar ¢] factor DUP (10) y el operador SIZE para determinar el niimero de bytes (10 x 2, 0 20), Los ejemplos siguientes ilustran los tres operadores: MOV AK, TYPE TABLEX AK = 0002 12 bytes) MOV BX, LENGTH TABLEX — )BK = O00A (10 bytes) MOV CX, SIZE TABLEX CX = 0014 120 bytes) Puede utilizar los valores que LENGTH y SIZE regresan para terminar una bisqueda 0 clasificacién de una tabla. Por ejemplo, si et registro SI contiene Ia direccién de desplazamiento incrementada de una bisqueda, puede examinar este desplazamiento por medio de CMe st.st2z TABLEX El capitulo 27 describe en detalle los operadores TYPE, LENGTH y SIZE. PUNTOS CLAVE + Para la mayoria de los propésitos, se definen tablas de manera que sus entradas cstén relacionadas ¥ tengan la misma longitd y formato de datos. + Disefe tablas con base en su formato de datos. Por ejemplo, las entradas de la tabla pueden ser caracteres 0 numéricas y cada una de uno, dos o mds bytes de longitud. + Recuerde que el niimero maximo para un DB es 256 y que los DW y DD invierten los bytes. Ademas, CMP y CMPSW suponen que las palabras contienen bytes en secuencia inversa. * Si una tabla esta sujeta a cambios frecuentes, 0 si varios programas hacen referencia a la tabla, almacénela en disco. Un programa de actualizacién puede manejar los cambios en. ia tabla, Entonces, cualguier programa puede cargar la tabla del disco y los programas no necesitan ser modificados, + Bajo direccionamiento directo, el programa calcula 1a direccign de una entrada en fa tabla y la accesa de manera directa. 280 Procesamiento de tablas Capitulo 18 TITLE PLSIALS (EXE) so de una Lista Ligeda OBE SMALL Sack pefine 1a pila pata panama be" 720: imanere de parte EMgier es 12238 Tapia an 6 Lista Ligada Se ase, 2a bo iio De 838, 36 bo tei: oe gate, 9 oo age: Oe 138by a2 | be "g205' | De 2800, 8 | cove jtetine seguento de cbdigo | wecrw bpoc aR By ecaca signa direccién de DATASS = Sn Wan Gh registro bs Ge ve op \ Tek br uiMenst Taicialize la direccién de 1a tabla nao mov aut vpiga para comparar 4 nytee Tey Sepkecse Tale, 1a direceion del ¥ do parce | hipe owe iabarte'? tanta nase gua, eeliz hee. } maneL, ne -aged em 1a table By Mo sunt viet ei" ti a1 deeplarantenco he Bros \Gbtlede cl Slsplacemiento del elements elgeiente mov BH (Bri Tee Br Linmusr iso brow Se bilo ele a aleina anteags de Le cable? | ome kro i me Me | ase \3

También podría gustarte