68000 68010 / 68020 Arquitectura y programación en ensamblador Stan Kelly-Bootle y Bob Fowler GRUPO WAITE INFORMATICA PERSONAL-PROFESIONAL Título de la obra original: 68000, 68010, 68020 PRIMER Traducción: Francisco J. López Aligué Diseño de colección: Narcís Fernández Primera edición, agosto 1987 Primera reimpresión, septiembre 1989 Reservados todos los derechos. Ni la to- talidad ni parte de este libro puede re- producirse o transmitirse por ningún procedimiento electfónico o mecánico, incluyendo fotocopia, grabación magné- tica Oo cualquier almacenamiento de in- formación. y sistema de recuperación, sin permiso escrito de Ediciones Anaya Multimedia, S. A. Anaya Multimedia agradece a Apple Com- puter España la cesión de la diapositiva de la cubierta, que representa la placa del Apple Macintosh II. 3 1985 by The Waite Group, Inc. Publicado por acuerdo con Howard W. Sams £ Co., Inc. O EDICIONES ANAYA MULTIMEDIA, S. A., 1989 Josefa Valcárcel, 27. 28027 Madrid Depósito legal: M. 24.617-1989 ISBN: 84-7614-136-X Printed in Spain Imprime: Anzos, S, A. - Fuenlabrada (Madrid) Indice Agradecimientos ........oooooooocooroccrnannn ca DESIRE Dep sy 9 IntrodUCCIÓN: uso o rn cd a AR AE raro ceso 11 1. Conceptos básicos de Microprocesadores ........ooooooococoo ooo... 17 MICTOPTOCESAÑOTES ...ooooooooccoc 17 Aritmética binaria ........oooooconorococrocnnn nro 22 BCD (números decimales codificados en binario) PR IIS Eileen 26 Octal y hexadecimal ......0oooooocorococncccncrco nor rrrn a 29 Algebra de Bo0le .........oooooooooncorocncnororcrr rr 31 Microordenadores (Los tres elementos) .......oooooocoococoroco oo... 37 La unidad central de proceso (CPU) ....ooooooccccocccoccccccncc oo 41 Cómo son las Memorias .......oooooococcoccnor corno corro 47 Software (descripción general) .......ooooooooocococococconnroco roo 54 2. La familia 68000 ooo ccoo oncnr rro 59 IOtTOAUCCIÓN ...ooooocccocor ocn 59 Historia del éxito del 68000 ........ooooocoocccococococroccnrnoo 64 A tiempo 1d q e res o a A rr ss rr 0 ¿BOLQUÉ LO DSZ cios arre aros 0 IE es ma ajo traia 69 3. Modelos de programación del 68000 ...............ooo0oooooorocmooo. Niveles de programación .....ocooooccccrroncarnr rr El set de instrucciones del 68000: Breve introducción .........o..oooo... Modelo dé HIEMOLÍA: oso enero isso asin acrtano cuna sis 0 UE BUE DATO cera vio eii ia Modelo: dé TEBÍSÍTOS: ave ccoro azon avita yo UR E E VUE dlls sa usa seno stes o Modelo básico de registros del 68000 ..........ooooococororccarormo.. Aritmética de registrOS .......40) x Ingr.< 1.500.000) + +(M xv (C x (E<50) x Ingr. >1.000.000) donde cada término individual, llamado variable (o expresión) booleana, se iguala a 1 si es cierto y a O si es falso. Si la respuesta obtenida es un 1, se pasa al punto 3, mientras que si es un 0 se salta al 12, según las instruecio- nes. Evidentemente, si usted es hombre, entonces M (abreviatura de Mujer) es falso e igual, por tanto, a 0, mientras que mM (es decir, No Mujer) es cierto e igual a 1, y así con el resto. Puertas lógicas Elcctrónicamente es posible construir circuitos, llamados puertas, que combinan las señales a su entrada de acuerdo con las reglas del álgebra de Boole. La figura 1.5 indica la representación de dichas puertas en los circuitos. En los micros modernos, estas puertas están formadas por tran- sistores “embutidos”? en silicio. El M68000 tiene, parece que por pura coin- cidencia, 68000 de tales puertas. El anterior micro, el 6800, tenía 6800 tran- sistores, lo que indica la lógica de la firma Motorola para sus numeraciones. En cuanto al 1 y al O, pueden representar dos estados eléctricos diferentes: el O puede asociarse a + 5 voltios y el l a 0 voltios. La función NOT se de- nomina inversor, puesto que realmente invierte el 0 por el 1, y viceversa, Las puertas son los bloques constitutivos básicos de los ordenadores: pue- den interconectarse de infinitas formas para realizar una gran variedad de funciones, tales como la decodificación y la aritmética binaria. Las pastillas IC (circuitos integrados) están disponibles con cientos de variedades, permi- tiendo cualquier combinación concebible al diseñador. Y, si usted consume una cantidad suficientemente alta, puede conseguir una pastilla especial- mente diseñada para sus propósitos que le evitará tener que interconectar muchos circuitos integrados convencionales (Custom). Desde las puertas hasta las sumas Veamos ahora de qué forma el álgcbra de Boole permite diseñar cir- cuitos tales que dan el salto desde la lógica hasta la aritmética. En la figu- ra 1.6 puede verse una tabla de un sencillo sumador binario A + B, donde A y B pueden ser 0 ó 1. Las salidas S y C: S es la suma y Cel acarrco, que, a su vez, pueden ser 0 ó 1 de acuerdo con nuestras reglas de suma binaria. Puede comprobarse que S coincide con la función EOR (OR exclusiva) de A, B, mientras que € es AgB. El circuito de la figura 1.6 se obtiene reem- plazando los símbolos de silicio equivalentes: dos puertas AND, una puerta OR y un inversor. Lo más importante es que, gracias a la tecnología de los 33 Entrada Salida lnurson ee Y (and) 3] C NO Y (nand) A 8 0 NO O (nor) Ml C EOR B Figura 1.5 Puertas lógicas Tabla de verdad a lol|p A*B r(A£ B) o(A*B) v(A*Bl £-(A8B) ENTRADA SALIDA S = Suma = (A*B)J£ (Ag B) C = Acarreo = Ag B AND (Y) (A*B) 8 (AS B) mu (AS B) A NOT (NO) AND (Y) 4 B + 0 rra Figura 1.6 Sumador binario circuitos integrados, pueden incorporarse (integrarse) muchos miles de tales circuitos en una pastilla producida masivamente. El semisumador de la figura 1.6 realiza la suma de dos bits exclusiva- mente, pero no es difícil extenderlo a sumas de 8 y 16 bits con otros tantos circuitos. Un sumador precisa de tres entradas, puesto que, además de los dos bits, hay que tener en cuenta el acarreo precedente, aunque su principio de funcionamiento es idéntico al mostrado en la figura 1.6. Biestables Antes de dejar el estudio de los circuitos básicos de cómputo, debemos analizar una ingeniosa combinación de puertas que nos indica de qué forma 35 ¡Flip! EH— R Entrada en t = 0 ¡Flop! JE A Entrada en t = 1 Figura 1.7 Biestable (Flip-Flop) básico pueden almacenarse electrónicamente los datos. El biestable consiste en dos puertas NOR, conectadas de la forma que indica la figura 1.7. Conectando pulsos en las entradas S (set) y R (reset) de distintas maneras, se consigue que las dos salidas basculen entre los valores 0/1 y 1/0 1! Estas salidas se conservan —**son recordadas'”— mucho tiempo después de que las entra- das que las provocaron hayan desaparecido, de forma que ya disponemos de la forma básica de almacenar 1 bit y de la forma de leer o escribir este . 11 En este punto, recomendamos que el lector consulte obras más extensas dedicadas a la electrónica digital, donde podrá ver cómo funcionan correctamente, sus distintos tipos y la mejor forma de interconectarse. Por otra parte, queremos recordar que a los biestables tam- bién se les conoce como flip-flops (uso directo desde la onomatopeya inglesa) o como “bás- cula”” (por las razones dadas en el texto), aunque cada vez es más común el de biestable. Asi- mismo, las entradas set y reset son una adaptación directa del inglés, que usualmente se con- servan, aunque pueden encontrarse obras que los hayan traducido por su equivalente €s- pañol de “Puesta a Uno” y “Puesta a Cero”. A A A A A A A A valor almacenado. Con una idea semejante a la de los sumadores, pueden conectarse varios de estos biestables en serie, de manera que se obtienen unidades de almacenamiento de varios bits, conocidas como registros. Hemos visto, de forma muy general, cómo existe un equivalente en sili- cio para cada una de las puertas lógicas básicas AND, OR y NOT, y sus derivadas NAND, NOR y EOR. Estas puertas lógicas pueden interconec- tarse para dar lugar a circuitos que realicen funciones mucho más com- plejas, incluyendo la suma binaria y el almacenamiento. Para coordinar el funcionamiento de estas puertas, se precisa otro ingre- diente: el tiempo. En la realidad, la configuración de unos y ceros de las entradas A, B,S y R de las figuras 1.6 y 1.7 llegan como una ristra de pulsos eléctricos de alta velocidad sincronizados por un reloj del sistema. Este reloj controlado por un cristal de cuarzo (que puede estar incorporado al chip de la CPU, o formar parte de un circuito aparte) marca la pauta de ejecución de las ac- tividades de una MPU. En términos generales, cuanto más rápido sea el reloj, más rápido será el ordenador, Un reloj típico del MC68000 funciona con una frecuencia de 8 MHz (8 millones de ciclos por segundo), lo que su- pone un tiempo de ejecución de ciclo de 125 nanosegundos (un nanosegun- do es una milésima de millonésima de segundo, 1/1.000.000.000, el tiempo que necesita la luz para recorrer 30 cm aproximadamente). Microordenadores: Los tres elementos Ahora vamos a hacer un breve análisis de la organización global de un sistema típico de microordenador, con vistas a identificar los elementos constitutivos con prioridad de un posterior análisis más detallado. Veremos cómo un microordenador puede ser visto como “tres cajas negras alrededor de un bus” ”, lus del sistema La figura 1.8 muestra el “bus del sistema”, una especie de caminos de cables, alrededor del cual se disponen los componentes principales, MPU, memoria y E/S, para comunicarse entre sí. 12 Nuevamente hemos de recurrir a emplear un término en su forma inglesa original. Sin embargo, el caso de la expresión “BUS” es uno de los más justificados, por cuanto no existe traducción precisa al español, siendo usado comúnmente por nuestros especialistas, 37 TN RS Bus de control Bul83S/s ¡9p sesng Teclado Pantalla Figura 1.8 Buses de los sistemas microordenadores La memoria La caja denominada memoria, subdividida en RAM y ROM, representa el medio principal de almacenamiento inmediato de datos y programaSyg Cada “pieza” de la memoria posee una única dirección propia que permité un acceso rápido y directo desde la MPU. ROM es la memoria de ““sólo lecj tura”, mientras que la RAM (del inglés Random Access Memory) puede señi leida y escrita. E/S (entrada/salida) La caja única marcada con E/5 (entrada/salida) comprende una multi: tud de dispositivos —unidades de disco,-terminales de usuario, impresoras$ modems, etc.—, cada uno con su circuito de adaptación particular (inter? faz), conocidos como controladores de E/S, soportados por los programé especiales para ello, tales como los circuitos de terminales. La E/S es M parte más visible y con mayor influencia sobre el usuario medio. En el cen tro de nuestros profundos diseños microelectrónicos, debemos hacer sitIG para el usuario medio, tecleando datos y sacando gráficas. El bus del sistema lleva tres tipos de señales: datos, direcciones y CoM5 trol. En algunos ordenadores, estos tres conjuntos de señales están eléctri? camente aislados (cables independientes). A tales tipos se les conoce como sistemas multibus, puesto que pueden identificarse por separado un bus de datos, de direcciones y de control. En sistemas más económicos existe un único bus compartido temporalmente por los tres mediante el esquema co- nocido por multiplexación. Funcionamiento del microordenador En un ciclo de lectura (Fig. 1.9), la MPU toma datos (números o ins- trucciones) en la memoria o en la E/S, enviando las señales apropiadas por el bus de control. Si el bus estuviera ocupado, la MPU deberá esperar du- rante unos pocos ciclos (a lo que llamamos un estado de espera). Cuando el bus está libre, la MPU coloca una dirección en el bus de di- recciones. Esta es decodificada por circuitos especiales de la memoria o de la E/S y, si todo va bien, el dato hallado en la dirección solicitada es lle- vado desde la memoria o E/S al bus de datos. En este momento, el bus de control indica a la MPU que el dato está disponible en el bus de datos. Una vez que el dato es transferido al receptor (buffer) '* de la MPU, el bus de control indica su disponibilidad nuevamente. En seguida veremos de qué forma la MPU maneja los datos recibidos. La anchura del bus de datos (medida en bits) marca el número de datos que pueden ser adquiridos durante cada ciclo de lectura, por lo que cuanto más ancho es mejor. Como veremos, el tamaño del bus de datos juega un papel fundamental en la determinación de la flexibilidad, el rendimiento y el coste de una MPU. El aspecto del coste se debe a que cada bit del bus de datos precisa del correspondiente pin '* en la pastilla de la MPU y de las pistas respectivas en su interior. Cuando se habla de ordenadores de 8, 16 Ó 32 bits, sin más especifica- ciones, debemos entender que se refiere al tamaño del bus de datos de la MPU. Pero tenga en cuenta que algunos vendedores tienden a mentir. Re- cuerde la ley de Gerswhin: “¡No necesariamente!”. En realidad, se precisan cuatro tamaños para caracterizar debidamente una MPU: el del bus de datos, el de la ALU (unidad aritmética y lógica), el de los registros y el del bus de direcciones. Así, ¿quién desea comprar un micro de 8/16/32/20 bits? (por ejemplo, el 68008). El tamaño del bus de direcciones determina el número total de distintas direcciones de memoria (incluyendo E/S) que pueden ser directamente ac- cedidos desde la MPU y que, por tanto, implican la máxima memoria utili- zable. Como en el caso del bus de datos, cuanto mayor, mejor será, pero también más caro resultará. Aquí podemos usar nuestra teoría anterior sobre los mensajes-por-bit. La mayor parte de los micros de 8 bits tiene un bus de direcciones de 16 bits que, como veíamos, puede alojar un máximo 1% Como en las anteriores ocasiones, nos encontramos con expresiones inglesas que son del dominio común en nuestro idioma. Así, pin en lugar de terminal, buffer en lugar de amplificador digital, pero que respetamos con la misma norma de siempre. 39 Bus de direcciones eula)sIs ¡ap sosng Bus de control Paso 1: Petición de lectura Paso 2: Envío de dirección Memoria RAM ¿ ROM ¿ Bus de direcciones PEN Ad] 2ule]sIs ¡ap sesng Paso 3: Recepción del dato Paso 4: Reconocimiénto Memoria RAM j ROM Figura 1.9 Ciclo de lectura de 64K direcciones de memoria (cada una de las cuales corresponde a un byte), puesto que 2'* = 65.536 = 64K. Aunque existen muchas formas inteligentes de acceder a más de 64K con un bus de 16 bits, todas ellas exigen un aumento del coste y del tiempo. La familia 68000 dispone de tamaños de bus de direcciones comprendidos en- tre 20 y 32 bits, lo que significa espacios de direccionamiento comprendidos entre un Megabyte y cuatro Gigabytes. El ciclo de escritura (Fig. 1.10) permite que la MPU envíe dalos a me- moria, o E/S. La MPU indica su intención (solicitud de escritura) al bus de control, y cuando el camino está despejado, coloca el dato en el bus de da- tos y la dirección de destino en el bus de direcciones. Entonces la MPU puede pasar a ejecutar la siguiente instrucción. Recuérdese que el trasiego de datos aparece como rápidas ristras de pul- sos (ceros y unos) sincronizadas por el reloj del sistema. Cuando hablamos de ciclos de lectura o escritura, estamos hablando de períodos de tiempo definidos por la velocidad del reloj del sistema. Resumen del bus del sistema A El bus del sistema enlaza entre sí las principales unidades del ordenador, ' ofreciendo un camino eléctrico entre la MPU, la memoria y la E/S. Por él circulan tres tipos de señales: datos, direcciones y control. Ahora que usted conoce de forma gencral la interacción entre la MPU y el bus del sistema, puede mirar al interior de la MPU y comprender cómo funciona. Aunque existen millones de MPU diferentes, hay una arquitectura “genérica” que sirve para todas. lla unidad central de proceso (CPU) Lo primero que se deduce de la observación de la figura 1.11 es que el microprocesador dispone de tres vías de comunicación con el “mundo ex- : terior””, que son las citadas de los buses de datos, direcciones y control. : Además, dispone también de un bus interno (puede haber incluso varios) que conecta las distintas unidades funcionales de la CPU. De hecho, en el e interior de la CPU, las señales de datos y control circulan por el bus inter- : no, sincronizadas por el reloj del sistema —no distinto del que dibujábamos como regulador del tráfico en el bus del sistema. En correspondencia con los programas de usuario del sistema de orde- nador, el funcionamiento interno de la CPU es gobernado por micropro- gramas almacenados en una ROM interior especial (cesto es cierto para el 68000 y para muchas otras CPU, pero en otros casos se emplea lógica de control cableada). Sigamos el camino de una secuencia típica de eventos: 41 42 Memoria Memona Figura 1.10 lO dde ESC CP ASS EME Bus de control AO E $ Paso 2: Envio de dirección Paso 3: Envio de datos Paso 4: Reconocimiento 2ua]sIs ¡ap sesng Paso 1: Petición de escritura: Bule]sIs ¡9p SOSNG relativas a las operaciones (resultado negativo, resultado cero, re- bose, etc.). Una vez que se han completado los pasos del | al 4, la CPU está dis- puesta para empezar la siguiente instrucción, puesto que, como usted recor- dará, el PC (contador de programa) ya se habia incrementado y, por tanto, contiene la dirección de la siguiente instrucción. Debemos, pues, recordar que, por regla general, las instrucciones están dispuestas secuencialmente en la memoria. Entre las muchas posibles desviaciones de la sencilla ordenación secuen- cial antes citada, una muy común es la denominada de ramificación. En este tipo de ordenamiento, una determinada circunstancia emanada del pro- pio programa (o de su ejecución) requiere la ejecución de una instrucción que se halla fuera de la secuencia normal. La ramificación se consigue me- diante la generación del nuevo valor del PC necesario. Otras desviaciones posibles pueden venir provocadas por errores, ex- cepciones o interrupciones externas. De estos tipos nos ocuparemos en los próximos capitulos, puesto que el 68000 dispone de unos mecanismos úni- cos para el tratamiento de errores y excepciones. Otro interesante hecho es el concerniente a la velocidad rea! con que se ejecutan las cuatro etapas básicas. La velocidad de una CPU se mide en MIPS (millones de instrucciones por segundo). Desde luego, no todas las instrucciones exigen el mismo tiempo, de forma que la medida en MIPS puede resultar engañosa. Una determinada instrucción puede ocupar entre 4 y más de 200 ciclos básicos. Para darnos una idea, el MC68020 funciona a una velocidad mantenida de 2 a 3 MIPS, con puntas de velocidad ocasio- nales de hasta $ MIPS. Prebúsqueda y segmentación Al observar nuestras cuatro etapas —búsqueda de instrucción, decodifi- cación, captura de datos y ejecución—, puede uno imaginarse la enorme ac- tividad del bus, tanto en el sistema total como en el interno de la CPU. En la lucha sin fin para conseguir mavores rendimientos de los sistemas, los diseñadores intentan. obviamente, aumentar la velocidad de ejecución de cada ciclo, especialmente reduciendo la posibilidad de retardos (estados de espera) consecuencia de contenciones del hus o de tiempos de acceso a me- morias lentas. Pero cuando se han alcanzado los limites prácticamente po- sibles, aún queda la posibilidad de aumentar la velocidad solapando opera- ciones, lo que se conoce por concurrencias. Se ve fácilmente que se pueden solapar (ejecutar simultáneamente) varios de los pasos del | al 4. Una estra- tegia típica de prebúsqueda supone tener tres instrucciones en la CPU a un mismo tiempo: en ejecución, en decodificación y una tercera siendo bus- cada. Con el metodo de la segmentación, puede simultanearse un mayor número de instrucciones. Estos métodos exigen, a menudo, disponer de dis- tintos recursos en el sistema, suponiendo que la pastilla de la CPU tenga los Una fuente importante de datos, tanto de entrada como de salida, para la ALU es un área especial de memoria rápida, organizada como registros de longitud fija. A diferencia de los registros temporales y los buffers, éstos si son accesibles para el programador. Registros Los registros juegan un importante papel, porque son los que dan a la CPU su personalidad y le confieren su programabilidad, y los hay de todos los tamaños, formas y colores. El 68000 básico tiene 17 registros de propó- sito general, cada uno de 32 bits. En el capitulo 3 nos ocuparemos con de- talle de este asunto, puesto que la organización de los registros está intima- mente ligada con el set de instrucciones. Cómo son las memorias La memoria rápida más normal en los modernos ordenadores es la me- moria RAM (Random Acces Memory) ''. Hay pastillas de RAM de varios tamaños, y se montan en placas para conseguir un total por placa com- prendido entre 16 Kbytes y 2 Megabytes, y un sistema puede tener más de una de tales placas. La estructura física de la memoria carece de importan- cia para el programador, el cual está interesado solamente en el es j Dirección fisica __—>> Direcciones lógicos Registros de segrrentación | Offset de programa do Sugmento de programa Difsot de datos Segmento de datos 16 bits 16 bits Dirección física Memoria segmentada máx Dirección lógica 20-32 hits Dirección 7 fisica Memoria lineal Control de función máx. CF 68000 0 Dirección lógica 2 Programa superdsor Unmdad Mane: menor de Datos del supendso! de nd os del usuario 1 MC6B451 20-32 bits Memoria lineal con MMU máx Figura 1,13 Menaria serenentada yomnemnornas lnea Segmento 4, de datos Segmento 2 de programma Segmento 3 da prorrama IDLIA Segmento 2, de dutos Memoria Cualquiera amos 51 Memoria Memoria él (de | Megabyte hasta 4 Gigabytes). Con dicho tamaño, las tareas pueden: distribuirse según el óptimo para sus necesidades. La seguridad debe con. seguirse desde “fuera”, y el 68000 está diseñado para ello. Varios chips (pastillas) especializadas, tales como el MC68451 (de Motorola), realizan algo parecido a la seementación. Estas unidades son llamadas unidades de manejo de memoria o MMU. En la figura 1.13 se ve cómo realizan su fun- ción. Los terminales FC (control de función) del 68000 indican automá- ticamente el estado del procesador, que significa cuándo está en modo s pervisor, cuándo en modo usuario y cuándo se trata de datos o de pro- grama. Con estos valores y la dirección lógica real, la MMU construye la! dirección fisica. Además, la MMU puede ofrecer protección contra escritu- ras indebidas en ciertas áreas de la memoria y disponer un espacio separado para operaciones de DMA (acceso directo a memoria). de masas Una de las más importantes caracteristicas de las memorias RAM en l diseño de ordenadores es su volatilidad. En la mayor parte de las RAM se pierde 1oda la información al desconectar la alimentación. Por tanto, es ne- cesario disponer de una memoria permanente, lo que se consigue con d versos tipos de almacenamientos, conocidos como memoria de masas ** tales como discos duros o flexibles, cintas de papel y magntticas. Los programas se almacenan, por lo general, en uno de estos medios, tales como discos flexibles fdiskertes), y deben ser vertidos a la RAM antes de utilizarse. Durante una E tipica de un programa, habrá mucho tráfico de E/S: datos llevados al disco, y datos y programas leidos en el dis- co. El rendimiento del sistema total vendrá, por tanto, muy condicionado por la memoria RAM disponible: cuanto más RAM, menos accesos al disco virtual A menudo, la memoria RAM disponible es bastante menor que la capas cidad de direccionamiento de la CPU. De hecho, mucho tendrán que bajar” los chips de memoria hasta que veamos muchos 68020 con toda la memoria RAM de que es capaz: ¡4 Gigabytes! La técnica llamada de memoría vir- tual (MV), inventada por Ferranti a Nal Gran Bretaña), en 13 mite acceder: a los datos residentes en disco como si de memoria R. AM tratase. La expresión correcta en castellano deberia ser la de memoria permanente, puesto qUe éste es su verdadero significado. Sin embargo, este tipo de memoria es siempre de gran cape cidad (por obvias razones de remiabilidad), lo que ha motivado su actual nombre. No enan, por su obsolescencia, las otrora inevitables memorias de ferritas, que seguram recordarán muchos lectores. lo dicho para el sofware, el firmware ya viene totalmente listo para fun- cionar a la primera. El firmware, desde luego, se escribe y comprueba con mucho más cui- dado antes de ser permanentemente introducido en el sitema. Un buen ejemplo lo constituye el intérprete de BASIC del [BM PCO', costes Los avances espectaculares en la producción masiva de circuitos inte- grados fchips) continúan provocando la caida de los precios. Haciendo un simil, si hubiera ocurrido lo mismo en la industria del automóvil desde hace treinta años, un Rolls-Royce costaria unas 15,000 pesetas. Desalortunada- mente, hoy el sofware se ha convertido en una dificil ocupación, resistente atodos los esbuerzos tendentes a la producción masiva. La programación es una intensa labor, que exige mentes ercadoras e impone salarios crecientes. Los costes del sofrware han resultado ser el factor dominante en todos los proyectos, grandes y pequeños, de ordenadores. En nuestro simil del coche, el mismo Rolls necesitaria un chófer con un sueldo anual de 15 millo- nes de pesetas (¡!) y Funcionaria con una gasolina de 1.500 pesetas el litro (1). A menudo se emplea la expresión de ingeniería software para describir los esfuerzos realizados en orden a conseguir los métodos de producción, tales como la dirección de proyectos y el control de calidad, en la parte más intelectual de la programación, El mayor desafío con que se enfrenta la industria actual de los ordena- dores es la corrección del desequilibrio entre los costes del hardware y los del sofware. La Familia del 68000 fue diseñada “por programadores para programa- dores”? y constituye un intento serio en este sentido, onclusión Aquí se termina nuestro galopar a través de varios de los conceptos más básicos. Muchos de ellos serán ampliados y, esperamos, clarificados en los próximos capitulos. - La familia 68000 En este capitulo se describe someramente la evolución histórica de la fa- milia de microprocesadores Motorola M68000, de forma que podamos si- tuarla en el sitio que le corresponde en el inquieto mundo actual de los micros. Asimismo, deseribiremos algunos de sus componentes y le mostra- remos su aspecto (Fig. 2.1). Por otra parte, le sugerimos que vuelva a leer este capitulo después de haber terminado el 3 y el 4, Varias de las caracteris- ticas discutidas aquí adquieren su importancia a la luz de las instrucciones en funcionamiento. ducción El primer micro 68000 de 16/32 birs (véase figura 2.2), presentado por Motorola en 1979, representó un salto cuántico hacia adelante, en cuanto a potencia y Mexibilidad se refiere. Desde entonces, tal como prometió, Motorola ha desarrollado una familia completa de MPU (unidades de mi- croprocesadores) y circuitos integrados fc/mps) de soporte que van, en pre- cio y rendimiento, desde el **económico”? MC68008, pasando por el 68000, el 68010 y el 68012, hasta el último de 3232 bits, el MC68020. El 68000 me reció el calificativo de supermicro, dejándonos sin los adecuados superla- tivos para calificar el 68020. Para añadir devoración de números (recuer- dese lo dicho en el anterior capítulo) a la familia, ha aparecido el FPFO (coprocesador de coma flotante) MC68881. 59 *) Cortesia de Motorola, Inc Figura 2.1 La familia 58000 Esperamos desvelar aleunas de las características de diseño de la familia Motorola 68000 y señalar los puntos principales en que se tomaron las deci- siones que llevaron a construir esta auténtica ruptura en cuanto a rendi- miento, programabilidad y expectativas de crecimiento se refiere. El chip del microprocesador es una de las más intrincadas realizaciones: del hombre, con densidades VLSI (integración en muy alta escala) cercanas: a los límites teóricos máximos. Hay muchas tecnologias VLSI distintas se= gún las necesidades de densidad y potencia requeridas. Sin embargo, todas: poseen el acrónimo común de MOS (dispositivos de estructura metal óxido. semiconductor). Por ejemplo, el MC68020 ha sido construido mediante el proceso HCMOS (MOS, complemento de alta densidad) ', alcanzando den-: sidades de 200.000 transistores en un sustrato cuadrado de 3/8 de pulgada: (véase la figura 2.3). Desde luego, se halla fuera de los objetivos de este libro el hacer un €s- Los conceptos que aquí se emplean para las distintas tecnologias de fabricación no 50M, en absoluto, ni sencillas ni fáciles de comprender. Para ello, recomendamos que el lector no demasiado experto en el tema consulte alguna de las obras dedicadas a su estudio, que pueden encontrarse en la mayoria de los catálogos de nuestras editoriales especializadas, con excelente nivel y calidad. » 2 , » * . A LL Y iS 0 AS A TA DAA rua 7] | tr A = OFRFEEL PFI Ta tir Cortesía de Motorola, Inc. Figura 2.2 La unidad microprocesadora MOC68000 radios” A A á + Cortesía de Motorola, 15€, Figura 2.3 MC68020 tudio detallado del vasto campo del diseño de los microcircuitos y de la microclectrónica en general. Y Nuestro propósito, por tanto, consiste en ofrecerle un buen conocimien* to de los aspectos más sobresalientes de esta notable familia, centrándo! en aquellos elementos directamente relacionados con el tema central del libro: el ser de instrucciones del 68000. Siguiendo la nomenclatura de Motorola, usaremos el convenio “6 para designar oficialmente la familia en general, mientras que reservamos 4 prefijo “MC” para particularizar aleún chip en concreto dentro de la 1% milia total. En la figura 2.4 se muestra un aspecto general de los miembros 4 constituven la familia y un esquema de cómo deben interconectarse. En Í práctica, raras veces se encuentra una configuración tan lógica. De hech cru MC68000k MC68008 MC68010 MC68020f PROCESAMIENTO MATEMATICO FAMILIA M68000 CONTROL DE BUSES ALMACENAMIENTO EN DISCO CONTROLADORES Fuc6381 MC68452 BAM MC68454 IMDC MC68120 IPC MC68451 MC68440 MC68230 MC68652 MMU DOMA PYT MPCC MANEJO 11068450 MC68901 11068653 ERISnIA DMAC MEP PGC DMA M5800 MC68661 PERIFERICOS EPCI ers DE PROPOsITO | MC68681 GENERAL DUART MC68562 DUSCC MC68564 sio COMUNICACIONES Figura 2,4 Familia A68000 y chips principalmente gracias a los esfuerzos de la propia Motorola, un hus están- dar conocido por **bus VME”” ha merecido la aprobación internacional del ISO y del IEEE”. Su creciente importancia significa que muchos equipos de * 150 son las siglas de la International Standard Organization, e IEEE lo son del Institute of Electrical and Electronics Engineers. Ambas, de la máxima categoria y prestigio mun diales. 63 l O MAA Cortesía de EMS (Sistemas Educ Irvine, Cal vos de Micruordenadores — Etfia utonal Microcomputer Systems—A, ma. Véase el apéndice E para mús detalles. Figura 2,5 Ordenador monaplace basado en el 6000 distintos fabricantes pueden interconectarse con los M68000 y, reciproca- mente, podremos encontrar muchos circuitos de soporte del bus VME en sistemas no Motorola. En la figura 2.5 puede verse un ordenador monopla- ca educativo simple de la familia 68000 (tabricado por Educational Micro- computer Systems, Irvine, California) completo con 20 Kbytes de memoria RAM, 16 Kbytes de memoria EPROM y varios circuitos de E/S. Historia del éxito del 68000 Hoy en día se precisa de bastante más que de una buena relación pre-- cio/rendimiento en el hardware para hacerse un sitio en el mercado. Los j tabricantes de ordenadores y los diseñadores independientes de sofrware ne- > cesitan, también, soporte básico de software con el que construir sistemas orientados al usuario y su software de aplicaciones. Con esta finalidad, Mo- torola fabricó herramientas de desarrollo sofware, tales como el EXOR- macs'Y, EXORset'" y EXORciser'Y, asi como componentes modulares pará la construcción de sistemas tales como los VMEmódulos'* y los VERSA- módulos'”", Todos ellos están soportados por un ordenador central con sistemas operativos desarrollados por Motorola, como el System V/68 derivado del UNIX, ayudas para traducción y comprobación, ensambladores y compi- ladores. Además, Motorola estableció prontamente acuerdos de intercambio de patentes con los principales fabricantes de Estados Unidos, Japón y Europa (véase el apéndice E). Ahora se pueden comprar sistemas 68000 de varios fabricantes. Si no se dispone de estas segundas fuentes, los vendedores ca- recen de garantías y se convierte en poco menos que imposible la penetra- ción en los mercados militar e industrial a ambos lados del océano. El fruto de estos esfuerzos está en las innumerables implementaciones disponibles del 68000. En el apéndice E se relacionan muchos de los fabri- cantes que ya han adoptado estos circuitos. Van desde los gigantes de la in- dustria, tales como IBM, Apple, Honeywell, NCR, 1Cl y Hewlett-Packard, hasta los menores, muy especializados, tales como AlphaMicro, Charles Rives, Alcyon y SBE, pasando por los fabricantes de equipos para consumo de masas, como Sinclair y Commodore. Probablemente no sea descabellado asegurar que el 68000 es el mejor, sino el más conocido en todo el mundo, sistema de microordenadores '. Los circuitos VLSI (integración en muy alta escala) tienen un ciclo de diseño-a-fabricación tan largo y costoso que, como el avión del chiste, se quedan fácilmente obsoletos antes de despegar. Hay dos formas de evitar este peligro potencial: La primera consiste en procurarse la bola de cristal más puro posible y tratar de adivinar la evolución del mercado en los próxi- mos dos o tres años. La segunda se basa en intentar reducir los periodos de diseño, automatizando los procesos de diseño y prueba. Como dijo Oscar Wilde, las predicciones son muy arriesgadas, sobre todo cuando se refieren al futuro. Sin embargo, existe una subindustria dedicada al estudio del mercado y a la intención de futuro del mismo, que hace lo que puede en las situa- ciones más dificiles, asesorando no solamente sobre los tipos de productos que se necesitarán, sino también sobre los muchos impoderables asociados a los mismos, tales como el valor óptimo de la relación precio/rendimiento, reparto de mercado, patrones de consumo y cosas por el estilo. Las cons- tantes fluctuaciones de exceso de stocks, escasez de Oferta, paro y contrata- ción en la industria del semiconductor subrayan el hecho de que la planifi- cación en este campo está aún lejos de ser una ciencia exacta. ' En nuestro país, paradójicamente, parece que son otras familias" las más populares. Sin embargo, esto es sólo el reflejo de una propaganda poco evolucionada, que no comecide con la opinión de numerosos especialistas. 65 A tiempo Una de las principales causas del éxito del 68000 fue, sin lugar a dudas, - el aparecer a tiempo. A mediados de los setenta, la bola de cristal predijo que los micros de 8 bits estarian pronto fuera de juego. De hecho, su gran éxito atrajo la atención hacia aplicaciones más complejas. Los usuarios, tanto comerciales como cientificos, pedian procesamiento cada vez más rá- pido sobre bases de datos cada vez mayores, reservadas, anteriormente, a los macros y minis. Los avances en las memorias de masas de bajo coste (unidades de discos rigidos y flexibles) y de RAM apoyaron estos requerj- mientos de varias maneras. Se precisaba de sistemas operativos v lenguajes más elaborados para poder explotar las crecientes bases de datos. los cuales, a su vez, exigieron sets de instrucciones y de modos de direccionamiento más potentes. Un nuevo mercado El creciente mercado de los ordenadores personales empezó a exigir in- terfaces cada vez más “amigables” (ergódicas). Aunque el aficionado ma- nitas era feliz con los diseños de los interfaces primitivos, el usuario domés- tico y de empresa se preguntaba: “*¿Qué pueden hacer por mi?” y “¿por que son tan dificiles de usar estos aparatos?” Un innegable hecho real es que el aislamiento del usuario de los bits y los bytes supone una enorme sobrecarga del software. Para salvar la falta de eficacia que supone la ergodicidad, se necesita más potencia pura de pro- cesamiento y un espacio de direccionamiento de memoria más amplio, de la misma forma que una caja de cambio automática de coche precisa de un motor más potente para conseguir un rendimiento comparable al cambio manual. Una de las razones de exigir sets de instrucciones más potentes con ca- pacidades de direccionamiento más posibles fue el poder satisfacer las exi- gencias que planteaban los ingenieros del software de los sistemas profesio- nales en sus investigaciones. El proyecto MACSS Motorola se encontró con la situación descrita cuando arrancó el pro- yecto MACSS (sistema de ordenador avanzado en silicio de Motorola) a mediados de los setenta. Se trataba de un desafío habitual en la industria de los ordenadores, cómo reconciliar los dos objetivos fundamentales autoex- cluyentes: crear una nueva generación a la vez que se mantiene la compatli- bilidad con el sofrware y los periféricos actuales. Ya no estaba bien visto el invocar al dios romano Júpiter, al que, según. se dice, adoraban propios y extraños. En el tumultuoso mundo real, el gru- po del MACSS adquirió difíciles compromisos entre los aspectos técnicos y los de mercado, tomando realmente miles de decisiones, unas forzadas por hechos reales y las otras apoyadas en la falible intuición. La existencia de numerosos usuarios supone una sustancial inversión, tanto en hardware como en software, que no puede ser ignorada a la ligera, aunque ello podría significar al mismo tiempo la imposibilidad de conseguir un total aprovechamiento de los avances en la tecnologia del silicio, las ar- quitecturas de ordenador y los métodos de programación. Los adelantos en estado sólido han continuado deslumbrándonos desde la aparición del primer transistor a finales de los cuarenta en los laborato- rios de la Bell. Siempre hay cientos de adelantos en el proceso de fabrica- ción de los IC (circuitos integrados) en alguno de los siguientes aspectos: Predicciones teóricas de los físicos de estado sólido, modelos matemáticos | y simulaciones, pruebas en pequeña escala en 1 + D (investigación y des- arrollo), esquemas piloto para el establecimiento de los métodos de control de calidad y estudios de determinación de la factibilidad económica de la producción en gran escala. Un aspecto crucial para completar el ciclo es la predicción de la demanda del mercado y de la vida útil del producto. Ninguna otra industria se enfrenta, como ésta, a tan delicadas ecuaciones que relacionan costes de creación, volúmenes de producción y coste uni- tario. a herencia La diversidad de CPU aparecidas entre la pionera Intel 4004 (1969 a 1971 y el proyecto MACSS (1976 a 1979) pone de manifiesto la variedad de posibles respuestas. La evolución histórica ha sido “un salto de mata'' de los principales involucrados: Intel, Motorola y Zilog. En 1979, los microprocesadores dominantes eran la Intel 8080/8085, el Zilog 280 y el Motorola 6800 *, todos ellos de 8 bits y no demasiado distin- tos en cuanto a arquitectura global y rendimiento. Aprovechando las facili- dades de las técnicas de integración en mayores densidades, tales como el proceso HMOS (metal óxido de gran densidad), los tres evolucionaron ha- I cia los diseños de 16 bits. Intel y Zilog mantuvieron la compatibilidad del código máquina con la gran cantidad de 8 bits en Funcionamiento, repitien- do la filosofía inicial, tal como muestra, por ejemplo, la secuencia Intel de 8008 a 8080, de SOBOA a 8085; cada uno de ellos, un hermano del anterior pero más rápido. Al aparecer los Intel de 16 bits 8088/8086, se mantuvieron los signos de esta tradición. 1 En honor a la verdad, el micro de mayor éxito ha sido, sin lugar a dudas, el Zilog Z80, a salvo de la popularidad inicial del 8080, debida, principalmente, a su pronta aparición en el mercado. El Motorola 6800, con ser el más prometedor, tuvo su principal virtud en sus “sucesores”", el 6809 y, principalmente, el 68000. 67 Romper con el pasado 8 El equipo del MACSS tomó la gran decisión de romper con el pasado y crear, como si no hubiera existido, el mejor diseño posible de 16 bits. La única concesión a los usuarios del 6800 de $ bits fue la dotación de circuitos de reloj para poder manejar los lentos periféricos sincronos del MC6800, Así, aunque el software tuvo que ser desarrollado partiendo de cero, habia por lo menos una amplia gama de dispositivos de E/S y de soporte ya en funcionamiento. Esta rotura con el pasado fue una jugada muy arriesgada, pero puso de manifiesto la realidad en la que los micros de 8 bits habian evolucionado a su aire, durante una época en que las necesidades de los programadores co- locaban en un segundo plano los requerimientos de los diseñadores de hard- ware. Cuando el primer Intel 4004 de 4 bits engendró el 8088 a principios de los setenta, a este último se le añadieron muchas de las características de una calculadora o de un circuito de control de pantalla de video. Esto no es, en absoluto, una critica hacia aquellos nobles pioneros. El mismisimo Jú- piter no hubiera sido capaz de predecir la explosión de las aplicaciones de los microprocesadores que iba a ocurrir en la siguiente década. Durante esta época, una vez que el set de instrucciones quebaba estable- cido, se desarrollaba un importante cuerpo de sofrware a su alrededor, de forma que las subsecuentes mejoras en las CPU estaban dominadas por la idea de la compatibilidad de los programas —el comprensible deseo de que la nueva máquina pudiera ponerse inmediatamente a trabajar. La lección era muy clara: El nuevo diseño del Motorola de 16 bits de- bería ser de tal forma que las futuras mejoras conservaran la compatibili- dad del sofware sin sacrificar el hardware. Al final, el equipo MACSS ha demostrado tener razón. TABLA 2.1 La familia de los microprocesadores M68000 Modelo MC6S8008 —— MC68000 MC68010 MC6S012 MC68020 Tecnologia HMOS HMOS HMOS HMOS HCMOS Terminales 64 DIP 64 DIP. 64 DIP/68 QP 84 GA 114 SPG Relojes (MHz) 4-12,5 4-12,5 4-12,5 4-12,$ 16,67 Núm. registros 17 17 20 20 23 Longitud de instrucciones (palabras) las las as las 1.4% Tamaño de los registros (bits) nm 3 Ele 32 32 Tamaño de ALU 16 16 16 16 32 Bus de datos $ 16 16 16 8/16/32 Bus direcciones 20 24 24 31 32 Capacidad de direccionamiento 1Mb 16Mb 16Mb 2Gb 4Gb ¿Por qué 16 bits? Tal como vimos en el capitulo 1, los números empleados para identifi- car un micro pueden conducir a errores. Como muestra la tabla 2. l, Incluso entre los miembros de una familia, la estadistica vital varia mucho. Todos los parámetros expuestos están astutamente interrelacionados, y todos tienen su particular significado en el resultado final de la relación precio/rendimiento del circuito. Pero, si hubiera que decidirse por un solo parámetro, el programador elegiría, probablemente, la longitud de la pa- labra de instrucción. Esta impone la riqueza y potencia del set de instruc- ciones, y esto es de la máxima importancia, cara a las consecuencias, para el programador. El ancho del bus de datos, por ejemplo, determina el número de ciclos de lectura/escritura necesarios para acceder a los datos. Pero si la velocidad es la suficiente, ¿qué le importa a usted que el bus sea de | o de 1.000 bits? Desde luego, eso importa al ingeniero y al responsable de ventas (¿cómo puede venderse una máquina de 1 bit?), pero el programador estará con- tento con tal de que los registros sean razonablemente capaces y grandes. El tamaño del bus de direcciones, como hemos visto va, determina el máximo espacio direccionable, y desde luego que todos descábamos libe- rarnos de la tiranía de los 64 Kbytes impuestos por los 16 bits antiguos. Existen varios métodos de manejo de memoria que pueden resolver este problema. La importancia del tamaño de la palabra de instrucción es clara si obser- vamos un código tipico de 8 bits, como el mostrado en la figura 2.6, Aun- que, a primera vista, es capaz de generar hasta 256 códigos diferentes, una vez que se asignan unos bits para determinar el modo de direccionamiento (para incluir en código de operación la memoria o registro sobre los que se Ñ 0 dee 0/1/10 E L JL J | 2 = 32 códigos de operación 4 modos de direccionamiento 00 = Inmediato 01 = Directo 10 = Indexado 11 = Extendido 2 registros 0 = Registro A 1 = Registro B Figura 2.6 Instrucciones de $ hits 8 debe actuar), el total se reduce a 32 códigos de operación diferentes. Ahora, el conflicto está entre el número y tipo de registros, el número de modos de direccionamiento v el número de códigos de operación. Ocho bits es dema- siado restrictivo. El salto dado por Motorola a los 16 bits de la palabra de instrucción cambió el panorama por completo, aunque a costa de una mayor compleji- dad de los circuitos. Capacidad de los chips Los diseñadores hablan de la capacidad de los chips, queriendo signi- ficar cuantas decisiones sobre su capacidad de funcionamiento pueden ha- cerse. Para cada tecnología en concreto (sea NMOS, HMOS, etc.), con la que se consigue una determinada densidad de componentes y superficie del chip, queda establecido el máximo número de puertas lógicas implemen- tables. Esto, a su vez, establece el limite a las caracteristicas y funciones que pueden implementarse en él. y define aquellas que deberán ser realizadas con circuitos externos de soporte. Número de terminales Las funciones escogidas deberán, obviamente, revertir al exterior, por lo que el diseño físico (el ““empaquetamiento'') debe hacerse con todo esmero. Al mismo tiempo que la existencia de los diseños de 8 bits provocaba dudas sobre el posible progreso, el número de terminales de los microchips exis- tentes entonces sumaba otro obstáculo. La disposición estándar de 40 pines tenía la ventaja del bajo coste de fabricación y prueba —y había grandes cantidades de zócalos de 40 terminales dispuestos a recibir estos circuitos—, pero ello limitaba el número de lineas de los buses de datos, dirección y control. A menudo, los diseñadores optaban por la multiplexación tempo- ral o el reparto de los caminos, pero esto es una solución autodestructiva. La solución MACSS consistió en una disposición de 64 pines en DIP (dis- posición en doble fila, una a cada lado del circuito), que permitió mayor li- bertad a la hora de escoger el tamaño de los buses y eliminó la necesidad de la multiplexación o el reparto de lineas entre los huses de datos y de direc- ciones”. La disposición de los terminales se muestra en la figura 2.7. Volviendo al tamaño de las instrucciones, se establecieron vias de comu- nicación entre los buffers y los decodificadores de 16 bits. En ellos, se pue- den colocar hasta 65.536 instrucciones diferentes — Una tarea nada trivial si 7 Esto es, desde luego, el punto de vista de Motorola. En este punto queremos animar al lector a que consulte obras dedicadas a los sistemas Intel o Zilog. Su trascendencia en la práctica ha demostrado que no son tan deficientes como aqui se sugiere. La multiplexación de las lineas supone un ahorro de pistas de comunicación y evitación de ruidos muy respe- tables. lS2239 O — NN 0. > 0 | a Ú qn APODO A OOOO OOOO NOOO oanonanand D la 315 ASIGNACION DE TERMINALES n DO YOU Qmn 32 xr 64 63 62 61 50 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 YUBEBUO E E E UE TD OE UE OT OO UT ODO OOO OOOTDoooDda higura 2,7 Termnales del MOSS0M) D5 D6 D?7 D8 D9 D10 D11 D12 D12 D14 D15 GND A23 A22 A21 VCC A20 A19 A18 A17 A16 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 AS 71 la comparamos con la situación de los $ bits, en que lo códigos v los deco- dificadores se definian casi por si solos. Los registros: Tipo y número Ahora, ya disponemos de suficiente espacio para implementar un con- junto simétrico de órdenes, esto es, para disponer de códigos de operación capaces de trabajar de la misma forma sobre un buen número de registros de propósito general. Con $ bits, la única forma de incrementar el número de registros es haciéndolos de propósito especial, dedicados. Por ejemplo, si la instrucción de suma, ADD, trabaja sólo con el registro Á, no es nece- sario incluir la identificación de A en la codificación de la operación. Como veremos, los registros simétricos son mucho más fáciles de utilizar siguiendo la filosofía de programación del 68000. El paso fundamental estuvo en decidir que todos los registros tendrian el mimo tamaño de 32 bits, incluso en aquellos casos, como el contador de programa o el puntero de pila, en que con 24 hubiera sido suficiente para los fines inmediatos que se perseguian. Motorola estableció un compromiso razonable entre el número y el tipo de registros, decidiendo un total de 16 registros básicos programables, 8 para operaciones generales de datos y 8 para operaciones generales de direc- cionamiento. En algunas instrucciones, se precisaron 3 bits para la codifica- ción del registro (en concreto, para las instrucciones de tipo implicito), mientras que se necesitaron 4 para el caso más general en que deberán poder trabajar con todos los registros. Si ahora lo comparamos con el 6800, que sólo tiene dos registros generales y un indice, podemos apreciar la buena noticia que supuso el nuevo sistema. Datos La palabra de instrucción de 16 bits permite también asignar algunos bits a la selección del tamaño del operando. A pesar de que los registros tie- nen 32 bits y el bus 16 (en el caso del 68000), Motorola quiso ofrecer al pro- gramador una forma sencilla y uniforme de manipular datos en forma de bytes de 8 bits, palabras de 16 y dobles palabras de 32. Para tal misión, se destinan dos bits en todas las instrucciones, con los que se determina qué tipo de dato va a manejarse. A nivel de lenguaje ensamblador, basta con un único código (B, W o L) para efectuar esta misma especificación. Modos de direccionamiento En la misma línea que las instrucciones, el número y capacidad de los modos de direccionamiento han pasado de 4 en el MC6800 a 14, o más, en el 68000. Su importancia se pondrá de manifiesto en los capítulos del 4 al 8. % lementación La última decisión de un diseño, después de haber tratado todos los da- tos importantes —número y tamaño de los registros, capacidad de direc- cionamiento, códigos de instrucción y modos de direccionamiento—, es la forma en que va a ser implementado en silicio. Hay dos caminos para dis- poner las complejas conexiones y los pasos lógicos necesarios para poner el chip en marcha. El método tradicional, llamado lógica random", requiere la especifica- ción completa y con todo detalle de las tareas a realizar, para plasmarse en la red a construir con elementos lógicos discretos que hará lo indicado. Este método lleva a un diseño de chip económico, en el que no se malgasta su capacidad. Sin embargo, a medida que los circuitos VLSI aumentan su complejidad, va siendo más y más difícil esta solución. La lógica random es, sencillamente, demasiado rigida. La alternativa, inventada de hecho por Maurice Wilkes en los primeros dias del EDSAC (Cambridge, 1949-57), se denomina microprogramación, nombre que en aquellos días no se prestaba a confusión tal como hoy ocurre * Microprogramación Motorola adoptó la microprogramación para la realización del núcleo del 68000. Con microprogramación, se tiene algo parecido a una CPU den- tro de nuestra CPU. Cada instrucción es subdividida en subinstrucciones, o si se prefiere microinstrucciones, de la misma forma que un programa ex- terior (un ““macro'*) se reduce a instrucciones convencionales y subrutinas. Por ejemplo, si se describen todos los detalles de la ejecución de una | instrucción de movimiento de datos entre dos registros y, después, se hace la misma operación con la suma de esos registros, se podrá observar que hay muchas *“microrrutinas”* comunes. Estas subrutinas, y todas las demás necesarias, constituyen el microprograma, que está almacenado en una mi- croROM interior. Hay un microsecuenciador que encamina el Hujo de datos y señales de : * En realidad, el adjetivo random es una acepción inglesa que significa “alearorio””, Aqui, tanto en castellano como en inglés, lo que quiere dar a entender es que depende de los deseos del diseñador que, por tanto, son amprevisibles (de ahi lo de aleatorio), De todas ma- neras, se trata de una acepción absolutamente general. Evidentemente, microprogramar no es programar un meroprocesador en el sentido ha- bitual de escribir un programa (BASIC, Ensamblador, etc.) para un microprocesador, sino que se trata de realizar el decoditicador de instrucciones que la CPU debe llevar en su in terior para poder interpretar el significado de las instrucciones del programa a medida que las va levendo en la memoria. 73 control para cada instrucción de acuerdo con el microprograma. Ello su- pone una enorme ventaja en cuanto a flexibilidad de diseño, prueba y ajuste a las necesidades reales, aunque sea a costa de la capacidad del chip. La microprogramación puede ser implementada y comprobada antes de em- barcarse en la costosa fabricación del chip. Conclusión Detrás del microcódigo, el 68000 emplea la nanoprogramación —y asi hasta infinito—. Su estudio nos llevaria más allá de nuestros objetivos, que han sido describir aleunos datos necesarios para su apetito de programa- dor, relativos a las decisiones que condujeron a la realización del 68000, para poder llegar al producto final. En el capitulo 3 nos ocuparemos de las caracteristicas de funcionamiento accesibles al programador. Modelos de programación del 68000 “Tus dones, tus caracteristicas, están en mi cerebro totalmente grabados con memoria permanente,” (SHAKESPEARE, Soneto OXII) En el capitulo 1 nos ocupamos de varios conceptos básicos comunes a todos los microprocesadores, y en el capitulo 2 analizamos algunas de las decisiones relativas al diseño y fabricación enfrentadas por Motorola al abandonar la gama 6800 de 8 bits para saltar al nuevo rango de los 16 y 32 bits de la familia 68000. Tal como vimos, el principal objetivo de Motorola fue la facilidad de programación. Por ello, veremos el 68000 desde el punto de vista del programador. En primer lugar, deberemos identificar con precisión las formas de clasi- ficación de los lenguajes de programación, los distintos papeles que cada uno juega y de qué manera pueden ser empleados por el programador según sus conocimientos del microprocesador. es de programación El término programación cubre un amplio rango de actividades que pre- cisan de muy diferentes conocimientos y apreciaciones. Como se vio en el 7] capítulo 1, todos los programas acaban, antes o después, en un listado de instrucciones extraídas de la memoria del procesador (RAM o ROM) y tra- ducidas en acciones concretas, tal como el acceso y manipulación de datos de otras zonas de memoria. Hay Programadores, y Programas escritos por ellos, de todos los colores Y tamaños. Se puede programar para ganarse el pan de cada dia, para sal- var al mundo libre o por el simple placer de hacerlo. El nivel de detalle ne- cesario sobre la forma interna concreta de trabajar el procesador, tal como el mecanismo para acceder a los datos y programas de la memoria. depende muy fuertemente de los niveles de los lenguajes de programación utilizados. La figura 3.1 ilustra algunas de las principales categorías de software con el fin de darle una idea sobre lo que significa, para Nosotros, el nivel de pro- eramación. Lenguajes de alto nivel El programador con lenguajes de alto nivel, tales como BASIC, FOR- TRAN o Pascal, escribe un programa “fuente” ' que la máquina es incapaz de reconocer sin algunas transformaciones previas. El programador está virtualmente aislado. tanto del procesador como de su arquitectura y su so- porte de memoria. El programador de alto nivel puede centrarse en resolver sus problemas de aplicación en el lenguaje elegido, dejando al compilador o al interprete la tarea de convertir el lenguaje fuente en instrucciones de lenguaje máqui- na que el procesador es capaz de comprender. Estas instrucciones en len- guaje máquina son series inescrutables de unos y ceros que sustituyen a aquellas de “lenguaje inglés” >. que son una forma mucho más natural y ge- nérica de expresar nuestro problema. bres de programas Objeto, ejecutable o listo para correr, con lo que se quiere dar a entender que no precisa de más traducciones Para que pueda ser ejecu- tado. Como puede verse en la figura 3.1, los módulos de código máquina * creados por el compilador se almacenan normalmente en discos, o cualquier Otro mecanismo de almacenamiento masivo, del que podrán ser llevados a | Aunque a lo largo del texto se deduce su sentido, queremos anticipar que por programa “fuente” se entiende aquel que está expresado de acuerdo con ciertas reglas, pero siempre inediante frases y/o órdenes de un lenguaje comprensible para las personas, y que es el que, precisamente, utilizan los programadores (por regla general) para hacer sus programas. - Evidentemente, nuestro lenguaje más natural es el castellano, pero como la totalidad de los programadores debemos, por imprescindible, saber utilizar el inglés (incluso como me- dio de construcción de los programas). Hemos querido respetar la versión inglesa original. * Por regla general, se sobrentiende que el código máquina es aquel que la CPU entiende directamente. Asi mismo, se denomina código objeto a la versión en código máquina de un Programa escrito, inicialmente. en lenguaje de nivel alto o medio. MEMORIA DISCO Código objeto Compilador Código objeto ALTO b "¿Puede enviarme una docena?” Lenguajes naturales Poner todos los niveles a 0 Incrementar el almacén en 12 Lenguajes de diseño Subrutina de facturación Programas informales 10 STOCK = STOCK + 12 Lenguajes de alto nivel: 20 GOSUB FACTURA BASIC, ADA, APL, Algol main () ( a / Lenguajes intermedios int S=0 CPL.C S=S +12 : ADD.W 12,5 Ensambladores JSR BILL 1010011011011101 0111010110110110 Código máquina 1000100011110001 Microcódigo ? > Nanocódigo BAJO Pigura 3.1 Niveles de lenguajes de progranuicion 79 memoria de trabajo cuando sea preciso. La diferencia con los intérpretes consiste en que en éstos cada instrucción traducida es ejecutada inmediata- mente. Para nosotros, estas diferencias no son significativas, por lo que a partir de ahora los englobaremos a todos bajo el denominador común de compiladores. Lenguajes de nivel medio Lenguaje 8| Un lenguaje de nivel medio, tal como FORTH o C, necesita, como los anteriores, de un compilador, pero permite un mayor control sobre el pro- cesador por parte del programador que en el caso del BASIC o del Pascal. de bajo nivel Un lenguaje ensamblador ofrece un detallado control sobre la forma en que el procesador ejecutará nuestras instrucciones. En este nivel de progra- mación se escriben realmente las instrucciones especificas de la máquina en una versión sencilla, simbólica, de mnemónicos fáciles de recordar, tales como ADD, MOVE y SUB *. El apéndice E contiene una relación alfabética de los mismos, cuya forma de actuar es el objetivo de los tres próximos ca- pítulos. Por ahora, lo único que debemos saber es que el lenguaje ensam- blador ofrece un camino fácil de leer el código máquina. En lugar de tener que escribir 0010101100110000, o algo parecido, en código binario para cada instrucción, los ensambladores permiten emplear simbolos más practi- cables y significativos. Hay que notar que, a diferencia de los lenguajes de los otros niveles, cada linea de ensamblador corresponde a una instrucción en lenguaje máquina. Cuando usted escribe una linea en lenguaje BASIC, por ejemplo, el compilador puede generar 50, 100 o más instrucciones en código máquina. Para los programas en lenguaje ensamblador, en lugar de emplear un complicado compilador, nexo de unión entre usted y el chip, se usa un sencillo y rápido ensamblador, que traduce los mnemónicos en códi- gos maquina. Asi, los ensambladores son compiladores sencillos —dan un único salto de nivel en su conversión. Son más sencillos que los compilado- res, porque el salto de nivel es mucho menor. Para trabajar a nivel de lenguaje ensamblador es preciso conocer bien en qué forma el procesador busca Y maneja cada instrucción. Pero, como pronto veremos, las ventajas son grandes: los programas escritos en len- guaje ensamblador son compactos, eficaces y super rápidos —¡v no tan difíciles como pudiera parecer! 3 Aqui queremos recordar lo dicho anteriormente sobre esta terminología: merece la pena hacer el pequeño esfuerzo de recordarlos en el inglés original en que vienen todos los ensambladores de microcódigo y de nanocódigo Dentro del propio nivel de máquina, hay instrucciones escritas en micro- código de forma permanente para interpretación del anterior y, aún más allá, el 68000 dispone de un nanocódigo para interpretar el mierocódigo. Ya apuntábamos en el capítulo 2 que estos esotéricos niveles están fuera del interés normal de un programador, pero nosotros nos beneficiamos de la tremenda flexibilidad que suponen en las etapas de diseño y prueba del chip. Todo nivel tiene ventajas e inconvenientes para cl programador. ración entre los niveles de lenguaje Una de las razones del éxito de los lenguajes de nivel alto y medio radica en el hecho de que los programas pueden escribirse de forma que corran con configuraciones distintas del mismo procesador o, incluso, en procesa- dores totalmente distintos. Para este último caso, todo lo que se necesita es un compilador adecuado al chip de que se trate. Por ejemplo, un programa escrito en el MBASIC'* de Microsoft” funcionará en un Apple, un Radio Shack", un IBM y cientos de otros sistemas basados en muchos procesa- dores distintos, con posibles diferencias sin límite en cuanto a tamaño de su memoria y estructura. Por supuesto, este feliz estado de cosas se debe al es- fuerzo de Microsoft para crear las diferentes versiones de compiladores e intérpretes de MBASIC para todas esas máquinas. Al software que puede funcionar con pocos cambios, o sin ninguno en absoluto, en distintos sistemas, se le llama portátil y, con vista a los cons- lantemente crecientes costes de la programación, es la propiedad más de- seable. Sin embargo, como suele decirse, nadie da nada por nada, hay un precio que pagar por la ““portabilidad''. De la misma forma, hay que pagar un precio por la mayor productividad de programación que suponen los lenguajes de alto nivel: El precio es la menor velocidad y eficacia, así como el mayor tamaño de los programas resultantes * Velocidad, tamaño y eficacia Á medida que uno desciende en la Jerarquía de los lenguajes hacia los ensambladores y la maquina, los programas van siendo menos portátiles y más dependientes del chip. Por otra parte, los niveles más bajos le per- miten un control más directo de las posibilidades del chip, pudiéndose aprovechar las caracteristicas del mismo de formas no accesibles desde ni- veles superiores. En resumidas cuentas, los lenguajes de bajo nivel son más difíciles de utilizar y Menos portátiles, pero son mucho más compactos y corren mucho más deprisa. Con programas típicos de pruebas, los llama- Y El autor se refiere aqui al programa máquina resultante de la compilación, frente al di- recto, obtenido por programación en ensamblador, dos bancos de pruebas (benchmarks), un programa escrito en ensamblador resulta cerca de unas 10.000 veces más rápido que su versión en BASIC, ocupando solamente el 1 por 100 de la memoria. Desde luego, hay muchos factores que determinan el rendimiento de un ordenador, y no es sienifica- tivo acelerar una etapa de la secuencia de funcionamiento de un ordenador, a menos que el resto siga los mismos derroteros. Los propios compiladores son también programas, de forma que quie- nes los escriben deben conocer muy profundamente los procesadores espe- cificos a nivel de lenguaje máquina. Su principal objetivo es la optimiza- ción, para conseguir reducir la sobrecarga que supone la traducción desde alto hasta bajo nivel, y producir el código más eficaz. Por ello, muchos compiladores están escritos en lenguaje ensamblador. Otra forma consiste en escribirlos en lenguaje C, traducirlos a lenguaje ensamblador y tratarlos para conseguir la mejor versión ejecutable posible. En otras áreas de des- arrollo software se emplean técnicas similares, especialmente en el caso de los sistemas operativos, utilidades y en todo el campo de lo que se conoce por sistemas software. Tales programas, empleados en dar soporte a todos los usuarios y grabados en la ROM muy a menudo, deben ser, evidente- mente, los más compactos y eficaces posible. Una regla general, a menudo comprobada, es que merece la pena es- cribir en el nivel más bajo posible los programas de uso frecuente, y ese nivel suele ser el ensamblador. La mayor parte de los actuales lenguajes de alto nivel permite saltar o encadenar a rutinas frecuentemente usadas, aun- que estén escritas en lenguaje ensamblador. A esta posibilidad se la podría llamar como la de *“lo mejor de ambos mundos”. Por esta razón, hoy día se suele exigir que los programadores conozcan varios lenguajes de alto ni- vel y, por lo menos, una versión del ensamblador. Como en los automóvi- les, uno puede pasar de una marca a otra, de forma que los mandos pueden estar dispuestos de distinta manera, pero los principios de conducción son los mismos. Continuando con el simil, el lenguaje ensamblador seria algo asi como deslizarse por detrás del volante de un Ferrari. Hay muchas téc- nicas nuevas que conocer antes de que usted pueda alcanzar su máxima po- tencia, pero caerán poco a poco, y entonces ¡zas!, estará conduciendo con auténtico estilo. Seguridad . Merece la pena mencionar brevemente (porque puede aclarar ciertos aspectos de los niveles de los lenguajes) el hecho de que los editores de soft- ware tratan de proteger sus programas fuente contra la pirateria y los acce- sos ilegales. En muchos casos, el público puede adquirir solamente la ver- sión en máquina de un programa, y aun ésta está protegida contra el uso no autorizado y la copia de muy distintas formas, que van desde las severas ad- vertencias por escrito hasta el empleo de sofisticados medios criptográficos. Hay varios paquetes sofware bien conocidos que pueden adquirirse por 500 dólares, pero cuyo programa fuente vale cinco millones. La clave del asunto está en que el programa fuente desvela la estrategia de la programa- ción y que su conocimiento permite a las personas sin escrúpulos aprove- charse indebidamente de los esfuerzos del programador. El programa fuente puede ser impreso, leido, modificado y recompilado (o reensamblado) y vendido como nuevo con bastante impunidad, mientras que la versión objeto sólo es válida para hacerla correr. Sin embargo, el Homo Sapiens, siendo la astuta especie que es, le dará vueltas constante- mente a la situación. Algunos, pacientemente y de forma manual, seguirán los unos y ceros binarios del módulo máquina para descubrir sus secretos ocultos; otros harán mal uso de los programas especiales llamados descom- piladores o desensambladores, para automatizar esta conversión de má- quina a fuente. Queremos poner énfasis en la expresión hacer mal uso, por- que los descompiladores y los desensambladores son herramientas legítimas en manos apropiadas. Incluso los programadores más brillantes pierden a veces sus propios códigos fuente (de lo que le echamos siempre la culpa al ordenador), por lo que el uso del descompilador no es, en estos casos, nin- gún delito. El punto fundamental es que la mágica estructura del programa fuente puede recuperarse raras veces por medio de la descompilación, y el descifrado de un programa desensamblado (recuérdese lo cerca que estamos del lenguaje máquina) es una forma demasiado dura de ganarse la vida deshonestamente. en de los niveles de los lenguajes Nuestra discusión sobre los niveles puede resumirse de la siguiente forma: Nivel Alto - Fácil de programar y adaptar, portátil, mayor tamaño y más lento. Nivel Bajo = Dificil de programar y adaptar, poco portátil, menor tamaño y más rápido. Para aprovechar la velocidad y potencia del lenguaje máquina, debe usted aprender más acerca de las instrucciones del procesador y de cómo las busca en la memoria, Entonces podrá ocuparse de unos elementos esencia- les (llamados registros) implementados en el interior del chip, que son los que ofrecen al programador control directo sobre el funcionamiento del procesador. et de instrucciones del 68000: ye introducción Ya vimos que el microprocesador, cuando funciona ejecutando un pro- grama, toma la memoria, y entonces obedece una secuencia de instrucciones representadas por secuencias binarias de unos y ceros, en lenguaje máqui- 83 na. Estas instrucciones contienen mucha información empaquetada, que el procesador debe decodificar en el decodificador de instrueciones antes de que pueda saber dónde encontrar los datos, qué hacer con ellos y dónde po- ner los resultados. Después necesita saber dónde conseguir la próxima ins- trucción. Como en la transmisión y recepción del código Morse, deben observarse algunos convenios en los extremos enviador y receptor para que pueda es- tablecerse la comunicación de forma correcta. Uno de los convenios que, obviamente, debe conocer el procesador, es el relativo al número de unos y ceros que deben recibirse antes de empezar a decodificar. En el 68000, las reglas son sencillas: Las instrucciones están en grupos de palabras de 16 bits. La instrucción más sencilla ocupará un mínimo de una palabra. Las instrucciones más complejas requerirán de palabras adicionales hasta un máximo de siete en total. La primera palabra de cada instrucción indicará al procesador si! debe buscar más palabras o no. Asi, el procesador coge de la memoria y decodifica 16 bits de una vez, hasta que ““sabe'? qué debe hacer. Dependiendo de cada instrucción en con- creto, el procesador realizará ciertas tareas. Si la instrucción indica **MOVE datos desde un sitio de la memoria a otro”, por ejemplo, deberá contener información sobre las direcciones de origen y de destino de los datos. Para entender la manera en que estas instrucciones y los datos a los que hacen referencia están dispuestos en la memoria, debemos fijarnos en la organización de ésta en el 68000. Aquí no nos importa nada relativo a las placas de memoria, los chips empleados o si se trata de memoria RAM o ROM. Lo que necesitamos entender es el modelo conceptual de organiza- ción de la memoria, tal y como lo ve el programador. La memoria del 68000 es un modelo de sencillez: exactamente una enorme pila de cajas numera- das. en cada una de las cuales hay un byte de 8 bits. El número de la caja es lo que se conoce como dirección del byte. Modelo de memoria La memoria del 68000, desde el punto de vista del programador, es una simple sucesión de direcciones de bytes, que van desde O, 1, 2, 3.... hasta la máxima dirección permitida. En cada dirección encontrará un solo dato de 8 bits esperando a ser utilizado. Esta simple secuencia de direcciones forma lo que llamamos un espacio lineal de direcciones, en contraste con otras distribuciones más complicadas en las que la memoria está segmentada, tal como la estructura del Intel 8086/8088 (vease el capuulo 1). La máxima dirección permitida viene fijada por el tamaño del bus de di- recciones, el cual, a su vez, depende del miembro de la familia 68000 en concreto que se esté empleando. Los distintos miembros de esta familia del 68000 varian en cuanto al número de lineas fisicas que conforman el bus de dirección (véase la tabla 3.1). TABLA 3.1 Familia 68000: Tumaño de los buses Pamanño ide lamaño del Tumiuto del bus Tamaño de Modelo repistros bus de datos de direcciones la ALU MC68000 32 16 24 16 MC68008 2 8 20 16 MC68010 32 l6 24 16 MC68012 Be 16 30 16 MC68020 2 8/16/12 32 32 La determinación de la máxima dirección alcanzable es un simple ejer- cicio de aritmética binaria. Cada bit que se añade al bus, dobla el número de bytes direccionables de memoria. Un hrs de dirección con una única li- nea fisica sólo podrá apuntar dos direcciones, llamémoslas dirección O y 1. Un bus de direcciones de dos lineas doblará esta capacidad hasta cuatro di- recciones de bytes, digamos 0, 1, 2 y 3. La capacidad de tados los 32 bits del bus de 32 direcciones del 68020 permite un espacio lineal de memoria de 2" - 4 Gigabytes - 4.294.967.296 bytes. Así, las direcciones de los bytes del 68020 pueden ir desde O hasta 4,294,967.295. Es conveniente recordar este limite superior. Aparecerá mu- chas veces como el mayor número sin signo que se puede almacenar con un dispositivo de 32 bits. Asi, le resultará más fácil recordar el binario: EMI III 11111 111111 (cuéntelos) o el hexadecimal: SEFFFEFEFE (cuidado, el **$” significa hexadecimal, no dinero) nportancia de los espacios cionamiento extralargos Durante años, el precio de las memorias ha ido cayendo drásticamente, pero aún tardará un poco antes de que el usuario medio pueda adquirir los 4 Gigabvtes de memoria fisica RAM. Sin embargo, las técnicas de VM (me- 85 Dirección Dirección hexadecimal hexadecimal del byte el de la palabra ] 0 Byte 0 o | Brteo 1 1 2 2 2 | 2 4 4 3 3 6 5 4 4 8 8 5 A A 6 Cc € 7 E E 8 9 Ef Dirección alta, A A byte bajo B fl Dirección baja, ) 15 da byte alto DO N-1 ) N | ByieN N | ByteNn Y N+2 N+2 N+1 N+1 | N+4 N+4 N+2 N+2 Y N+6 N+6 N+3 y N+4 N+5 AAA DIN f: FFFC FEFC FFFF...FF .FFFE L_FEFE 7 0 15 B Palabra ento (Word) Figura 3.2a Modelo de lu memoria del ONO (prinera parte) moria virtual) desarrolladas originalmente por Ferranti Atlas, a finales 06 los cincuenta, están disponibles en los últimos super micros. La VM le pef mite almacenar datos en direcciones de memoria situadas fuera del rangl cubierto por la RAM realmente instalada, con lo que se evita la necesid de instalar toda la RAM necesaria para cubrir el espacio total. Los analist de sistemas están continuamente pensando formas de conseguir que ul Dirección hexadecimal de la doble al palabra Palabra 0 “Pal o| Breo | Bret: Byte2 : Byte3 Palabra 4 ¿ Woid 6 Ss al bres : Bros | Byre6 : Bre7 YU 8 Palabra 8 ¡ Palabra_A 7 Cc Palabra C Palabra E 10 Palabra 10 E Palabra 12 Dirección alta, | palabra baja f : : E Dirección baja, : | NN palabra alta 31 d E A N Í[ ByleN : Byte N+1; Byte N+2: Byte N43 14 N+4 Palabra N +4 ¿ Palabra N +6 E N+8 Palabra N +8 i PalabraN + A CEFFB [AS PEF9 LOPERA FFFS O FFFCÍ FEO | FFFD : FFFE_; FFFF Máxima 31 24 23 1615 87 0 lid Doble palabra (Longword) Figura 3.2b Modelo de la memoria del OS0ODO (serunda purte) cosa aparezca como otra, un arte conocido como emulación. La RAM- disco, por ejemplo, le permite acceder a la RAM como si del disco se tra- tara; pues bien, ¡la VM le permite acceder al disco como si fuera RAM! Lo último en emulación es la máquina virtual, una técnica que permite que un microprocesador funcione como si de otro se tratara (aunque aún no haya sido fabricado). Como veremos en los capitulos 7 y 8, el MC68010 y el MC68020 tienen ciertas caracteristicas que animan a emplear esta técnica. 87 El 68000 tiene 24 de las 32 lineas conectadas al exterior, lo que signi fica un espacio de direccionamiento de =' = 16 Megabytes = 16.777.216 = = $1000000 bytes. | El procesador a “escala reducida'” MC68008 tiene solamente 20 líneas de las 32 interiores conectadas al exterior, lo que significa un espacio de di. reccionamiento de *sólo”” 2 =1] Megabyte = 1.046,576 — 5100000 bytes, ¡Cómo cambian los tiempos! Parece que era ayer cuando nos moriamog por microprocesadores que soportaban 64 Kbytes. El espacio reservado: Sólo para uso del sistema Habiendo establecido nuestro amplio espacio lineal de direcciones, re servemos inmediatamente las direcciones comprendidas entre la 0 y la 1024 para usos especificos esenciales del 68000, conocidas como memoria del tema y datos del sistema. Estas direcciones contienen importantes tablas para el tratamiento de las interrupciones, cargas de Operativos, etc., y me deben ser alteradas por el usuario. Algunas de estas sacrosantas direcciones pueden estar en la ROM, de forma que no desaparezcan al desconectar alimentación, pero seguirán utilizando espacio de direcciones como cual: quiera otra posición de memoria. Habra, con toda seguridad, otras áreas de memoria asignadas perma nentemente a otras funciones vitales y, por tanto, no accesibles al mero! ustiario de programas y datos. A medida que los sistemas y los programas de usuario van siendo más ergódicos, aumentan en complejidad y tamaños Por ello, el gran espacio de direccionamiento del 68000 es una auténtica bendición. Hay muchos micros que llevan 128K de memoria, pero al cargar el sistema operativo y demás programas auxiliares, al usuario le quedan 50 Kbytes, o algo por el estilo. Acceso a memoria Aún nos queda gran cantidad de espacio de memoria disponible, y sus ponemos que tenemos algunas placas de circuitos de memoria para conecta” parte o la totalidad de las direcciones disponibles. ¿Cómo se obtienen los: datos y las instrucciones almacenadas en la memoria? Es preciso observar ell bus de datos del 68000, un camino eléctrico de doble dirección, que conecta la memoria con el procesador. El bus de datos La tabla 3.1 nos trae a colación otro dato importante y significativo de la familia 68000: el tamaño del bus de datos. Este indica cuánta informa- ción puede transferirse en cada ciclo de lectura o escritura de memoria. Un bus estrecho precisará de más ciclos de lectura o escritura para una misma: cantidad de datos. En primer lugar, observemos que las lineas del bus de datos son total- mente independientes de las de los otros buses. Varias CPU están hechas de forma que se ahorran silicio y terminales multplexando o compartiendo temporalmente lineas de datos y direcciones, e incluso otro tipo de líneas. Por bus dedicado entendemos aquel por el que, en cada ciclo de lectura 0 escritura de memoria, los bits del bus de datos pueden transterirse en pa- ralelo, sin tener que esperar a que termine alguna otra actividad anterior de las líneas. Ahora, como los distintos miembros de nuestra feliz familia del 68000 tienen diferentes tamaños de bus de datos (que van desde 8 hasta 22), de- seará saber cómo pueden emplearse las mismas instrucciones de acceso a memoria para todos ellos. He aqui la forma: Cada instrucción, indepen- dientemente del tamaño del bus, incluye una letra L, Wo B, que identifica el tamaño del dato. La CPU lo interpreta, y asi transferirá una doble pa- labra de 32 bits (L), una palabra de 16 bits (W) o un byte de 8 bits (B) a o desde memoria. Cada 68000 realiza la acción apropiada. El número real de ciclos de lectura/escritura es transparente para el programador: una doble palabra precisará 4 ciclos (accesos de 4 x 8 bytes) en cl 68008, 2 en el 68000 y solamente 1 en el 68020. Evidentemente, el 68020 es más rápido, pero el punto que ahora tocamos (otra vez) es el alto grado de compatibi- lidad entre todos los miembros de la familia 68000. El 68000 básico lee 16 bits cada vez, lo que resulta banstante apropiado, puesto que, como ya sabemos, las instrucciones están codificadas en pala- bras de 16 bits, o múltiplos suyos. Pero si lo que se desea es un único byte de la memoria, el proceso empleará también un ciclo, igual que para leer dos bytes. Debido al tamaño de los datos de las instrucciones del 68000, podemos ver su memoria como si estuviera dividida en bytes en las direcciones de bytes, palabras en las direcciones de palabras o dobles palabras en las de dobles palabras. En las figuras 3.2a y 3.2b se muestra cómo se hace esto. He aqui las reglas: Il. Las direcciones de los bytes pueden ser pares o impares. Sus incre- mentos son de l en 1. Las direcciones de las palabras son siempre pares. Sus incrementos son de 2 en 2, Las direcciones de las dobles palabras son también pares. Sus incre- mentos son de 4 en 4, 4. Cuando se accede a una palabra de la dirección N (donde N es un número par cualquiera), el byte de la dirección N es el byte alto y el de la dirección N + 1 es el byte bajo. Vuelva a leerlo bien. Esto sig- nifica que, cuando se mira una palabra de memoria, su byte más significativo está en la dirección más baja, v su byte menos signifi- cativo está en la dirección más alta. Ahora, borde la frase siguiente en un cuadro y cuélguela de la cabecera de su cama: ra Lal Dirección baja/byte alto, dirección alta/byte bajo 89 5. Al acceder a una palabra doble en la dirección N (donde N es up! número par cualquiera), la palabra de la dirección N es la más signi. ficativa, mientras que la de la dirección N + 2 es la menos significa. tiva. Aparece una inversión, como en la regla número 4, a tener en cuenta. De las dos palabras de una doble palabra, la más signi cativa está en la dirección de palabra más alta. Recite la siguiente consigna: Dirección baja/palabra alta, dirección alta/palabra baja 6. Si se intenta acceder a una palabra o una doble palabra en una d rección impar, se conseguirá un mensaje de error. El 68020 es misericordioso, pero por ahora ésta es una sabia regla que debe seguir. Si el 68000 es el primer microprocesador que usted estudia con este de bytes, palabras y dobles palabras. Si no, se dará inmediatamente cuenta de que los puntos 4 y $ son exactamente los contrarios de muchos otro chips. Es como conducir por el lado contrario en Inglaterra —no es y seguir las reglas—. Cuando, en los próximos apartados, lleguemos a los registros, veremos que las reglas de direccionamiento del 68000 son consis tentes y sensatas * Resumamos ahora lo que hemos aprendido de la organización y direc: cionamiento de la memoria en el 68000, Resumen del modelo de memoria e Un gran espacio de direccionamiento lineal. Sin restricciones en el ta= maño del programa (hasta el máximo valor permitido). : * El MC68008 puede direccionar hasta 1 Megabyte. Los MC68000/ 68010/68012 hasta 16 Megabytes, y el MC68020 hasta 4 Gigabytes. e El direccionamiento a bytes (8 bits), palabras (16 bits) o dobles pala- bras (32 bits) se controla mediante códigos especiales en la propia ins-- trucción. e Las direcciones de palabra y dobles palabras son pares. e Las instrucciones de los programas se almacenan como palabras; los] datos pueden tratarse como bytes, palabras, o dobles palabras. * Evidentemente, esta forma de direccionar la memoria resultará familiar a todos los QUe va hayan utilizado microprocesadores de Motorola, aun aquellos de 8 bits, donde los dato% se almacenan en el orden en que estamos acostumbrados a escribirlos sobre el papel. Los qué hayan trabajado con Intel o Zilos, recordarán que las magnitudes de dos bytes se almacés naban en el orden inverso. * La palabra de la dirección N tiene en N el byte más significativo, y en N +1 el menos significativo. e La doble palabra de la dirección N tiene en N la palabra más signifi- cativa, y en N + 2 la menos significativa. * La doble palabra de la dirección N tiene 4 bytes en las direcciones N,N+1,N+2yN+3. os de registros Ahora que ya tenemos una idea general de la forma en que el 68000 di- recciona la memoria RAM y ROM exterior, podemos aventurarnos a cono- cer los dispositivos internos del propio chip, llamados registros, que permi- ten al programador realizar un control directo o indirecto sobre las distintas facetas del funcionamiento del 68000. El corazón de la programación del 68000 está en su potente, aunque sencillo, set de instrucciones. Cada una de las más o menos 60 instrucciones básicas, tales como ADD o MOVE, realiza un paso de programa especifico manipulando o interactuando con el contenido de los registros internos y con la memoria externa, de forma que nuestro modelo de programación deberá incluir los registros y los modos de direccionamiento de la memoria como accesibles al programador, antes de dar sentido al set de instrucciones. Hasta cierto punto, estamos enfrentándonos a una situación similar a un “plato combinado”*, puesto que los registros, los modos de direcciona- miento y las instrucciones están intimamente relacionadas y son mutuamen- te dependientes. Algunas propiedades de los registros del 68000 pueden pa- recer algo arbitrarias, hasta que, en los capitulos del 4 al 6, se describan al- gunas instrucciones que revelen súbitamente la belleza y la simetría del 68000. Le rogamos que espere hasta que describamos cómo son los re- gistros y las muchas Funciones que realizan. ¿es un registro? En primera aproximación, un registro puede ser visto como una pequeña parte de una RAM muy rápida montada en el interior del chip, rápida, de- bido a que los datos contenidos en él pueden ser accedidos y actualizados por el procesador sin necesidad de perder tiempo en realizar ciclos de bús- queda en memoria. Los registros también tienen direcciones numéricas como la RAM, pero sólo a efectos de referencia interna en las instrucciones en lenguaje máquina; el programador en lenguaje ensamblador siempre uti- liza direcciones simbólicas, tales como Dl, PC, o A6. La gran diferencia entre los registros y la RAM es que aquéllos disponen de varias funciones especificas implementadas y están conectados directamente con las unida- des de control del chip para poder llevar a cabo estas funciones. Desde el punto de vista del programador, los registros son unidades “inteligentes” y ultrarrápidas de RAM. 91 Tipos de registros y sus funciones Como vimos en el capitulo 2, una de las principales cuestiones en el d seño de los chips es la que se refiere al número de registros y a cuántas fun. ciones diferentes deben tener. Las siguientes funciones son esenciales y, una u otra forma, deben siempre existir: Areas pasivas de trabajo para retención de resultados intermedios La más inmediata, pero no la menos importante, de las funciones es k de mantener los resultados intermedios de la ejecución de un programa, hecho fundamental ahora es que los datos almacenados en registros int nos pueden ser accedidos y procesados muy rápidamente, con instruccio res sean éstos, más datos (tanto números como direcciones) pueden alma narse listos para ser usados, sin necesidad de malgastar tiempo en intere bios con la memoria externa. Por más rápida que sea la RAM, habrá que emplear ciclos en el cále de direcciones, acceder a los datos, recuperarlos y almacenar los resultad en la memoria. Para alcanzar el máximo rendimiento, siempre intenta alimentar el sistema con datos, de combustible, de los registros. Es un € muy semejante al de las máquinas de calcular de sobremesa: si sólo se pone de un registro, deberemos escribir a menudo los subtotales y volve a introducirlos, mientras que el uso de una máquina con múltiples registros nos evitará este engorro. | Operaciones lógicas y aritméticas Los registros, tradicionalmente conocidos por acumuladores, están nectados con la ALU (unidad aritmética y lógica) para recibir los resultados de sus operaciones. En los primeros microprocesadores habia, por regla ges neral, un único acumulador, obligando al programador a '““barajar'' datof antes y después de realizar cada operación aritmética. Con los registros de datos de propósito general, tal como los existentes en el 68000, se pueden eteciuar las operaciones aritméticas sin necesidad 0 codificar este trasiego de datos. Operaciones de direccionamiento Los registros de dirección ofrecen al procesador las direcciones de moria donde encontrar o salvar los datos. Antes de que una instrucc pueda acceder a la memoria deberá, obviamente, determinar la direcc sobre la que se quicre operar; la forma más frecuente consiste en obten8 ésta información en un registro de direcciones, pero hay otras formas más complejas en las que las direcciones se calculan a partir de dos o más re- gistros. Los distintos microchips emplean distintos esquemas de direccionamien- 010, y $u consecuencia está en los distintos tipos de registros de propósito ¡especial empleados en las distintas tareas fundamentales para el cálculo de la dirección efectiva, donde están los datos precisados por una instrucción. En los Intel 8086/8088, por ejemplo, tal y como dijimos en el capítulo 1, hay registros especiales destinados exclusivamente a contener el valor de los segmentos, de las bases y de indice con los que se genera la dirección efecti- va, Veremos que la estructura lineal no segmentada del 68000 simplifica considerablemente la situación: Hay un único tipo de registros de dirección (del que hay cinco diferentes) y cualquier registro de datos puede emplearse como registro indice. Secuencia de programa El PC (contador de programa) es un registro de dirección especial, dedi- cado a mantener la dirección de memoria donde está la instrucción pre- sente; de esta forma, el procesador sabe dónde está la próxima dentro del programa. Punteros de pila Teóricamente, un puntero de pila es, simplemente, un registro de direc ción empleado para apuntar a una Zona especifica de memoria, conocida como “*pila”” '. Las pilas, como se verá en el capitulo 5, juegan un impor- tante papel como zonas de memoria donde salvar los datos mientras la CPU interrumpe su trabajo para realizar algún otro. La mayor parte de las CPU tiene uno o más registros dedicados a conservar tales direcciones de me- moria. Estado del procesador Bajo diferentes nombres, tales como SR (registro de estado o de esta- tus), PSW (palabra de estado del procesador) o CCR (registro de códigos de condición), se engloban ciertos registros necesarios para contener los * El nombre de “pila'* se debe al concepto de “apilamiento”” sobre la forma en que los datos se almacenan en una zona de memoria. A diferencia del direccionamiento conven cional de la memoria RAM, en este caso, por razones de la urgencia con que se suele utilizar, basta con conocer la dirección del primer dato; el resto viene a continuación, además en un determinado orden preestablecido, uno tras otro, lo que, visualizado como se ha hecho con las direcciones de memoria, supone un verdadero apilamiento. 93 datos relativos a los distintos estados, o condiciones, acaecidos en los suce: sivos pasos del programa. Tipicamente, el procesador marcará los eventos, tales como si el resul. tado de una suma es cero o negativo, poniendo a 00 a l determinados bits del SR. Ciertas instrucciones permiten que el programador compruebe el valor de estos bits y, de acuerdo con ello, se altere o no la ejecución del programa. Otros bits del SR marcan los niveles de prioridad de interrupción. Son los empleados para controlar ciertas vicisitudes que pueden suspender teme poralmente la ejecución del programa en funcionamiento. A tales suspen= siones se les llama, naturalmente, interrupciones. Cuando se solicita una interrupción por parte de, pongamos por caso, una unidad de E/S, la CPU debe decidir la urgencia relativa de lo que esté haciendo en este momento, frente a lo que la unidad de E/S desea hacer. Tal decisión se tomará en fu ción de los valores numéricos de los niveles de prioridad almacenados el SR. Tras esta breve revista a los tipos y funciones de los registros, estam ya en condiciones de abordar el modelo básico de los registros del 68000, Modelo básico de registros del 68000 La figura 3.3 muestra el modelo básico de registros aplicable a todo rango de CPU 68000. A medida que nos movemos desde el 68008 a través del 68000, hasta el 68010 y el 68020, vamos encontrando mejoras del m delo, pero sin abandonar nada en absoluto de los anteriores. Para el pro- gramador se trata de mejoras compatibles —lo que es posiblemente lo mejo que pueda pedirse de un rango completo de microprocesadores. A pesar de que la tecnología del IC, los terminales, los tamaños y for- mas, las velocidades y las capacidades de direccionamiento de los distintt elementos de la familia sean diferentes, la gama 68000 es de mejora compa úble, en cuanto al código máquina se refiere. Los programas escritos pa el 68000, cosecha de 1979, funcionarán sin problemas en el 68020, de 1986. En seguida nos ocuparemos de los cinco tipos de registros de nuestro. modelo, analizando cada uno con detalle: Il. Registros de 32 bits de datos, de los cuales hay ocho, denotados por: Do-D7. 2. Registros de 32 bits de direcciones, de los cuales hay siete, denota- dos por A0-A7. 3. Punteros de pila de 32 bits. Hay dos de éstos: el USP (puntero de: pila de usuario) y el SSP (puntero de pila supervisor). Puesto que en. cada momento sólo uno puede estar activo, a ambos se les denota: por A7; pero debemos recordar que hay dos punteros de pila dife- rentes manteniendo dos pilas distintas (llamadas, naturalmentt, 31 16 15 87 0 A AA AS : i D1 D2 Registros D3 de datos: D4 32 bits D5 D6 D7 31 16 15 0 AA 40 | A1 A2 Registros Ad 32 bits AS A6 31 0 AS VU > Puntero USP (puntero de pila de usuario) de pila: 32 bits 31 23 0 E Contador PC de programa: SSP (puntero de pila del superv.) 32 bits Byte 15 del sistema 87 CCR 0 Registro de estado: 16 bits Piura 3,3 Modelo basico de los rerniros A3 de direcciones: $ pila de usuario y de supervisor), y ambos mantienen sus propios yaz lores, a pesar de compartir una misma denominación (dirección), 4. Contador de programa de 32 bits, del que hay uno solamente, denas tado por PC. Es muy semejante a un registro de direcciones, pere está especializado en retener el valor de la dirección de la instrucz ción en ejecución. Según el modelo de 68000 varía el número de bits efectivos: 24 para el 68000, 32 para el 68020. Registro de estado, del que sólo hay uno, denotado por SR. Sy byte inferior (bits 0 al 7) se llama CCR (registro de códigos de com; LA El CCR tiene cinco indicadores, que se ponen a l o se borran a( para indicar las diferentes condiciones resultantes de cada ope Tación: C = Acarreo Y = Rebose Z =Cero Ñ = Negativo X = Extensión El byte del sistema dispone de uno o varios indicadores (flags) pa saber en cuál de los dos estados posibles se encuentra (bien en el pri vilegiado o en el no privilegiado de usuario), y es este indicador que determina qué numero de pila, SSP o USP, es activo. Además, el byte del sistema tiene una máscara de interrupciones de 3 bits (10% 12) para marcar el nivel de prioridad (0-7), y un indicador para de- terminar si el procesador está en modo traza (una forma de trabajo que permite que el procesador ejecute el programa paso a paso), Registros de datos y de direcciones Los registros de datos y de direcciones son el caballo de batalla dell 68000, y la mayor parte de las o los utiliza de un modo u otro manipulación genérica de Cleo mientras que en los de direcciones A0-A7 estarán las direcciones necesarias para poder acceder o actualizar informa- ciones de la memoria. a la memoria. Las distintas funciones de los registros de datos y de direcciones son un reflejo de la interconexión que hay entre ellos, y de las reglas que gobierne las instrucciones a utilizar. La única operación aritmética que puede pretenderse hacer con un re- sistro de dirección es la de sumarle o restarle alguna cantidad para indicar (ina ) una determinada posición: es muy poce frecuente necesitar multu- ¿plicar o dividir direcciones. Además, las direcciones son siempre magnitudes de 166 32 bits, por lo que careceria de sentido diseñar registros de direccio- nes capaces de manejar bits o bvtes. Todo esto se refleja en el set de instrucciones, al haber algunas de ellas que actúan sólo con registros de datos o de direcciones, O que, quizá, ae- tían de distinta forma con cada uno de ellos. Estas excepciones aparentes “pronto aparecerán bastante lógicas y naturales en el contexto del 68000, Los registros de datos han sido diseñados para trabajar con todo tipo de operaciones aritméticas y lógicas y, dado que su tamaño es de 32 bits, tam- bién pueden utilizarse como registros indice. de los registros Todos los registros de datos se comportan de la misma manera, asi como todos los registros de direcciones, que lo hacen igual, de forma que, compa- rado con muchos otros microprocesadores, hay muchas menos personaliza- ciones que recordar. Si se compara el 68000 con sus rivales más directos, veremos que Moto- rola ofrece un conjunto de registros muy claro y simétrico y una uniforme estructura de 32 bits para datos y direcciones. Un set de instrucciones que goza de esta uniformidad se suele llamar ortogonal y, aunque incrementa la complejidad de la CPU, facilita enormemente la programación. Ahora, veamos los registros de datos con más detalle, deteniendonos en las subdivisiones básicas de sus 32 bits y la forma en que la CPU las utiliza. istros de datos Todos los registros de datos, DO a D7, son como el mostrado en la fi- gura 3.4. Los bits se enumeran desde el O, en el extremo de la derecha corres- pondiente al LSB (bit menos significativo), hasta el 31, el MSB (bit más sip- nificativo). Hay que acordarse de que la numeración empieza en el 0, a la derecha, hasta el 31, a la izquierda. Si no se respela este convenio, se con- seguirán espectaculares “resultados”'. El bit 1 es el segundo por la derecha. Los 32 bits pueden utilizarse en casi todas sus combinaciones (si usted se ve inclinado a ello, puede utilizar los bits S, 19 y 28, por ejemplo); sin em- bargo, el set de instrucciones ha sido concebido para la más rápida ac- tuación sobre las tres subdivisiones más comunes, que son: Doble palabra de 32 bits: una por registro de datos Palabra de 16 bits: dos por registro de datos Byte de 8 bits: cuatro por registro de datos 97 Bit de Doble palabra = 32 bits | signo 0 LSg msg 31 24 23 16 15 87 . [byte menos significa [byte más significativo) Bit d Bit de ADE Palabra alta = 16 bits signo Palabra baja = 16 bits | MSB LSB MSB LSB Byte bajo =8 bits Byte alto = 8 bits 23 16 15 8 ; MSB LSB MSB LSB Byte alto = 8 bits Byte bajo = 8 bits Bit de signo N 7 0 MSB LSB Figura 3.4 El reentro de datos D1 Antes Destino 0000 [1011 [0010] 0011| 1100 | 011+| 0011 1100! E a D2 Ántes de MOVE, doble palabra desde D1 a D2 Después D2 41E|F[1|¡5|A F Después de MOVE, doble palabra desde D1 a D2 Figura 1,5 Operación con doble palabra: MOVE 1 Con menor frecuencia, podemos precisar trabajar con la subdivisión en cuatro-ocho nibbles de 4 bits cada uno, pero este aspecto lo dejamos hasta que tratemos de las operaciones en BCD (binarios codificadas en decimal) en el capitulo 6, La figura 3.4 muestra los nombres aplicados en estas subdivisiones. Se habla de palabra alta y palabra baja en una doble palabra, y de bytes alto y bajo en una palabra. En el apartado de memoria aparecían los direccionamientos de bytes, palabras y dobles palabras. Por tanto, no es inesperado que en las opera- ciones con registros de datos tengamos las mismas posibilidades. 99 Origen 4|E|F 31 Antes Destino Bl2l3ic|7|3|c|Y> 2 Despu A Después de MOVE, palabra desde Dl a D2 Figura 2,6 Operación de palabra. MON EM Códigos del tamaño de los registros La mayor parte de las instrucciones trabaja en los tres modos, es decir, dobles palabras, palabras y bytes, lo cual viene indicado por las letras L, W y B en la instrucción. Así, se indica qué parte del registro es la afectada: el total para la doble palabra, la palabra inferior para la palabra, o el byte in- ferior para el byte. Veamos ahora cómo funciona esto, centrándonos en la instrucción: MOVE para llevar los datos de un registro a otro. Siempre se llevan los da- tos desde el registro fuente hasta el de destino. El formato de la instrucción MOVE es: MOVE. , 100 a — pr Nuestros ejemplos son: MOVE.L D1,D2 MOVE.W D1,D2 MOVE.B D1,D2 Supongamos que, inicialmente, Dl contiene el decimal 1.324.440,200 = =5$4EFISABF ($ = hexadecimal) y que D2 contiene el 186.894.140 = $0B23C 73C. En la figura 3.5, la instrucción MOVE.L D1,D2 lleva la doble palabra de Dl a D2. Como esperábamos, D2 acaba teniendo el valor $4EF1SASF, Se han transferido los 32 bits. El registro fuente queda con su valor inicial. Origen 31 16 15 0 Antes Destino D2 B|2 713 Antes de MOVE, byte desde Dl a D2 0 Después D2 B1213|C|7 8|F Después de MOVE, byte desde D1 a D2 hieura 3,7 Operación de byte: MOVE AB 101 Aritmética de registros Código de tamaño de datos y rango numérico El signo 102 En la figura 3.6 se ha cambiado el tamaño a MOVE.W. Esta vez, sólo |, palabra inferior de D2 es la afectada: toma el valor de la inferior de DI. 1 superior, en ambos, queda con su valor inicial. Finalmente, en la figura 3.7 se ha hecho un transvase en modo byte. lamente se transfiere el byte inferior (bits 0-7) de Dl al byte inferior de DI Los tres bytes superiores de D2 permanecen inalterados. Resulta de gran utilidad en muchos casos tener la posibilidad de Opera; sobre unas partes de los registros, dejando las demás inalteradas. En al nos ordenadores, el movimiento de un byte, como el de la figura 3.7, pued precisar de tres o más pasos, o quizá incluso de un registro más. Dado que la principal misión de los registros de datos es la suma, debe mos fijarnos ahora en la aritmética de los registros de 32 bits. Como ve remos, de la misma forma que con los MOVE, pueden realizarse cálculos en 8, 16 y 32 bits. También, como entonces, las operaciones de sumas ef bytes y palabras no afectan las partes altas de los registros. La elección de tamaño determinará el rango numérico cubierto. Tal y como vimos en el capitulo 1, a cada bit que añade el diseñador sé dobla el rango del registro y, por tanto, su exactitud numérica. Asi, cuantí mayores sean los registros, mayor exactitud se alcanzará —de ahi la excita ción que produjo el paso desde los registros de 4 bits a los de 8, y de ahí alos de 16 bits. La búsqueda interminable de mayor exactitud está hoy en los 80 bits de los registros disponibles en el coprocesador 68881 de Mo O rola y similares devoradores de números—. Como veremos, hay muchdl trucos de programación útiles para combinar los registros con vistas a con seguir la que se llama resultados en multiprecisión, pero lo importante 6$ disponer del hardware que lo haga. Como vimos en el capítulo 1, los registros de 32 bits cubren un rango Sim signo que va desde 0 hasta + 4.294.967.295, mientras que con complement9 a 2 se cubren los números con signo dentro del rango desde —2.147,483,64 hasta +2.147.483.647. Con la notación del complemento a 2 (véase la tabla 1.1 del capitulo 1) vetamos que los números negativos tienen su bit 31 (el situado a la izquierdi del todo) a 1, mientras que los positivos, incluyendo el cero, tienen el bit a 0. Por tanto, a ese bit se le denomina como el bit de signo. De torma similar, en las operaciones con números de 16 v 8 bits en —=— “€. Registro DeUa +2,147 483.647 positivos De -2.147.483,648 a 1 negativos Bit de signo . 0 0 De0a +32.767 positivos Palabra (W) De 32.768a 1 negativos Bit de signo a) De O a + 127 positivos Byte (B mí, De 128a | negativos Bit de signo Números con signo Y 3 0é— sg y De O a +4.294.967.295 LSB 15 o MSB De Oa +65,535 MSB > y 438 MSB De U a 255 Números sin signo Figura 3.8 Rungo de los números COn Y MIR SINO tación de complemento a 2, el bit de signo está, respectivamente, en las po- siciones 15 y 7, indicando asi el signo de la palabra, o del byte. La regla importante para los números con signo es: Bit de signo = 0 para los números positivos (incluyendo el cero) Bit de signo = | para los números negativos Para los números sin signo, desde luego, este bit representa su valor bi- nario normal (2", 2 6 2'). Los números sin signo no disponen, evidente- mente, de bit de signo: emplean todos los bits disponibles para alcanzar el rango positivo máximo. En la figura 3.8 pueden verse los rangos alcanzados con cada tamaño de datos: L, W y B. 103 Acarreo 104 Ahora, si usted se asoma a un registro de datos, verá una fila de 32 bite ceros y unos en abundancia. El 68000 no da especial importancia intrinsen a estos bits; puede tratarse de números con o sin signo, o de caracteres me numéricos. Se obedecerá sin preguntas a cualquier operación legal que g programe sobre este registro. Si, por ejemplo, usted decide una operaciór tal como ADD para sumar **1'” al registro, la CPU tratará el contenido del registro como un número. Pero a la pregunta de: ¿Debe conocer la CPUÉ el contenido del registro es un número con o sin signo?; la Tespuesta es:¡No! Resulta que ADD es una operación que funciona igual con nú ros de uno y otro tipo, con tal de que el resultado esté en los rangos de tos en la figura 3.8. Dado que los rangos varian entre los números con y sin signo, el 68 proporciona dos indicadores diferentes en el CCR (registro de códigos de condición). El indicador V (rebose) = 1 avisa de que se ha superado él rango con signo. El indicador C (acarreo) = | indica del mismo hecho para los números sin signo. En seguida veremos cómo funciona esto. Lo impore tante es que la CPU no debe sacer cuándo el programador utiliza uno u otra dición resultante de sus operaciones. Es discrecional, por parte del progras mador, decidir hacer uso de ellos o no. Si se emplean números con signo, el indicador C es irrelevante, pero el V es de importancia crucial. Si, por el contrario, se emplean números signo, el V no tiene importancia, mientras que el C es crucial (sólo hay posible excepción a esta regla durante la división sin signo. Nos ocupg mos de esto en el capitulo 5). Tanto el indicador Y como el C están adaptados al tamaño de los datos que se empleen en las instrucciones. Sumando, por ejemplo, en modo byte, el indicador referirá resultados que sobrepasan el valor 255 para los casa sin signo, o el rango + 127 a —128 para los números con signo. VeamoS esta situación. Primero detalladamente para el C. Los registros sin signo son algo asi como los cuentakilómetros de los: coches: tras un cierto kilometraje vuelven al O, perdiéndose el 1 vital (que sig nificaria 100.000 kilómetros), con lo que se vuelve a ser el orgulloso propit= tario de un coche (o registro) sin casi kilómetros. El mismo resultado se ob- tiene sumando 1 a un registro de 32 bits que contenga el valor 4.294.967.29$ El resultado correcto de la suma es: 4.294.967.296 = 2" = 100000000000000000000000000000000 Sin embargo, ¡ay!, hacen falta 33 bits para este resultado, por lo qué: nuestro registro, haciéndolo lo mejor posible, nos da solamente los 32 bi z más bajos a cero. El registro nos da un resultado de 0 en lugar del correct0' de ¡4.294.967.296! r fortunadamente, a diferencia del cuentakilómetros del coche, el bn más significativo no está perdido. Está en el bit C del registro CCR. Este bit puede chequearse. Si está a 0, significa que no hubo acarreo; si ésta |, significa que lo hubo y podemos obrar en consecuencia. En nuestro caso, debemos comprobar que el resultado es 2” en lugar de 0. (En Jara esto.) definitiva, el bit C es una extensión de nuestro registro de datos, con «que las sumas son de, en realidad, 33 bits. Sin embargo, hay un solo CCR, con lo que el único bit C debe servir ra los 8 registros de datos. Si no se comprueba inmediatamente después realizada cada operación, se corre el riesgo de que la próxima lo altere, lo que reaparece el error de los 4.294.967.296, Para manejar estas si- yaciones, se dispone del misterioso bit X (extensión). Por regla general, el X se pone al mismo valor que el C, pero hay muchas instrucciones que alteran el bit C, pero no el X. Por el momento, podemos considerar que el bit X es una especie de memoria de C. Al detectar un acarreo, debemos rea- lizar algunas operaciones antes de corregir la situación. Si durante ellas se pierde el bit de C, aún conservaremos el X. Si se trabaja con palabras, se producirá un acarreo cuando la palabra menos significativa sobrepase el limite 65.535; de la misma forma, si se tra- baja con bytes, se producirá el acarreo al sobrepasar el valor 255. Esto, “nuevamente, es muy uniforme y favorable para el programador. El código de tamaño de datos hace muchas cosas por nosotros. El bit de acarreo indica, también, otro tipo de peligro de la aritmética 'sin signo. Si se restan dos números sin signo y el resultado es negativo (por ejemplo, 1-2 =—1), el resultado será almacenado erróneamente en un re- gistro sin signo. En este caso, el bit de acarreo indica que se ha producido “un cambio en el límite alto de la operación de resta. Ási, el programador e comprobar el estado del indicador de acarreo tras las restas y tomar medidas de ajuste necesarias. La multiplicación estándar sin signo del 68000 no precisa comprobar el estado del bit de acarreo. En este caso, la multiplicación de dos números de 16 bits sin signos nos da un perfecto resultado de 32 bits y siempre pondrá acero (borrará) este indicador. No es posible exceder los límites. 9 y extensión: Resumen En la suma hay un indicador o bit C (acarreo) del CCR que nos previene ante las sumas sin signo que puedan exceder el límite impuesto para las ope- raciones con 8, 166 32 bits. Tanto el C como el X (extensión) se ponen a 1 cuando se produce un acarreo, o un cambio de signo. El bit de X se con- serva para usos posteriores, aunque se borre el C. El programador puede comprobar el indicador de acarreo y tomar las medidas correctivas nece- sarias. 105 Rebose El indicador o bi Y (rebose) sirve para evitar errores en la aritmética: con signo. Para entenderlo, veamos un ejemplo de tal aritmética. Usare solamente 4 bits, pero el caso es inmediatamente extendible a 8, 16 y 32, sumamos 1 y —1, tendremos: Decimal Binario =1. == 111l(complemento a 2) Fl = 0001 SUMA 0 = 1000 Tenemos un resultado correcto en los bits del O al 3, con lo que podemos norar el acarreo en el bit 4. Es decir, esto explica que el C carece de impor= tancia en la aritmética con signo. En la suma en complemento a 2, se des cartar simplemente. Ahora sumemos 6 +7 + 6= 0110 7= 0111 SUMA =13 - 1110??? = —2 (complemento a 2) + Aqui obtenemos un resultado falso, a pesar de no haber acarreo. ¿Por q está equivocada la suma en complemento a 2? La razón estriba en que + está fuera del rango con signo de 4 bits (-8 a +7). De la misma forma, cuando sumamos dos enteros con signo en 32 bits, el indicador de acarreo no nos previene del rebose de los limites. Para pre- venir contra la violación del rango comprendido entre —2.147.483.648 y + 2.147.483.647, el 68000 debe ser mucho más sinuoso. Debe compro los bits de signo de los dos enteros, asi como los acarreos desde el bit al 31. Los detalles carecen de importancia, con tal de comprender el res tado final: Si el indicador Y es puesto a | en nuestra operación con signo, resultado es incorrecto —habremos excedido los límites legales del modo ed complemento a 2. 4 Nuestra discusión sobre los rangos de los registros, los bits de signo, acarreo y rebose, ha preparado la escena para nuestro próximo tipo de ré gistro: los registros de direcciones. Registros de direcciones Los siete registros de direcciones de 32 bits, denotados por A0-A6s: pueden almacenar un valor del mismo rango que los registros de datos. 106 tonces, ¿cuál es la diferencia? La diferencia reside en las subdivisiones per- mitidas de esos 32 bits. Nunca se permite el modo de byte en las operaciones con registros de direcciones P Los registros de dirección están hechos para trabajar con direcciones largas de 32 bits o cortas de 16, por lo que estamos limitados a dobles pa- labras o palabras al manejar de AO a A6 (y también con A7). A pesar de que el 68000 realiza un direccionamiento basado en los 32 bits, se emplea el formato de 16, que permite circunscribir la memoria fisica entre límites de 64 Kbytes, cuando se puedan evitar ciclos del bus, El 68000 dispone de una caracteristica propia en cl manejo de las direcciones de 16 bits, denominada extensión del bit de signo. Veamos cómo funciona. El modo de doble palabra de los registros de dirección es exactamente igual que para los registros de datos: están involucrados los 32 bits en la forma vista en la figura 3.4. Veamos el primer movimiento de la figura 3.9. DI está como antes, pero ahora llevaremos la doble palabra a AO en lugar de D2. El resultado final es el mismo: los 32 bits de Dl se copian en los de AO, El movimiento de palabras a los registros de dirección es distinto, y la diferencia es importante. La segunda parte de la figura 3.9 muestra el efecto de llevar una palabra desde DI hasta AO. Esta vez queda afectado todo el efecto AO de destino, no solamente la palabra inferior. La palabra inferior de AO se copia de la inferior de D1 de la forma usual, pero la palabra supe- rior de AO se carga con el valor del bit de extensión de DI. El bit de signo al que nos referimos es el bit de signo (el 15) de la pa- labra inferior de DI, que en la figura es O. Este O se copia en todos los bits desde el 16 hasta el 31 de AO. El resultado final es que AO, como un todo, refleja el valor y el signo de la palabra fuente, es decir, de la palabra infe- rior de DI. Como resultó que la palabra inferior de DI era positiva (bit de signo = 0), se forzó a que AO fuera también positivo, haciendo que su bit 31 fuera igual a 0. En la figura 3.10 puede verse qué ocurre si la palabra menos sienifica- tiva de DI es negativa, con el bit de signo (el 15) igual a 1. Un movimiento de doble palabra de Dl a AO funciona de manera normal, pero el movi- miento de palabra fuerza a todos los bits de la palabra alta de A0 al valor 1. La extensión del bit de signo ha obligado a que AO conserve su signo, en de los registros de dirección Los registros de dirección contienen valores de direcciones completas de 32 bits, pero el trabajar con 16 bits ahorra tiempo y memoria en muchos casos. La extensión del bit de signo preserva la integridad aritmética sin necesidad de preocupar al programador con ello. 107 108 Ántes 31 16 15 0 de MOVE, Destino doble palabra a0l1 ">. *»M Después de MOVE, doble palabra D1 — AO palabra D1 — AO: Figura 3.9 Extensión del hu de seno en operaciones de palabra con registros de dirección: bu de steno = 0 Bit de signo de la palabra baja 1010 1.0001 abren Ántes de MOVE, doble palabra D1 — AO AO Después de MOVE, doble palabra ¡AO D1 - AO Bit de signo de la palabra baja — 1 Después de MOVE, palabra D1 — AO 7 Pi A lcd. FF |F Piura 3.10 Exrensioón del bat de signo en operaciones de pulabra con rernsiros de dirección: bitode signo 1 109 A continuación, vamos a ver el importantísimo registro SR (registro de estado), que, como vimos, tiene dos bytes de importantes datos, uno pa el sistema y el otro para el usuario. Byte del sistema El byte más sieniticativo del SR es el llamado byte del sistema. Su nor. bre se debe al hecho de que es un área protegida en la que se almacenan datos referentes al funcionamiento de todo el sistema. Puede ser leido por: todos los usuarios, pero sólo puede ser escrito (alterado) cuando la máquina. está en el estado privilegiado de “supervisor”. Tal como puede verse en la figura 3.11, cinco de sus bits están dispues= tos de la siguiente manera (los bits 12 y 14 se usan en el 68020 solamente, y se analizan en el capitulo 8): Bits 8-10 = máscara de interrupciones (10, 11, 12) Bit 15 =T (indicador de modo traza) Bit 13 =5SS (indicador de estado supervisor) Máscara de interrupciones Estos tres bits permiten al sistema fijar hasta 8 niveles de prioridad (0 al 7) para determinar qué interrupciones serán aceptadas y atendidas po el 68000. El nombre de máscara es significativo del concepto involucrado, puesto que asi se enmascaran o prohiben los niveles de interrupción. | Los dispositivos externos pueden pedir una interrupción con un nivel comprendido entre 0 y 7 (siendo el 7 el de mayor prioridad), enviando una señal en tres bits a la CPU. Cuando la CPU haya terminado su operación presente, compara el nivel de la petición con el de la máscara. Sólo en el caso de que la petición sea de mayor nivel que la máscara se atenderá la pe- tición de interrupción. En otro caso será ignorada. Si la máscara está al valor 0, se atenderán todas las solicitudes. Una máscara al nivel 7 sienifica: ¡no interrumpan! * Modo de traza Cuando el bit indicador T (modo de traza) está a 1. el 68000 cae en un estado especial de funcionamiento de único paso, llamado modo de traza. * La “máscara” de niveles de imerrupción son tres clementos de memoria (biestables) cuyo valor, 406 L, codificado en binario, indica el valor de la codificación de prioridad que debe recibirse del exterior para poder retener la ejecución del programa en curso y saltar 4 Un programa especial de tratamiento de interrupciones. La razón del nombre en español procede del concepto ““pasa-no pasa” asociado a una *“máscara"' real, aunque su verdadero significado seria el de “nivel”. Si el nivel de la petición es mayor que el nivel interno, ésta eS: atendida, no siéndolo en caso contrario. 110 Byte de usuario Byte del sistema Registro de códigos de condición LL MYA rn N|z|v]o 121 > ¿ SL A 9 8 J 6 5 4 3 2 1 0 Máscara Solamente para MC68020 de interrupción M Estado maestro/interrupción [niveles 0 al 7) To = Permisión de traza Figura 3,11 Registro de estado: bie del sistema hvte de ustiario En esta situación, la CPU ejecutará una única instrucción para, a conti- ¿Qué hacer] Registro de datos 4 Código de tamaño de byte (B] Origen: ruge Registro de datos 3 31 16 15 B 7 0 AAA ANTAS AS Desde el origen AE Al3 D3 a 1 invotucrados Dr 0 de da 'MOVE . AS TN AAA Al destino 2 |B dd No involucrados ——-> AA AS AA D3 inalterado A|3 “Q—— No involucrados ——— > Byte Después transferido de MOVE DA: ME TE DS ha cambiado A|3 el byte bajo “Q——— No involucrados —— > hieura 9.1 Instrucción con dos operarndos: MOVE. DA 04 ADD.L D6,D? ADD. Doble palabra indica: sumar (adicionar) los 32 bits del origen, D6, a los 32 bits del destino, D7, y co locar el resultado en el destino, D7?. Vemos, otra vez, que el destino es el receptor del resultado de la ope- ración. Códigos de tamaños de los datos: L, W, B En los anteriores ejemplos hemos visto que algunos códigos de opera ción levan aparejada una letra, A ésta se la denomina código de tamaño 119 del dato, porque indica cuántos bits del origen (fuente) y del destino estás involucrados en la operación. Las reglas son muy simples y se aplican tant para datos en registros como en memoria: L significa doble palabra: opera sobre los 32 bits. W significa palabra: opera sobre los 16 bits. B significa byte: opera sobre los 8 bits inferiores. La mavor parte de las instrucciones puede funcionar con los tres tipos di datos, por lo que en adelante emplearemos una notación simplificadora. por ejemplo ADD.z, donde **z'" puede representar L, W. o B. 7 Ahora ya sabemos bastante para poder escribir un programa real, po que vamos a presentarle una situación hipotética con que comprobar brios de programador. A APLICACION PRACTICA Problema: Estamos corriendo un programa de nóminas a fines de mara y necesitamos actualizar las horas trabajadas (YTD ; year-to-date) e presente año, incluyendo las del mes de marzo. Emplee ADD y MO! y coloque el resultado en el registro de datos D3. Datos: 1. El número de horas YTD trabajadas en enero y febrero están en el Té gistro Dl. : 2. Las horas trabajadas en marzo están en el registro de datos D2. Caso práctico: Horas YTD = 320 en DI Horas en marzo = 138 en D2 Nuevas horas YTD = 458 a colocar en D3 Solución: Programa 4.1 MOYVE.L D1,D3 ADD.L — D2,D3 Ahora, D3 contiene la suma (D2 + Dl) = 458. DI y D2 permanecen i all rados. Tamaño de los datos y rango de los resultados La instrucción ADD realiza una interesante adición binaria, depenok do de usted el decidir cuándo los resultados tienen un signo y cuándo E En este pequeño programa estamos tratando con pequeños números PE 120 tivos totalmente comprendidos en el rango de un registro de 32 bits, por cuanto la cuestión es redundante, Merece la pena notar que el 68000, usualmente, tiene más trabajo que hacer cuando realiza una operación en 32 bits (.L) que cuando lo hace en 16 (W). De forma similar, las operaciones en 16 bits (.W), usualmente, pre- cisan de más pasos internos de la CPU que las variantes de 8 bits (.B). Si alguien pregunta: ¿cuán rápida es una instrucción de ADD en el 680007, lo único que podemos ofrecer como respuesta es un rango de valores (casos de mejor y peor) para las posibilidades .B, .W, y .L. Incluso estos datos de- penderán del modelo de chip y de su reloj (que, tipicamente, varia entre 125 y 60 nanosegundos). No, en realidad no estamos esquivando la pregunta, ADD puede, en realidad, ocupar entre 0 (sí, CERO) y 30 ciclos de reloj, de- pendiendo de '*dónde, cuándo y qué” estemos sumando. El milagro efec- tivo de cero ciclos es, en resumen, consecuencia del solapamiento de ins- trucciones que realiza el 68020. En cualquier caso, no existe una forma sencilla para determinar la cro- nología de las operaciones .B, .W, y .L. Por ejemplo, rara vez las operacio- nes en .W ocupan realmente el doble que sus versiones en .B; sin embargo, el sentido común nos indica que cuando podamos escoger el tamaño del dato, deberemos optar por el menor posible que cubra nuestras necesidades. Desde luego, en el ejemplo anterior podrían haberse ahorrado algunos ciclos de reloj empleando MOVE.W y ADD.W, puesto que los números cabian en el rango de las operaciones de 16 bits (con y sin signo). Sin em- bargo, no hubiera funcionado con MOVE,B y con ADD,B, puesto que los valores sobrepasan el límite de 255 (11111111), correspondiente al máximo dato sin signo permitido en un byte. La situación más común en la práctica es trabajar con números con signo (en complemento a 2), de forma que el programa anterior, por ejemplo, permitiría valores negativos en D2 para ajustar las horas de YTD (ADD un negativo es SUBstraer). A medida que se vaya desarrollando el programa de las nóminas, se irán encontrando valores con distintos rangos y signos, por lo que será necesario usar la letra de tamaño apropiada para cada caso. También veremos cómo utilizar el CCR (registro de códigos de condición) para comprobar el correcto funcionamiento de nuestra aritmética. Comentarios Una interesante posibilidad ofrecida a todos los niveles de programa- ción es la capacidad de añadir títulos, fechas, números de revisión, comen- tarios, notas y recordatorios en el texto del programa para uso personal solamente. Tales comentarios son ignorados por los ensambladores y com- piladores, pero pueden resultar notablemente útiles cuando usted (o sus colegas) vayan a leer su listado de programa varios meses. despues y se pre- gunten: **¿qué ocurría aqui?””, o “¿por qué hacia yo esto?” La adición de comentarios breves es una buena costumbre, especialmen- te para los lenguajes de bajo nivel, donde el propósito de cada línea no re- 121 CCR: El registro de códigos de condición 122 sulta evidente. Los convenios de comentarios de Motorola son sencili Permiten tanto lineas individuales como comentarios en la propia linea é la instrucción ('*on line””), como sigue: 7 + En cualquier sitio indica una linea de sólo comentario. de forma que el ensamblador ignora todos los caracteres que siguen al « f terisco) hasta que se lea la siguiente linea de código fuente. De forma alte programa: Aquií el comentario de la linea para lo que basta con incluir un espacio (o tabulación) entre los Opera v el comentario. Desarrollemos estas buenas costumbres añadiendo algunos comenta al primer programa de nuestro ejemplo. + Programa 4.1 con comentarios + Actualización YTD 4 rev. 1 SKB MOVE.L D1,D3 Antiguo YTD ahora en D3 (32 bits) ADD.L — D2,D3 Suma las horas de marzo al viejo YTD + Ahora, D3 contiene las horas actualizadas del YTD En el capitulo 3 vimos de qué forma los indicadores del CCR saban varias condiciones del procesador, alertándole frente a posibles res. Es importante conocer de qué forma cada código de operación 3 a los cinco indicadores del CCR, para lo que emplearemos la siguiente M6 tación: Indicador del CCR X N Z V C MOVE pe + + 0 0 ADD =U 5 + E a Donde: — indica no alterado 0 indica siempre puesto a O (borrado) indica puesto siempre a 1 + significa que se pondrá a 00 a 1 según el resulta de la instrucción U significa indefinido, es decir, el indicador no conll información útil =C— puestoa0oa l, según esté el indicador C En la figura 4.2 se muestran cómo cambian los registros y el CCR du- rante la ejecución del programa 4.1. Adornemos nuestro programa com- probando el estado del CCR. Esto impondrá algunas nuevas instrucciones para ramificaciones (branching)? y una construcción conocida como eti- queta para indicar el lugar al que deseamos que el programa se dirija. + Programa 4.2: Comprobación del COR + Actualización YTD $ rev. 2 SKB MOVYE.L D1,D3 Antiguo YTD, ahora en D3 (32 bus) ADD.L D2,D3 Suma las horas de marzo al viejo YTD + Ahora D3 contiene las horas YID actualizadas BVS ERROR.I Salta a la etiqueta ERROR.1 si hay rebose BEQ IDLE Salta a la etiqueta LABEL si es cero + A * BRA OVER Salta siempre a OVER ERROR.1 - Se detectó error + * * BRA OVER Salta siempre a OVER IDLE D3=0, Posible error OVER Ramificaciones y etiquetas Tal y como prometimos, nuestro revisado programa introduce dos con- ceptos nuevos, directamente interrelacionados: ramificaciones y etiquetas. Salvo que se le indique otra cosa, el procesador avanzará secuencialmente de una instrucción a la siguiente, quizá de forma parecida a esto: Il. Tomar la dirección del PC (contador de programa). 2. Leer la primera palabra de la instrucción en la dirección de memo- ría apuntada por PC, * Ahora hemos optado por la traducción más correcta al español, puesto que este es un caso extremo de deformación de nuestro idioma. En efecto, la expresión original inglesa de branching ha provocado la “aparición'* del término “*brancheo””, que juzgamos fuera de l6- gica a todas luces y excesivamente forzado, a pesar de que ya forma parte de la jerga profe- sional al caso. En cualquier caso, su significado de derivación desde la tarea en ejecución en un momento dado se corresponde con la acepción de ramificación, clásica en nuestros ma- nuales y tratados, A partir de ahora, el nemónico BRA y sus derivados deberán evocarnos este significado. 123 Origen Destino 31 0 y y D1 320 GD) MOVEL D1, D3 4 Código de tamaño a - doble palabra (L) D3 [Sin tmportancia-= CCR previo x|n|z|v]c D1 eS CCR posterior — D3 320 XINIZ|V -Tolofolo > -0D1 Origen Destino r y = (2) ADD.L D2, D3 D2 [138 4 Código de tamaño doble palabra (L) D3 320 CCR previo X|N|Z|v|c D2 138 ) =|0Jojojo CCR posterior x|N|z|v J PA D3 | 458 ] ojojoj¡o| o _——4S - D2 + D3 Figura 4.2 4crualización de horas YTD Decodificar esta palabra-instrucción y, si es necesario, leer las Pr labras adicionales (o extensiones) precisas para poder decodificafl* instrucción completa. tad 4. Ejecutar los pasos necesarios para completar la instrucción en € Ó 5. Incrementar el valor del PC para apuntar a la próxima inst 6. Repetir todo el ciclo desde el punto 1. 124 Esta secuencia lineal de lectura-ejecución de la instrucción (véase la fi- gura 4,3) puede alterarse tanto de forma incondicional como bajo condicio- nes, mediante el uso de las instrucciones de ramificación y de las etiquetas. ificación incondicional: BRA etiqueta La instrucción BRA (BRanch Always: saltar siempre) es una ramifica- ción incondicional, y su efecto es tan dramático como que altera el punto $ de la secuencia normal antes desarrollada. Lo que ocurre es que el contador de programa PC, en lugar de incrementarse para apuntar a la siguiente ins- trucción, se carga con una nueva dirección que depende de la etiqueta em- pleada, y se pasa el control del programa a la línea de programa afectada de dicha etiqueta. Asi, el código BRA OVER de nuestro ejemplo provoca el salto del programa a la linea marcada con OVER —y desde entonces se vuelve a seguir la secuencia normal de ejecución desde el punto | al 5, de forma normal, por lo menos hasta que encontremos otra orden de rami- ficación. Veamos a continuación de qué manera se altera la secuencia normal al encontrar la instrucción BRA: Il. Tomar la dirección del PC (contador de programa). Leer la primera palabra de la instrucción en la dirección de memo- ria apuntada por el PC, 3, Decodificar esta palabra de la instrucción y, si es necesario, leer las palabras adicionales (o extensiones) precisas para decodificar la ins- trucción completa. 4. Si la instrucción es BRA OVER, el punto 3 habrá generado un nú- mero con signo, llamado desplazamiento de la ramificación, que depende de la posición de la etiqueta OVER en el listado del pro- grama. Adicionar este desplazamiento al valor del PC y devolver la suma al PC. Ahora, el PC está apuntando a la instrucción marcada con OVER. 6. Ahora, el procesador está ya preparado para proceder al punto 1 anterior, donde leerá, decodificará y ejecutará la instrucción mar- cada con OVER. ba in Podemos ver que los puntos del 1 al 3 son siempre los mismos, pero que SI en el punto 3 se decodifica una instrucción de BRA, en lugar de incre- mentarse para apuntar a la siguiente instrucción; el PC se autoajustará para apuntar a la linea marcada con la etiqueta OVER (véase la figura 4,4). Por el momento, no debemos preocuparnos demasiado por la forma en que se calcula el desplazamiento de la ramificación para conseguir el valor correc- to que añadir al PC para apuntar exactamente a OVER. Los principales puntos a tener en cuenta son: 125 PC+2 PC+2 PCc+2 a Contador de programa 54 33 Busqueda (NI eS 2 Dirección = N 0 a% ' > $ N+2 23 n+2V 33 Decoditica (N! Instrucción 1 e 23 N+4 Búsqueda 7) 2% de (N +2) Palabra de N+4 = Busqueda extensión 1-1 de IN + 4) A Palabra de N +6 — Inst extensión 12 A de 1 p a Búsqueda de (N + 6 g Instrucción 2 N+8 sE N+6 23 Y 33 [ > Instrucción 3 N + 10 EN Decoditica A =3 IN- 6) Palabra de N +12 extension 3-1 Instrucción 4 PCO+2 PC+2 eS .s p E q, e La ramificación supone una ruptura en la secuencia normal de “P e Esencialmente, las etiquetas son direcciones de instrucción que el e Dado que el valor del desplazamiento tiene signo (positivo o negalllf 126 Búsqueda IN + 8) ES N+8 Decoditica N+10 ] NB TE Búsqueda ARE Contador de programa (PC) y da secuencia de instrucciones de N ¡IN — 101 Figura 4.3 a la siguiente instrucción'* mediante el ajuste del valor de la direcak, contenida en el PC. ma interpreta de forma que el nuevo valor del PC es ahora (PC + plazamiento), dándonos la dirección de la instrucción siruada EM linea etiquetada. A yA el salto podrá hacerse hacia delante o hacia detrás. Si la eriquetá E situada más adelante en el programa, más allá de la linea del BRA desplazamiento será positivo, incrementando el PC para poder Dirección de palabra Búsqueda de (No BRA OVER A Desplazamiento dl Decodifica UN Busqueda Hna ena. con OVER Búsqueda de IN + dl PC N+d Figura 4.4 El contador de provrarma Y la Secuencia de la instruccion de ran ficación hacia delante. Si la etiqueta aparece antes que la linea del BRA, desplazamiento será negativo, con lo que el PC se decrementará par. ramificarse hacia atrás. Los lectores que sepan BASIC reconocerán la similitud entre el BRA y el GOTO. La gran diferencia está en el uso de etiquetas con nemónicos alfa- béticos, en lugar de números de lineas empleados en el BASIC. Tal como hemos indicado, entre bastidores, la etiqueta OVER actúa de forma muy parecida al número de linea. Al ensamblar, cargar y ejecutar el anterior programa, la etiqueta OVER es traducida a la dirección de memoria de esa instrucción en particular, y es esa dirección la que se coloca en el PC al de- codificar la instrucción BRA OVER. La manera en que esto se hace será analizada con mayor detalle cuando hablemos del direccionamiento abso- luto y del relativo. El programador es libre de emplear cualquier conjunto razonable de caracteres como etiquetas, pero, naturalmente, deberá procurarse siempre evitar el duplicar etiquetas con el mismo nombre en un mismo programa. Además, deben respetarse las reglas de la sintaxis: las etiquetas han de co- locarse al extremo izquierdo de las líneas, y hay que disponer de espacios, o tabulaciones, entre las etiquetas y los códigos de operación. La ramificación incondicional no es muy útil. Veamos ahora el cómo y el porqué de la condicional, para asi poder entender el programa 4.2. 127 Ramificación condicional 128 Un total de 14 instrucciones de ramificación de estructura Bcc le permiten efectuar la ramificación solamente si se cumple la condición ip: dicada por el código **cc**. Las dos letras **cc** son mnemónicos referido a condiciones particulares de los indicadores del CCR, que el 68000 co probará antes de decidir si se debe efectuar la ramificación o no. En ca negativo, se ejecutará la siguiente instrucción. Si se satisface la condición estipulada, el 68000 salta a la linea marcada con la etiqueta, empleando k misma estrategia que la descrita para el BRA. be Asi, Bcc puede leerse como: Si se cumple cc, hacer un BRA . Si no se cumple cc, ejecutar la siguiente instrucción. La comprensión de Bcc es, aproximadamente, el 150 por 100 del camino al dominio del 68000 ¿Qué clases de condiciones pueden comprobarse con cc? En el pro ma 4.2 se analizan sólo dos casos sencillos en los que solamente se co prueba un único indicador del CCR. Para BVS, se hace cc = VS, con lo se comprucba el valor del indicador V: ¿Está a 1 o no? Para BEQ, se cc = EQ, de forma que se observa el indicador Z. ¿Es el resultado o no? És decir, ¿es Z = 1 0 no? BVS ERROR.! significa lo siguiente: Se mificará (a la linea marcada con ERROR.!) solamente si el indicador 4 rebose (V) está a 1. Si la suma de D2 y D3 provoca V = 1 (rebose) es quel respuesta contenida en D3 es errónea, y deberemos hacer algo al respectó Por ello, se comprueba el estado del indicador Y mediante BVS. Si Y todo va bien (por ahora), y no necesitamos ramificar el programa. Si V=! ha habido rebose y usted ha tenido el valor y la prudencia de prepa y contra ello con BVS. La parte del programa que se inicia en la linea marcada con ERROR es la encargada de ocuparse del hecho de que ha habido rebose y de que resultado almacenado en D3 es aritméticamente incorrecto para nula con signo. Para nuestro ejemplo, eso significaria que las horas sobrepasado el rango de -2.147.483.648 a + 2.147.483.647, lo que 1 la presencia de errores, bien en los datos de partida, bien en el blog programa. Así, BVS puede ser también un buen método de detectar € durante el desarrollo y prueba de los programas. pero, de manera pr dial con números grandes (o potencialmente grandes), BVS es una H esencial contra errores. E. BEQ IDLE significa que se ramificará (a la linea marcada con 1D! solamente si el resultado es igual (EQual) a cero (Zero), es decir, sólO; indicador Z está puesto (= 1), Aqui, el mnemónico ee = EQ no es tan evi- dente (¿por qué no poner BZS, que significaría “saltar si está puesto el in dicador de cero [Branch 1f Zero Ser|2)*, pero de todas formas lo empleare- mos así. Este programa comprueba si D3, que contiene las horas YID es cero o no. Si D3 no es cero, se sigue normalmente con el programa. Si D3 es cero, es que queremos hacer algo al respecto, por lo que saltaremos a la linea marcada con IDLE. Hemos escogido un mnemónico sugestivo, como siempre, para aumentar la legibilidad de nuestro programa, BEQ se em plea, a menudo, para saltarnos las partes innecesarias de un programa. Como un ejemplo frecuente valga éste: ¡No enviar nunca una factura de 00 pesetas! En nuestro caso, el salto a IDLE, si el número de horas YTD es nulo, no indica, necesariamente, un error (aunque pueda exigir un cuidado especial), sino que en un buen programas de nóminas se puede obviar con toda tranquilidad el coste de impuestos sobre el salario si el empleado no ha estado trabajando. Bcc y el CCR Bee sirve para comprobar el COR, pero no para altera los indicadores del mismo: asi, se pueden realizar varias pruebas sucesivas de Bcc, tales como BVS seguidas de BEQ, tal como en el programa 3.3. Si BVS no pro- duce el salto, se comprueba inmediatamente el cero con BEQ. Este punto pone de manifiesto la importancia del conocimiento de como cada instrucción afecta al COR. Veamos un pequeño ejemplo de codilica- ción cuidadosa que puede evitar muchas horas de frustración. Supongamos que después de estar funcionando con toda normalidad durante algunos años, decidimos añadir una inocente linea al programa 4.2 como la mos trada en el programa 4.2A (tales añadidos se conocen como parches de una linea): * Programa 4.24: Cambio incorrecto del programa 4.2 Actualización YID —4 rev. 3— Salvar DY en D4 para uso posterior MOVE.L- D1,Dá El anterior YTD en D3 (32 bis) ADD.L. D2,D3 Añade las horas de mayo al anterior YTD MOVE. D3,D4 + + parche de linea + D3 y D4 contienen, ambos, las horas YTD actualizadas. La razón de este mnemónico, como de otros muchos, está en su ormen. En electo, este tipa de denominaciones apareció va en el pionero 6800, con el que Motorola entraba en cl *ruedo"* de los micros con una preciosa máquina muy apta para etectuar cálculos maltemáte cos no demasiado complejos para nuestros dias y, sobre todo, controles de datos en entrada yéo salida de forma sencilla y eficaz. Asi, la razón de BEQ estaba en la comprobación de la igualdad entre dos magnitudes: Branch if they are EQual (salta sí son iguales). 129 Bcc: Todas las posibilidades 130 BVS ERROR.1 Salta a ERROR.I si hay rebose??? * 4 + ERROR.1 Se ha detectado rebose??” + 4 + Hemos introducido un MOVE.L entre el ADD y el BVS, tal comof dica el comentario + +. ¿Dónde está el error? En el hecho de que el jp cador Y se borra con la instrucción MOVE, por lo que ahora el BVS; rece de sentido. Nunca podremos saltar a ERROR.1 aunque ADD Dor el Val. Hasta ahora hemos visto dos de los 14 códigos Bcc. Las demás comprueban otras condiciones del CCR, tanto de indicadores únicos e9 de combinaciones de ellos. Posponemos la discusión sobre las distir comprobaciones de los indicadores hasta que no veamos el CMP (Ct Pare) en el capitulo 6. He aqui los Bcc de comprobación de un único Í cador de la forma BVS, o BEQ. BVC: Salta si el indicador de rebose está a cero (V = 0) Como se ve, BVS y BVC son pruebas complementarias; si una se cumple otra no. | BNE: Salta si no es cero, es decir, si Z=0 También BEQ y BNE son complementarios —nuevamente, si se uno, no se cumple el otro. BCC: Salta si el indicador de acarreo está a cero (C= 0) BCS: Salta si el indicador de acarreo está a uno (C = 1) Una vez más, BCS y BCC son dos pruebas complementarias. Hay el cuidado y no confundir CC (Carry Clear) con ce (cualquier condlk BPL: Salta si es positivo (Plus), esto es, si N =0 BMI: Salta si es negativo (Menos), esto es, si N=1 Sí, va lo ha adivinado usted, BPL y BMI también son complemeb Esta variedad de elección (recuérdese que aún quedan varios mé plejos) nos permitirá una considerable flexibilidad en la comprob los resultados y en la toma de decisiones apropiadas mediante el mificación) a la línea de programa convenientemente marcada. CoMl mos visto, aparecen por parejas opuestas que pueden parecer, a primera vista, un derroche. Por ejemplo: BPL ANS__PLUS — Ejecutar el programa P si la respuesta es + ve Ejecutarlo si la respuesta es — ve * A + ANS__PLUS * * *Y También puede escribirse de la forma: BMI_ ANS_MIN Ejecutar programa M si el resultado es — ve Ejecutar programa P si el resultado es + ye * + % ANS_MIN — * + 4 Ambos programas llevan al mismo resultado, por lo que usted sobrevivirá igualmente con BPL que con BMI. En la práctica, sin embargo, resulta útil hacer una elección previa: salen programas más legibles empleando el Bcc más natural y apropiado para cada situación, provocando la ramificación, por ejemplo, cuando se produzca cl evento menos probable. Resumen de las ramificaciones Modos * BRA ETIQUETA provoca un salto incondicional a la etiqueta. e Bcc ETIQUETA provoca el salto a la etiqueta sólo cuando se cumple la condición cc. Si no, se sigue con la siguiente instrucción. Ahora que hemos visto ya algunas instrucciones sencillas que emplean los registros de datos como operandos, podemos pasar al estudio de otros casos en que los operandos empleados son combinaciones de registros y/o direcciones de memoria, conocidos como modos de direccionamiento. de direccionamiento Imaginemos una instrucción que nos diga: **De acuerdo, ya sé que se supone que debo llevar (MOVE) o sumar (ADD) o lo que sea, pero digame ahora dónde debo buscar el operador de origen y el de destino”. Para ello, cada operando se expresa por medio de un determinado formato, unién- dolo, si es necesario, con la suficiente información para encaminar la ins- trucción a los datos correctos. Estos formatos de operandos se denominan modos de direccionamiento, de los que hay dos grupos principales: modos directos a registros y modos de memoria. Como veremos, cada uno de estos 131 Modo directo de registros Modos de direccionamiento de memoria erupos se subdivide, a su vez, en subgrupos menores de modos de cionamiento. Asimismo veremos que la mayor parte de las instruccig permiten elegir entre muchas combinaciones para el direccionamiento ta del operador origen como del de destino. Habiendo dejado claro que el camino para la comprensión del funcig miento del 68000 depende en un 130 por 100 del dominio de la instrucg Bcc, podemos añadir ahora que el restante 150 por 100 es el relativo q! modos de direccionamiento. Hasta ahora, en nuestros programas, el dato inicial estaba disponible los registros de datos DI y D2, y se almacenaba el resultado de la suf D2 + D3 en un tercer registro de datos D3. Asi, todos nuestros operandl estaban expresados de forma directa mediante un sencillo formato deno nado modo directo de registros. Para este modo, hay dos variantes: Modo de direccionamiento Símbolo ¿Qué operando usa? Directo de registro de datos Dn El valor de Dn Directo de registro de direcciones An El valor de An donde Dn puede ser cualquier registro de datos (del DO al D7) y An quier registro de direcciones (del AO al A7). Para simplificar, nos refe mos a estos dos modos por ''modo Dn” y por “modo An” En el capitulo 3 vimos la forma en que los registros de direcciones pue den almacenar direcciones de 166 32 bits, de forma que, debido a esto. modo An tiene ciertas restricciones, en el sentido de que está prohib el manejo de tamaños de bytes con ellos. Aparte de estas diferencias, qu más adelante detallaremos, los modos Dn y An son muy similares. Estos dos modos directos se emplean cuando los operandos origen $ valores (datos o direcciones) que estén disponibles en los registros. Cuan se emplea el modo directo para el destino, hay que informar a la CPU registro de que se trate para recibir el resultado de las operaciones. El pro mo apartado trata de los operandos de memoria. En la mayor parte de los casos prácticos, los datos iniciales de un Pre! erama se han cargado previamente en la memoria de usuario (RAM) a E vés de algún dispositivo externo, tal como un disco o un teclado. El resulta de las distintas operaciones del programa se almacenará también en ! RAM, para desde ahi ir a los dispositivos externos de salida, tales como discos, impresoras o pantallas. Para conseguirlo se necesitan los modos direccionamiento de memoria, que le “dicen” al código de operación dónde localizar en la memoria los operandos de origen y destino. El 68000 tiene 10 modos distintos de direccionamiento de memoria, mientras el 68020 tiene 16, tal como se indica en el apéndice B direccionamiento de memoria Ha dirección efectiva Los formatos de direccionamiento de memoria van desde el caso extre- mamente sencillo (** Aquí está la dirección de la memoria donde está el ope- rando'*) hasta el más complicado (¡Para conseguir saber la dirección de la memoria donde se halla el operando es preciso sumar dos números: para formarla, vaya a tal dirección de la memoria, donde encontrará otra dircc- ción; súmele tal número y ésa es la dirección de su operando!*?). Afortuna- damente, el principiante puede ponerse a trabajar ya con los modos más sencillos. El caso complicado ha sido seleccionado para poner de manifiesto un hecho fundamental respecto a los modos de direccionamiento de me- moria: El modo de direccionamiento permite que la instrucción calcule la dirección efectiva (real) < ea > del operando Cualquier operando situado en la memoria está absolutamente definido y localizado mediante su %, su dirección efectiva. En todo modo de direccionamiento, la CPU realiza el cálculo de la previamente a ac- ceder al operando origen situado en dicha . Similarmente, antes de que se pueda escribir un operando resultado en la memoria, debe calcularse su< ea >. Estos cálculos (y sus accesos a memoria de programa necesarios) pueden ocupar entre O y 24 ciclos de reloj. La importancia de tales cálculos queda puesta de manifiesto por el hecho de que Motorola ha dispuesto de dos ALU adicionales para realizar el cálculo de la < ea > aritméticamente, mientras que la ALU principal se dedica al trabajo de arimética con los datos normales, ¿De que forma puede el 68000 saber cómo calcular el valor de la . Los avanzados modos del 68000 han reducido drásticamente este fuerzo. En efecto, el programador ha cedido la responsabilidad del a las rápidas ALU interiores. ensambladores que hacen uso de ello) ofrecen una especie de lengua alto nivel para el acceso a las complejas estructuras de datos para g volúmenes de RAM. Como veremos, cada modo de direccionamiento ha sido pensado pañ resolver un tipo particular de acceso a memoria y de manipulación d tos. Nuestro primer ejemplo fue, probablemente, el del modo más l de direccionamiento, llamado inmediato, que sólo se utiliza para los OP randos origen. | En muchas ocasiones deseamos emplear constantes numéricas —€58 cir, números predeterminados que no son el resultado de ninguna OP ción—. Supongamos, por ejemplo, que en el programa 4.2 queremos Y tener el número de empleados parados: todos aquellos de número de 19 YTD cero. Asignemos el registro de datos D4 a contener dicho núme Cada vez que saltamos a la etiqueta IDLE, incrementaremos (le sun mos 1) D4. Al terminar las nóminas, podemos sacar el valor de D4. Ef erama 4.3 muestra la nueva versión (con las adiciones en negrita). + Programa 4.3: Cuenta de empleados parados + Actualización de YTD 4 rev. 3 SKB MOVE.L D1,DJ Anterior YD, ahora en D3 (32 bits) ADD. D2,D3 Anadir las horas de mayo al anterior YTD CLRW D4 Poner los 16 bits inferiores de D4 a cero * Ahora D3 contiene las horas actualizadas de YTD. BVS ERROR.I Saltar si hay rebose BEQ IDLE Saltar si es cero * Á 4 ERROR.I— — Rebose detectado 4 i A BRA OVER Saltar siempre a OVER IDLE ADD.Q +*1,D4 Incrementar D4 = cuenta de parados OVER "Notas al programa 4.3 En el programa revisado hay dos códigos nuevos, CLR (Borrar = CLeaR) y ADDQ (Suma rápida = ADD Quick). CER es una instrucción sencilla pero muy útil, con una sola palabra y la sintaxis siguiente: CLR.z que borra parte o todo el operando, según la letra .z, identificadora del ta- maño del dato. CLR.L borrará los 32 bits. CLR.W borrará sólo los 16 bits menos significativos, dejando los más altos sin tocar, y CLR.B borrará tan sólo los 8 bils menos significativos, dejando los 24 más altos sin tocar. En nuestro ejemplo hemos decidido emplear justamente los 16 bits más bajos de D4 como “contador de parados'”, dejándole a usted, si quiere, usar los 16 altos para cualquier otra misión. Para nóminas pequeñas (de menos de 255 empleados) se puede considerar en utilizar solamente el byte bajo de D4 (sin signo): el código de tamaño de datos .2 permite una gran Nexibilidad a la hora de utilizar los registros. Se hace CLR.W D4 para ase- gurarnos de que el contador de 16 bits de D4 está a cero antes de empezar a contar. Recuérdese que CLR.W no afecta a los 16 bits más altos de Da, Es un error sorprendentemente muy común el olvidar **CL Rear” —borrar- los contadores *. CLR provoca los cambios esperables en el CCR: ¿A veces no podemos evitar caer en la tentación de imitar la útil costumbre americana de formar verbos a partir de sustantivos, sobre todo cuando esto ayuda al lector español a familiarizarse con el texto. 135 Indicador del CCR Xx N Za V a GER a 0 l 0 0 puesto que el operando ahora es 0 (Z = 1), no negativo (N =0), y no hay nj rebose mi acarreo (V = 0, € =0). El indicador X permanece inalterado, ty como dijimos en la instrucción MOVE anterior. Como ADD, ADDO es una instrucción con dos operandos. Su for general es: ADDQ.. , donde es un número comprendido entre | y 8, Esto significa quel un ADD (suma) del número de al destino ten L, Wo B, según sé el código de tamaño) y colocar la suma en el destino. La **Q” de ADDQí dica que se trata de la forma rápida (Quick, en inglés) del código de oper ción de ADD. El dato inmediato de origen, escrito siempre con el simbol delante, se suma, sencillamente, al destino. En nuestro caso, ADDQ.W 41, D4 incrementa en 1 la palabra baja de D4. La razón de que sea rápido estriba en que el procesador no tiene q e: a ninguna parte a buscar el dato de origen. De hecho, el dato origen es erabado en 3 bits sin signo en la propia palabra del código de ADDQ,! que explica también el porqué del pequeño rango de estas constantes, ql sólo va desde 1 hasta $. Ahora he aqui una pequeña y rápida comprobación de lo que hem aprendido. ¿Cómo pueden almacenarse los números del 1 al 8 en 3 biB Pues, ¿no es cierto que tres bits sirven para codificar los números del 0 al porque podremos penetrar “dentro” de una simple palabra de instruccil y analizar su configuración. La palabra ADDO es de la forma Bit 15 14 13 12 1110 9 8 7 6 5 4 3 2 MM DTO led do a0 2 2 mo mom Donde: ddd — bits del 9 al 11 especifican el 4 24 — bis del 6 y 7 especifican el tamaño del dato mmm — bits del 3 al $ especifican el modo de destino rr — bits del 0 al 2 especifican el registro de destino Los bits $ y del 12 al 15 identifican la instrucción como ADDQ4 ADDOQ y cer la ; en este caso, mmm y rrr están codificados para determinar el registro de destino correspondiente a esta . En este momento no nos interesa su formato, salvo poner de manifiesto el hecho de que, por regla general, se dedican a este propósito 6 de los 16 bits de la palabra de la ins- trucción. En el apéndice B se listan todos los códigos de las instrucciones. El código del tamaño de los datos es simple: 00 = byte, 01 = palabra, 10 = doble palabra (dejando el código 11 sin usar, como una útil posibili- dad para el futuro). En cuanto al “truco”, la forma de codificar los núme- ros del | al 8 en tres bits, tenemos que es: | Para ddd - 001 2 =010 43 =011 % 4 = 100 *S 101 *6 =110 $7 =111 ÉS = 000 As1, el decodificador de la instrucción se convierte ddd = 000 no a 40 (lo que sería una pérdida de tiempo y esfuerzo) sino a %8. Esta pequeña digresión nos ha servido para tomar conciencia de lo que significa la deco- dificación de las instrucciones. En las instrucciones más complicadas multi- palabras que más adelante encontraremos será preciso saber en que forma están dispuestas en las palabras de los códigos de los datos (incluyendo las direcciones) y en sus extensiones, Esperamos que con esto hayamos conseguido ganarnos su respeto hacia la gente que ha escrito los ensambladores. Recuérdese que el ensamblado: ha de convertir ADDQ * del programa fuente en la configuración de bits que hemos visto (entre Otras cosas). el CCR ADDO actúa sobre el COR como un ADD normal: Indicador del COR XxX N Z V E ADDOQ Gl + , » + con lo que se obtienen los mismos indicadores que con la aritmética nor- mal. Pero, ¿qué ocurre si se necesita sumar una constante mayor que 8? Sigamos leyendo lo que viene a continuación. 137 ADDI: Suma inmediata Si se necesita sumar (ADD) constantes mayores que *£8, debe emplez la instrucción ADDI, que veremos ahora por su smiliud con ADDQ. estructura es de la forma: ADDLz¿ — *, ADDI nos permite sumar un dato inmediato de hasta 32 bits a una dot palabra, de 16 bits a una palabra o de $ bits a un byte. Por ejemplo, ADDLL —— %SEFFFF,DO incrementará DO en SFFFFF =11111111111111111111, pero ADDIW — FSFEFFF,DO incrementará solamente la palabra inferior de DO, y lo hará en la cantid de SEFFF =1111111111111111, y, de la misma forma, Y ADDLB— AFS$FEFEF,DO solamente incrementara el byte inferior de DO, haciendolo en $FF = 11114 ADDO es casi el doble de rápida que ADDI, por la sencilla razón de ql ADDI necesita una o dos palabras de extensión para contener el : 16 bis, o BX*:8 bits .* Palabra L %: aqui los otros 16 bits hasta el total de3 a Ny »- Recuérdese que estas dos palabras de extensión están almacenadas en la moria y deberán ser leidas como cualquier otro operando. Hay, Sin bargo, una ventaja al respecto: sus direcciones de memoria están a Col nuación inmediatamente detrás de la palabra de la instrucción. AhorAl sabemos que el PC (contador de programa) contiene la dirección de la ll trucción y que después de la decodificación se habrá incrementado € Asi, en cuanto se decodifica el ADDI, el PC contiene ya la dirección 00% se halla el dato inmediato en byte, palabra o doble palabra. Con el A de direccionamiento inmediato, no hay necesidad de ciclos extra de proce- sador o de cáleulos para conocer la dirección efectiva de la memoria donde está el operando. El dato origen forma parte de la propia instrucción y está disponible en la misma secuencia de lectura y decodificación. Por ahora hemos usado el modo inmediato solamente para las instrue- ciones ADDOQ y ADDLI, pero se puede encontrar en muchas otras más. ciones generales del modo inmediato He aguí un sencillo ejemplo: MOVE.z F£, En este caso, sencillamente se lleva el dato inmediato (L, W, o B) al desti- no. La extensión correspondiente al %4 se almacena en memoria de la misma manera que con las extensiones del ADDI, No existe MOVEI como tal, sino que basta con un MOVE con formato de inmediato. Obsérvese que las dos instrucciones siguientes son funcionalmente equi- valentes: CLR.z DI MOVE.z 0,D1 Puesto que ambas cargan la parte L, W, o B del registro D] con 0. ¿Podría usted adivinar cuál de las dos es más rápida? Una pista: CLR.z: no precisa de palabras de extensión. Otra versión muy popular del modo inmediato es: MOVEQUL. 4. Dn que es un transporte rápido de datos reservado para dobles palabras y usa- do sólo con registros de datos. MOVEQ permite llevar un dato de 8 bits con signo a un registro de datos, por lo que suele escribirse MOVEQ.L. X4,Dn como regla mnemotécnica, Hay que tener en cuenta que para llevar un dato de 8 bits como si fuera una doble palabra, el 68000 realiza primero la exten- sión de signo del 4 a 32 bits. Los bits de 4 forman parte del código de la propia instrucción, por lo que ésta representa una superrápida forma de llevar números del rango comprendido entre 128 y + 127 con signo al total de los 32 bits de Dn. He agui una aplicación Úpica: 139 * Programa 4.4: Cuenta de ciclos MOVEQ.L +52,D0 Se pone el contador DO a - $2 LAZO — SUBQ.L.— *1,D0 Se decrementa el contador en 1 BNE LAZO ¿Está el contador a 0? Si no, repitase el LAZO Si es que sí, abandónese el LAZO En este caso hemos supuesto que queriamos ejecutar el programa 52 veg como 52 es menor que 127, hemos empleado MOVEO para preparar n tro contador en DO. Cada vez que se ejecuta el en el lazo, como consecuencia del BNE. Por tanto, se Aba dtonara el . La instrucción SUBO.L es n pero resulta de sentido obvio: SUBQ.7. *. Punciona exactamente como ADDOQ, excepto en que se substrae el dato! mediato origen (valores del | al $ sin signo) del destino, colocando el re tado en el destino. El código z del tamaño tiene el sienificado que ya no$ habitual: SUBQ.L lo restará del total de los 32 bits, SUBQ.W lo hará $ de la palabra inferior y SUBQ.B solamente del byte menos sienificativo operando de destino. Corresponde a las variedades de ADD y ADDÍ, tal bién hay versiones del SUB: SUB.¿ — , SUBI.: — *, Todas las variantes del SUB alteran el CCR en la misma forma que las M riantes del ADD: Indicador del COR XxX N 7 V SUB =€ z + « de forma que se pueden comprobar las situaciones de cero, negativo y FEB se de la forma usual, El indicador de € (acarreo) en realidad indica acarfl negativo, pero su funcionamiento es el mismo. ¿Acaso se equivoca la af meética sin signo? Por ejemplo: MOVEQ.L— 40,D6 SUBQ.L 21,D6 dejará el COR de la forma Indicador del CUR XxX N Z V (a 1 1 0 0 | puesto que ahora D6 contiene el valor SFFFFFFFL =—1 (con Signo), que es correcto (no hay rebose), pero incorrecto desde el punto de vista de la aril- mética sin signo. Resumen del modo de direccionamiento inmediato El modo inmediato es limpio y rápido para manejar valores origen Hijos. Existen ciertas variantes Quick +, del código de operación para da- tos suficientemente pequeños como para caber en el código de la propia Ims- rucción, y hay versiones del inmediato para grandes valores del 4 que precisan de una o dos palabras de extensión situadas a continuación de la instrucción (en las direcciones de memoria PC +2 y PC 44). A continuación veremos modos de direccionamiento que nos permitirán acceder a datos situados en cualquier parte de la memoria, no solamente los de palabra del código de instrucción o sus extensiones. Direccionamiento absoluto Desde luego, el direccionamiento inmediato está limitado al caso en que los valores del operando origen sean fijos y conocidos de antemano, antes de escribir la instrucción. Sin embargo, en la mayor parte de los casos, los operandos son varla- bles situadas en la memoria (desde un teclado o a través de un acceso a los ficheros de un disco). La situación más simple se presenta cuando se intenta conocer la dirección de memoria real, conocida también como dirección absoluta, de los datos que se desean manejar. Escribamos de nuevo el pro- erama 4.1, suponiendo que los valores imiciales están en la memoria, en lugar de los registros de datos. Como hicimos en el capitulo 3, emplearemos el simbolo $ para denotar los números hexadecimales. APLICACION PRACTICA Problema: Calcular el total actualizado de horas YTD (desde enero hasta marzo), empleando operandos absolutos de memoria. Colocar el resul- tado en la doble palabra de dirección $6008, Datos: El total de horas YTD desde enero y febrero estácen la dirección $6000, 2. Las horas trabajadas en marzo están en la dirección $6004, 3. Los valores están en tamaño de dobles palabras. 141 Ejemplos: Horas YTD = 320 en la dirección $6000. Horas marzo = 138 en la dirección $6004. Horas YTD actualizadas = 458 en la dirección $6008. Solución: Programa 4.5 MOVE.L $6000,D3 — D3=horas YTD ADD.L — $6004,D3 — D3= horas YTD + horas marzo MOVE.L D3,56008 Se salva D3 en la memoria $6008 * La dirección $6008 ahora contiene la suma (96000) + (56004) = 458 Nótese el uso de los paréntesis para indicar que se está trabajando cg los datos contenidos en esta dirección. Asi, en la dirección (56000) teneme el valor (56000) = 320). En el próximo apartado hablaremos de esta nofá ción y veremos con detalle cómo las direcciones pueden acceder a doble palabras, palabras y bytes de memoria. El modo de direccionamiento absoluto indica simplemente la dirección real del origen, o del destino: no debe confundirse con el modo inmediatol Comparemos los siguientes casos: MOVE.L-— 456000,D3 MOVE.L — $6000,D3 El pequeño simbolo *%'* del dato inmediato marca drásticamente la di o rencia. La primera linea significa: Reemplazar el contenido de D3 por el número $6000. La segunda linea sienifica: Reemplazar el contenido de DÍ por el número que está en la dirección de memoria $6000. Direccionamiento absoluto: Versiones larga y corta La dirección absoluta que damos al especificar el operando origen o dl de destino puede ocupar una palabra o dos, de acuerdo con el formato de la instrucción, dando lugar a las variedades corta y larga del modo de direc cionamiento absoluto *. En la versión larga, la dirección absoluta es un N a mero de 32 bits almacenado como dos palabras de 16 bits de extensión, que permite acceder a todo el espacio direccionable por el 68000. El precio que debernos pagar por ello es que el procesador debe efect * Observese que, en este caso, dar la dirección absoluta de la memoria donde está el dal comcide con dar su , de la que va se ha hablado anteriormente. una lectura de las dos palabras de extensión en la memoria y combinarlas para formar la dirección de 32 bits antes de poder acceder al operando. Cuando no se desea poder acceder al espacio total de direccionamiento, se puede ahorrar tiempo empleando la versión corta de 16 bits. Con esta ver- sión, el procesador extiende el bit de signo hasta el total de los 32 bits de la dirección final, lo que es mucho más rápido que tener que tomar una se gunda palabra de la memoria. La variedad de modo corta permite acceder a direcciones comprendidas en el rango desde $000000 hasta $007FFE (os 32 Kbytes más bajos) y desde $-8000 hasta SFFFFFF (los 32 Kbytes más altos), según que el bit de signo sea “0% o “1%, (Cuando se hable del bil de signo de una dirección, desde luego no estamos sugiriendo que haya di- recciones negativas: todas las direcciones absolutas son números positivos, Se entiende por bit de signo al colocado en la posición 15 de la palabra, que resulta ser “1'” para direcciones superiores a $7FFF.) Hay distintos modos de tratar las direcciones absolutas cortas v largas según los distintos ensambladores. Algunos generan automáticamente el mejor modo para nosotros (por ejemplo, nuestro $6000 seria tomado como corto), mientras otros requieren la letra del código L (largo) o W (corto, es decir, una sola palabra de extensión) tras la dirección. ftiquetas como direcciones absolutas Ya hemos empleado las etiquetas para las instrucciones de ramificación, y hemos explicado brevemente que, cuando el programa esté ensamblado y cargado en memoria, cada simbolo de etiqueta se convierte en la direc- ción de la instrucción a la que se desea saltar. Desde el punto de vista de un programador poco avezado, será suficiente considerar las etiquetas como direcciones y, como tales, emplear los mnemónicos no sólo para saltar, sino también como direcciones absolutas de operandos. La ventaja obvia es su legibilidad y facilidad de programación. Para verlo, reeseribamos el progra- ma 4,5 de la forma siguiente: + Programa 4,5A: Uso de etiquetas como Direcciones Absolutas + Datos como en el programa 4,5, con las ebquetas siguientes: + HRSYTD = dirección 56000, conteniendo 320 horas « HIRSMAR = dirección $6004, conteniendo 138 horas + NEWHRS = dirección $6008 = destino de la suma MOVE.L HRSYTD,D3 D3 = (HRSYTD) ADD.LL. — HRSMAR,D3 D3 = (HRSYTD) + (HRSMAR) MOVE.L D3,NEWHRS Salvar D3 en la dirección NEWHRS + Ahora la dirección NEWHRS = $6008 contiene la suma ($6000) + ($6004) — 458 + Nótese, otra vez, el uso de paréntesis para indicar que se trata del contenido + de una dirección. Asi, tendremos que HRSYTD = $6000; pero (HRSYTD) = 320 143 Directivas del ensamblador Directiva Sin lugar a dudas, la versión 4,54 es mucho más comprensible ¡ diatamente que la 4.5 (quizá, algo más parecida al BASIC), y esto ayu a escribir, modificar y comprobar los códigos. No es ninguna exageracií decir que dificilmente veremos lineas como ésta: MOVE.L — $6000,D3 salvo en ejemplos didácticos. Desde luego, hay que informar al sistema d lo que son las etiquetas HRSYTD, HRSMAR y NEWHRS, y para ello 4 precisa de cierta ayuda por parte del ensamblador. Una vez “asignadas” lá direcciones a las etiquetas, se puede programar en términos de HRSYTI etectera, en lugar de ocupar nuestra memoria humana con números hexade cimales carentes de sienificado. La colocación de las direcciones en los cam pos de datos es casi tan simple como la etiquetación de los números de l; instrucciones para la ramificación. 7 Para indicar al ensamblador lo que deseamos, necesitamos hacer uso dl unas pocas directivas del ensamblador, tambien conocidas a veces por psell docódigos, porque, a primera vista, parecen instrucciones del tipo de las de 68000. Sin embargo, las directivas se limitan a dirigir y controlar el proce de ensamblado y. a diferencia de las instrucciones “de verdad””, no gene lenguaje en código maquina. Los ensambladores modernos disponen dl centenares de diferentes directivas con muchas variantes no estandarizadas, la mavor parte de las cuales se sale del objetivo de esta instrucción. Afortunadamente, solamente se necesitan tres o cuatro de tales direó% tivas para dar sentido a los modos de direccionamiento, por lo que las pré sentaremos empleando la sintaxis estándar “vainilla”? de Motorola. Una vé descritas, podremos completar el programa 4.5A, de forma que HRS represente realmente la dirección que tenemos en la cabeza. de origen absoluto: ORG La siguiente linea ORG Cargar el programa en programa que vienen a continuación sean ensambladas y, eventualmentk cargadas a partir de una dirección especifica dada de forma absoluta. Paf nuestros actuales propósitos, solamente necesitaremos una directiva $ ORG al principio del programa: ORG $6000 El programa empieza en la direccion $6000 A partir de aquí, cada linea del programa fuente será traducida al lenguaje máquina de instrucciones, algunas con una sola palabra, otras hasta cinco, siendo colocadas todas en la dirección apropiada para cada palabra a medi- da que el ensamblador vava incrementando su contador de posición: un simple contador que empieza en el $6000 y se incrementa en uno o en (has- ta) cinco, según las imposiciones de cada instrucción. Cuando se encuentra una etiqueta, inmediatamente ya sabemos (mejor dicho, ya sabe el en- samblador) su dirección, Antes vimos cómo tuncionan las etiquetas de sal- to, ahora podemos entender cómo lo hacen las de datos y las dircctivas empleadas para definirlas. Areas de datos de memoria con DS y DC Hay dos directivas basicas, DS y DC, que nos permiten colocar etigue- tas identificativas de zonas de datos en memoria: ETIQUETA D5.;/ Define Almacenamiento ETIQUETA DC Define Constante DS sirve para reservar un determinadode posiciones de memoria (z— L, W, o B) en la dirección — Etiqueta, mientras que DC colocará, en la memoria que sea precisa, losque se escriban en la columna de la de- recha a partir de la dirección Etiqueta. Eiemplos de almacenamiento de datos NEWHRS — DS,L L-— define almac. = 1 doble palabra en NEWHRS sirve para reservar una doble palabra “vacía” para almacenamiento de da- tos en la dirección NEWHRS, que es exactamente lo que se necesita para el programa 4.SA. Las líneas siguientes realizan la misma función: NEWHRS — DS.W 2 define almac. = 2 palabras en NEWHRS NEWHRS — D5.B 4 define almac. = 4 bvtes en NEWHRS Las palabras buffer o buffer de datos (directamente empleadas desde el original inglés por su aceptación corriente en nuestra lengua) se usan para denotar áreas de memoria asignadas, por medio de DS, a contener informa- ción futura. Á menudo nos encontraremos, por ejemplo, con lineas como estas DSKBUF DS.B 512 Disponer $512 bwtes para buffer de disco o similar, para definir un área general en la que cargar un bloque de infor- mación desde un disco. 145 Se puede, desde luego, emplear DS para reservar sitio para cualg número de dobles palabras, palabras, o bytes, con tal de que se tenga dado de evitar las direcciones impares para las palabras, o las dobles p bras. Por ejemplo: ETIQUETAI DS.B ETIQUETA2 DS.1 A Situar 3 bytes desde “Etiquetal””. ¡Ojo! Si Etiquetal es par, entonces queta2 es impar y no pueden almac mi dos dobles palabras a partir de direg impar. pd La conclusión es que el ensamblador reserva el espacio de memorias citado, incrementa su contador de posición para apuntar tras el área nada, dando a la siguiente etiqueta la dirección convenientemente jp mentada. Asi, aquí tratará de dar a Etiqueta2 el valor correspondien [Etiquetal + $ bytes], que puede ser, o no. legal. Podría ponerse un DS en Etiqueta2 (las direcciones de los bytes pueden ser pares o impares), A un DS.L, o un DS.W, provocarán un error de dirección. / Suponiendo que no hayamos forzado las reglas de par/impar, la dij ción absoluta asienada a un DS dependerá, naturalmente, de dos fa ORG, la dirección de partida del programa, y la situación de la e dentro del mismo. Ántes de pasar a ilustrar esto con un programa, analicemos la otral rectiva de etiquetado de datos, DC, con más detalle. Datos constantes: Ejemplos La sintaxis de datos constantes (DC) es sólo un poco distinta, pequeña diferencia es de importancia galáctica: HRSYTD — DCL 320 Define constante = 320 en HRSYTD no posiciona 320 dobles palabras de memoria. l El 320 representa un único campo de y nos basta con una del palabra (debido al DC.L) para contener el binario equivalente al detl 320 en la dirección que el ensamblador asiene a HRSYTD. Se puede € plear DC para almacenar cualquier cantidad de datos. A menudo se lll - tabla a una lista de datos relacionados y almacenados consecutivame como las tablas de logaritmos, o las tablas trigonométricas, al final de antiguos libros de texto. TABLA DC.B $10,524,5F4,$09 Definición de las cuatro constantes que forman TABLA * El byte de dirección TABLA contiene ahora $10 * El byte de dirección TABLA + ] contiene ahora $2A 146 + El byte de dirección TABLA + 2 contiene ahora SF4 + El byte de dirección TABLA + 3 contiene ahora $09 El formato general es: ETIQUETA DC. ,,... DC.z dispondrá del área suficiente para contener los ,,... que se indican, escribiendolos sobre cualesquiera que hubiera en las direcciones marcadas por la etiqueta. El puede venir expresado en cualquier forma habitual: binario, decimal, hexadecimal, o ASCHL. Merece la pena recordar, una vez más, aqui, que ORG, DS y DC son seudocódigos, no instrucciones verdaderas del 658000. No serán traducidas en palabras de instrucciones de código máquina como un MOVE, o un ADD. Sin embargo, afectarán la posición del programa, la forma en que lo escri- biremos y los valores que encontraremos en las palabras de extensión de las instrucciones despues del ensamblado y la carga. Además, los seudocódigos y las directivas han sido un ingrediente esen- cial de los ensambladores durante muchos años, lo que ha ejercido una con- siderable influencia en los diseñadores de miecroprocesadores cuando deben decidir el tipo y formato del set de instrucciones. Etiquetas de datos en acción Vamos ahora a reescribir el programa 4,5 para poner de manifiesto el fancionamiento de las directivas: + Programa 4,58, Etiquetas de datos con DS y DC + Revisión del programa 4.5A ' HRSYTD = dirección $6000, conteniendo 320 horas '-— HRSMAR = dirección $6004, comtemendo 138 horas + NEWHRS = dirección $6008 — destino de la suma ORG $6000 Inicio en 56000 absoluto * Definición de las áreas de datos Primera etiqueta HRSYTD = dirección $6000 * Después de almacenar 32 bits alu, la siguiente etiqueta, HRSMAR, * será = $6004, y asi sucesivamente HRSYTD DC.L 10 Almacenar 3120 en HRSYTD HRSMAR DC.L 138 Almacenar 138 en HRSMAR NEWHRS DS.L 1 Reservar 1 doble palabra en NEWARS + Resto del programa como en 4,54 MOVE. HRSYTD,DA D3 = (HRSYTD) = ($6000) 147 ADD.L HRSMAR.D3 D3 = (HRSYTD) + (HRSMAR) MOVE.L D3.NEWHRS Salvar D3 en la memoria en la dirección NEWHRS = 56008 + Ahora la dirección NEWHRS = S$6008 contiene la suma ($6000) + (S6004) = 458 En este ejemplo hemos empleado ORG para fijar un área de mem ria, empezando en la dirección absoluta $6000, que contiene no solamer nuestros datos, sino también el propio programa. La primera instrucció MOVE.L, será colocada en la dirección [$6008 + 4 bytes] = S600B, jug detrás de NEWHRS. Es perfectamente posible, y a menudo preferible, separar los datos q programa en memoria. La forma más sencilla de hacerlo consiste en e plear una segunda directiva ORG para definir el principio d programa. A continuación tenemos el programa 4.5€ con una linea má que hace precisamente esto: | * Programa 4.5C: separación de las arcas de datos y programa . Revisión del programa 4.5B. Iguales datos que en 4,5B HRSYTD = dirección $6000, conteniendo 320 horas HRSMAR = dirección $6004, conteniendo 138 horas NEWHRS = dirección $6008 = destino de la suma . - ORG — $6000 — Los datos empiezan en la 36000 absoluta e Definicion del área de datos * La primera etiqueta HRSYTD sera = dirección $6000 Despues de almacenar 32 bits abi, la siguiente etiqueta, HRSMAR, será = $6004, y asi sucesivamente + + 0 Guardar un 320 en HRSYTD 38 Guardar un 138 cn HRSMAR Reservar | doble palabra en NEWHRS HRSYTD DCI Y HRSMAR DC.L 138 NEWHRS DS.L 1 ORG $3000 El programa empieza en la dirección absoluta S8000 * La primera instrucción estará en la $8000 * El programa y los resultados igual que en el 4.5B MOVE.L HRSYID,D3 D3 = (HRSYTD) = (56000) ADD.L —— HRSMAR.D3 D3 - (HRSYTD) - (HRSMAR) MOVE.L D3.NEWHRS Salvar D3 en la memoria en lá dirección NEWHRS = $6008 + La dirección NEWHRS = $6008 ahora contiene la suma de (36000) - (S6004) = 458 En su nueva posición, el programa sigue trabajando como antes, pué que, cuando hace referencia a HRSYTD y las demás ctiquetas, 1008 toma las direcciones de memoria definidas por ORG $6000 y nuestras eli quetas de datos DC y DS. HRSYTD estará definido como $6000, indepen- dientemente de donde coloquemos nuestro programa. La ventaja inmediata de separar datos de programa cs la posibilidad de que varios usuarios con distintos programas compartan una misma tabla en una zona común de memoria mutuamente aceptada como tal. En las insta- laciones reales se encuentran variantes sin fin de esa separación entre áreas de datos y de programas. El asunto ahora es que hemos ganado una consi- derable flexibilidad, independientemente de donde pongamos las cosas. umen del direccionamiento absoluto Los datos de memoria pueden ser accedidos (leidos), o almacenados (es- critos), empleando direcciones absolutas como operandos origen o destino. La dirección absoluta puede ser especificada explicitamente por 56000, o por SFFFFFF, por ejemplo, o mediante etiquetas simbólicas conveniente- mente definidas. El direccionamiento absoluto, incluso con etiquetas, no es lo bastante flexible para la mayoría de las aplicaciones. Una forma más conveniente es mediante los registros de direcciones, tal como se expone en el próximo apartado. Direccionamiento absoluto por registros La principal misión de los registros de dirección, como su propio nom- bre indica, es la de ofrecer las direcciones de memoria de los operandos. En este contexto, es importante la idea del puntero. Si en el registro A3 está el valor 53000, diremos que A3 apunta a la dirección de memoria $3000. Para distinguir entre el puntero A3 y el operando apuntado por él, usa- remos la sintaxis estándar de Motorola: A3 es el puntero y (A3) es el ope- rando apuntado por A3, Los paréntesis de (A3) representan lo que denomi- namos Imdirección. A3 es un registro de direcciones directo, pero (A3) es una dirección sobre registro de dirección. En la sección del “*modelo de memoria'* del capitulo 3 vimos cómo el 68000 usa direcciones de bytes, palabras y dobles palabras; entonces, ¿qué apunta A3 realmente? Si A3 contiene un número impar, tal como 53001, no hay error posible: A3 apunta al byte situado en la dirección $3001; pero si es par, tal como $3000, puede estar apuntando a cualquiera de los tres ca- sos posibles, En esta posición podremos encontrar los siguientes valores: Un byte en la dirección de byte A3= $3000 seria (A3) = SE2 Una palabra en la dirección de palabra A3 = 53000 seria (A3) = SE278 Una doble palabra en la dirección de doble palabra A3 = 53000 seria (A3) = SE278B01C 149 Los valores del ejemplo carecen de importancia frente al modo en que esi identificados. Asi, antes de contestar a la pregunta: “¿Qué es ( , deberemos conocer el tamaño del dato involucrado, sea este L, W,oB,f ejemplo: MOVE.L-—— (A3),D7 llevara SEZT8EBOIC a D7 MOVE.W (A3,D7 llevará $E278 a la palabra inferior de D? MOVE.B. —(A3.D7 llevará SE2 al byte inferior de D? Como podemos observar, el operando origen (A3) se comporta de for muy similar a un registro de datos: los códigos B, W, o L determinan q parte del operando es la afectada. Las diferencias importantes son: las ofi raciones sobre L y W en memoria exigen siempre direcciones pares, | operaciones sobre B pueden tener dirección par o impar. Aqui debem cordar las reglas establecidas sobre “dirección baja-byte alto, dir alta-byte bajo” (vease el capitulo 3). registros de dirección en lugar del absoluto. APLICACION PRACTICA Problema: Calcular el total de horas YTD trabajadas (desde enero ha marzo) empleando operandos indireccionados en memoria. Coloc: total actualizado en la doble palabra de dirección $6008. Datos: Il. El total de horas YTD (de enero y febrero) es una doble palabra sit! en la dirección $6000. 2. Las horas trabajadas en marzo están en una doble palabra situada € la dirección 56004, Solución: Programa 4.6 * Poner las direcciones en los registros de dirección MOVEA.L F96000,41 — Al contiene la dirección de YID MOVEA.L H$6004,42 — A2 contiene la dirección de horas marzo MOVEA.L S608,A3 Aj contiene la dirección de nuevo YTD * Cálculo MOVEL — (A1),D3 D3 = horas YTD ADD.L (42),D3 D3 = horas YTD + horas marzo MOVE.L — Di(A3) Poner D3 en la memoria de dirección A3 = $6008 + Ahora (A3) contiene la suma (A2) + (41) = 458 * Al y A2 permanecen inalterados MOVEA: Llevar a registro de dirección El programa 4.6 introduce un nuevo código de operación, MOVEA (MOVE Address), que no es más que una versión del MOVE empleada cuando el operando de destino es un registro de dirección. El formato po- neral es: MOVEA.] .An o MOVEA.W ,An Las direcciones del 68000 son valores de 32 bits (incluso aunque nuestro 6800X emplee nada más que 20 6 24), de forma que no está permitido un MOVEA.B. Incluso el MOVEA.W es de 32 bits, puesto que el valor de 16 bits siempre es extendido a 32, con el bit de signo, según se explicó en el ca- piuulo 3. Además, MOVEA, como las demás operaciones sobre registros de dirección, no afectan al CCR, puesto que no estamos interesados en acarrcos, reboses, negativos, ceros, o positivos cuando manipulamos direc- ciones. Aqui hemos empleado MOVEA con un origen de datos inmediato para preparar los registros de dirección, Una vez que Al, A2 y A3 están prepa- rados, el programa utiliza (Al) y (A2) como operandos origen y (A3) como dle destino. Restricciones del ADD (suma) Usted, quizá, se asombrará que hayamos usado D3 en el anterior pro- grama, ¿Por qué no ahorramos una linea (y un registro) haciendo MOVE! (AM,LA3) Correcto ADD. (AD(A3) legal La primera línea es correcta; llevará el contenido de la dirección $6000 a la memoria de dirección $6008. La segunda, por el contrario, es ilegal, porque ADD debe tener, por lo menos, un registro de datos, y SUB debe tener, también por lo menos, un registro de datos. El 68000 no permite emplear ADD, o SUB, con dos operandos de memoria. Asi, podremos hacer ADD. Dn,Dm Correcto SUB.2 Dn.Dm Correcto ADD.¿ An,Dm Correcto para ¿= Lu W solamente SUB. An,Dm Correcto para ¿=L o W solamente 151 ADD. Dn,(Am) Correcto SUB.? Dn.(Am) Correcto ADD.7 (Am),Dn Correcto SUB.: (Am),Dn Correcto Pero no se puede hacer ADD.z (Am). An) Incorrecto SUB.?7 (Am) (An) Incorrecto ADD 2 Dn,Am Incorrecto SUB.: Dn,Am Incorrecto Las reglas anteriores prohiben emplear An en ADD ni en SUB destino: entonces, ¿cómo puede aumentarse o disminuirse una direcci un registro de direcciones? Hay una forma, llamada ADDA (sumar a gistro de dirección: ADD Address). Abordemos el programa 4.6 de ángulo diferente, para mostrar la forma en que trabaja ADDA: * Programa 4.6A: Solución alternativa del 4.6, empleando ADDA * Preparación de las direcciones en los registros de dirección MOVEA.W 6000,A0 AU contiene la dirección de YTD MOVEA.W A0AI Al tambien la tiene ahora ADDA.W *34,A0 AO = $6000 — 4 — 56004 MOVEA.W A0,A2 Al contiene la dirección de horas marzo ADDA.W +3,A0 AO = $6004 + 4= $6008 MOVEA.W AD. A3 A3 tene la dirección de nuevas YTD * Cálculo: igual que 4.6 MOVE.L (A1),D3 D3 = Horas YTD ADD.L (A2),D3 DI = Horas YTD + Horas marzo MOVE. D3IJA3) Poner D3 en la memoria de dirección A3 = 56008 Así, para sumar (ADD) algo a un registro de direcciones, empl MT ADDA de la misma forma que usabamos MOVEA para llevar algo a un: eistro de direcciones. El formato general es: ADDA.L — ,An ADDA.W ,An mientras que para substraer una cantidad de An tenemos: SUBA.! ,An SUBA.W — .An Notese, nuevamente, que el hecho lundamental en la vida del 68000 es que no están permitidas las operaciones de bytes con los registros An. Como en el caso de MOVEA, la manipulación con An no provoca alteraciones del COR, El punto clave del programa 4.64 es la forma en que hemos usado ADDA con el puntero AO, Añadiendo 4 a un registro de dirección que ini- cialmente contenga un valor par, conseguimos apuntar a la próxima doble palabra de la memoria, De forma similar, si añadiéramos 2 Ó 1, el puntero se “desplazaria'” para apuntar a la siguiente palabra o al siguiente byte, res- pectivamente. Es muy Frecuente encontrarse con que los datos que se ma nejan están almacenados en la memoria como secuencias o tablas; de Torma que ADDA o SUBA son útiles para “posicionar” los punteros de los repis- tros de dirección con objeto de barrer las tablas de datos en ambos senti- dos. Esta forma de actuar es tan común que el 68000 ofrece dos variantes especiales del modo de direccionamiento en (An) para simplificar el barrido de las direcciones consecutivas. Los modos nuevos merementan o decre- mentan automáticamente el puntero An. Veamos, en primer lugar, el modo indirecto de registro de dirección con posineremento. Direccionamiento indirecto con posincremento: (An) + El modo de direccionamiento indirecto con posineremento, que se es- cribe (An) +, se explica mejor con un ejemplo: Programa 4.68: Solución alternativa a $6, usando (An) + Preparación de dirección del primer valor de la tabla MOVEA.W KS6000,A1 Al contiene la dirección de las horas YTD, es decir, apunta a horas YTD * Calculo MOVE.1 (AMA, DF DA 56000) — horas Y ID, y despues se suma 4 al puntero Al ADD I (AI) +, DFO Se suma (36004) a DF y despues se suma dal puntero A] MOVE.L DIAL) Se puarda DI en la memoria de dirección Al = $6008 En luear de emplear tres registros de dirección para los operandos, esta solución emplea solamente Al, de forma que el posincremento se encarga de apuntar a la doble palabra siguiente trás cada operación. El autoinere- mento es mas *económico”* que la instrucción ADDA X4,A1 y, además, nos evita la complicación de tener que saber de cuánto ha de ser el incre- mento, que el hace automáticamente, Tempus Fugit: Un intervalo dedicado a los cronogramas 154 (Al)+ incrementara Al en 4, 2 6 1, según sea el código del tama dato empleado en el propio código de la operación. Por ejemplo: MOVEW (42) +,D5 Hacer DS = palabra (A2), y despues sumar (ADD) 2 4 ps acabará haciendo que A2 apunte a la siguiente palabra en (Al + 2), y MOVE.B — (42)-,D5 Hacer D5= byte (A2). y despues A2=A2-] hará que A2 apunte al siguiente byte en (A2= 1). Dado que ya hemos visto varias maneras de realizar la misma senil Operación de sumar las horas YTD., resultará muy útil compararlas des punto de vista de los tiempos (cronogramas) empleados en ello. En n sencillo contexto, no pararemos mientes en unos pocos microsegundo más o de menos, pero, desde una perspectiva amplia y práctica, es im tante preguntarse sobre cómo lo hace el 68000 (en la siguiente tabla de tenerse en cuenta que el bus de $ bits del MC68008 precisará de más ci mientras que los 32 del bus de 68020 le permitirán realizarlo en me Programa 4.1 Directo de registros: Tomar los datos de los registros: muy rápido, acceso a memoria. Almacenar los resultados. un registro: muy rápido, pero, ¿cómo se | ' los datos a esos registros? Y ¿cómo se imprimir los resultados? Antes o después necesitaremos 4l ceder a memoria. Programa 4.5 (+ variantes) Direccionamiento absoluto: Tomar la dirección de los datos de las palabras extensión: significa una o dos lecturas en mem ria. Después, tomar el propio dato: significa una. o dos lecturas de memoria. Tomar la dirección para almacenar el resultado: significa una O ' lecturas de memoria. Almacenar la doble palab resultado: significa dos escrituras en memo Proerama 4.6 Direccionamiento indirecto: Disponer tres registros con datos inmediatos: plica de tres a seis lecturas de memoria. Tomál Prorrama 4.64 Proerama 4.6B las direcciones de Án: muy rápido. Entonces, leer los datos: significa una o dos lecturas en memo- ria. Almacenar el resultado: emplea dos escrituras en memoria. Direccionamiento indirecto mediante ADDA: Preparar un registro de direcciones con un dato inmediato: significa una o dos lecturas en memo- ria, Ejecutar un ADDA inmediato dos veces: su- pone dos lecturas en memoria, Tomar las direc- ciones de An: muy rápido. Entonces, tomar los datos: supone una o dos lecturas en memoria. Al- macenar la respuesta: significa dos escrituras en memoria. Direccionamiento indirecto con posincremento: Preparar un registro de direcciones con un dato inmediato: significa una o dos lecturas en memo- ria. Generar la dirección con (An) +: muy rápido. Entonces, tomar el dato: supone una o dos lectu- ras en memoria. Almacenar el resultado: implica dos escrituras en memoria. Así, el modo indirecto con posincremento parece ofrecer el mejor mé- todo global, con tal de que los datos estén convenientemente colocados de forma secuencial en la memoria. Una situación típica en que los datos ocu- pan de forma natural direcciones sucesivas es la del procesamiento de tex- tos, donde se deben manejar largas ristras o secuencias de caracteres ASCII, cada uno de los cuales exige un byte de memoria. A menudo se critica al 68000, arguyendo falta de instrucciones explicitamente dedicadas al manejo de ristras de datos. El ejemplo siguiente demuestra lo contrario. Manejo de ristras de datos con (An) + He aquí un ejemplo de la potencia de (An) +. El problema resultará la- miliar a todos aquellos lectores que hayan tenido que mover o copiar un bloque de texto en un procesamiento de textos. k Programa 4,7: Copiar una ristra de caracteres desde una posición de memoria a Otra Al apunta al primer carácter ASCII del bloque de texto almacenado en la memoria Se supone que el último carácter es el ASCIL “nulo” (0) Se quiere copiar en el bloque de texto, incluyendo el nulo final en otra parte de la memoria de dirección inicial contenida en A2 Si hav algún daño anterior en (A2), puede ser borrado ¡Al es mayor que ! 155 + Si el bloque está vacio testo es, si empieza con el carácter NULO), no nos molestam * en moverlo LAZO TST.B (Al) ¿Hemos alcanzado un Nulo? Prueba del byte en (41)=0 BEQ FINI Sres asi, saltar a FINI MOVE.B (Al) + (A = Llevar el byte de Al al byte de Al. Incrementar Aly Alen 1 para apuntar al siguiente byte BRA LAZO Volver a LAZO para analizar el siguiente byte. FINI- + ATENCION: recuérdese que Al y A2 habrán cambiado su contenido salvo que el prime * carácter en (Al) sea un NULO E Podemos observar cómo (Al)+, como byte origen, y (A2)=, con destino, avanzan como punteros (el puntero Al como *enviador” y el A como **receptor””) en cada carácter de la ristra. Si no se hiciera una OP para cs el final de la ms Mene IA (AD, Asi, el sencillo TST. B introducido anteriormente nos evitará el alterar to el contenido de la RAM. TST.z operando comprueba si el tamaño z =L, W, o B del operando es negativo o zero ( Zero no es error, es para poner en evidencia su sentido), y, según sean. pondrán los respectivos indicadores Z y N del CCR, El indicador N ca de importancia en este ejemplo particular. Asi, TST.B (Al) hace la pregunta: “¿Es el byte en la memoria de dirección Al = 07”. asi, el flag Z se pone a l; de lo contrario se pone a 0. Para el 68000, los digos ASCII carecen de interés por sí mismos: es nuestro problema el i pretar los 8 bits de cada byte de nuestra ristra. El TST.B Funciona bien suponiendo que el bloque se termina con U carácter ASCII NULO que en binario es 00000000 (llamado a veces bls que no debe confundirse con el “espacio”? ASCIT, que es 00100000, O el “cero” ASCII, que es 00110000). Todo lo que debe recordarse es que dl NULO es un carácter ASCII como otro cualquiera y que ocupa un byte € nuestra preciosa memoria. Por ello, nuestra TST.B busca un 0. ! La instrucción BEQ tras la TST.B comprueba el valor del CCR y prÓ voca un salto a FINI solamente si el indicador Z está a 1, es decir, si el DY de (Al) es un NULO. ] Obsérvese también que hemos efectuado un TST.B al principio del pr 8 grama. Si en el primer byte de (Al) es un NULO, saltaremos inmediatá mente a FINI sir efectuar ningún movimiento de datos. Los programado se entretienen ponderando la cuestión de si merece la pena copiar una vacia, es decir, aquella que empieza (y termina) con un NULO. Evidente- mente, debe distinguirse entre un bloque vacio y ningún bloque en abso- luto. El programa 4.7 ignora los bloques vacios, puesto que se salta untes de copiar el NULO. No tiene ninguna dificultad el reescribir el programa 4-7, de forma que se copie el NULO de (Al) en (A2). En muchas facetas de la vida podría ser tachado de estrafalario o metafísico, pero en programación de ordenadores tales detalles pueden ser de vital importancia. Una buena razón para no copiar el NULO en (A2) podria ser que se puede desear co- piar más texto detrás del actual o, dicho de forma más correcta, con pala- bras impresionantes, concatenar con otros bloques. Si, a pesar de todo, us- ted insiste en una copia exacta de un bloque no vacio que incluya el NULO final, aqui tiene el programa 4.8: + Programa 4,8: Copiar una nstra de caracteres desde una posición de memoria a otra + Al apunta al primer carácter ASCII del bloque de texto de memoria * Se supone que el ultimo carácter del bloque es el ASCII NULO + Se desea copiar todo el bloque, incluyendo el NULO final en otra parte de la memoria * que empieza en la dirección A2, Se puede borrar cualquier dato que hubiera en (A2) * Al es mayor que Sila ristra en Ál esta vacia (es decir, empieza con un NULO), no se moleste en moverlo TST.B (Al) ¿Es el primer byte un NULO? BEQ FINI Si lo es, saltar a FINT porque el bloque esta vacio LAZO MOVE.B (Al) + (A2) 4 Llevar el byte de Al a A2, Incrementar Al y A2 para apuntar al siguiente byte en memoria BNE LAZO Si el byte movido no es el NULO, hay que seguir copiando FINI- * Recuerdese que Al y A2 pueden resultar alterados Resumen del modo (An) + El modo (An) +, tanto como origen o como destino, o como ambos, es la Forma más eficaz de manipular posiciones sucesivas ordenadas de menor a mayor. Se prepara An para apuntar a la dirección inicial y, escogiendo el tamaño de la operación (L, W, o B), se permite al 68000 que vaya incrementando correctamente el puntero, Ántes prometimos dos formas de barrer direcciones consecutivas, por lo que, habiendo visto cómo (An)+ va hacia delante, ahora presentamos el modo inverso, —(An), para acceder a la memoria hacia atrás. 157 Direccionamiento indirecto de registros de dirección con predecremento: —(An) El modo indirecto de registros de dirección con predecremento está jp mamente relacionado con el modo (An) +, y se escribe —(An). El punt se reduce o decrementa por 4, 2ó l antes de que se realice la operació la misma forma que en (An)+, el cambio viene determinado por el cód; de tamaño empleado de los datos en la instrucción. He aqui un ejer sencillo: + A5 contiene $8008 al principio CLR.L— —(A5) Reducirá AS en 4, y entonces borrará la doble palabra (58004) Sin embargo, CLR.W-(A5) Reducirá AS en 2, y entonces borrará la palabra (58006) CLR.B— —(A5) Reducirá AS en 1, y entonces borrará el byte ($8007) Empleando —(An), se pueden barrer las tablas desde el final ha principio (lo que a veces resulta más rápido), con tal de que nos acordemg da contraria con —(An). Esta idea se emplea en los procesadores de texif tales como el WordStar, que le permite una búsqueda adelante y hacia at en el documento. Resumen del modo-—(An) El modo —(An), tanto como destino u origen, o como ambos, €s la : ma más eficaz de manipular posiciones sucesivas de memoria en direcciOM de mayor a menor. Se prepara An de forma que apunte justamente más [. de la posición mayor y, tras haber escogido el tamaño de los datos Bl W., o B), se deja al 68000 que vava decrementando correctamente el punt antes de cada operación. Conclusión Concluimos este capitulo con un breve repaso a los modos de dle cionamiento que hemos visto, En el capitulo 5 discutiremos los usos a zados de estos modos e introduciremos nuevos modos e instrucciones: Descripción de los modos: Dn Án (An) (An) + (An) Inmed Abs. W Abs.L Directo a registro de datos. | Llamados ambos directo Directo a registro de dirección. | a registro. Indirecto de registro de dirección. Indirecto a registro de dirección con posincremento. Indirecto a registro de dirección con predecremento. Operando inmediato: también escrito (dato). Dirección absoluta corta (16 bits con extensión de signo): también se escribe xxx[.W] o etiqueta. Dirección absoluta larga (32 bits): también se escribe xxx[.1.] o etiqueta. set de instrucciones del MC68000: Conceptos avanzados En este capítulo emplearemos las instrucciones y modos de direcciona- miento descritos en el capitulo 4. El primer paso consiste en enfrentarse a las labores de housekeeping ', es decir, mantener un control real de la in- formación contenida en la memoria o los registros de datos y direcciones, Esta materia proporciona una ocasión de explorar de forma práctica las ins- trucciones y las posibilidades del M68000. Preservando el valor de los registros: ómo y por qué Con los modos (An), (An) + y (An) nos enfrentamos al problema que se presenta en un programa largo, cuando empiezan a acabarse los registros disponibles, Aunque el M68000 proporciona 16 registros muy versátiles, lo que es bastante más de lo que ofrecen la mayoría de los microprocesadores, ' Hemos conservado el termino housekeeping por varias razones. En primer lugar, su traducción por “labores domésticas'* a algo similar nos parece excesivamente forzada. En segundo lugar, este término aparece con Frecuencia en los manuales de referencia técnica para indicar un conjunto de rutinas que realizan labores generalmente repetitivas, pero fun- damentales para el mantenimiento del sistema, Finalmente, el término puede ilustrar el par- ticular sentido del humor que los americanos han esparcido sobre toda la jerga informática. 161 MOVEM: se puede alcanzar una situación en la que los registros de DO a D7 co gan resultados intermedios importantes y los registros de AO a A7 al nen determinados punteros que no deseamos perder. Supongamos, ejemplo, que nos embarcamos en una operación para copiar una cadem caracteres mediante una instrucción: MOVE.B (A3) +. (A0)- De este modo, como vimos en el capitulo 4, perderemos los valo OS | ciales de A3 y AO, puesto que al final de la operación A3 y ADO apunta a una dirección determinada por la cadena de caracteres, que a men será impredecible. Obviamente, podemos salvar los valores de los re AO y A3 escribiendo su contenido en una posición de la memoria y rarlo al finalizar el proceso leyendo ésta, como se demuestra en el pro * Programa $.1 * Queremos copiar la cadena (A3) — (AO) sin perder los punteros en A3 y AO MOVE.L A3,54004 Salvamos A3 MOVE.L A0,54000 Salvamos AO MOVE.L $4000,40 Restauramos A0 MOVE.L 5$4004,A3 Restauramos Aj El mismo “truco” puede emplearse para salvar y restaurar los valo de los registros Dn. Esto nos permite lograr nuestro propósito, pero hayi gunos “pequeños problemas”. En primer lugar, este truco puede plante problemas en programas largos (''¿Dónde puse yo A3 y D7...2). Pi pi mos, además, borrar inadvertidamente los valores almacenados (al escrib sobre ellos durante alguna operación en el programa). Por último, hay que prestar una notable atención a las direcciones con las que trabajamos (ps o impares) según salvemos dobles palabras, palabras o bytes. El M68000 proporciona dos métodos para simplificar las operacial -y anteriores: la instrucción MOVEM y la pila de usuario. Mover varios registros MOVEM es una versión especial de MOVE que permite salvar vari gistros de una forma rápida y fácil en un grupo de posiciones consecutlk de la memoria y restaurarlos más tarde, cuando se necesiten. Para salvar registros se emplea el formato: MOVEM.Z , y para restaurarlos se emplea el formato: MOVEM.Z , Nótese que Z sólo indica L o W, de modo que no está permitido emplear MOVEM,.B. La puede indicar hasta 16 registros diferentes (de A0 hasta A7 y de DO hasta D7) para salvar o restaurar, mientras que el y el indican la posición de la memoria en que comienza la lista. MOVEM.L transfiere 32 bits (una doble palabra completa), mientras que MOVEM.W sólo transfiere la palabra menos significativa, empleando determinados convenios de extensión del signo al restaurar los registros. El programa 5.1 puede escribirse: 2 Programa 5.14 + Salvar y restaurar varios registros en una dirección empleando MOVEM * Queremos copiar la cadena (A3) — (A0) sin perder los punteros en A3 y A0 MOVEM.L A0/A3,54000 — Salvamos AO y A3 en $4000 y $404 MOVEM.L $4000,A0/A3 — Restauramos AO y A3 desde $4000 y $4004 Nótese cómo los registros en la se separan empleando una barra (4). Para salvar registros consecutivos se puede emplear el for- mato: MOVEM.L D0-D5'A4-A6,S6000 que salvará 9 registros: los 6 registros de datos de DO a DS y los 3 registros de direcciones de A4 a A6. Los 9 registros se almacenarán en la memoria, ocupando Y dobles palabras en las posiciones $6000 a $6020. Para res- taurarlos emplearemos el formato: MOVEM.L $6000,D0-D5/A4-A6 Hasta ahora, hemos estado salvando los valores de los registros en una dirección absoluta, pero también se puede emplear un puntero (siempre que quede algún registro de direcciones An libre), empleando el modo de direc- cionamiento indirecto con predecremento —(An), en cuyo caso debemos restaurarlos empleando el modo (An) +, o direccionamiento indirecto con posincremento. De nuevo observamos como estos dos modos de direcciona- miento son complementarios. El programa 5.1B emplea esta variante: * Programa 5.1B * Salvar y restaurar varios registros empleando los modos de direccionamiento * indirecto An) y (An) + * Se desea mover una cadena de caracteres sin perder por ello los valores * de los punteros AO, A3. AS apunta a la última dirección empleada en el área * de la memoria destinada a almacenar varios valores temporalmente * Suponer que AS = $4008 MOVEM.L A0/A3, AS) Pilas + Con la instrucción anterior reducimos AS en 4. Salvamos A3, comenzando en $4 * Reducimos de nuevo AS en 4, Ahora AS = $4000 Ahora salvamos A0 + Notese cómo MOVEM invierte el orden en que se efectúa el salvamiento! + MOVEM.L (A5)+ A0/A3 + Restauramos el valor de AO desde $4000. Incrementamos AS en 4 y resta desde 54004. Incrementamos A5 en 4. AS recupera su valor inicial: $4008 * La instrucción MOVEM con los modos —(An) y +(An) es muy Como se verá en la sección siguiente, es muy similar al concepto de: pe] Emplear la pila como solución para el problema de salvar y restam registros requiere un corto preámbulo para hablar de la jerga de las pi y de la mistica de las mismas. Como se muestra en las figuras 5.1 y 5.2, el registro de direcciones / se denomina USP (puntero de la pila de usuario) y se emplea para ap a una determinada zona de la memoria, denominada pila de usuario. Es pila “crece” hacia abajo a partir de su base, desde las direcciones más all de la memoria hacia las más bajas, a medida que salvamos datos; y duce hacia arriba, hacia la base de la pila, desde las direcciones más baj hacia las más altas. Quizá ayude este párrafo si se lee con atención. Todo esto nos recu aquella famosa caja que llegó desde Dublín (Irlanda) con la siguiente 15 cripción: *“Esta caja debe permanecer siempre invertida. Para evitar cual quier confusión, la parte inferior se ha marcado como “arriba'.” . El término más empleado para salvar datos en la pila es el de “me los datos en la pila, mientras que la acción de restaurarlos se indica med te **sacar'” los datos de la pila”. Las pilas son dispositivos LIFO (el úl en entrar es el primero en salir), mientras que una cola es un dispositiM FIFO (el primero en entrar es el primero en salir). No hay ninguna duda acerca del lugar en que se está salvando un en la pila. A7, el puntero de la pila, siempre apunta al último dato salve que es el primer candidato a ser restaurado. La secuencia para meter, PU ejemplo, Dl en la pila es: * Hemos optado por traducir stack por pila, push por meter y pull por sacar, que, Í Que no sean las traducciones más correctas, reflejan claramente los conceptos que quel ilustrar. Desgraciadamente, los términos ingleses en este campo están impregnados de un mor muy particular (como ya se ha indicado), asi como de dobles sentidos muy dificil traducir. USP A7 D1 31 1615 0 Antes de completar la acción: Introducir la palabra contenida en Di eo la pila de usuano con MOVE. W DI, (4SP). Decrementar el puntero de pila en 2 antes del MOVE.W, 31 1615 0 Después de completar la acción: Introducir la palabra contenida en D1, Manejo de ta pia MOVE.L DI, AA?) * Predecrementamos A? (en 4, pues oprque nos movemos hacia abajo Dirección NM A924 FBO1 Dirección = N_2 oa 2 Puntero Dire =P ; de pila crecim. de la pila 3 0% > 3Cc5m.2 Z E N44 E Base de la pila CA la) TAME TAS A Puntero O de pila FBO41N-2 3052 97O0A y,> N+4 Base de la pla Figura 5.1 mnirodcir datos Meter DI en la pila estamos tratando con palabras dobles) co la memoria (Recordemos que la pila crece hacia abajo) Entonces metemos Dl en la nueva dirección citada por A?; el puntero de la pila apunta ahora al elemento reción salvado 165 166 Puntero dE de pila ESE se red. las pilas USP A7 Dirección = N- 2 , F.Bo01mn-al D1 3C52n 31 1615 0 É 97 0A yl Antes de completar la acción: 1 Sacar una palabra de la pila, introduciéndola en D1 con MOVE W (SP1+.,D1. Incrementar el puntero de pila en 2 después del MOVE W N+4 y Base de la pila . a Sd crecen las direc Memoria CS Ea A CEE Puntero de pila IAS usP A7[__ Dirección N__ mf” D1 31 1615 0 Después de completar la acción: Se ha sacado una palabra de la pia Base de y se ha metido en D1 la pila ASE crecen las direc Figura $.2 Manejo de la pulas sacar datos Para sacar Dl de la pila se emplea: MOVE.L (A7)=,DI Restaurar DI desde la pila + El valor previo de DI está almacenado en (AT); asi pues, se lleva (A7) a DI + y se incrementa A7 en 4 para reducir la pila. (A7) apunta ahora al dato + (si es que hay aleuno) que entró antes de DI La sintaxis estándar permite emplear el mnemónico SP (Stack PoiM 3 puntero de pila) en lugar de A7: MOVE.L D1,—4SP) Meter DI en la pila MOVE.L (SP)+,D!I Restaurar Dl desde la pila MOVEM y la pila Se puede emplear MOVEM para salvar varios registros en la pila: MOVEM.L DO-DIFAD-A6, ASP) de este modo, salvamos los valores de 11 registros, y con MOVEM.L (SP) + DO-DIFAD/A6 los recuperamos. MOVEM, sin embargo, permite salvar sólo los registros (Lo W), mien- tras que MOVE permite salvar datos de la memoria en la pila, incluyendo bytes. Metiendo bytes en la pila Cuando se introduce un byte en la pila, por ejemplo: MOVE.B_ D2, (SP) — Salvar el byte menos significativo de D2 en la pila el M68000 tiene implementado un interesante truco que impide que los nú- meros impares entren en juego si más tarde deseamos meter una palabra o una doble palabra en la pila. La figura 5.3 muestra cómo funciona este truco, Normalmente, la instrucción MOVE.B predecrementa y posincrementa An en 1, pero cuando trabaja con el puntero de la pila SP (- A7), el proce- sador cambia el puntero en 2 unidades para mantener las direcciones como números pares. Todos los datos de la pila quedan alineados como si de pa- labras se tratara. Cuando metemos un byte en la pila, este se aloja en el byte más significativo de la palabra de la pila, mientras que el menos signi- ficativo se desperdicia. Una vez que hemos visto cómo funciona la pila del M68000, vamos a ver una situación en la que el M68000 la emplea por su cuenta, sin hacer uso explícito de una instrucción MOVE. Primero necesitamos entender el con- cepto general de subrutina. Subrutina: Una definición breve Una subrutina es una parte del programa construida de modo que puede llamarse desde cualquier parte del programa principal y, una vez que ha concluido la tarea que tenía que realizar, devuelve el control al lugar del programa desde donde se la invocó. Las subrutinas tienen una etiqueta que las identifica, y llamar a una subrutina es muy parecido a efectuar una bi furcación fhranch). Sin embargo, a diferencia de las bifurcaciones, que 167 de) LA 1d) de la pila sp ar oo se D2 31 1615 D ; Antes de meter q el byte A MOVE.B D2, - (SP) rocio El byte entra en la parte más significatiwa de la palabra Edel LATA) COMENTE $2000 23 SP A7 2000 $2002 A2 93 D2 5A23 31 1615 0 Después de meter el byte Base de la pila Figura $.3 Funcionamiento de la pila con bytes simplemente nos llevan a un lugar en el programa, llamar a una subrutiná: requiere un mecanismo que permita al sistema recordar la linea en la que Sá produjo la llamada, de modo que, cuando la subrutina concluye, el sistemá sepa adónde retornar. E ; Las subrutinas son vitales para reducir la cantidad de código que hay que escribir y depurar. Cualquier secuencia de instrucciones que se emplee varias veces puede codificarse en forma de subrutina y luego llamarse É A a menudo como se necesite desde cualquier linea en el programa principaa Veamos cómo se llama a una subrutina y cómo el M68000 involucra en de forma automática a la pila, para asegurar que la dirección de retornú' queda a salvo. | -BSR: Saltar a una subrutina Las subrutinas se llaman con una instrucción BSR. El formato empleado para BSR es el mismo que para la instrucción Bec: BRS — Saltar a la subrutina que comienza en la En la linea de la encontraremos la subrutina codificada como cualquier otra parte del programa, pero concluida siempre con un RTS (re- torno desde la subrutina). Aqui está, paso a paso, la secuencia que inicia un BSR: 1. Calcular la dirección de la siguiente instrucción y meterla en la pila de usuario. 2. Saltar (incondicionalmente, como en el caso de BRA) a la instrue- ción marcada con la, haciendo que el PC apunte a la di- rección de la 3. Se ejecutan, normalmente, las instrucciones que comienzan en la hasta encontrar un RTS. 4. Se carga el PC, sacando de la pila la dirección que se salvó en el paso 1. De hecho, el procesador efectúa internamente un MOVE.I (A?) + ,PC. El procesador ejecuta la instrucción cuya dirección se encuentra en el PC, de modo que el control se ha devuelto a la instrucción que seguia a la instrucción BSR. un El trio BSR, y RTS se combinan para construir una [écnica a la que nos referiremos como llamar a una subrutina. La etiqueta debe ser un mnemónico, puesto que normalmente hablaremos en términos de llamar a la subrutina “etiqueta''. Una subrutina ahorra trabajo de programación y reduce el tamaño del programa, ahorrando, por tanto, memoria. Ni la instrucción BSR ni la instrucción RTS afectan al estado de los indicadores del CCR, aunque seguramente las instrucciones contenidas en la subrutina los emplearán y alterarán. Veamos cómo funciona la instrue- ción BSR: Programa 5,2. Llamar a la subrutina AC UMU Programa para sumar varios numeros que están en la memoria «DI se empleara como acumulador. La subrutina ACUMU sumará DO y DI COMIEN CLR.L DI Comenzamos. Poner a cero el acumulados : PRINCE. MOVE.L (Al),DÓ0 Proerama principal. Ponemos el valor de (Al) E | | en DO BRS ACUMU Llamamos a la subrutina ACUMI MOVE.L (A2),D0 Ponemos el valor de (A2) en DU BRS ACUMU Llamamos a la subrutina ACUMU otra vez 169 170 La sección de las subrutinas comienza aquí ACUMU ADD.L D0.D1 Esta es una subrutina de una sola llamada ACUMU KRIS ACUMU entrada = doble palabra DO que no cambia salida — doble palabra DI = DI + Do Normalmente las subrutinas son más largas y más útiles que el ejeny que se da aqui. Sin embargo, esta subrutina nos sirve para ilustrar los pr eipios básicos de su manejo. Subrutinas: Parámetros de entrada y salida Normalmente se asignan valores a los parámetros de una subrutina Ñ diante MOVE antes de saltar a la misma con una instrucción BRA. Ca subrutina debe tener un conjunto de parámetros de entrada, ACUMU sólo un parámetro de entrada DO y otro de salida DI. Para optimizar el de las subrutinas, estos parámetros y su uso deben estar perfectamente d cumentados. Las subrutinas se denominan programas de propósito g o utilidades. Una vez que se han comprobado, pueden añadirse a un brería de subrutinas accesible a cualquiera que emplee el sistema. M ensambladores permiten que dicha librería sea escrutada durante el el blado; cualquier subrutina llamada durante el programa se copia auto camente. El propósito que se persigue es el de “no reinventar la ru Una vez que se comprende lo que hace una subrutina particular, se cmpll esta como si de una sola instrucción se tratase, sin preocuparse por los de talles internos de la misma. Efectos secundarios de las subrutinas sobre los registros Una subrutina de propósito general bien diseñada debe proteger al usul rio de efectos secundarios no deseados. Una subrutina compleja puede cer uso de muchos registros y, a menos que se tomen medidas, sus valofÉ se perderán. La pila de usuario parece un lugar apropiado para salvi y más tarde restaurar, estos valores aun a pesar de que BSR y RTS empl la pila para salvar y recuperar A dirección de retorno de la subrutina (p: 1 24, citados anteriormente). La filosofia LIFO de la pila permite reali2A sucesivos salvamentos y restauraciones siempre que éstos se efectúen e orden correcto. Seguidamente se da un ejemplo de programa que emplea la pila en una subrutina: * Programa 5.3: Subrutina PONERO *AÓ apunta aun área de memoria que deseamos poner a cero * DO contiene el número de palabras que hay que poner a cero * La subrutina PONERO no debe alterar AU n1 DO PRINCI. BSR PONERO — Salvar la dirección de retorno Saltar a PONERO * Sección de las subrutinas PONERO MOVE.L DO, 45P) Salvar DO en la pila MOVIE.L AD, 45P) Salvar AD en la pila BUCLE CIRW (AD) Poner (AD) a cero Incrementar AD en 2, SUBQ.L +**1,D0 Decrementar el contador BNE BUCLE Cuando el contador sea cero. abandonar el hucle MOVIE. (SP)+>,A0. Restaurar A0 MOVE. A(SP)+,D0 Restaurar DO RIS Recobrar la dirección de retorno y volver Cuando se restauran valores de la pila (implicita o explicitamente), se hace en orden inverso a como se salvaron en la misma, dejándola igual que se encontraba antes del BSRK. Efectos secundarios de las subrutinas en el CCR Es casi seguro que los indicadores del COR se alterarán durante la eje- cución de una subrutina, y esto puede producir problemas en el programa principal. Muy a menudo se prueba un valor para llamar a una de las tres subrutinas, según éste resulte positivo, negativo O cero, Al volver puede desearse probar estos valores de nuevo empleando los valores oniginales del COR. Preliminares Como va se ha visto, puede quererse llamar a una subrutina determi- nada en muchas condiciones diferentes, y una subrutina que cambia el con- 171 Salvando el CCR 172 texto del programa principal tiene un coste elevado en flexibilidad y py producir errores dificiles de hallar. Muchos o provocados por el sistema o por el rai Puede general de * *presers ar él contexto” es fundamental en todas las Operacior de un ordenador. Por contexto entendemos aqui la lista de todos los registros e indicad res del procesador (incluyendo el PC) que necesitamos para salvar en a lugar, de modo que cuando llegue el momento de regresar al pro principal (tras una interrupción o una llamada a una subrutina) pueda ciarse la tarca que se ejecutaba de forma inequivoca y correcta. Una er, diendo de la situación, “salvar el contexto”* puede ser bien responsabilid; del programador, bien una tarea asignada al sistema operativo. Más al lante veremos cómo el M68000 mantiene una pila independiente acce sólo en modo supervisor mediante el punto de pila del modo supe 5 (S5P). El modo supervisor es un modo de trabajo privilegiado definido pi proteger ciertos contextos vitales para el sistema, empleando la pila en SUPervisor. Cuando se emplean subrutinas definidas por el usuario, se puede er plear la pila para salvar los indicadores del CCR del mismo modo que ha riamos para preservar los valores de los registros. La forma de hacer €8 difiere, sin embargo, entre el MC68000 y los M68010/M68020 (por razon que se discutirán en el capitulo 7). En el MC68000 se emplea: MOVE. W SR, 4SP) Salvar el SR en la pila De modo que, aunque sólo necesitamos salvar el CCR, nos vemos oblig dos a salvar ambos bytes del registro de estado. Los procesadores M68010 68020 permiten emplear otro método más simple: MOVE.W CCR,4SP) — Salvar el CCR en la pila que sólo salva el byte del CCR en la pila (el otro byte se pone a cero). cualquier caso, para restaurar el COR se emplea: MOVE.W- (SP) - ,CCR ' Hemos optado por traducir hue (bicho) por error, pues éste es su significado correct Tambien hemos empleado el término depurar para debugginge, a pesar de que ambos (Ent nos se han incorporado a la jerga de uso común en informática. En todos los ejemplos de este capitulo se empleará la versión del M68000 (MOVEr desde el SR). -RTR: Retornar y restaurar el CCR Una forma más simple de restaurar los valores del CCR es emplear una versión especial de la instrucción RTS, denominada RTR (retornar de la subrutina y restaurar los valores de los indicadores). La instrucción RTR al final de una subrutina restaurará los valores del CCR y luego devolverá el control al programa principal. Usar RTR cuando no se han salvado pre- viamente los valores del CCR es un grave error, la pila no estará 'sincroni- zada'” y por todas partes surgirán errores. Anidando subrutinas Una vez comprendido el carácter LIFO de la pila de usuario, se ve inme- diatamente que las subrutinas pueden llamar a otras subrutinas y asi sucesi- vamente; este concepto se conoce como anidar. Simplemente confiamos en que la pila nos devuelva en último lugar lo que entró primero. El máximo número de subrutinas anidadas que pueden tenerse depende únicamente del sistema operativo y de la memoria disponible. Muchos sistemas no asignan un área fija a la pila, de modo que ésta puede crecer (hacia abajo) hasta que *““choque'' con una zona de memoria en uso, Vamos ahora a introducir otros modos de direccionamiento, Excluyendo los modos de direccionamiento especiales del MC68020, tenemos cuatro modos que discutir en este capitulo. Todos ellos son variantes del direccio- namiento indirecto. Direccionamiento indirecto por registros con desplazamiento Este modo se describe d16(An), donde d16 (un número de 16 bits) re- presenta el desplazamiento en bytes que se suma al registro Án antes de to- mar el operando de la memoria. A diferencia de los modos —(An) y (An) +, el valor de An no cambia al emplear este modo de direccionamiento. Fl desplazamiento puede ser cualquier número con signo de 32.768 hasta + 32,767 y se empleará la notación d16 para recordar este hecho. Por tanto, este modo de direccionamiento permite acceder a la memoria en un intervalo de 32 Kbytes por arriba o por debajo de la dirección contenida en el rexistro An. Se emplea principalmente para trabajar con datos en una tabla cuya dirección base (es decir, la dirección de comienzo de la tabla) está contenida en An. Es útil expresar el modo dl6(An) en términos de cáleulo de una dirección efectiva, , es decir: = dl6 + An, Esta 173 fórmula expresa cómo el procesador determina la dirección del ope El desplazamiento d16 se almacena en realidad como una palabra de ex sión, como ya se vio en el caso de datos inmediatos. El tiempo de cálcule una dirección efectiva puede variar desde 0 ciclos, en el modo directo, 17 ciclos,en modos complicados de direccionamiento indirecto. Veamos mo tunciona el modo dl6(An). Modo con desplazamiento: Aplicaciones En la figura 5.4, A2 = $6000 apunta a una tabla de datos que consi en 20 dobles palabras ($6000), (S6004), ($6008), (S600C), etc. Para pay D3 al valor de la cuarta entrada necesitamos efectuar un: y MOVE.L 12(A2),D3 puesto que la dirección efectiva de la fuente es: A2 + (3 dobles palabras) = A2 + 12 bytes = $6000 + $C = $600€C tras el MOVE A2 =$6000. Si deseamos cambiar el orden de las seg y tercera entradas de la tabla, podriamos emplear el método: * Programa 5.4: Cambiar el orden en una tabla * lHustraremos el uso de dl6(An) tanto en origen como en destino = A2 contiene la base de la tabla + Invertimos el orden de la segunda y tercera entradas MOVE.L 4142),D0 Tomamos lá segunda entrada MOVE.L $(42),4442) — Movemos la tercera entrada al lugar de la seg MOVE.L DO.8(A2) Ponemos lá segunda entrada en tercer lugar Los tres puntos a tener en cuenta cuando se emplea este modo sonf l. Para operandos tipo L o W, la suma (d16 + An) debe ser un N mero par. Para operandos tipo B, esta suma puede ser par o impé 2. No deben confundirse —(An) con —1(An). Por ejemplo, si Als = $2001, tanto MOVE.B —1(A2),D3 como MOVE.B —(A2) mué ven el byte de menor orden de D3, pero —1(A2) deja A2 = $200 El modo predecrementado (A2) reduce A2 a $2000. 3. Este modo aparece normalmente como BLACAn); por ejempl donde BLA es un desplazamiento (es preferible que BLA tenga 2 rácter mnemotécnico) al que se le asiena un valor durante el ensal blado. Hay muchos casos en los que se necesita la flexibilidad de un despla miento variable en lugar del desplazamiento Hijo de dI6(An). El prox modo de direccionamiento soluciona este problema. 174 byte N +1 ¡ADA pa 43210 byte N ALLI RZ, A CCcrR XI N|Z]V|C palabra N ¡E EA: palabra N + ¡A Ñ r $6000 31 2423 1615 $600C PT HD A AN IAE VENA Antes de la instrucción MOVE.L 12142), D3 432 1 0 MUADTNTTD COR X N E V G byte N bye N +1 q Le MAD AAD cambios paúlabra N nea Resultado Puestos palabra N - 1 10 nulo a cero s ¡ lll AQ : o|jo|jo0J0O]j6 JO ¡O JO 31 24 23 1615 87 0 $6000 D3 PC $600C $600 31 2423 1615 87 0 Después de la instrucción MOVE L 12/42), D3 Direccionamiento indirecto por registros con desplazamiento e índice La extensión del modo dl6(An) permite un desplazamiento varjal extra, conocido como indice, para sumarlo desde un registro. Llamarem modo indexado a este tipo de direccionamiento por brevedad. Se e cri] ds(An,Xi.Z), donde d8 representa el desplazamiento en bytes QUe se efas tuará (d8 es un número de $ bits con signo desde —128 hasta + 127), A contiene la dirección base como en el caso anterior y Xi es cualquier reph tro (DO-D7, A0-A7), conocido aqui como registro indice, y Z es un cód; de tamaño: L o W. La dirección efectiva, , construye con tres elementos diferente = An + d8 + Xi,Z. En otras palabras, el procesador toma el nú d8 y suma el número de bytes indicado por éste con la dirección An, y des: pués toma del registro Xi.Z el número de bytes que debe emplear para efe tuar el desplazamiento final relativo a An. El registro Xi.L aportará los 32 bits en el caso de Xi.L, bien los 16 menos significativos en el caso Xi.W. La velocidad de cálculo de la dirección efectiva es la mi para los casos L y W,. : Á menudo abreviaremos el modo indice a d(An,Xi) si el desplazamientt fijo d8 es 0, este modo propiciará un modo indexado sencillo, como se en cuentra en muchos microprocesadores de 8 y 16 bits. Modo indexado: Aplicaciones La aplicación principal del modo d(An.Xi) se encuentra al acceder a trices multidimensionales de datos en la memoria. Con dos desplazam tos, por ejemplo, se puede asignar a An la dirección base de una hoja de cálculo. Si se asigna al desplazamiento d el valor del número de linea y A registro indice Xi el número de la columna, entonces d(An.Xi) es la direé ción efectiva de la celda en la memoria, es decir, el contenido de la e que se encuentra en la intersección de la fila y la columna indicada. Aunque el desplazamiento fijo d8 ofrece un intervalo que va desde — hasta + 127 solamente, el registro indice Xi.L es una amplia compensació pues puede cubrir un rango de 2 Gigabytes a cada lado del valor del p lero An. Veamos el uso del modo indexado empleando los datos del progfk ma 5.4, con 48 =0 para mostrar un direccionamiento indexado simplé; * Programa 3.5: Cambiar las posiciones de los registros en una tabla * empleando modo indexado * Datos iniciales como en el programa 5.4 + lustrar el uso del modo dS(An,X1.Z) tanto en origen como en destino * Al apunta a la base de una tabla de dobles palabras * Invertir el orden de las segunda y tercera entradas 176 MOVEQ.L. %4,Dl Se pone el registro indice Dl a 4 MOVEL —— 0(42,D1.W),D0 Se salva la segunda entrada de da tabla MOVEA.W H8,AU Se pone el registro indice AO as MOVE.] O(A2,A0,W).0(A2,DL,W) Se mueve la tercera entrada al segundo lugar MOVE.1 DO,O(A2,A0,.W) Se mueve la segunda entrada al tercer lugar + Nótese que ÁA2 permanece sin cambios En el programa 5.5 hemos empleado tanto los registros D] como A0 para demostrar que se puede emplear cualquier tipo de registro como in dice. Los registros de datos son más apropiados que los de direcciones, principalmente, porque se pueden realizar más operaciones aritméticas sobre ellos. Cuando se está trabajando con una tabla, a menudo, es mejor operar (sumar, restar, multiplicar e incluso dividir) sobre el desplazamiento en Xi. En el programa 5.5 la tabla está constituida por dobles palabras, de modo que hay que ajustar los desplazamientos en múltiplos de 4. Para ta- blas de palabras, los desplazamientos deben ser de 2. Naturalmente se puede pedir al M68000 que efectúe estos cálculos por nosotros. Para obte- ner múltiplos, ¡multipliquemos! Multiplicación Hay dos instrucciones básicas de multiplicación que emplean el mismo lormato: MULS Dn Multiplicación con signo MULU ,Dn — Multiplicación sin signo Ambas instrucciones muluplican dos palabras de 16 bits, proporcionando un resultado de 32 bits. No se necesita un código de tamaño, pues implicita- mente se asigna el código W, La fuente puede venir dada por cualquier modo de direccionamiento, excepto por An (direccionamiento directo por registro). La multiplicación se efectúa de acuerdo con la regla: (palabra en la fuente) < (palabra de orden más bajo en Dn) = (resultado de 32 bits en Dn) Como en el caso de ADD o SUB, la fuente permanece inalterada, pero el resultado destruye el valor previo del operando destino. Sin embargo, a di- terencia de ADD v SUB, la multiplicación con signo (MULS) o de multipli- cación sin signo (MULU). Cuando se emplean ADD o SUB, los indicadores 177 178 V (rebose) y C (acarreo) advertian de posibles errores en el signo del resi tado. La multiplicación es diferente. Las inviolables leyes de la aritmética binaria indican que. al multipli dos números sin sieno de 16 bits, la respuesta cabe siempre en 32 bits gi acarreo ni rebose. Multiplicar un número con signo por otro sin signo mi un ejercicio con resultados brillantes, pues el M68000 asume que se conog bien los tipos de los números que se pretenden multiplicar. Se debe el entonces entre MULU y MULS para obtener una respuesta correcta, bas instrucciones afectan a los indicadores del CCR: Indicador XxX N Z V dl MULS/MULU d * 0 0 (Recordemos lo que nuestra notación indica: X no cambia; N se pone; valor del bit de signo —bit 31—: Z se pone a 1 si el resultado es cero; Cy siempre se ponen a 0.) MULS, desde luego, maneja correctamente los nos de los resultados, por ejemplo: (6) x (-2)= +12 y (26) x (+ = —12, de modo que el indicador N indica literalmente positivo O nega MULU se emplea para multiplicar sin considerar el signo, entonces N g indica que valor tiene el bit más significativo (el bit en la posición 31) de: tras la multiplicación. llustraremos MULS con un sencillo (pero esencial) ejemplo tomado una nómina: * Programa 5.6: Horas = Precio de la hora = Paga + Como en el programa 4.1, la palubra D2 contiene el número de horas * que se trabajo en el més de marzo = 138 + La palabra en D4 contiene el precio por hora = 699 + Calcular el salario de marzo; si es positivo, salvarlo en la palabra larga = en la dirección absoluta $A200. Preservar los valores de D2 y D4 MOVE. W D4,48P) — Salvar le palabra D4 en la pila MULS D2,D4 D4 es ahora D4 = D2 x D4 = Horas + Precio = (D2 no cambia, Dá cambia) BMI DELDA Si el resulla es negativo, ir a deuda BEQ NOPAGA Si el resultado es cero, ira NOPAGA MOVE.L— D4,A32000. Salvar el salario en la memoria MOVE.W (SP)-.D4 Restaurar el valor de D4 BRA FINAL Saltar a la sección final DEUDA MOVE W 1(SP)+,D4 — Restaurar el valor de D4 (vease nota 2) BRA FINAL Saltar e la sección final NOPAGA MOVE.W (SP)-,D4 Restaurar el valor de D4 (vease nota 2) + $ FINAL * Salario de marzo — 96462 almacenado en SA200 + D2 no ha cambiado, se restaura 14 l. Se ha empleado MULS en lugar de MULU, porque en la mayor parte de las aplicaciones financieras aparecerán cantidades negati- vas (devoluciones, ajustes, etc.), MULS permite emplear BMI con sentido, puesto que BM] comprueba el indicador N. Tenemos que mantener la pila ajustada. Puesto que hemos metido D4, hay que sacarlo antes o después. No se puede sacar antes del BM! o el BEQ, porque el MOVE afecta los indicadores N y Z. 3. Tenemos un uso tipico de BRA (salto incondicional) para saltar por encima de secciones del programa que no nos interesan. Sin el pri- mer BRA FINAL, el programa habria entrado en la sección de DEUDA una fuente común de errores. ta División Como en el caso de la multiplicación, existen dos instrucciones para la división: DIVS ,Dn División con signo DIVU ,Dn División sin signo Ambas instrucciones dividen el operando destino, Dn (32 bits), entre el ope- rando fuente (16 bits) para dar el resultado (16 bits) en la palabra más sig- nificativa. La fuente puede tener cualquier modo de direccionamiento, cxcepto An, de modo que podemos dividir un registro de datos entre otro o entre una palabra en la memoria. Como ya se ha visto en otras operaciones aritméticas, la fuente (divisor) permanece inalterada, mientras que el desti no (dividendo) se reemplaza por el resultado. La división emplea, pues, la seulente regla: (Destino —los 32 bits de Dn-—) / (Fuente —una palabra de 16 biis—) > (Resto —palabra más sienificativa de Dn—) (Cociente —palabra menos signiticativa de Dn—) He aqui un pequeño ejemplo: * Programa 5.7 * Ganancias diarias promedio calculadas empleando DIVS * Empleando los datos del Programa 5,6, D4 contiene el salario de marzo — 96462 * Calcular las ganancias diarias medias y almacenarlas en la segunda palabra * de una tabla que emplea como puntero de la base el registro A2. Salvar el resto en la sexta palabra de esta tabla, Conservar el valor de D4 + MOVE.L DIVS D4,D7 %31,D4 MOVE,W D4,242) SWAP Ds MOVE.,W- D4,10(42) MOVE.L D7,D4 * Ahora 242) = 3111 y 10(A2) =21 * 96462/31 = 3111, con un resto de 2] * Almacenarlas en la segunda palabra de una tabla que emplea como puntero de la bag el registro A2. Salvar el resto en la sexta palabra de esta tabla. Conservar el valor de MOVE.L D4.D7 DIVS +431.D4 MOVE.W D4,2(42) SWAP D4 MOVE.W- D4,10(A2) MOVE.L — D7,D4 * Ahora 2(A2) = 3111 y 10(42) =2] + 9646231 = 311, con un resto de 21 SWAP Dn cs una instrucción simple, pero poderosa, que invierte el of den de las palabras más y menos significativas en los registros de datos. tese que en el programa 5-7 no se puede emplear directamente la instruc MOVE para salvar el resto, puesto que esta instrucción sólo mueve la labra menos significativa, y MOVE.L mueve toda la palabra. Más adela estudiaremos manipulaciones más extrañas en los registros, ¡ncluyel desplazamientos y rotaciones: pero ahora va hemos visto la necesidad € estas operaciones: aislar una parte de un registro para poder acceder a ell Se ha empleado DIVS por la misma razón que se empleó MULS en 6 programa 5-6. DIVS proporciona la respuesta correcta; asi, por ejempl0; (-24)(—2) Los indicadores N y Z del CCR reflejan el estado del cociente, porque Y resto tiene el mismo signo que el dividendo (a menos que el resto sea cero) Por ejemplo: (+12) y ( Se salva D4 en D7 Se divide D4 entre 31 (división en modo inmedia o) Palabra significativa de D4 = cociente. Palabra más significativa de D4 = resto | Se salva el cociente en la tabla Se cambia el orden de las palabras en D4. El es ahora la palabra menos significativa y el coci la más significativa Se salva el resto en la tabla Se restaura Dá4 Se salva D4 en DT Dividir D4 entre 31 (división en modo inmediato). Palabra significativa de D4 = cociente. Palabra más significativa de D4 = resto Se salva el cociente en la tabla Se cambia el orden de las palabras en D4. El resto | es ahora la palabra menos significativa y el cociente. la mas significativa Se salva el resto en la tabla Restauramos D4 ,: + 24)/(-2) = (- 12), etc. (+ 25)/(-2) =(-12) resto= +1 (-25)14(-2) =(+ 12) resto= —] (25)141+ 25) =(-1) resto= +0 A diferencia de MULS, DIVS y DIVU pueden presentar dos problemas. El primero de ellos lo constituyen las “*divisiones por cero”. Si el programa no comprueba esta posibilidad, el M68000 disparará un mecanismo (TRAP) para evitar que el sistema caiga en un ciclo infinito. Este tipo de mecanis- mos pertenece a una clase de excepciones, que bien se encuentran bajo el control del programador o bien son competencia del sistema, que llevan al M68000 al modo supervisor (que se ha mencionado en el capitulo 3). En este modo privilegiado, el sistema inicia la acción de recuperación apro- piada. Brevemente, el mecanismo que se oculta tras un TRAP, como el que se dispara en el caso de una división por cero, lleva al procesador a una tabla en la memoria reservada al sistema ($000-$3FFF), denominada tabla de vec- tores de excepción, donde se encuentra la dirección de la rutina capaz de controlar la situación. El M68000 es, pues, tremendamente flexible a la hora de controlar una situación que en otros chips menos elaborados lle- varía al caos, la destrucción o a cosas peores. El segundo problema que puede aparecer es que DIVU y DIVS pueden llevar a situaciones de rebosamiento cuando el dividendo sea muy grande en relación con el divisor, de modo que se exceda la capacidad de 16 bits (de —32767 a 32768 en el caso de aritmética con signo y 65536 en el caso de aritmética con signo). Como medida de protección, el procesador pondrá el indicador de rebose, V, a 1 en el caso de que se produzca esta situación. Silos números que se están empleando pueden llevar a esta situación. se debe comprobar el estado del indicador Y inmediatamente después de la di- visión con un BVS (bifurcar si se produce rebosamiento) inmediatamente despues de la división, tal como anteriormente se hizo con ADD. DIVS y DIVU afectan al COR seguñ la siguiente tabla: Indicador X N Z V C DIVS/DIVU ] + , A 0 que comeide con la de MULS/MULU, excepto en el caso del indicador Y. En el programa $-7 empleamos para el divisor el número de dias de marzo, el modo inmediato: 431, ¡Un programa más práctico permitirá em- plear otros meses! Por ejemplo, podriamos construir una pegueña tabla con los días que tiene cada mes. Una tabla así puede ser útil en muchas aplicaciones financieras: para calcular los días transcurridos entre dos fe- chas a efectos de amortización de intereses y cosas parecidas. El modo in- dexado es adecuado a estos propósitos. En el próximo ejemplo veremos cómo se pueden efectuar cálculos aritméticos en el registro indice para sim plificar la localización de los datos en una tabla. 181 ASL: Desplazamiento aritmético a la izquierda 4 Programa 5,8 + Ganancias diarias promedio en cualquier mes El numero del mes M (Enero = 1, Febrero = 2, etc.) se encuentra en la palabra meng ficativa de DO. D4 contiene la paga de ese mes. AO apunta a la base de la tabla de labras DIAMES (A0) = 31, NAO) = 28, 440) =31,... 2440) = 31 Por tanto, el número de dias del mes M se encuentra en la palabra 12 HA0), lenoraremos a los años bisiestos por el momento Calcular el promedio diario de ganancias con una cifra decimal y almacenar el resultado en la palabra menos significativa de D6 * Conservar los valores de D4 y D6 He o 4 MOVEM.L D0/D4, 4SP) Los guardamos en la pila SUBQ.W MULS 100.D4 Multiplicar las ganancias por 100 DIVS D(A0,D0.W),D4 — Dividimos D4 entre los dias del mes M MOVE.M D3,D6 Se ignora la palabra mas significativa de DI (el resto) La palabra menos significativa contiene el prome dio por 100 ¡ MOVEM.L (SP)+,D0'D4 Restaurar los valores de DO y D4 + Para el conocido mes de marzo, M=3, de modo que DO =2x(3—I| =2 El operando fuente para DIVS es la palabra en la dirección 0 + AO + 4=4(A0), es decir. la tercera entrada en la tabla DIAMES, 31. D6 contiene ahora el promedio. por 100. Podemos redondearlo a un decimal mas tarde *+ + * Un método alternativo para la multiplicación es emplear desplazamien- tos, tal como se discute a continuación. Hasta ahora hemos empleado MULU porque estamos tratando con meros positivos conocidos y pequeños y porque es ligeramente más rapl que MULS. De hecho, existe una forma mucho más rápida de multipl por 2,4, 8 o cualquier potencia pequeña de 2. Se puede usar: ASLz *,Dn que realiza un desplazamiento aritmético a la izquierda. El número de lu: gares a los que afecta el desplazamiento viene dado por el número de 3 , lo que nos proporciona un contador de desplazamiento con un comprendido entre 1 y 8. El código de tamaño determina qué porción Dn se ve afectada por el desplazamiento, B, W, o L. La figura 5.5 muests cómo puede emplearse la instrucción ASL para multiplicar por 2. €4 01 1 0| 6 —> 227 UnASR da |O O 1 1 -3, lo mismo que dividir por 2. OK A — ¿- 2? Un ASL da 1100 - 12, lo mismo que multiplicar por 2. OK «4 — ¿47 Dos ASL dan 1101050 - 8, resultado incorrecto: se ha producido un error de rebose 101 0 U=-6(en complemento a 2) —> e 2?UntSL da [0 1 0 1 5, resultado erróneo: no se produce ningún aviso —> ¿x 27 Un ASRda |1 1 0 1 3. lo mismo que dividir por 2, OK +4, resultado erróneo. se ha producido ¿-< 2? Dos ASL dan 0100 un error de rebose 12 está fuera del rango que, para números con signo, proporcionas 4 bits) Pienra 5,5 Usvo dedos desplezarmentos para mulniplicar y abider desplazamiento aritmético de la secuencia de bits en la porción L, W, o B de Dn es equivalente a duplicar el valor de dicha parte de Dn. De este modo, un ASL de 1 puede duplicar sólo el byte menos significativo de Dn sin alec- tar al resto del registro, A medida que el desplazamiento aritmetico tiene lugar, se van metiendo ceros en Dn desde la derecha y los bits van saliendo por el otro extremo. En el programa 5.8 podemos reemplazar: MULU- *2,D0 Palabra larga en DO — [palabra en D0 2) por cualquiera de los siguientes: ASL.L %1,D0 Palabra larga en DO = (palabra en DO x 2) ASL.W +1,D0 Palabra en DO — ¿palabra en DO < 21 ASL.BO 1,D0 Byte en DO = [byte en DO += 2) Tanto MULU como cualquiera de los tres ASL funcionan igualmente bien en nuestro ejemplo, puesto que el valor máximo de DO es 22, dentro de los limites de la capacidad máxima del byte menos significativo de D0 para aritmética con signo. Para números mayores, desde luego, hubrá que de 183 cidir cuál de las instrucciones (ASL/MULS/MULU) es la que prope e una codificación más segura. A diferencia de MULS/MULU, ASL producir reboses y hay que comprobar el CCR para verificar que fi hayan excedido las diferentes capacidades de cálculo (L, W, o B). ASL es de tres a cinco veces más rápida que MULU o MULS, Para realizar un desplazamiento de más de $ lugares, o para rea desplazamiento variable, se puede emplear el formato: ASL.z Dm,Dn — Desplazar Dn a la izquierda las veces que indique Dm (máximo, 64), donde los 6 bits menos sienificativos de Dip. contiene el contador de desplazamiento También se puede someter a desplazamiento un byte en la memoria, py el contador de desplazamiento está restringido a 1: 1 ASL.¿ Desplazamiento simple a la izquierda e un operando en memoria En el capitulo 6 se tratarán con más detalle las instrucciones de zamiento y rotación, de modo que sólo mencionaremos ahora una y; del ASL, el ASR. ASR: Desplazamiento aritmético a la derecha Como se muestra en la figura 5.5, desplazar un registro a la derecha lo mismo que dividir por 2. Para conservar el bit de signo del registro $ tido a desplazamiento, ASK introduce los bits a partir de éste hacia la: recha. Los formatos para el ASR son los mismos que los del ASL: ASK. %=,Dn Desplazar Dn a la derecha di veces ASR.z Dm,Dn Desplazar Dn a la derecha las veces que indique Dm (maximo, 64) ASR./ — Desplazamiento simple a le derecha de un operando en memoria Resumen del modo índice El modo indice permite establecer punteros para ma a daros en la memoria. Se pueden establecer desplazamientos positivos gativos respecto a la dirección de la base mantenida en un registro de 0 ciones, calculándolos de diferentes formas, mediante operaciones arm ticas en cualquier registro designado como indice. Xi, en el modo d(Ang Terminamos ahora nuestro examen de los modos básicos de direccid miento del M68000 estudiando los modos relativos 184 Modos relativos: Motivaciones En los ejemplos previos hemos hecho uso de datos almacenados en po- siciones fijas de la memoria. Por ejemplo, “las horas YTD están almace- nadas en la dirección $6000 o HRSTYD". En las aplicaciones reales rara vez se saben por adelantado las direcciones absolutas de los datos o rutinas, y a menudo tendremos considerables problemas para asegurarnos que los programas funcionarán al cargarlos en cualquier zona de la mento- ria. Tales programas se denominan programas relocalizables o programas independientes de la posición de memoria. De hecho, algunos sistemas ope- rativos (como el caso del AMOS de Alpha Micro, empleado en el ordena- dor AMI00L basado en el MC68000) requieren que todos los programas sean relocalizables. Otros sistemas operativos presentan restricciones O exi gen ciertos programas especiales para cargar sofware no relocalizable). En un programa relocalizable, la mayoria de las referencias a la memo- ría debe hacerse con relación a ciertas direcciones que no se conocen por anticipado. Excepciones obvias a esta regla son las localizaciones fijas, como las que se emplean para la entrada/salida, o las áreas reservadas por el sistema, como las tablas de vectores de excepción. Cuando un programa se carga y se ejecuta, las instrucciones deben con- tener suficiente información como para permitir que el procesador calcule la dirección efectiva de cada operando, de modo que pueda localizarlo y trabajar con Cl correctamente. El papel del contador de programa La clave de todo lo expuesto anteriormente es el contador del programa, PC, que, como ya hemos visto, es un registro de direcciones muy especial que contiene la dirección absoluta de la instrucción que en ese momento está ejecutando el procesador. Un programa puede seguirse hasta que ter- mina, mirando el PC de la misma forma que seguiriamos las flechas en un sitio público para llegar a cierto destino. De modo que tenemos una forma de referirnos a los operandos en la memoria de una forma relativa, que no absoluta, indicando, por ejemplo, “420 bytes después (o antes) de la actual posición contenida en el PC se en- cuentran las horas YTD de marzo". Con este tipo de codificación si es po- sible construir un programa relocalizable, Direccionamiento relativo: Direccionamiento por contador de programa con desplazamiento Este modo de direccionamiento se escribe simbólicamente como d16(PC): —lo que nos recuerda mucho al modo di6(An), con el PC en el lugar del 185 Etiquetas como operandos relativos An—. Parece obvio, pues, que d16 indica un número de 16 bits con si que se empleará como desplazamiento. Este número de 16 bits nos of; un rango de 32 Kbytes por encima o por debajo de la dirección conter en el PC. La dirección efectiva se calcula según la expresión: =dif + PC. El desplazamiento se almacena como una única palabra de exteng siguiendo a la instrucción, y, estrictamente hablando, esta palabra de exy sión es la que representa el valor del PC cuando se calcula la dirección ef tiva . Esto es francamente extraño, pues el procesador tiene que la palabra d16 de la memoria, de modo que el PC ha pasado va la dir de la propia instrucción. Aunque hasta aqui el modo d16(PC) parece igual al modo d16(An), h una excepción fundamental: Los modos de direccionamiento relativos sólo pueden emplearse. para operandos fuente 2 Cualquier combinación de código/operando en la que el destino es una di rección alterable en la forma d16(PC) es ilícita. La razón es simple: es y forma de poner trabas a una alteración inadvertida del programa. Ampl remos esto más adelante. Los operandos en modo relativo no pueden alterarse El modo dl6(An) puede emplearse como fuente o destino, pero sólo pued emplearse el modo d16(PC) como fuente. Ahora puede parecer que el mo di6(PC) es inútil en la práctica: ¿cómo demonios se asigna un valor a dl6 ¿Cuántos bytes delante o después de la instrucción actual está la dire ccIo! efectiva, , del operando que quiero emplear? La solución para est pregunta se encuentra en las etiquetas. Empleando operandos etiqueta podemos delegar en el ensamblador para que sea él quien realice los cále los de los desplazamientos pertinentes. Este truco es similar al que emp mos con la combinación Bcc en el capitulo 4. Se ha visto en el capítulo 4 que se puede emplear la directiva ORG pafá forzar al ensamblador a asienar una dirección absoluta a las etiquetas. - Existe otra directiva del ensamblador, denominada RORG (origen relé tivo). En una sección del código fuente presidida por una RORG, el e a blador asienará de forma automática a las etiquetas de los operandos € modo d(16)PC. 7 En esta fase, el ensamblador no sabe qué valor contendrá el PC cuan se decodifiquen las instrucciones durante una ejecución del programa, no le hace falta. Todo lo que el ensamblador necesita saber es el desplaza? miento relativo, la ““distancia”' en bytes entre cualquier instrucción que €ít plee una etiqueta y la etiqueta misma. La mayoría de los ensambladores son multipaso, es decir, recorren el código fuente varias veces para permitir que se establezcan las posiciones relativas de todas las etiquetas, y asi calcular y asignar los correspondientes desplazamientos dl6. Veamos una situación típica, para lo cual introduciremos la instrucción JMP, que es simplemente una versión más versátil de la bifurcación incon- dicional BRA. También existe el equivalente de BRS, JRS. Existe, de todos modos, una diferencia técnica entre BRA y BSR y sus equivalentes JMP v JSR, dado que estas últimas admiten una clase más amplia de direcciones que las primeras, como veremos al final de esta sección. RORG La siguiente sección es relativa A , + JUMP BUCLE Saltar a BUCLE * 4 “— BUCLE + * * Las dos palabras correspondientes a la instrucción JMP, una vez ensam- bladas, tendrán el siguiente aspecto: Bit 15 14 131211 1098765 4 3210 mom morrr JIMP. 00.01.0000. 111011111010 d16 00000010010 10110 (d16= 598) Los bits del 6 al 15 codifican la instrucción JMP en si, mientras que los bits del O al 5 indican el modo de direccionamiento dl6(PC). La palabra de ex- tensión contiene el desplazamiento relativo de la etiqueta BUCLE. El des- plazamiento es positivo, porque el salto ha sido hacia adelante. Al decodificar esta instrucción durante la ejecución, el procesador, si- guiendo las rígidas reglas del modo d16(PC), toma la palabra de extensión y calcula la dirección defectiva del operando según la regla: = PC + + 598 bytes. Puesto que el PC contiene la dirección de la palabra de exten- sión, tenemos que: = dirección del JMP + 600 bytes, que es la direc- ción de la línea etiquetada . La instrucción JMP ahora asigna al PC el valor de la dirección calculada. Asi, el procesador toma la próxima instrucción de la zona de memoria marcada como BUCLE. En otras palabras, hemos saltado a BUCLE. El ensamblador calcula automáticamente el desplazamiento, en byles, 16 = “ PC” bytes, mientras que el procesador, para obtener la dirección real de la , calcula: = PC 4 desplazamiento d16, donde ahora PC representa una dirección real y conocida. Las etiquetas, en una sección presidida por un ORG, son iguales a aquellas empleadas en modo absoluto. Las etiquetas en una sección PC 187 equivalen a emplear el modo de direccionamiento relativo por contadg programa con desplazamiento. i Raramente se empleará el modo dl6(PC) directamente; lo nor emplear una directiva RORG en una determinada sección del progra biendo que es una forma encubierta de emplear el modo dl6(PC). Además de emplear las etiquetas como marcas para los saltos y bifus ciones, se pueden emplear las etiquetas de muchas formas. RORG pex emplear las directivas DC (definir constantes) y DS (definir un almacg miento) con etiquetas relativas al PC. Asi, las áreas de datos son reloc zables, porque se ha empleado el modo relativo al PC. Por ejemplo: RORG TABLA DC.W $3442,50087 define dos palabras de datos en la dirección TABLA que puede emplea como operando fuente, sin importar dónde se encuentre el programa en! memoria. De este modo: : MOVE.W TABLA,DI llevará S34A2 a la palabra menos significativa de DD1. Para conseguir e el ensamblador define un desplazamiento de 16 bits en una palabra de tensión asociada a la instrucción MOVE y el operando fuente se codifici el modo d16(Pc). Cuando la instrucción se decodifica y se ejecuta el desp zamiento sumado al PC, proporciona la dirección efectiva de los datos macenados en la TABLA. Vamos a estudiar ahora otro método de acceder a la memoria que plean las importantes instrucciones LEA (cargar la dirección etectiva) y (meter en la pila la dirección efectiva). LEA es una instrucción de dos operandos con el formato: LEA ,An LEA calcula la dirección efectiva del operando fuente y la almacena en Al Todos los bits de An resultan afectados, aun cuando el chip emplee menor número de bits de dirección. PEA es una instrucción con un solo operando con el formato: PEA PEA efectúa los mismos cálculos que LEA y almacena la dirección en pila que en ese momento esté empleando el sistema (pila de modo usuafk o de modo supervisor). PEA es equivalente, de hecho, a: LEA , An MOVE.L An, ASP) ] (aunque cuando se emplea PEA no se involucra a ningún registro). Podemos ilustrar el uso de LEA con áreas de datos etiquetados: + Programa 5,9 4 Uso de la instrucción LEA + Calcular la media de dos números almacenados en la TABLA RORG TABLA DCW $442,500B6 — Definimos un área de datos en la dirección TABLA CLR.L DI Poner a cero el registro empleado como acumulador LEA TABLA,A3 Cargar la dirección efectiva de la TABLA en A3 MOVE.W (A3)+,DI DI contiene ahora la primera de las dos palabras a sumar ADD.W (A3),D1 Sumar la segunda palabra ASR,W ¿1,DI Dividir la suma por 2 * La respuesta final se encuentra en la palabra menos significativa de DI + <$MA2 + 500B6>2 = SIAAC Emplear LEA suele revertir en un ahorro de tiempo. Si tenemos que ac- ceder a un operando complejo varias veces en el curso del programa, con- viene emplear previamente una instrucción LEA para calcular su dirección efectiva y almacenarla en un registro de datos. Por ejemplo, suponer que es necesario realizar complicados cálculos para establecer los valores de An y Xi antes de emplear el modo d8(Xn,Xi) para acceder a una matriz. Cada vez que empleamos d8(An, Xi) como operando, empleamos de 8 a 14 ciclos del procesador para calcular la dirección efectiva . Pero si empleamos: LEA d8(An,Xi),Am Cargar Ám con la ; =d8 + An + Xi Ahora ya tenemos un puntero para los subsiguientes cálculos. Por otra parte, si vamos a llamar a una subrutina que necesita el ope- rando d8(An,Xi), podriamos emplear un: PEA d8(An, Xi) Meter d8 + An + Xi en la pila antes de un BSR o un JR5 La pila contendria entonces: en la dirección del puntero dirección de retorno de la subrutina en la dirección del puntero +4 la que metimos en la pila con PEA Durante la subrutina, podemos recuperar esta usando una instrucción MOVEA.L S$SP)Am Cargar Am desde SP +4 189 Conceptualmente, LEA es idéntica al inverso de los paréntesis de in rección (). An apunta a los datos en (An). La dirección efectiva, , de (An) es An. LEA (An), Am pone en Am el valor de An. Veamos ahora el modo que nos queda: desplazamiento relativo aj E con desplazamiento e indice, Direccionamiento relativo: Contador de programa con desplazamiento e índice Por brevedad, denominaremos direccionamiento por PC indexado a modo de direccionamiento. Este modo se indica dS(PC,Xi.Z), de don deduce que sigue las reglas dadas para el modo d8(An,Xi.Z), reempl An por el PC. La dirección efectiva del operando se calcula como: =d8 + PC+X1.Z donde d8 representa un desplazamiento con signo de $ bits (de —1 + 127 bytes) y Xi.Z representa a cualquier registro seleccionado como gistro indice. El código de tamaño Z puede ser L o W, y éste determina emplean los 16 ó 32 bits (se espera un signo en el caso de 32) del registro (con signo) como desplazamiento indice adicional para el PC. El despla de tamaño se almacenan en una única palabra de extensión. Para si car la escritura, muchas veces se denotará este modo como d(PC,Xi). timos el aviso que dimos para el desplazamiento relativo al PC, dl6 Los modos de direccionamiento relativos sólo pueden emplearse para operandos fuente Cualquier combinación de código/operando en la que el destino es una É rección alterable en la forma dl6(PC) es ilícita. De nuestra discusión acerca de los códigos relocalizables se deduce el direccionamiento por PC indexado permite definir y acceder a t y matrices. Vamos a reformular el programa 5-9 para mostrar un uso $ cillo de este modo de direccionamiento con nuestra TABLA de datos. = Programa 5.10 * Programa 5.9, empleando direccionamiento por PC indexado * Calcular la media de dos numeros almacenados en la TABLA 190 RORG CUR] DI Poner a cero el registro empleado como acumulador MOVE.Q. HOLDOAS Ponemos el registro indice acero MOVE.M- TABLE(PC,D0,W),D] DI contiene ahora la primera de las dos palabras a sumar ADDQW 42,D0 Incrementar cl indice en 2 ADD.W - TABLECPC,D0.W),D1— Sumar Ja segunda palabra ASR.W 41,D1 Dividir la suma entre 2 2 Se define un árca de datos relativa a la direccion TABLA TABLA DOW $442 ,$00B6,556F9,8110C + La respuesta final se encuentra en la palabra menos sienificativa de Di: e 12 = SIAAC Como en los ejemplos anteriores de uso de la pareja RORG/etiqueta, el ensamblador establece la distancia entre PC y TABLA. El desplazamiento, sin embargo, está limitado a un valor con signo de 8 bits, de modo que el programa 5-9 funcionará correctamente sólo si la etiqueta TABLA está entre 128 y + 127 bytes de las instrucciones MOVE y ADD, La tabla, sin embargo, puede ser tan larga como se necesite; teniendo esto en cuenta, se ha modificado la posición de la tabla en programa $-10. Se emplea el re- gistro DO como índice de la tabla, de modo que podemos extraer cualquier valor de la tabla. Antes de la instrucción ADD.W TABLA(PC,D0.W),D1 DO se ha puesto a 2, de modo que la dirección efectiva del operando tuen- te es: = PC 4 d8 + D0 =PC+ + 2 = TABLA + 2 de modo que sumamos la segunda palabra de la TABLA. Modos relativos: Restricción de su uso aoperandos fuente Como ya se ha indicado dos veces, los modos relativos no pueden em- plearse para operandos destino. Esta es una decisión deliberada de Moto- 191 Modos de direccionamiento: Resumen total 192 rola para reducir el riesgo de que un programa, especialmente aa codificados de forma relocalizable, se autodestruya escribiendo inadw, mente encima de si mismo. Por ejemplo, si MOVE.W DO,s(PC) ¿No permiuido! fuera una instrucción válida, reemplazaria la instrucción (o parte de la: ma), que se encontrará 4 palabras (8 bytes) más adelante con lo que hab en la palabra menos significativa de DO. Hay una eran probabilidad se produzca el caos cuando el procesador alcanza una instrucción y ga mente intenta ejecutarla. Por supuesto, se puede ser enormemente fi y asignar deliberadamente a DO una cadena de bits que correspondan a instrucción válida. Los programas que se automodifican juegan un importante, pero el M68000 obliga a emplear una acción especial, pa gurarse de que el programa sabe lo que está haciendo. Un efecto secundario de esta restricción es el gran cuidado que ha: El tener al emplear etiquetas: 7 MOVE.W DO,TABLA — Válido en secciones ORG MOVE.W DO,.TABLA — Inválido en secciones RORG Aunque estas dos instrucciones parecen lo mismo, sus modos de di namiento son diferentes. En el primer caso, TABLA es una dirección dl luta y, por tanto, válida. En el segundo, RORG es una dirección rela dIM(PC), y, por tanto, inválida. Para evitar la restricción que se nos impol en las secciones RORG, empleamos: LEA TABLA,AI — Ponemos la dirección efectiva de la tabla en AL MOVE.W DOJA!) Movemos la palabra en DO u la TABLA Hasta ahora hemos explorado los 12 modos de direccionamiento bé del MC68000 (el MC68020 tiene seis más que estudiaremos en el capitulo Ahora vamos a dar, es necesario, un resumen para ofrecer una visión € conjunto. Al describir algunas de las instrucciones, se ha indicado 06 sionalmente que existian algunas restricciones en los modos de direccio miento de los operandos origen y/o destino. Estas limitaciones puede experimentados. Gran parte de la literatura técnica contribuye a este empleando una nomenclatura inadecuada para los diferentes modos de É reccionamiento. En el apéndice B, parte del cual se reproduce a continuación, se ha! tentado clasificar de forma lógica los modos de direccionamiento, lo que, esperamos, contribuirá a esclarecer cuándo determinados modos son vá- lidos y por qué. El apéndice C lista todos los códigos de operación con los modos permitidos para los operandos fuente y destino, dos de direccionamiento del M68000 Cada modo de direccionamiento pertenece a todos o a alguno de los nueve grupos siguientes: Cualquier dirección efectiva = Dirección efectiva de un registro = Dirección efectiva de los datos ¿mea> = Dirección efectiva de la memoria = Dirección efectiva de control Saca> = Dirección efectiva alterable (datos o memoria) Dirección efectiva alterable de datos = Dirección efectiva alterable de la memoria Dirección efectiva alterable de control Un * en la tabla indica los grupos para cada modo (y los modos para cada grupo). Modo ca rea dea mea cea uUea adea amea acea Dn * * . * * Án a , . (An) . ” - - * * * * (An) + A s + E e . An) - * * - » * dí An) + » * +* * + * ” d(An,Xi) ” * * * , > . ' Abs.W » » » . + + * * Abs.L e + * * * . > + d(PC) Ñ z . , dPO/Xi) * o Inmed . * + bd(An,Xi) e * e , * Qe * + MC6o8020 193 19% Modo ca rea dea mea cea dae4a adea amea uced bd(PC,X1) [bd, An], X1,0d [bd,An,Xi],od [bd,PC],Xi,od [bd,PC,X1],od En el capitulo $ se tratarán más detalladamente los modos de di cionamiento del M68020. Descripción de los modos: Dn An (An) (An) + (An) dl6(An) dl6(An,Xi.Z) Abs.W Abs.L dIMPC) ds(PC,X1.Z) Inmed Modos para el M68000 solamente (véase el capítulo 8 para más detaleR * bd(An,X1.Z*s) * - - M Registro de datos directo. Registro de direcciones directo. Registro de direcciones indirecto. Registro de direcciones indirecto con posincremento, también se escribe d(An). Registro de direcciones indirecto con desplazamien e indice; también se escribe d(An,X1). O como una etiqueta. Dirección absoluta larga; también se escribe como o como una etiqueta. Contador de programa con desplazamiento (modo rel tivo); también se escribe como d(PC) o como etiqueta. Contador de programa con desplazamiento e (modo relativo); también se escribe como d(P o como una etiqueta y (PC,X1). Registro de direcciones indirecto con desplazami yr to de la base e índice [similar al d(An,Xi.Z*% pero bd puede ser d16 o d32]. bd(PCO,X1.Z*s) Contador de programa con desplazamiento de la base e indice [similar al d(PC,Xi.Z*s), pero db puede ser d16 o d32]. [db,An],Xi.Z*s,od Posindexado indirecto en la memoria. [bd,An,X1.Z*],0d Preindexado indirecto en la memoria. [db,PC],Xi.Z*s,od. Contador de programa indirecto posindexado en la memoria. [db,PC,Xi.Z*s],od Contador de programa indirecto preindexado en la memoria. Abreviaturas: Dn An Xi Z Z $ PQ SR CCR bd od XXX Cualquier registro de datos, DO-D7, Cualquier registro de direcciones, A0-A7. Cualquier An o Dn empleado como registro indice. Indicador del tamaño de los datos (B, W, o L). Indicador del tamaño de los datos (L o W). Factor de escala (1, 2, 46 8). Contador de programa (20, 24 6 32 bits). Registro de estatus. Registro de códigos de condición. Un desplazamiento extendido o en complemento a 2: dl6, ds, d3, etc., indican el número de bits. Un desplazamiento de la base en complemento a 2 (16 6 32 bits). Un desplazamiento exterior en complemento a 2 (166 32 bits). Cualquier dirección absoluta válida. Grupos de modos: Definiciones Tomemos algunos grupos y modos para indicar por qué están asociados como se ha mostrado. dirección efectiva de los datos: Como se ha visto, Án permite solamente una aritmética restringida, no está clasificada como un operando de datos verdaderos. dirección efectiva de la memoria: Excluye los modos de direccio- namiento directo por registros en , Dn y An, que no son ope- randos de la memoria. dirección efectiva alterable de datos: Vodas las que pue- den ser destinos válidos sujetas a cambiar por una instrucción. Obvia- mente, los datos inmediatos no son direcciones alterables, de forma 195 que el modo inmediato es una pero no una . De la ma manera hemos visto que los dos modos relativos no son alte ah Finalmente, An no es una , puesto que no es una * dirección efectiva alterable de la memoria: Cualquier dirección efectiva alterable: Cualquier combinación de , junto con An. dirección de control efectiva: Un subconjunto de que; presenta sólo aquellas direcciones de la memoria a las que de transferir el control, por ejemplo, mediante un JMP o un JRS. Formatos de las instrucciones empleando grupos de modos Esta agrupación de modos permite especificar las combinaciones de e digos de operación/operando de forma precisa y concisa. Se dan a comf nuación los formatos para algunas instrucciones que va se han estudiad (para una lista completa, vease apéndice C): Ñ MOVE.Z , Fuente Todos los modos de direccionamiento gales. Destino Sólo se permiten direcciones efectivas a bles de datos. Excluido An, todos los mé dos relativos e inmediatos. MOVEA.Z ,An Fuente Todos los modos de direccionamiento son le gales. Destino An Sólo se permite direccionamiento directo P registro. ADD.z ,Dn ADD.z ,Dn Admite dos formatos: Fuente Todos los modos. Destino Sólo Dn. o bien: Fuente Dn. Destino Sólo se permite el modo de direccionami efectivo alterable. Excluido An, todos 14 modos relativos e inmediatos. 196 ADDIL.z Fuente Destino ADDO.z Fuente Destino MULS Fuente Destino BRA Fuente Destino JMP Fuente Destino %datos> , F Sólo modo inmediato. Sólo se permiten direcciones efectivas altera- bles de datos. Excluido An, todos los mo- dos relativos e inmediatos, +*+, F Modo inmediato solamente. Solamente las direcciones efectivas alterables son legales, 7 = L, W sólo para An. Excluir todos los modos relativos e inmediatos. , Dn Modos de direccionamiento por direcciones efectivas de datos; todos los modos cxcep- to An, Dn Solo registros de datos directos. ETIQUETA Ninguna ETIQUETA Sólo se admiten los modos relativos d(PC) y (dPCO,Xi). Ninguna Modos que emplean direcciones efectivas de control. El esquema anterior puede emplearse para cubrir instrucciones que, como MOVEM, tienen operandos poco corrientes. Operandos implícitos Para completar este esquema, notemos que algunas instrucciones hacen uso de registros del sistema sin hacer mención especifica del campo de ope- randos, Algunos ejemplos que ya se han visto son: Operando Instrucción implícito BRA Bifurcación incondicional PE ¡MP Saltar siempre PC Bcc Bifurcación condicional PC BSR Saltar a una subrutina PC,SsP 197 Operando Instrucción implicuo JSR Saltar a una subrutina PE,SP RTS Retorno desde una subrutina PC,SP RTR Retornar y restaurar PC,SP,CCOR MOVE to CCR CCR MOVE trom CCR Sr Conclusión Hasta ahora hemos expuesto el conjunto básico de instrucciones d M68000 y creemos que el lector tendrá una idea global del mismo. En k próximos capitulos cubriremos algunos grupos de instrucciones diversas, a como una discusión del MC68010 y del MC68020. ras instrucciones del WVI68000 En este capítulo estudiaremos otras instrucciones del M68000 agrupadas por funciones. Se empleará la agrupación pol modos dada en el capitulo $ y en el apéndice B para simplificar nuestra discusión de los modos de direc- cionamiento permitidos. OP: No opera La instrucción NOP es una instrucción de una palabra que avanza el PC a la siguiente instrucción. No afecta a ninguno de los indicadores y no hay reglas complicadas para los operandos fuente y destino, puesto que estos no existen. Sin embargo, esta instrucción es muy interesante de conocer si se está desarrollando un programa en ensamblador, sobre todo st las facilida- des de edición depuración de que se dispone son rudimentarias. Á menudo es útil reservar espacio en el programa (cada NOP es una palabra) para sub- secuentes inserciones; de manera similar se pueden borrar instrucciones, reemplazándolas por NOP. El código en lenguaje máquina para la instruc- ción NOP es $4E71, y en algunos sistemas se puede borrar insertando $41:71 directamente en el código objeto sin necesidad de reensamblado. 201 Manipulación de bits Este primer eran grupo de instrucciones permite manipular bits y grupa de bits dentro de los registros, registros especiales y la memoria. | Como ya se ha visto, la mavoria de las instrucciones presenta varia siones en que es necesario aislar parte del operando, por ejemplo, c se necesita acceder a la parte superior o intermedia de una doble palabra A menudo tambien es interesante disponer de nuestros propios registros é estatus o condición; por ejemplo, en un programa de nóminas podemos contrar un “byte de estatus del empleado””, con sus 8 bits, representan sexo (1 bit) estado civil (2 bits), etc. El sistema operativo también se con nica a menudo con el programa a base de cambiar el estatus de ciertos j vcadores en determinadas localizaciones. Muchas de las instrucciones para el manejo de bits del M68000 están orientadas a simplificar la idea de probar. poner a uno o a cero bits, quí tienen un significado logico más que aritmético. De modo que revise antes los operadores lógicos básicos. TABLA 6.1 Resumen de las instrucciones lógicas Efectos sobre Instrucción Operando el COR AND.L/W/B ,Dn o Dn, xXx N*Z*VOCO OR.L/W/B NOT.L/W/B X_N=Z*VOCO EOR.L/W/B Dn (*) X_ N=Z*VOCO. ANDI.B| FXxx, COR X*N+Z+Vs*C* ORI.B: EORI!.B; ANDH.W) ceo Ni (ea X+N=Z+V*C* ORI.W] EORI/.W) (%) No se admite un dirección de la memoria como operando fuente 00 Instrucción privilegiada = Modos de direccionamiento por dirección efectiva; todos menos An. “amea> - Direccionamiento por direcciones alterables eleciivas: (An). (Ani+. —(An), díAn,Xip, Abs. W, Abs,L. “adea> = Modos de direccionamiento alterables por los datos: + Dn. (Vop indica que el tamaño de los datos va implicito : Notación para el CCR: indica sin cambios, + indica cambios segun las reglas del CCR, O Mé que el indicador siempre se pone a 0, Operaciones lógicas NOT AND El M68000 dispone de cuatro instrucciones lógicas básicas: NOT, AND, OR y EOR, que se resumen en la tabla 6.1. Estas instrucciones se emplean en muchas ocasiones, tales como poner a cero o uno determinados indica- dores bits, y para enmascarar o extraer campos de datos de los registros o de la memoria. Vamos a recapitular lo que hace cada una de las instrue- ciones y después las veremos en acción. El NOT lógico significa volver cada 1 en un 0 y cada 0 en un | en el ope- rando designado. Matemáticamente, esto es equivalente a formar el com- plemento a 1 del operando, de modo que '**NOT 01011010" += 10100101. NOT requiere sólo un operando que sirve como fuente y destino. El for- mato es: NOT.z donde significa dirección de datos alterables, es decir, cualquier modo de direccionamiento excepto An, d(PC), d(PC,Xi) e Inmediata. Como es usual, el código para z dicta cuáles de los 32, 16 u 8 bits del operando re- sultan afectados por el NOT. Por ejemplo, NOT.B DI en la figura 6.1 invierte el byte menos significativo de Dl sin afectar a los otros tres bytes. El COR cambia como en el caso de un MOVE, según se muestra en la tabla 6.1. AND requiere operandos fuente y destino. La base para un AND lógico se obtiene de la siguiente tabla de verdad: Fuente 0 0 ] ] Destino 0 | O 1 AND 0-0 0 1 = Nuevo destino En otras palabras, AND opera bit a bit, comprobando los valores de los bits en la fuente y el destino y formando un nuevo biten el destino de acuct do con las reglas dadas más arriba, A menos que ambos, fuente y destino, 203 ANTES DEL NOT.B D1 AR OO Palabra N mu Ar A A MA con PIM psico > Bt de signo Bit de signo 3n de signo Wo f 7 de la doble palabra de la palabra del byte 00 A(2|3|B/|5|7 |8]5 1615 D1 A + 100010 | 0 aa DESPUES DEL NOT.B D1 13210 byte N_ | byte N+1J xINLAVCA EA CCR bala -¡OJojó of Palabra N No es Siempre cero a cero Sin cambios Ñ al Palabra lu ot A|(2|3 |[B|5|7|7|A 31 16 15 0 | AAA TT 31 23 0 —— Sin cambios 42011111010 D1 AU GUBNA E S68 AAA CHATA Fisura 6.1 VO RED tengan un len la misma posición, AND pondrá un cero en dicha posición. Hay dos formatos permitidos: AND.zz ,Ds AND. Dn, Donde significa dirección efectiva de datos, es decir, cualquier modo de direccionamiento, excepto An, y significa cualquier dirección efectiva de la memoria, es decir, cualquier dirección de datos alterables, ex- cepto Dn, Nótese que la fuente o el destino deben ser registros de datos. Tambien puede suceder que ambos sean registros de datos. Las figuras 6.2 y 6.3 muestran dos ejemplos, AND cambia el CCR como en el caso de un MOVE, como se ve en la tabla 6.1. El OR lógico se refiere al OR inclusivo. Aparte de emplear la tabla de verdad que se muestra más abajo, el OR funciona como el AND, emplean- do dos operandos y los mismos modos de direccionamiento y tamaños de datos; además, OR cambia el COR de la misma forma que AND y MOVE, Fuente o 0 1 1 Destino 0 1 0 | AND 0 1 1 1 => Nuevo destino Nótese que un OR produce un ] siempre que la fuente o el destino sean un 1, de aqui el nombre de OR inclusivo. Los formatos permitidos son, como en el caso del AND: OR. Ds OR7 Dn, Las figuras 6.4 y 6.5 muestran al OR en acción sobre diferentes ope- randos. EOR es el OR exclusivo, como se muestra en la tabla de verdad del EOR: Fuente 0 0 l 1 Destino 0 l 0 1 AND 0 l ] 0 = Nuevo destino ANTES DEL AND.W (A3), DS 423210 Palabra N AO ! Palabra N + 2 COR HH Bit de sign AA Bit de signo Bit de signo de la doble palabra E de! byte FUENTE de la palabra ja E ¡mA PATA, $2000 A3 0¡0|0|0|2| 0/ 0/0 0 1 Ed m Nn DESTINO 1000|1111J0000]0011 9/JE|2|3|8|F/|0|3 Jos DESPUES DEL AND.W (A3), D5 CccR Sin cambios Ñ No » No es cero á cero nogativo $ Sin cambios > Epa 83 31 16 15 0) 9 E|2| 3/8| 2 0/0 Sin cambios —|:000|0010/0000| 0000 D5 PC Figura 6,2 IND (430,105 206 byte N byle N+1 y AAA AND.L D6.(A2) + E || || ANTES DEL MA, CCR E Z|V os Palabra N Bit de signo ASES de la doble palabra Bu de signo Bu de signo DÓ FUENTE de la palabra del byto a: ea 2|B|C|0|1[5|A]|3 1. 31 16 15 DESTINO o > Nm nv o o [uu] oO N_O 0¡|0|0|0|1| O| 0/0 us mo as o DESPUES DEL AND.L D6,(A2[ + 432] 0 oca TAI 20005 y Sin cambios UN SN No es caro Siempre E Sin a > 2[B[cjol115|AÍ3 31 1615 23 0 as Figura 04 IND IL D614214 ANTES DEL OR.B 4(PC), D3 42392310 Palabra N TA co sob Bit de signo de la doble palabra ¿a ¡y palabra Bit de signo del byte DESTINO 1010/0111 A|B|C|D|E|F|A|?7 Jos —» $200 31 1615 0 $202 u ES o DESPUES DEL OR.B 4(PC), D3 4321 ANA ss CcCcR = -HMI1010 SÁ Palabra N E A Sin cambios a No e Vo es Siempre de E negatrwo de dá NN : 1111J0111 A|B|C|D|E|F|F|7 Joa 1 5 15 0 3204 ololo|2|0|4 fc El PC se incrementa por la acción norma de las instrucciones y no por 41PC) pe Y o Figura 6,4 OR.B HYPO) DS ANTES DEL OR.W D2, — (A6) , X CcCcR Bit de signo - de la doble palabra Bit de signo 2 5 a FUENTE de la palabra del byte E AE. 0010/1001 1|3|9 [B| 2/9 31 1615 DESPUES DEL OR.W D2, - 146) Sin cambios 1[3[9 |B| 2/9 31 16 15 La diferencia entre el OR y el EOR es el cero en la última columna, 1 EOR busca en uno, pero no en los dos operandos, cuando da valores a | bits de destino. Su principal utilidad, como veremos, es que puede empleg para invertir bits escogidos dentro de un campo sin molestar a los demg a diferencia del NOT, que invierte todos y cada uno de los bits. A dife cia de AND y OR, EOR sólo permite un formato: EOR.z. — Dn. No se puede emplear una dirección de la memoria como fuente del EOR EOR cambia el CCR de la misma forma que AND, OR y MOVE, se muestra en la figura 6.6. Instrucciones lógicas: Variaciones en modo inmediato Con la excepción de NOT, las instrucciones lógicas admiten forma fuente en modo inmediato: ANDI, ORI y FORI, que presentan todos misma forma: ANDI.z ORI.Z %*, EOR1.7 El tamaño del dato en * debe ser 432, d16, d3, dependiendo di código de tamaño empleado para %(L, W, o B). La instrucción toma una o dos palabras para almacenar el dato inmediato. El uso del modo fuente con AND es muy común. Para enmascarar o ai$ lar un determinado operando se crea una máscara, %, con unos 6 las posiciones seleccionadas y ceros en las posiciones descartadas. Dado qu +3 = 00000011, el ANDI.B, en la figura 6.7, pone a cero todos los bits, cepto los dos menos significativos en D2, Con EORI.W, la mácara, *, se elige con unos y ceros en las posiciones que se desea invertir y con ceros en aquellas que se desea def intactas. En la figura 6.8, los bits en el byte menos significativo de la y moria en (Al) resultan todos invertidos por el **FF", mientras que el byl más significativo permanece inalterado. Cambiando el CCR Un formato especial permite cambiar cualquiera o todos los indicadoré en el bvte del CCR: 210 byte N ANTES DEL AD EOR.W DO, 4(A2, D5.L) A SITE lalabra / ¡ CCR = se ns Bit de signo - EHH — Y olel7le6|3|5|F|F 31 16 15 0 ON | byte N+1 43210 A XINTZIVICA Peon o FUENTE de la palabra del byte e / A 7 s0r1oro diri ato 0 0 1 DO , 400 DIRECCION DE LA BASE ue EE NO VOS IO FRA A FE o|o0|0|0|3| 0/0|0 A2 54000 olololo|1|0lol0 f; 31 23 0 DESPUES DEL EOR.W DO, 4(A2, D5.L) a cca [XA al C A E oo Palabra ? Sin cambios e N = No es negativo Noes cero Siempre + Sin cambios + 918 |7|6 |3 | 5| F[F Joo 315 31 m 0 AAA TS 0 AAN DR E Sin cambios > oo |olo|3|o[0|0 Paz aa, SiN CAMIOS ra olo [ojo |1|o[o[0 fos eE 23 0 Figura 6.6 FOR MWODOHA2,DS.La 211 ANTES DEL ANDI.B + 3,D2 CCR Bit de signo pa de la doble palabra Bit de signo A DESTINO ) e palabr: PR A 3|9|2| 0|5]| 6 31 1615 DESPUES DEL ANDI.B +3,D2 CCR XIN| Z/VIC sin Cambios N No es ÑO ES e No es qe Siempre negativo +90 a cer Sin cambios 4——>/00020|0011 39/|2|ol5|6|013 Jo: 31 1615 0 uy cd E O Figura € ANDITR 23, D2 212 ANTES DEL EORI.W +*$00FF,(A1) 7 byte N y byte N+1 ] MATA o: (2090000 000 (0 43.210 Bn de signo xIniZ Iv lc Á Palabra N + - O A de la doble palabra cor y J Bn de signo e DESTINO de la palabra Bit de signo del byt 2 9 5 F L, O a a e cool Bo oo 0/|0|0 |0|8 |0| OJOJPAr 31 16 15 0 $FO000 srooo] o [o [FF $F004 O|O|F|O|O|O0 fre 31 23 0 DESPUES DEL EORI.W A4$00FF,(A1) to byte N | byte N+1 y 4 dia EL =LoloFolo Palabra N Sin camb Dr / Ñ Palabra N + - TON AS PA No es No es Siempre negativo Cero a Cero dae 0010/1001 0000 ojojo|ol8s|o|o0[0Jas 31 1615 0 $F004 (próxima instruccion) F|O| 0/4 loc 31 2) 0 Firura 68 ECORIEMWASOOLE (ALS 213 ANDI.B ORIB *,CCR EORI.B Nótese que el destino se indica simplemente mediante CCR y que sóle permite el modo byte. La B es opcional. pero aqui se usará para ren lo que realmente está sucediendo. Para usar este formato conviene re que: Bit O=C ag Bi 1 =V fag Bit 2 - Z ag Bit3=N Mag Bit4=X faz Bits 5-7 no se emplean Una aplicación común es la de poner a cero el indicador X sin cambi el resto de los fags del CCR. Para esto se emplea: ANDI.B HSEF,CCR puesto que SEF = 11101111. Esto es obligado antes de emprender cá iructivo comparar el método de cambiar el COR mediante un ANDI cc aquel que emplea un MOVE para el mismo fin. La instrutción: MOVE.W HS$EF,CCR Sólo se mueve un byte en lugar de toda la palabra pondrá, efectivamente, a cero el fag X, pero cambiará todos los otf Mags a 1. Cambiando el SR [registro de estado) En modo supervisor, v sólo en él, se pueden cambiar ambos bytES | . SR, el byte más significativo, o byte del sistema, y el COR (byte menos 9E> nificativo). Para esto se emplean los formatos: ANDI.W ORI.W +,SR — Instrucción privilegiada. Sólo en modo supervisor EORI.W El byie del sistema contiene los flags de ST (estado y traza), asi comú; máscara de interrupciones de tres bits. ¡De aqui la necesidad de prole 214 que supone ser una instrucción privilegiada! (MOVE-a-SR está protegida de modo similar.) Se tratará este particular en detalle más tarde, en la sección “Más acerca del privilegio”. peraciones lógicas: Resumen Eligiendo apropiadamente la máscara en operando fuente, se pueden al- terar determinados bits o flags en el operando destino. Las reglas son: NOT Se invierten todos los bits en el destino. AND 0 en la fuente: Pone a 0 el bit seleccionado en el destino. l en la fuente: Selecciona los bits que permanecerán malterados en el destino. OR O en la fuente: Selecciona los bits que permanecerán inalterados en el destino. l en la fuente: Pone a 1 el bit seleccionado en el destino. FOR O en la fuente: Selecciona los bits que permanecerán inalterados en el destino. len la fuente: Selecciona los bits que serán invertidos en el destino, APLICACION PRACTICA Problema: Poner a cero el octavo bit (el bit en la séptima posición) de cada byte de una cadena de caracteres ASCII en la memoria. Preliminares: En algunos sistemas, el alfabeto ASCII de siete bits se extiende usando el octavo bit (el bit en la séptima posición) para aplicaciones de control no estándar. En otras ocasiones se emplea este bit para funciones de paridad (véase el problema 6.2 como ejemplo). Este octavo bit es en ocasiones un engorro y debe ser suprimido. Datos: Se da una cadena de caracteres ASCII! no nula que comienza en la posición de la memoria almacenada en A6, es decir, el primer byte de la cadena es el byte (A6). El fin de la cadena lo señala el byte cero 500. Solución: Programa 6.1 BUCLE ANDLB ASTF(A6)+ La fuente inmediata es “01 MIIII”, A6 se incrementa al “siguiente byte” TST.B (46) ¿Es el nuevo byte $007 BNE.SS BUCLE No: repetimos Si: fin de la cadena 215 Notas al programa; Estamos empleando $7F como máscara, +*, f unos en todas las posiciones que no se desee cambiar (del O al 6) yy en la posición que deseamos cambiar. La lógica subyacente es; lIANDx=x (x sin cambios) ODANDx=0 (x se pone a cero) Nótese la potencia del modo de direccionamiento (A6)+ cuando se conjunción con el byte nulo como fin de la cadena. Esta es una muy empleada cuando se trabaja con entes de longitud variable como denas de caracteres. La linea ANDI.B pone a cero el octavo bit en la rección A6 y entonces incrementa A6 en 1 para obtener la dirección siguiente byte. TST.B simplemente comprueba cl nuevo byte (sin iy mentar) y BNE indica bifurcación si no es cero. Asi se continúa exg minando la cadena de caracteres hasta alcanzar su final: | Instrucciones de desplazamiento y rotación Hay ocho instrucciones de desplazamiento y rotación que permiten mi ver los bits dentro de los registros, o la memoria, hacia la derecha o hac izquierda. Dando un valor al contador de desplazamiento, que dete número de desplazamientos, se puede cambiar la posición de los bits d de bytes, palabras y dobles palabras. Los desplazamientos también funciones aritméticas. Se ha visto en el capitulo 4 que en aritmética binaria simple despli los bits de una cadena una vez a la derecha es equivalente a mul por 2, mientras que desplazarlos a la izquierda es equivalente a dividir po De modo que un uso evidente de las instrucciones de desplazamiento plearlas como métodos rápidos de multiplicación y división por poten de 2. Sin embargo, antes de comenzar con los desplazamientos a izq y derecha de cadenas de bits, debemos saber si éstas representan nú con signo o sin signo. Recordemos que en números con signo el bit si cativo es el bit de signo. Si olvidamos este factor cuando realicemos d zamientos, podemos obtener resultados erróneos. Debido a este problé el M68000 ofrece dos tipos de desplazamientos: desplazamiento l aritmético. La diferencia entre ellos estriba en cómo tratan el bit de 5 Veamos primero los desplazamientos lógicos, que son los más sencili0% - Instrucciones de desplazamiento lógico Un desplazamiento lógico se emplea principalmente sobre núme signo. El desplazamiento actúa moviendo una cadena de bits un detél 216 nado número de posiciones a la izquierda (LSL) o a la derecha (LSR), in- sertando ceros en el extremo correspondiente. Cuando se inserta un cero, podemos imaginar cómo resulta desplazado el resto de los bits de la cadena uno detrás de otro, con un pobre bit al final saliendose por el extremo. Las figuras 6.9 y 6.10 muestran dos desplazamientos lógicos en una palabra. El número de desplazamientos efectuados se denomina cuenta de des- plazamiento y se especifica mediante un operando inmediato, indicado como siempre por el simbolo +. Asi, en nuestros ejemplos, el contenido de la palabra de orden más bajo de Dl sufre tres desplazamientos a la izquier- da y dos a la derecha. El contador de desplazamiento inmediato puede Lo- mar valores de X*1 a %8. Esto significa, obviamente, que el máximo valor del contador de desplazamiento inmediato es 48. Para efectuar más de ocho desplazamientos se necesita el formato LSL.zz Dm,Dn LSR.z Dm,Dn Donde el registro de datos Dm contiene el contador de desplazamiento, Con este formato se pueden realizar de uno a 64 desplazamientos a la de- recha o a la izquierda. Sólo los 6 bits menos significativos de Dm (bits del O al 5) se emplean para el contador de desplazamiento (lo que explica el limite de 64 para el contador de desplazamiento en este formato). El término correcto para esto, que nos ahorrará mucha palabrería posteriormente, es: registro de datos del contador de desplazamiento = Dm módulo 64 (que a menudo se abrevia a Dm mod 64). Por ejemplo, si: Dm =306 67 ó 131, entonces el contador de desplazamiento será = Dm mod 64 = 3, O si Dm = 63 6 127 6 191, entonces el contador de desplazamiento será = Dm mod 64 = 63. La regla es dividir Dm entre 64, hasta que el resto sea menor de 64. La mayoría de los relojes funciona en base al concepto (horas mod 12), de modo que este concepto es omnipresente. Usar Dm como contador de desplazamiento proporciona una mayor flexibilidad que emplear el contador de desplazamiento inmediato: por ejemplo, el contador de desplazamiento puede variarse de una manera diná- mica en un programa. Los desplazamientos inmediatos son para pequeños desplazamientos fijos. Si el contador de desplazamiento se hace cero, por accidente o diseño, no se produce ningún desplazamiento, pero el CCR queda afectado (véase más abajo). El código de tamaño de datos z especifica cuántos bits del registro des- 217 ANTES DEL v=0 operando J- 0 LSL LSL.W %3, D1 T ] Palabra N RARA ARA Palabra N 2 Palabra N + 2 Bit de signo CCR GN Z|V CA de la doble palabra [-| 2 SQno DESTINO Entran ceros 5|2|9 D1 a: MAMA EE 31 1615 0 PC 31 23 0 DESPUES DEL LSL.W £3, D1 E CCR a SN SINE j Palabra N O|0 Ultimo bit que ha salid . da No 5 Palabra N + 2 Operando cero E No es A cero negativo Sin cambios —>/0001/|00094 1010/1000 2|9|8|1/0|A]|8)PYPD1 31 1615 0 E PC 2 3 o Figura 6.9 LSL. W 43,D1 218 ANTES DEL LSR.W +2, D1 Bit de signo de la doble palabra DESTINO Os CCR operando V=0 LSR byte N byte N+1 NTE Ta Palabra N+2 Bn de sigho de la A del byte A 0001 en aaa Ceros en —+ (1010/0010 Bit de signo 0101 2 |9]|8 A 2 16 15 o > 199000 000 00 PC 31 23 0 DESPUES DEL LSR.W +2, D1 43210 mint im CCR X|NI ZV 5 OJOJO[ OJO Ultimo bit 7 | que ha salido / Acero Ñ No es A Ultima negativo EE aalO que ñ “salido jas Sin cambios —|00:0/1000 1000/0101 s|l2|ols8s|2|8|8|5)Jo1 31 1615 0 lrc 31 23 0 Figura 6,10 SR, WI R*2,DI WMA byte A l vv 1208000008 0 bit qsEz E nn E E MEE MO 219 Desplazamientos lógicos y el CCR Desplazamientos lógicos para operandos de la memoria tino resultarán afectados por el desplazamiento. En el ejemplo LSL, 16 bits menos significativos, es decir, la palabra de menor peso, afectados por el desplazamiento. Si hubiéramos empleado L o B, el zamiento habria afectado al total de los 32 bits o habría quedado co a los 8 bits menos significativos de DI. ¿Qué es lo que ocurre con el bit que sale del registro cuando se pra un desplazamiento? Como se muestra en las figuras 6.9 y 6.10, se a nan tanto en el indicador C (acarreo) como en el indicador X (exte del CCR (registro de códigos de condición). Si miramos en los indi res Co X después de que se complete una instrucción de desplazam obtendremos el valor 0 ó 1 del último bit que salió del registro afectado y el desplazamiento. Los indicadores N (negativo) y Z (cero) indican sj: bits en el registro DI después del desplazamiento representan un nún negativo o un cero. Recordemos que si está tratando con números sin si; el indicador N sólo indica el estado del bit más significativo y no el gi del operando. El indicador V siempre se pone a 0. La siguiente tabla re sume los cambios del CCR: Indicador X: Se pone a 1 si Dn resulta negativo tras el desplazamien» to; de lo contrario se pone a 0. zamiento es 0, es decir, si no se produce desplazamien- to alguno. Indicador N: Si se pone a | si Dn resulta negativo tras el desplaza: miento, de lo contrario se pone a 0. Indicador Z: Se pone a 1 si Dn resulta cero tras el desplazami Indicador V: Siempre se pone a 0. Indicador C: Resulta afectado del mismo modo que el indicador A, pero se pone a 0 si el contador de desplazamiento es Q, es decir, si no se produce desplazamiento alguno. Los desplazamientos lógicos de cadenas de bits de la memoria sufi e dos restricciones. Sólo se pueden desplazar palabras en la memoria y el con* tador de desplazamiento debe ser 1. El formato para un desplazamiento en la memoria es: LSL.W LSR.W donde indica dirección efectiva de la memoria. byte N y byte N+1 ; ANTES DEL operando k- 0 LSL.W (A6) cil LSL Y 772 7/ Palabra N A 43210 near ÁREA" MAI de la doble palabra CCR Ú DESTINO Bit de signo Bar de signo INDIRECTO de la palabra del byte 53824 AN IRAN $ PE Y FEAS, P 0100101111 101014441 0|¡0|0[|0|3|8| 2/4 Jas 0 31 1615 A PC 31 23 0 DESPUES DEL LSL.W (A6) 432 o byte N byte N+1 ss AAA, Último bit Eras on Lo LO oJ ips AA 2% Malo Ñ Palabra N + 2 5 0000 PA que ha salido Es negativo No es Ultimo bit y que ha salido + Sin cambios E $3824 0|J0|0/013|8 4 ac 31 1615 0 loc 31 23 0 N Figura 6,11 ESLW 116) El contador de desplazamiento es siempre |, por lo que no se IR citamente como operando. : El CCR cambia como en un desplazamiento lógico en un registrg, - Indicador X: Se pone al valor del último bit que salió de la Palabra destino. mE Indicador N: Se pone a 1 si Dn resulta negativo tras el desplaza. miento, es decir, si el bit en la posición 15 es 1; de lo contrario se pone a 0. E Indicador Z: Se pone a 1 si Dn resulta cero tras el desplazamiento, Indicador V: Siempre se pone a 0. E Indicador C: Resulta afectado del mismo modo que el indicador X (dado que el contador de desplazamiento no €s nú ca 0). En la figura 6.11 desplazamos la palabra situada en (A6) uno a la iz quierda. Nótense los cambios en el CCR, > APLICACION PRACTICA Problema: Comprobar la paridad de un carácter ASCII de 8 bits. Cox los unos en un código ASCII y poner el byte D3 a cero si la paridg par; poner el byte D3 a uno si la paridad es impar (condición de en Preliminares: El código ASCII estándar de 7 bits (bits de O a 6) que se Ef cuentra en el apéndice F asigna caracteres a cada una de las 128 combi ciones de 7 bits existentes desde $00 hasta $7F. Para comprobar la exa titud de una transmisión, se incluye en ocasiones un octavo bit (bi a cada código. Las normas de asignación de este bit son: Si el número de unos en el código de 7 bits es impar, el número se pone al valor 1. Si el número de unos en el código de 7 bits es par, se pone a 0, Por tanto, todos los códigos ASCII de 8 bits válidos tendrán un número pá de bits 1, y se denomina a este esquema de comprobación paridad par A medida que se recibe cada carácter se puede comprobar si algún b se ha perdido o añadido durante la transmisión. Existen métodos de coñ probación más elaborados, pero el método de paridad par-impar es a0% cuado en muchas circunstancias. Su mayor ventaja es que cualquier Al mero impar de cambios transformará un código ASCII válido en UM inválido y, por tanto, se podrá detectar el error. La peor clase de 16 es aquella que no deja huellas inmediatas. Por ejemplo, el código ASCII para el número 5 es $35; si el bit O can bia de 1 20, recibiremos el código $34, que es el número 4. Este tipo de erroés podria pasar inadvertido hasta que el interesado comprobase su libreta de cuentas. El código ASCII de 8 bits detectaría rápidamente este error: 0110101 =$35 ="'5" 0110100 = $34 = “4” ASCII de 7 bits Perder el bit 0 de **5'* da 0110100 = $34 = "4" 00110101 =$35=“5" 10110100 = $B4 = “4” ASCII de 8 bits Perder el bit O de **5* da 00110100 = $34 = INVALIDO (paridad (errónea) Datos: Un carácter ASCII de E bits en el byte de menor orden de Dl. Ejemplos: Byte Dl =5$A2 = 10100010 dará D3=1 (3 unos en DI = impar) Byte Dl = 547 =01000111 dará D3 =0 (4 unos en DI] = par) Solución: Programa 6.2. CLR,B DESP. — TST.B BEQ.S LSL.B BCC.S EORI.B BRA.S HECHO TST.B BNE D3 DI HECHO *1,D1 DESP 1,03 DESP DJ ERROR Poner el byte D3a0 ¿Es el byte DI 0? Si DI es 0 hemos acabado Si DI no es 0 hacemos un desplazamiento lógico a la izquierda ¿Ha salido un 1? Si no es asi, no hay acarreo y vamos u DESP; si ha salido un 1 lo anotamos en D3 Invertimos el bit 0 en D3, es decir, si D3=0, hacemos D3 =1, y si D3=1, hacemos D3 =0 Volvemos a DESP ¿Es D3 0? No, Vamos a ERROR * A BRA + + OTRA_COSA — Continúa el programa ERROR — * Notas al programa: Algunas de las instrucciones de salto tienen la opción cortos (de —128 a 127 bytes). Esta opción ahorra una palabra en el en- samblado. Instrucciones de desplazamiento aritmético La figura 6.12 ilustra el desplazamiento aritmético. Como puede verse, los desplazamientos aritméticos son muy similares a los desplazamientos ló- gicos de la sección anterior. De hecho, emplean los mismos formatos para las cadenas de bits origen y destino, y los desplazamientos a derecha e iz- quierda se producen de acuerdo al tamaño del dato y al contador de despla- zamiento (ASL equivale a desplazamiento aritmético a la izquierda y ASR a desplazamiento aritmético a la derecha). La diferencia es que cuando se desplazan aritméticamente números con signo, el procesador protege el bit 223 Se pone Y [- A , : e ANTES DEL dl operando le 9 s Cambia [x] ASL ASL.L +3,D1 hp [xj cn dl TA O a o A alabre N Sn a e ZU xn Z [VICO CCR SÍ Bn de signo Bit de signo [Ei Li Bn de signo del byte de la doble palabre de la palabra 0110101 M Entran ceros 5 Po a) ro Ly > DESPUES DEL ASL.L +*3,D1 CCR Ulturno bit 1 que há salido Palabra N ob a X Palabra N- Rebose Es negativo No es Ultimo bit ce que ha salido Figura 6.12 IST.L 3D! 224 61 15] La) E o <» Lan ¿+ e o AN mm z + 1 más significativo contra posibles cambios que podrían llevar a resultados erróneos. Por ejemplo, si se desea dividir 4 entre 2, emplear el desplaza- miento lógico llevaria a resultados erróneos. Veamos por qué: En complemento a 2, -4= 11111100 (en formato byte) Desplazamiento lógico a la derecha de -4 =01111110= + 126 El desplazamiento aritmético correcto a la derecha sería 2 = 11111110 La situación es peor cuando se intenta dividir —4 entre 4, empleando des- plazamiento lógico a la derecha con un contador de desplazamiento de 2. El problema es que cuando un LSR introduce un cero a la izquierda (el valor más significativo) de cualquier número negativo, no sólo altera el bit de signo, también lo mueve a la posición 6 y la respuesta resultante carece de sentido en lo que concierne a la aritmética de signo. El LSR funciona bien con números de signo positivo, pero es claro que se necesita un despla- zamiento a la derecha que funcione bien con todos los números con signo. El ASR consigue esto introduciendo un 0 o un 1, dependiendo del signo que hay que desplazar. Tomemos el ejemplo de **-4 entre 2” de nuevo: En complemento a 2, -4= 11111100 (en formato byte) El desplazamiento aritmético a la derecha de -4= 11111110 = -2, que es correcto Dado que —4 tiene el bit de signo a 1, ASR introduce un 1 a la izquierda, preservando el signo del dividendo. Similarmente, multiplicar por 2 empleando desplazamientos a la izquier- da puede llevar a resultados erróneos con números con signo: En complemento a 2, +72 = 01001000 (en formato byte) El desplazamiento a la izquierda de 472 = 10010000 = — 122 con signo o +144 sin signo Aqui la respuesta es correcta en aritmética sin signo, pero incorrecta con signo. El problema no se debe al desplazamiento en si, sino al hecho de que + 144 excede la capacidad de un byte de 8 bits (de —126 a +127). Hay que vivir con este hecho. Como se vio en la instrucción ADD, lo mejor que se puede hacer es vigilar el indicador de rebose Y en el CCR: éste es nuestra defensa contra la aritmética de signo. Podemos recordar que el LSI siempre pone a cero el indicador Y en el CCR. Luego el LSL es peligroso si se desea emplear números con signo. La solución es emplear el ASL cuando se desea emplear números con signo, porque el ASL afecta al indicador V. ASL introduce ceros desde la derecha como el ASL, pero, si se detecta un cambio de signo en cualquier momento durante el desplazamiento, se pondrá a 1 el indicador Y. Si no ocurren cambios de signo, el indicador Y 225 se pondrá a 0. Nótese que en desplazamientos múltiples el indicadg puede cambiar varias veces para terminar con el mismo valor con el empezara. Sin embargo, si Y se pone a 1, permanecerá en este valor f que termine el desplazamiento. Como en el resto de la aritmética con sj es responsabilidad del programador comprobar el estado del indi ador un valor V = 1 significa peligro. ; Resumamos las diferencias entre los desplazamientos lÓgicos y ari LICOS. Desplazamientos lógicos y aritméticos: Diferencias El LSR desplaza hacia la derecha, insertando ceros desde la izq El ASR desplaza hacia la derecha, copiando el bit de signo desde izquierda. Tanto el LSL como el ASL desplazan hacia la izquierda, insel ceros desde la derecha; pero el LSL pone a cero el indicador d bose en el CCR. El ASL pone el indicador V a 1 si ocurre cualquier cambio de sig durante el desplazamiento. ' Veamos ahora las semejanzas entre los desplazamientos lógicos méticos. Desplazamientos lógicos y aritméticos: Semejanzas Los desplazamientos lógicos y aritméticos comparten los modos reccionamiento. ASLz¿ *,Dn Cuenta de desplazamiento inmediato entre | y 8 ASLz Dm,Dn Cuenta de desplazamiento Dm mod 64 *. ASL.W Cuenta de desplazamiento = 1 ASRí %,Dn ASR.z Dm.Dn ASR.W Tanto los desplazamientos lógicos como aritméticos copian el sale desplazado en los indicadores C y X, y ambos afectan a los indici N y Z de la misma manera. Las figuras 6.12 y 6.13 muestran dos UB desplazamientos aritméticos. Desplazamientos aritméticos y el CCR Resumamos los cambios en el COR: Indicador X: Se pone al valor del último bit que salió de la palabra destino. No resulta afectado si el contador de despla- samiento es 0, es decir, si no se produce desplazamien- to alguno. Indicador N: Se pone a 1 si el destino resulta negativo tras el despla- zamiento. Indicador V: Se pone a 1 si ocurre algún cambio en el bit de signo en cualquier momento durante el desplazamiento. Indicador C: Resulta afectado del mismo modo que el indicador X, pero se pone a cero si el contador de desplazamiento es 0, es decir, si no se produce desplazamiento alguno. APLICACION PRACTICA Problema: Calcular la media aritmética de dos números con signo DO y DI al entero más próximo y almacenar la respuesta en la palabra de orden más bajo de D3, Señalar un error si se excede el rango de los números con signo. Preliminares: La media aritmética de un par de números, a veces conocida como promedio, se obtiene sumándolos y dividiendo por 2. La media está exactamente a medio camino entre ambos números. Una aplicación muy común se encuentra en los procesos de búsqueda binaria en ficheros ordenados. Se localiza el registro buscado dividiendo el fichero en dos partes iguales. Comparar el objeto de la búsqueda con el registro inter- medio de cada una de las partes indica cuál de ellas lo contiene. Entonces se divide esa mitad del fichero deseado y se repite el proceso hasta en- contrar el registro deseado. En cada paso de la búsqueda es necesario calcular la media para hallar el registro intermedio. Datos: Dos números de 16 bits en DO y DI. Ejemplos: DO = 2979 = $0BAJ3 DI =4261 =$I0A5 DO + D] =7240 =$1C48 (no hay rebose) D3 = 1/2* 7240 = 3620 = $0E24 DO = -3 = $FFFD Dl = =$ =S$SFFFB DO+D1=-8 =5$FFF8 (no hay rebose) D3 = 1/2*(-8) = —4 = $FFF4 DO = 43981 = SABCD D1 = 26341 = $66E5 DO + Dl = 70322 = $112B2 227 Solución: Programa 6.3. MOVE.W D0,D3 La palabra DO está ahora en D3 ADD.W DI,D3 La palabra en D3 es DO + DI BVYS ERROR Saltar a ERROR si el indicador Y se ha puesto a 1 ASR.W +1,D3 Dividir D3 entre 2. Ignorar el resto. D3 contiene ahora la media de DO y D3 (el entero más próximo) BRA OTRA_ COSA Continúa el programa ERROR + + + . FIN Notas: Si DO + D] es par, la media obtenida en D3 será correcta; p DO + D1 es impar, la media en D3 será 0,5 menor que la real. N problema simplificado pedia el entero más próximo, de modo que se ignorado cualquier resto al dividir por 2. Hay una forma fácil de renciar estos dos casos. Cuando se efectúa un ASR sobre un nú impar, el bit que sale es un 1. Puesto que este bit se copia en los ii dores X y C del CCR, se puede comprobar fácilmente este hecho diante un BCS o un BCC y emprender la acción adecuada. 7 La tabla 6.2 da un resumen de todas las instrucciones de desplazamiento y da como resulta afectado el CCR. TABLA 6.2 Resumen de las instrucciones de desplazamiento Efectos sobre Instrucción Operando el CCR ASL.L/W/B Dm,Dn o 4,Dn X+N+*Z+V+C* ASR.L/W/B ASL.W x+N*Z*V+C* ASR.W LSL.L/W/B Dm,Dn o *,Dn x=*N=Z*V0C* LSR.L/W/B LSL.W X*»N=Z*V0C* LSR.W = Direccionamiento por direcciones alterables efectivas: (An), (An) +, (An), diam díAn,Xi), Abs.W, Abs.L $ =3 bits que se emplean como datos inmediatos. Permiten un contador de desplazam de la £. - 1 Notación para el CCR: indica sin cambios, * indica cambios segun las reglas del CCR, 01m que cl indicador siempre se pone a O ANTES DEL pAERAnS 1 Bu de signo ASR.L +2,D1 TA Son PUN ASR Ba de signo Bit de signo de la doble palabra de la palabra 0010 y A 1101/0010/1001/|1000/1010 Bit de signe A byte AD 0001|0101 D|2|9|8]| A| 2 1 0) 1 1615 DESPUES DEL ASR.L +2,D1 CCcR 0 Ultimo bt que ha salido = € d J ú No , Es negativo cero 0100/1010 0010/1000 | que ha Na hay rebose 1000/0101 A 8 5 31 23 bigura ft, 13 ISR, EARL DS Último t salido Pélabra byle N4+1 byte N 2 A WU Palabra N+.2 Salida de bits D1 | byte N | byte N+1 y Palabra N SL Mm Na D1 : f Pp ó f ; 229 Rotaciones Rotar los bits en un registro es muy parecido al desplazamiento lé descrito más arriba, excepto que los bits que salen por uno cualquiera los extremos entran por el otro. Como la palabra “rotación” sugiere, yy puede imaginarse las cadenas de bits moviéndose en el sentido de las del reloj (rotación a la izquierda) o en sentido contrario a éstas (rota a la derecha). Como en el caso de los desplazamientos, se puede especi cuántas veces se rotan los bits empleando un dato inmediato o un reg como contador de desplazamiento. Los formatos de la instrucción de ción para la fuente y el destino son idénticos a aquellos empleados pa desplazamientos. La gran diferencia es lo que sucede con los bits a m Que rotan. La tabla 6.3 muestra las cuatro variantes para las instruccio n' de rotación. ROR Rotación a la derecha ROL Rotación a la izquierda ROXR Rotación a la derecha empleando el indicador X ROXL Rotación a la izquierda empleando el indicador X TaBLa 6.3 Resumen de las instrucciones de rotación Efectos sobre Instrucción Operando el COR ROL.L/W/B Dm,Dn o +,Dn X_N+*Z+*VOC8 ROR.L/W/B ROL.W X_N=Z*V0C* ROR.W ROXL.L/W/B Dm,Dn o %,Dn X*N=Z*V0C* ROXR.L/W/B ROXL.W x=N=Z*V0C* ROXR.W A = = Direccionamiento por direcciones alterables efectivas: (An), (An) +, —(An), AR d(An,Xi), Abs.W, Abs.1 * = 3 bits que se emplean como datos inmediatos. Permiten un contador de despla delas 3 Notación para el CCR: __ indica sin cambios, * indica cambios según las reglas del CCR, 0 que el mdicador siempre se pone a 0, Estas instrucciones aceptan los tres formatos dados para los desplaZá mientos, que son: ROR.z Dm,Dn Rotar Dnf.z) a la derecha tantas veces como indique (Dm mod 64) ROR 4,Dn Rotar Dnf.z) a la derecha d3 veces (1 8) ROR.z Rotar la memoria(.z) a la derecha una vez solamente La figura 6.14 muestra cómo el bit desplazado siempre se copia en el in- dicador € del CCR. En las variantes RORYROL los bits desplazados entran directamente por el otro extremo y el indicador X permanece inalterado. Programa 6.5: Sumar los bytes 1, 3 y 4 con signo de una doble palabra + DO contiene 4 bytes representando cada uno un número con signo + Byte 1 = bits 0-7 (byte menos significativo de la palabra menos significativa) + Byle 2 bits 8-15 (byte más significativo de la palabra menos significativa) + Byte 3 = bis 16-23 (byte menos significativo de la palabra más significativa) + Byte 4 bis 17-32 (byte más significativo de la palabra más significativa) + La suma de los bytes 1, 3 y 4 se almacena en DI * Se emplea D3 como registro temporal para cálculos Se mantiene los valores de DO y D3 MOVEM.| CLR.I CER. MOVE.B SWAP MOVE.B ADD.W ROR.L MOVE.B ADD.W MOVEM.I DO'D3, ASP) DA DI Do,D1 DO DO,D3 D3,D1 8.10 D0,D3 D3,D1 (SP) + ,D0/D3 Almacenar estos valores en la pila Poner a 0 la doble palabra D3 Poner a 0 la doble palabra DI Byte la DI Inverter las palabras en DO, El byte 4 es ahora el byte menos significativo de la palabra menos significativa El bvte 4 es el byte más significativo de la palabra menos significativa. (El byte 2 es el byte más sigembecativo de lá palabra mas significativa. El byte 4 es el byte más significativo de la palabra más sienificativa) Byte 3 a DA Sumar bytes | y 3 y almacenar el resultado en Dl Movemos el byte 4 al byte menos significativo de la palabra menos significativa. (El byte | pasa al byte más significativo de la palabra menos significativa, El byte 2 pasa al byte menos significativo de lá palabra más significativa, El byte 3 pasacal byte más siemicativo de la palabra más significativa) Byte 4 a D3 Sumar byte 4 a DI Restaurar los valores de DO,D3 según la pia DI contiene la ama de los bytes 1, 3 y 4 Asignación y comprobación de valores de bits z 2 an] ¿ ner « Ya A ie TO En el capitulo 4 encontramos la instrucción TS ¿2 que comprueba un operando completo (1, W, o B) para poner a 0 ó 1 los indicadores del 233 CCR, según proceda. En el próximo grupo de instrucciones redefinire esta idea para incluir la posibilidad de asignar o comprobar los valores un bit en concreto en una amplia variedad de situaciones. ( BTST: Comprobar un bit BTST permite comprobar cualquier bi dentro de un registro de datos o cualquier bit en un byte de la memoria. El resultado de esta comprob ción, como en el caso de un TST, se refleja en el indicador Z del CC] Si el bit comprobado = 0, se pone el indicador Z a 1 Si el bir comprobado = 1, se pone el indicador Z a 0 El resto de los indicadores del CCR permanecen inalterados. TST, como se vio en el capitulo 4, comprueba si todo un byte, palab o doble palabra es cero, mientras que BTST comprueba un bit individual mente. BTST tiene los siguientes formatos: BTST.L Dm,Dn Comprucba cl bit (Dm mod 32) de Dn BTST.L *,Dn Comprucba el bit d$ de Dn BTST.B_ Dm, Comprueba cl bu (Dm mod 8) byte BTST.B_ 4, Comprueba el bit d3 del byte Donde representa un número de $ bits, es decir. de 0 a 31, y número de 3 bits: de 0 a 7. . Nótese que excluye aquí el modo inmediato como una direccl válida. Puesto que el destino no se altera por un BTST, los destinos dire cionados en modo relativo si se permiten. El operando fuente, que indica la posición del bit a comprobar, p ser un número en un registro de datos o una constante inmediata. Recu dese que el bit en la posición cero es el primero y menos significativo. todos los casos. 1 El rango en que puede moverse el valor de la posición del bit a CO cla es, obviamente, de O a 31 para los registros de datos y de 0 a 7Pp s los bytes de la memoria. Si se intenta comprobar una posición de un. fuera de estos rangos, el procesador simplemente la reducirá en módulo: o en módulo 8, como se ha indicado más arriba. . Puesto que sólo los bytes de la memoria pueden comprobarse mediaf BTST, es necesario en algunas ocasiones moverse desde esta a un regi5t de datos para comprobaciones más elaboradas. Los E de tamaños están implicados en el formato, de modo Ql son opcionales en la mavoria de los ensambladores. Aqui se usarán Pi clarificar lo que se está haciendo. Aqui se muestran dos ejemplos tipicos del uso de BTST. * Programa 6.6: Comprobar si un número es par o impar empleando BTST * DÁ contiene un número sin signo + Sies par dejarlo tal y como está + Sies impar sumarlo uno para transformarlo en pur BTST.L— *0,D3 — ¿Eselbitó de D3=0? BEQ PAR Si es asi saltar a PAR ADDQ.L 41,D3 Si no es así es impar, sumarle uno para hacerlo par BCS ERROR — ¿Demasiado grande para ser un número con signo de 32 bits? Se ha producido un acarreo PAR * ” * ERROR El programa 6.6 descansa en el hecho de que un número par tiene su bit menos significativo a 0. Transformar un número de impar a par es un truco útil para redondear las direcciones que usa el M68000 a la palabra más próxima. * Programa 6.7: Comprobar cl estatus de un empleado, empleando BTST + AU apunta al registro de un empleado en la memoria = La primera palabra contiene la identificación del empleado + El byte de orden más bajo de la segunda palabra es el byte de estatus del empleado + Bi 0=0 para varones, | para mujeres + Bit =0 para jornada a tiempo completo (TC), + | para jornada a tiempo parcial (TP) + Bi 2=0 para personal de oficina (PO), | para directivos (DD) + Incrementar el contador D6 en 1 si el empleado es mujer CIPO + Cuando se entra en este segmento del programa, D6 contiene el subtotal + de tales empleados BTST.B_ +*0,2(40) BEQ IGNORAR BTIST.B +*1,2(40) BNE IGNORAR BTST.B_ +*2,A0) BNE IGNORAR ADDQ.L +*1,D6 IGNORAR Comprobar el bit de sexo Ignorar a los varones, es decir, bit 0=0 Comprobar el bit de TP*TC lenorar a los empleados a Liempo parcial, es decir, bi 1 =1 Comprobar el bir de DI/PO lenorar directivos, es decir, bit 2=1 Añadir 1 al conjunto de empleados mujer TC/PO * Esto formaria parte de un programa para contar el número de empleados * en cada categoria Aquií estamos comprobando el byte de la memoria en la localización AO + 2; por tanto, el operando destino es 2(A0). Para comprobaciones re- petidas sobre 2(A0), probablemente encontrariamos más rápido mover XAO) a un registro de datos. puesto que nos ahorrariamos calculos de di- recciones efectivas y búsquedas en la memoria. 235 Comprobar y cambiar un bit E Hay tres variantes de BTST, que son: BCLR: comprobar un bit y ponerlo a 0 BSET : comprobar un bit y ponerlo a 1 BCHG: comprobar un bit y cambiarlo Estas variantes no sólo comprueban el valor de un bit alterando el estat del indicador Z como BTST, sino que después proceden a cambiar el del bit comprobado según indique el nemónico. Los formatos difieren ligeramente del de BTST, puesto que sólo se miten operandos alterables, lo que es natural si se considera que B BSET/BCHG alteran realmente el destino. BCLR.L Dm.Dn Comprueba el bit (Dm mod 32) de Dn BCLR.L. % Dn Comprueba el bit (d6 mod 32) de Dn BCLR.B- Dm, Comprueba el bit (Dm mod 8) del byte BCLR.B-— **, Comprueba el bit (Dm mod 8) del byte Una vez que se ha puesto el indicador Z al valor correspondiente, B pone el bit destino indicado a 0. BSET.L — Dm.Dn Comprueba el bit (Dm mod 32) de Dn BSET.L — *.Dn Comprueba el bit (dé mod 32) de Dn BSET.B Dm, Comprueba el bit (Dm mod $) del byte BSET.B_ *. Comprueba el bit (Dm mod 8) del byte Una vez que se ha puesto el indicador Z al valor correspondiente, BSEF- pone el bit destino indicado a 1. BCHG.L Dm.Dn Comprueba el bit (Dm mod 32) de Dn BCHG.L *,Dn Comprueba el bit (d6 mod 32) de Dn BCHG.B Dm, Comprueba el bit (Dm mod 8) del byte BCHG.B *, Comprueba el bit (Dm mod £) del byte Una vez que se ha puesto el indicador Z al valor correspondiente, BCRY invierte el bit indicado: 0 > 16 1 =>0, ] Las tres instrucciones para probar y asignar valores a ciertos bits st emplearse únicamente para asignar valores a éstos, ignorándose los aspt de comprobación. Empleando estos datos en el programa 6.7, podemos bajar la categoria de un empleado cambiando su byte de estatus. * Programa 6.7: Cambiar el estatus de un empleado, empleando BCLR + A0 apunta al registro del empleado en la memoria + La primera palabra contiene la identificación del empleado + El byte de orden más bajo de la segunda palabra es el byte de estatus del empleado * Bi 0=0 para varones, | para mujeres + Bit 1 =0 para jornada a tiempo completo (TC), 1 para jornada a tiempo parcial (TP) * Bit 2=0 para directivos (DI), 1 para el resto del personal + Rebajamos la categoria del empleado poniendo el bit 2 a 0 BCLR.B_ X2(A40) — Ponemos el bit 2 de 2(A0) a 0 BEQ ERROR — El empleado ya estaba en la categoria * * + FRROR * BCLR comprueba el bit 2 antes de ponerlo a 0, * BEQ producirá un salto si el bit 2 era ya 0, revelando un posible error * en el conjunto de registros con el que se está trabajando BCHG es útil para controlar la actividad durante los bucles, actuando como un balancín o conmutador. Por ejemplo: * Programa 6,84: Cambiando los trabajos mediante BSET y BCHG BSET.L +0,D2 Comenzamos poniendo el bit 0 de Dl a 1 BUCLE BCHG.L +0,D2 Cambiar 0 + | y ]-=0 BEQ TAREAO — Realizar la TAREAO para números pares BRA BUCLE TAREAO BRA BUCLE * Cada vez que se alcanza el comienzo del BUCLE comprobamos el valor del bit 0 de D2 + y se pone a. 00 1 el indicador Z. Después se cambia el valor del bit de 0 a 1 “ode la 0. Entonces se comprueba el valor de Z para realizar la TAREAO * ula TAREAL. De este modo se alternan las tareas a realizar. Para evitar un ciclo ¿ infinito se supone que una de las dos tareas contiene algun test para salir del BUCLE Scc: Poner a uno condicionalmente Scc representa un conjunto de códigos de un solo operando, que debe ser un byte, y que tiene el formato: Sal.B) El byte en se pone a 5$FE (todo unos) si la condición ce es cierta y se pone a $00 (todo ceros) si la condición cc es falsa, Dado que Sec altera el destino, sólo se permiten los modos de direccionamiento de tipo , Sec tiene 16 posibles variantes correspondientes a los diferenies mnemó- nicos de condición representados por cc. Cada condición viene determinada 237 TABLA 6.4 Códigos de condición para Bcc, Dbec y Secc Mnermórnico la Condición Formula booleana para el cc El Acarreo 8 cero E Sin (05 Acarreo a 1 € Sin EQ Es igual a Z Todas F Falso 0 Toda GE Mayor o igual que (Na V) + (uN? eV) Con si Er Mayor que (No Von Z)+ (Nav mz) Con HI Mayor que nm ECrrmwZ Sin si LE Menor o igual que Z + (Na V) + (uNa Y) Con gi ES Menor o igual que E+Z Sin si LT Menor que (Nau Y) + (uN a V) Con s Mi Es negativo N Con $ NE No es igual a nz Todas PL Es positivo ne N Con s T Verdadero 1 Todas* vC Se ha producido un rebose “V Con signo VS No se ha producido un rebose V Con $5 Leyenda: = = NO lógico: + = Ológico: + = Y lógico. * Ey Tono se utilizan con bc por el estado de los indicadores en el CCR en el momento en que se efe la comprobación. Ya se han visto instrucciones de este tipo en el capitul en la sección en que se hablo de las instrucciones Bec (saltos condiciona La tabla 6.4 muestra la lista completa de los códigos cc empleados con Bcc y DBcc (instrucción esta última de la que se hablará más adelan La función esencial de un Scc es la de almacenar el resultado de u comprobación efectuada sobre el CCR, de modo que pueda usarse el resul tado obtenido más tarde, una vez que el CCR haya cambiado. Ya se há visto que la mavoría de las instrucciones altera el CCR, y esto puede ser umi molestia si se desea diferir una acción condicional. Funcionamiento de las instrucciones tipo cc Las diferentes condiciones representadas por un código cc varian de > comprobar el estado de un único indicador del CCR hasta evaluar comple cadas expresiones booleanas que involucran varios de estos indicadorél Las condiciones que afectan a un solo indicador se explicaron ya cua se habló del Bcc. Estas ocho condiciones básicas dependen sólo del de los indicadores N, Z, C, o X. Estos indicadores pueden considerar camo variables booleanas que toman el valor 1 para significar verdad Y! valor 0 para indicar lo contrario. Se pueden combinar, como se muestis para indicar condiciones más complicadas. La tabla 6.4 muestra los cála los lógicos efectuados por el M68000 para determinar la veracidad O sedad de cuestiones típicas referentes a las relaciones entre dos núme mayor. menor, igual, etc. Disección de una condición cc que afecta a varios indicadores Tomemos como ejemplo la condición HI (mayor que), que se lista en la tabla como una condición sin signo. Si queremos comparar dos números sin signo en DO y Dl, podemos escribir: SUB.L —— DO0,DI Esto restará DO de Dl, cambiará los valores de los indicadores del CCR y reemplazará DI por la diferencia entre Dl y DO, O, como se detallará más adelante, podemos escribir: CMP.L-— D0,DI Para responder a la pregunta: “¿Es el número sin signo en Dl mayor que el número sin signo en DO?”, tenemos que mirar los indicadores € y Z des- pués de un SUB o un CMP. Si Z = 1, tenemos una diferencia nula, de modo que DO = DI y, por tanto, DO no es mayor que DI. Por otra parte, si C=1, tenemos un acarreo negativo, implicando que Dl es menor que D0; de nue- vo, esto indica que DO no es mayor que DI. Por tanto, la condición “sel mayor que** sólo se verifica si (C =0 y Z=0), expresión que nos lleva a la fórmula booleana: HI = -CS£-Z, que se lee NO-C y NO-Z. El efecto de SHI DS Poner al el registro DS si se verifica la condición “ser mayor que”* por ejemplo, es: Si(C=0y Z - 0), poner el byte de orden más bajo de DS a $FF. En otro caso poner el byte de orden más bajo de DS a $00, .k De este modo almacenamos el resultado de la comprobación que'” en DS para su uso posterior. Similarmente: Ser Mayor BHIT Saltar a la indicada 51 se verifica la condición “ser mavor que” indica que el procesador salte a la sólo si (UC =0 y Z=0). El procesador realiza estas pruebas independientemente de los anteriores pasos de programa. Es, de hecho, el programador quien tiene que dotar de significado a la condición HI (ser mayor que'*), empleando previamente un paso CMP o SUB que emplee los números que se desea comparar. Cada una de las otras condiciones puede ser analizada de la misma for- ma estudiando los diferentes indicadores tras un CMP o un SUB que em- plec los números que se están comparando. 239 Comparaciones cc con y sin signo 240 Está claro que las cuestiones del tipo “*¿es mayor que?” o “¿es men que?” sólo pueden resolverse si se sabe qué modo de numeración se está en pleando: ¿con signo o sin signo? ¿Es “10000000” mayor que **0000011]* La respuesta es sí para números con signo y no para números sin sign Por otra parte, la cuestión “¿son iguales?” o **¿es cero?” puede testarse con independencia del modo de numeración. La columna final q la tabla 6.4 indica qué condiciones se aplican a cada modo. Notar que torola ha elegido la forma “*higher/lower/same'” (más/menos/lo mismg( para las comparaciones sin signo y la forma '*“greater/less'” (mayor menor para comparaciones con signo. Se pueden comprobar las fórmulas booleanas restando varios número con y sin signo y comprobando los indicadores en el CCR. Entonces se sul tituyen los valores de los indicadores 0 ó 1 en las fórmulas booleanas, apli cando las siguientes reglas: 0>0=0 Falso O Falso = Falso 1I>0=1 Verdadero O Falso = Verdadero 050=0 Falso Y Falso = Falso 0% 1=0 Falso Y Verdadero = Falso ALI =1 Verdadero Y Verdadero = Verdadero O0=1 NO Falso = Verdadero =]1=(0 NO Verdadero = Falso MA +B) = (AS TB) NO(A O B)=(NO A) Y (NO B) MAnB)=(VA +¿UB) NO (A Y B)= (NO A) O (NO B) Cada una de las condiciones se reduce a 1 (verdadero) o U (falso) y el tomará nota de este hecho en cualquier registro o localización de la men * ria previamente elegida. Las reglas expresadas en álgebra booleana merecen un estudio más tallado, porque equivalen a capitulos enteros acerca del significado (€ acarreo y el rebose. Una vez que se ha convencido de que todas las reg funcionan, relájese y deje que el M68000 las evalúe por usted, ¡lo hace re mente bien! Dos de las posibilidades para cc actúan de manera incondicional: ST Siempre pone a SEE (verdadero) ST Siempre pone ¿ $00 (falso) Nótese que no se emplea ni la variante Toni la variante E con Bec; emplea- mos BRA para indicar una bifurcación incondicional, mientras que BE (no bifurcar) es más una abstracción de la programación estructurada que una instrucción real. TAS: Probar y poner a 1 de manera indivisible La última instrucción dentro del grupo de instrucciones de manipula- ción de bits es la instrucción PAS (probar y poner a | el operando), que esconde un sucio truco bajo su simple apariencia: TAS[.B). Esta linea primero prueba el byte en y asigna los valores correspon- dientes a los indicadores N y Z del CCRAZ 1 siel bytees O, N 1 siel bit de sieno es 1). Finalmente, TAS pone incondicionalmente el septimo bit del byte destino a uno, transformándolo en negativo. El raro truco que esta instrucción emplea es que la operación efectuada por TAS es indivisible; con esto queremos señalar que TAS emplea un ciclo de lectura/escritura especial, que no puede ser interrumpido, y ningún 060 programa, dispositivo o procesador en el sistema, puede acceder al byte destino hasta que TAS ha finalizado. Incluso las rutinas normales del error del hus se ven alteradas para mantener TAS indivisible. ¿Para qué todo este jaleo si sólo se trata de probar y cambiar un byte? La razón se encuentra en la necesidad de suministrar medios de control y sincronización para diversas situaciones delicadas, en las que se puede encontrar el M68000 en los siste- mas multiproceso y multitarea de hoy en dia. La idea general es que un re- curso cualquiera —un fichero en disco, un banco de memoria, un dispost- tivo de entrada/salida (E/S) o incluso un procesador completo— puede sel compartido por diferentes grupos de usuarios. Para regular este acceso múltiple a un dispositivo se emplean tanto métodos sofware como métodos hardware. Diversos indicadores, semáforos y algoritmos de control de prio- ridades y colas se emplean para determinar quién y durante cuanto Liempo tiene acceso aun dispositivo determinado. Normalmente, cuando un pro- erama emplea un dispositivo, lo marca como “en uso”, poniendo un indi- cador de recursos, que puede ser un determinado bit o byte, aun cierto valor. Este recurso se devuelve al sistema, poniendo de nuevo a cero (o a un valor predeterminado) dicho indicador de recursos, de modo que otras La- reas tengan acceso a el, Supongamos, por ejemplo, que se ha asignado al byte en la posición $1000 el siguiente valor para todos los programas: (51000) = 500 El fichero de empleados está libre; se permite el aceeso para funciones de actualización. ($1000) otro valor El fichero de empleados está siendo utilizado; na se permite el acceso. 241 Un byte como éste puede tener un nombre pomposo como **byte de est del fichero de empleados”. Hemos sugerido una dirección absolu; modo que hay un sitio fijo donde cualquier programa pueda compra estado actual del fichero de empleados. Sin emplear TAS, un programa podria quedar asi: * Programa 6.9: Protección de ficheros sin TAS WAIT TST.B $1000 ¿Está libre el fichero? BNE.SS WAIT No, seguir intentándolo ST 51000 — Tomar el control del fichero poniendo el byte ($100) y. Esto indicara que el fichero está ocupado ñ 7 ST es equivalente a MOVE.B +W5FF,$1000, CLR.B SI000 Liberar el fichero para que otros puedan usarlo, poniendo $00 en ($1000) Esto parece correcto, pero, ¿qué pasaria si se produce una interrupción] to antes del ST $1000? El programa que ha producido la interrupción hacer un TST.B $1000 y, encontrando el fichero libre, tomar su co poniendo $1000 as SFF, y proceder a realizar las actualizaciones Opo Cuando el programa que nos ha interrumpido termine su tarea y de el fichero al sistema, nuestro programa continuará el proceso de a ción de un fichero ya modificado, con consecuencias probablemente trosas. Veamos cómo puede ayudar TAS: * Programa 6.10: Protección de ficheros con TAS WAIT TAS $1000 Comprobar (51000) y asignar valores al CCR según pra Despues poner ($1000) a un valor negativo BNE WAIT Segun los valores del CCR el fichero estaba ocupado... Seguir intentandolo CLR.B $1000 — Liberar el fichero para que otros puedan usarlo, poniendo $00 en ($1000) El CLREB es vital. Sin él las tareas podrian esperar indefinidamente la: A rización para acceder al fichero; además, cuanto antes se produzcas CLR.B, mejor. El empleo del TAS, a diferencia del metodo que emplk TST/ST, asegura que la secuencia de prueba y asignación de valoré puede ser interrumpida. Es importante notar que la secuencia BNE/W está realmente comprobando el byte de estatus tal y como estaba ank que TAS alterara el bit de signo. Cualquier interrupción o excepcióM ocurra después del TAS, pero antes del BNE, no afectará al CCR, dado que éste se salva y restaura siempre como parte del programa interrum- pido, En una aplicación real de tiempo compartido, el procedimiento de pro- tección simple de ficheros que se ha mostrado aqui seria más complicado, empleando conceptos como los de ficheros de sólo lectura, públicos y de ue- ceso restringido, protección de ficheros por registros, etc. Puesto que TAS afecta únicamente al bit 7 (el bit de signo) del operando (byte de estatus) para señalar ocupado, los otros 6 bits del byte pueden emplearse para indi- car otras caracteristicas del recurso compartido. Si es necesario el BNE (bi- furcar si no es cero), puede sustituirse por BM] (bifurear si es negativo), que prueba el indicador N. Comparaciones con la familia de instrucciones CMP El próximo grupo de instrucciones permite comparar los operandos fuente y destino. La noción de base relativa a la familia de instrucciones CMP es que el procesador se comporta como si estuviera efectuando un SUB, es decir, restando la fuente del destino, pero sin alterar este último. Recordar que un SUB sustituye el destino por la diferencia entre fuente y destino. Todo lo que el CMP hace es cambiar los indicadores del COR (N, Z, V y C) como si hubiera efectuado una substracción. Tras un CMP en cualquiera de sus variantes, se puede emplear cualquiera de las instruc- ciones condicionales que dependen de los ce (códigos de condición), según se muestra en la tabla 6.4. Hay dos aspectos relativos a los cc y el CMP que hay que tener en cuen- ta. Primero, siempre estamos haciendo preguntas en la forma **destino fuente”*, donde significa mavor que, menor que, etcétera. No es raro que los programadores tergiversen lo anterior, dado que las instrucciones se escriben en el formato fuente, destino. Hay cuatro formatos para las instrucciones CMP, dependiendo del tipo de operandos que se estén comparando: CMPA.z ,Dn Comparar con el valor de Dn (empleando el tamaño adecuado) CMPA.2 ,An Comparar con el valor de An (sólo Lo W) CMPLZ %, Comparar un dato inmediato con el destino CMPM.2 (Am) +, (An) + Comparar posiciones de memoria sucesivas CMP cambia el CCR como lo hace un SUB, excepto que no afecta al indi cador X. Aquí se dan algunos ejemplos: 243 + un BNE comprobará si la relación es de ““desigualdad””, de modo que hay b + En la secuencia de saltos condicionales que se ha desarrollado más arriba * un acarreo negativo y no un acarreo, de modo que un BCS comprueba + que la fuente sea mayor que el destino * Programa 6.11: Comparar dobles palabras sin signo CMP.L — D3,D4 Comparar las dobles palabras en D3 y D4 BEQ IGUAL Saltar a IGUAL si D3=D4. De aqui en se sabe que D3 y D4 son diferentes BHI D4MAS Saltar a DIMAS si el número con signo en es mayor que el número con signo en D3 BCS DIMAS Saltar a DIMAS si el número con signo en es mayor que el número con sieno en D4 IGUAL $ E * D4MAS + D3MAS + + + * Un BLS comprobará si los operandos mantienen una relación de “menor o igual"; * redundancia en las opciones que se pueden tomar tras un CMP sobre números 2 sim signo + se han cubierto todas las posibilidades. A menudo se puede evitar un salto * condicional, dado que todos los anteriores han excluido todas las posibilidades * restantes excepto una. En el listado anterior podria reemplazarse el BCS * por un BRA. Recordar que el indicador € tras un CMP o un SUB significa + Proerama 6.12: Comparar bytes con sieno en modo inmediato CMPLB— 4-1,54000 ¿El byte en $4000 es mayor/menor/'igual que — BLE MENOR Saltar a MENOR si es menor o igual + + + MENOR e de + Las comparaciones con signo emplean BEQ/BGE/BGT/BLE + como se muestra en la tabla 6.4 + Los datos de fuente de CMP se almacenarán en una o dos palabras de extensión, * dependiendo del tamaño del dato + Proerama 6.13: Comparacion de dos cadenas de caracteres ASCH en la memoria + la cadena de caracteres | tiene como puntero a Al + La cadena de caracteres 2 tiene como puntero a A2 + Ambas cadenas terminan con el carácter ASCTE NUL ($00). - Se pondra el byte D6 a $00 si son diferentes y a SFF si son iguales. + La palabra D7 contendrá el número de caracteres que coinciden. SsT D6 Poner el byte de indicación D6 a $FF (scamos optimistas) CLR.W DT Poner a 0 el contador de caracteres que coinciden BUCLE CMPM.B (Al) +,(42)+ Comparar los bytes, incrementar cl puntero BNE DISTIN Los bytes son diferentes, se acabo. Saltar a DISTIN TST —HA1) ¿Se ucabo el fin de la cadena? BEQ FIN Si, hemos terminado ADDQ.W 41,D7 Incrementar el contador de caracteres que coinciden BRA BUCLE Vamos a por otro caracter DISTIN CLR.B D6 Indicar que no coinciden FIN * Los bytes se comparan sólo para comprobar si son diferentes (NE), * ahora no nos importan consideraciones de signo. Si estamos interesados en secuencias + lexicográficas, es decir, si la cadena de caracteres 1 está antes que la cadena 2 + en el diccionario podemos probar con un BHI o BLS (sin signo) e indicarlo * de alguna forma en D6 cuando algún par de caracteres no coincida * Nótese que TST.B—1(Al) comprueba el byte que se acaba de comparar; * puesto que (Al)+ ha incrementado el puntero en 1 (byte), tenemos que movernos * hacia atrás 1 byte también para estar en el sitio correcto. No confundir —HA1) * con Al), que desplazará hacia atrás cl puntero, ocasionando resultados A desastrosos CMPA: Comparar direcciones La variante de CMP, CMPA, como la variante de SUB, SUBA, se em- plea sólo cuando el destino es un registro de direcciones. Sin embargo, hay una sutil pero importante diferencia entre CMPA y SUBA. SUBA, como todas las operaciones puras de aritmética que actúan sobre un registro de direcciones, no afecta al COR, pero un CMPA no tiene sentido hasta que se reflejan en el CCR los cambios sobre los indicadores Z, Y, N y C. Sin estos cambios no se podrian comprobar las condiciones definidas por los cc, es decir, si dos direcciones son iguales o si una es mayor/menor que la otra. Asi pues, CMPA rompe las normas y afecta a los indicadores del CCR, CMPA no permite códigos de tamaño byte, y cuando se realiza un CMPA.W, la palabra fuente se extiende, con signo, a 32 bits antes de que la comparación sea efectiva. Por otra parte, recordar que las direcciones son esencialmente números positivos sin signo y, como se verá en el próxi- mo ejemplo, normalmente sólo se usarán pruebas sin signo tras un CMPA., Uno de los principales usos del CMPA se encuentra cuando se desea comprobar si una dirección se encuentra dentro de ciertos límites. Ya se han visto varios ejemplos en los que, de diferentes formas, An se incremen- ta/decrementa empleando (An) +, (An), ADDA, SUBA u operaciones con la pila. Hemos de tener la certeza de que An no excede, por exceso o por defecto, debajo de determinados límites. Veamos el siguiente ejemplo: 245 = Programa 6.14: Empleo de CMPA para comprobar los limites de una pila de + Se ha establecido una pequeña pila que emplea como puntero de pila a A2 > AO apunta a la base de esta pila. Al apunta al tope de la misma = La pila crece hacia abajo en la memoria a partir de AÚ y hacia Al a medida + que se introducen nuevos valores en ella. Diseñemos un metodo sencillo = para comprobar que A2 no sobrepasa los limites + Normalmente, AU>=A2>=A]l MOVE.W DI. 442) — Esta es la forma tipica de entrar en una pila CMPA.L ALA2 ¿Esta llena la pila? BEQ LLENA Sí, esta a tope. Vamonos BCS ERROR2 Estamos por debajo del valor del limite. Error MOVE.L-— (42)+,D7 — Esta es la forma tipica de salir de una pila CMPA.L AZA0 ¿Hemos alcanzado la base? BCS ERRORI Estamos encima de la base LLENA — * + ERROR! * * * ERROR2 * El primer CMPA efectúa la diferencia A2 Al, de modo que el indicador Z = se pone al sólo si A2= Al, indicando que la pila está exactamente llena = Cse pone a 1 sólo en el caso de un acarreo negativo, es decir, si Al es mayor que A = indicando que se ha sobrepasado el limite (como la pila “crece” hacia abajo * estamos “por debajo"' del límite). Un BEQ solo no seria suficiente, = puesto que introducir valores en la pila puede decrementar A2 en 20en4 = El segundo CMPA efectúa la diferencia A2—Al, de modo que el BCS indica 2 51 Al es mayor que AO, es decir, ¡nos las hemos ingeniado para sacar más cosas + de las que hemos metido + Estar por encima de la base de la pila implica un error de programación, + mientras que estar por debajo del limite sólo indica un abuso de la capacidad + de la pila Asociada muy de cerca al CMPA y a los saltos condicionales, existe OB instrucción, denominada DBec, que da al M68000 otra ventaja más s0% la competencia. Veamos por que. DBcc: Probar los cc, decrementar y efectuar un salto condicional El formato es: DB Dn, Comprobar los << (códigos de condición), decremen y condicionalmente saltar a la indicada. 246 Hay tres elementos que definen la instrucción DBec. El primero es el fa- miliar código de condición cc, análogo a los empleados para Scc. Un resu- men de estos códigos se encuentra en la tabla 6,4, Asi nos encontramos con DBEO, DBHI, etc. El segundo elemento es el contador de ciclos Dn. Dn re- presenta aquí la palabra de orden más bajo de Dn y se denomina contador de ciclos del bucle o simplemente contador de ciclos. El tercer elemento es la , que define el comienzo del bucle que se desea realizar. Como en la versión larga de Bcc, la actúa como un PC de desplaza- miento relativo de 16 bits, que se almacena en una palabra de extensión. Sin embargo, DBcc sólo permite saltos hacia atrás desde DBce hasta la , con una longitud máxima de $7FFE (32766) bytes. La debe estar situada antes del DBec. Secuencia de sucesos en la ejecución de un DBcc Cuando se alcanza un DBcc, la secuencia de sucesos es la siguiente: Si la condición cc es cierta, ejecutar la siguiente instrucción. Si la condición cc es falsa, decrementar Dn en —1, es decir, Dn + Dn 1. Comprobar ahora Dn. Si Dn es —1, ejecutar la siguiente instrucción. Si Dn no es —1, saltar a la . A medida que vamos asimilando todo lo anterior y que va tomando un sentido DBcc, se revela como una instrucción compuesta extremadamente útil. Un gran tanto por ciento del trabajo que se realiza al programar en ensamblador va dirigido a la tediosa tarca de establecer controles para los diferentes bucles: contar el número de ciclos, controlar las condiciones que pondrán fin al bucle o ambas tareas exigen una atención permanente por parte del programador. DBce reduce este trabajo, combinando todas las ac- ciones que se han descrito anteriormente en una poderosa instrucción, DBcc en acción Vamos a ver la versión más simple de DBec empleando DBF (DBE in- dica que el código de condición cc = Falso). * Programa 6.15: Un bucle que no hace nada empleando DBE Ejecutar la tarea A 24765 veces y despues continuar MOVE. W 424764,D0.— Poner DW al valor de contador de ciclos —] BUCLE DBF-—— DO,BUCLE Volver a BUCLE hasta que DO= —1 247 + La primera vez que nos encontramos con el DBF, la condición es falsa por definiciás + de modo que hacemos DX) = 24763 y volvemos a BUCLE (puesto que DU ? + no vale aún —1). Si seguimos este proceso descubriremos que se efectua + un total de 24765 veces antes que DO alcance el valor —1 + Dado que la tarca Á se ejecuta una vez cuando se entra en el bucle por primera yes * y puesto que repetimos el proceso hasta que DO valga —1, hemos de poner el contador de ciclos del bucle a 1 menos del número de ciclos necesitados y « Cuando se emplea DBF no se utilizan los aspectos de prueba de condi. ciones de DBcc, sino que sólo nos quedamos con el aspecto de cuenta, | cluso en este caso, al comparar el bucle anterior con un bucle normal que no se use DBcc, se puede apreciar un considerable ahorro de esfue en la programación. También existe la instrucción DBT, pero si seguimos la secuencia ar rior es fácil darse cuenta que la instrucción DBT Dn. nos llevará de inmediato fuera del bucle. Es decir, DBT no hace nada ef absoluto, se cita solamente para subrayar el funcionamiento lógico de instrucciones DBcc. Si tiene aleuna duda, relea la secuencia de funcio miento de las instrucciones DBcc. Cuando tenemos una condición “auténtica'? como PL (positivo) (no hay acarreo). las instrucciones DBcc resultan equivalentes a la ciada estructura de la programación EJECUTAR - HASTA QUE LA SEA VERDAD '. Dentro de esta estructura tenemos, además, condición adicional que viene dada por la condición EJECUTAR - HA QUE Dn SEA —1, que nos permite poner un limite al número de itera nes del bucle. Los dos programas próximos aclararán todo esto. + Programa 6.16: Hallas el primer valor negativo de una tabla de números * AL apunta a la base de la tabla de 100 numeros con signo * Recorrer la tabla y poner el primer número negativo la palabra de orden más bajo. * de D4. Anotar su posicion en la tabla en D5. Si no se encuentra ningún número * negativo, poner IM a —1yD5a0 CLRW — D4 Ponemos la palabra D4 a 0 MOVE.W 99 DS Ponemos el contador a (100 —1) BLSCAR TST.W (A?) + ¿Es negativa la palabra en (A2y? DBMI DS,BUSCAR — BUSCAR hasta que encontremos un númerd: negativo o hasta que se acabe la tabla TST.W DS Es D5 =—I y BMI NOHAY Si es asi es que todas las palabras de la 10% son positivas. lr a NOHAY con D3 = —1 l Esta estructura se conoce en la jerga de proeramación por su denominación 1 DO-UNTIL. que por estar incorporada a la sintaxis de muchos lenguajes de programacik intraducible. MOVEW -2MA2).D4 Poner el valor de la primera palabra negativa en A? SUBQW 100,05 DS = D5 100 NEG.W DS DS = -D3=100-D5; ahora DS contiene la posición de la primera palabra negativa NOHAY IST.W pone los indicadores 2 y Na los valores correspondientes a la palabra (A2) CMPLW ROJLA2)+ haria lo mismo, pero empleando algun ciclo mas + Cada número no negativo (MI = falso) que se lea decrementará DS y comprobara csi D3= 1, lo que significará el fin de la tabla y que NOHAY números nepativos El primer número negativo (MI verdadero) 110s sacará del buele y nos llevara + a comprobar si DS = 1 mediante un TSTAW DS, es decir, 51 hemos recorrido «la tabla sin éxito. Si DS está en el rango 099, se calcula su posicion en la tabla * hallando primero DS 100 y “multiplicándolo”” por —| templear NEG.W + es un truco habitual para hallar la —Dn) a partir de ¿Do ab. Notar que el valor - del primer número negativo se obtiene con un UYA2), dado que (A?) + «ya ha avanzado Al a la siguiente palabra e Se puede emplear este tipo de programa, incorporando un DBec, para localizar todos los números de cualquier tipo de una tabla. Por ejemplo: BUSCAR CMPLW 300042 +) DBLE DS, BUSCAR — BUSCAR hasta que (A2)< = 3000 + * + localizará todas las entradas de una tabla que sean mayores o iguales que 3000. Las tablas o cadenas de longitud variable se pueden recorrer de muchas formas. Ya nos es familiar la idea de encontrar una cadena de longitud va riable que termina siempre con el mismo carácter (el carácter ASCHONUL, por ejemplo), de modo que sólo tenemos que buscar este carácter en el bu- cle. Otra idea común es la de mantener la longitud de la cadena o tabla en la cabecera de la misma, de modo que a medida que se insertan o borran caracteres de la cadena o elementos de la tabla se actualiza esta cabecera. Veamos el programa 6.17 para ilustrar esta técnica: * Programa 6.17: Encontrar la uluma entrada con valor cero en una tabla + de longitud variable empleando DBEQ 2 A2 apunta a la base de la tabla. La primera palabra de la tabla contiene * el número de palabras con signo que siguen < Recorrer la tabla buscando la última palabra cero. Anotar su posición en DS « Sino se encuentran ceros poner DS 4 1 + Si la tabla está vacía poner DS $00 y DU=3$EF, Sila tabla no esta vacta * poner DO = $00 MOVE.W (A2)+,D5 DS contiene cl número de elementos en da tabla Ahora A2 apunta al primer elemento de la misma SEQ DO Poner DO a SEE si la tabla está ocupada 249 BEQ VACIA La tabla estaba vacia, vamonos MOVE.W D5,D4 Ahora D4 también contiene el número de entradas de la tabla ASL.W +1,D4 D4=D4x2 ADDA.W D4,A2 A2 apunta ahora a después de la última entras SUBQW 1,D5 Poner el contador para el bucle a DS—1 BUSCAR TST.W HA2) ¿Es la palabra en (A2) cero? DBEQ D5,SCAN — Continuar buscando hasta que (A2) sea cerg o hasta que se acabe la tabla TSTW DS ¿Es negativo DS? BMI NOHAY Si es asi, no hay entradas nulas, nos vamos. a NOHAY con D5 = —| ADDQ.W +1.D5 DS =D5 + 1. Ahora DS contiene la posició de la última entrada cero en la tabla NOHAY 4 + * VACIA — * SEQ DO comprueba el COR despues del MOVE u DS. Si DS es $00 entonces + (EQ es verdad) y ponemos DO a $EF. Si no se verifica lo anterior, SEQ + pondrá DO a $00. Más tarde, en el programa, cuando A2, DS y el CCR, * podriamos referirnos al valor de DO, que recordara el resultado del SEQ + Notar el uso de (A2) para recorrer la tabla desde su final. Se ha tenido cuidado = de dejar A2 apuntando | palabra después de la última de la tabla antes de entrar + en el bucle de búsqueda. También se ha tenido que multiplicar por 2 el número + de palabras para obtener el número correcto de bytes para A2 + Como en el programa 6.15, se ha puesto el contador de ciclos a uno menos + de los necesarios Comentarios generales acerca de DBcc Sólo se ha podido dar un breve resumen de la enorme potencia que Off cen las instrucciones de la familia DBcc, de modo que concluiremos 6 algunos comentarios: e El valor que queda en el contador de ciclos del bucle es útil, co! ha demostrado en los dos últimos programas. Nos dice cómo qué ha terminado el bucle. * Se puede emplear el contador de ciclos Dn como un registro indice Be e. decremento automático. + En algunas ocasiones puede ser útil entrar en el bucle directamentes la linca que contiene la instrucción DBcc, en vez de entrar en el bu desde su comienzo: MOVE.W *.Dn — Asignar un valor al contador de ciclos. BRA DBCC Vamos a la linea en que está el DBec + BUCLE * + + DBCC— DBec Dn,BUCLE Esto es perfectamente válido siempre que el contador de ciclos del bucle tenga un valor correcto. Es fácil equivocarse, dado que en este caso el valor que hay que asignar es el del número de interacciones que se necesitan y no uno menos. e Tomando las debidas precauciones se puede cambiar el valor de Dn durante el bucle, acortando o alargando asi la duración de éste. e [| M68010 tiene un modo particular de empleo de la instrucción DBec para efectuar los bucles (special loop mode) que altera la secuencia de comprobación /decremento sin afectar al conjunto de la instrucción. Sin embargo, la velocidad de ejecución de los bucles pequeños se in- crementa manteniendo la instrucción DBec y los desplazamientos aso- ciados a la misma en un esquema de precarga de las dos palabras ne- cesarias, reduciendo asi el número de accesos a la memoria. Operaciones matemáticas Ya se han visto las cuatro operaciones matemáticas del M68000, ADD (sumar), SUB (restar), MULU/MULS (multiplicar) y DIVU/DIVS (dividir) y algunas de sus variantes simples (como ADDO, ADDLI, ADDA, etc.). Va- mos a estudiar ahora otras instrucciones que realizan varias funciones arit- méticas. NEG: Negación Ya se ha usado NEG en un ejemplo anterior sin demasiadas explicacio- nes. De hecho: NEG./ Niega el operando destino simplemente reemplaza el destino por su complemento negativo a 2, es de- cir, efectúa (0—), empleando la parte del destino indicada por Z (L. W, o B). El destino debe ser una dirección efectiva de datos, lo que excluye los modos de direccionamiento Án, MPCO), d(PC,Xi) e inmediato. Si DO contiene $12345678, entonces NEG.L DO da DO= SEDCBA988 (negación de los 32 bits) NEG.W DOdaDO= 51234A988 (negación de los 16 bits menos significativos, el resto permanece sin cambios) NEG.B DO da DO 512345688 (negación de los 8 bits menos sig- nificativos, el resto permanece sin cambios) 251 Una excelente razón para recordar que existe esta instrucción es que se puede escribir: SUBL2 Dn,* ¡ILEGAL! de modo que para calcular (+*— Dn) escribimos: SUBL: *,Dn Dn = Dn—* NEG.z Dn Dn = —Dn que si está permitido. Nótese también que a veces queremos ¿[Dm— Dn), sin alterar el valor. Dm. SUB. Dn,Dm, nos da (Dm-— Dn), pero perdemos Dm. ¿Por qu usar entonces SUB.z Dm,Dn seguido por un NEG.2 Dn? Otro empleo de NEG.z se encuentra tras un Secc para convertir la valencia VERDADERO =$FF en VERDADERO = l, que a veces es y conveniente: i Sec Pone el byte en a $FF si es verdadero y a $00 si es falso NEG.B Pone el byte en a 1 si es verdadero y 20 si es falso NEG afecta al CCR de la misma forma que SUB, aunque la informa: ción que obtenemos de los indicadores es menos útil: X Se pone al mismo valor que € N Se pone a | si el resultado es negativo Z Se pone a | si el resultado es cero V Se pone a 1 si se produce un rebose C Se pone a 1 si se produce un acarreo negativo (siempre a menos que el operando sea cero) EXT: Extensión del signo En muchas ocasiones hemos observado que el M68000 extiende auto ticamente el signo de un registro al pasar de 16 a 32 bits, por ejemplo instrucción EXT permite al programador ejecutar este truco de dos fo diferentes: EXTW Dn Extiende el sieno de un byte a palabra, es decir, copia dl WA en el bit 15 e EXT.L Dn Exuende el signo de una palabra a una palabra larga, €$ copia el bit 15 en el bit 31 Si tenemos que DO = $12345678, entonces EXT producirá los siguientes electos: EXTW DU DO = $12140078 EXT.I DO DO = SO000567N dado que el bit 7 es 0 y el bil 15 es O también. EXT es útil para conservar los signos de los datos cuando se cambian los tamaños de los mismos durante un programa. En ocasiones es fácil ol- vidar que tenemos un número negativo en DO, por ejemplo, y escribir: MOVE,B- D0.DI de modo que ahora sólo el byte menos significativo de Dl es “negativo”. Más tarde, en el programa, podemos escribir: ADD.W D1,D3 ADD.L — DI,D3 y obtendremos resultados incorrectos. El uso de EXT resuelve este pro- blema: MOVE.B- D0,DI EXTW DI DI tiene ahora el signo correcto ADD.W D1,D3 o bien, podemos escribir: MOVE.B- D0,D1 EXTW DI La palabra en DI tiene ahora el musmo signo que el byte en DI EXT.I DI La doble palabra en DI tiene ahora el mismo signo que la palabra en DI ADD.L D1,D3 EXT altera el COR de la misma forma que MOVE: X No se altera Se pone a | si el resultado es negativo Se pone a 1 si el resultado es cero Siempre a 0 Siempre a 0 (MN Z 253 Matemáticas de multiprecisión ni en por qué en unas ocasiones cambia como el indicador C y en otras e manece imalterado. Hemos visto que el indicador X actúa más allá de rotaban en un campo de 9 bits empleando el indicador X, las palab hacian en un entorno de 17 bits y lo mismo pasaba con las dobles pala que empleaban 33. Necesitamos algunas instrucciones más que nos a el funcionamiento de este misterioso indicador. Instrucciones aritméticas extendidas Introduciremos ahora las instrucciones extendidas ADDX, SUBX NEGX, que emplean el indicador X de forma numerica, permitiendo ( anteriores acarreos y acárreos negativos se incorporen a una aritmética m tirregistro: Ñ ADDX Dm.Dn Sumar (Dm + Dn + X), almacenar el resultado en Dn ADDX (Am). (An) Sumar (fuente - destino < X); almacenar el resultado en el destino SUBX Dm.Dn Resta (Dn —Dm—X); almacenar el resultado en Dn ADDX Am). 4 An) Restar (destino — fuente —X); almacenar el resultado en el destino NEGX Sustituir por (0 — —X]| En los ejemplos que siguen debe recordarse que siempre que se pro un acarreo 0 un acarreo negativo, durante una operación aritmética, los indicadores C como X, se ponen a 1. Las instrucciones de M68000 cuidadosamente estudiadas, de modo que algunas instrucciones, € MOVE, afecten sólo al indicador C y no al X. De este modo, el indica X “recuerda” un acarreo O un acarreo negativo hasta que necesitamos plearlo mediante un ADDX o un SUBX, que puede estar varias lineas programa después de que el indicador X adquiriera su valor. Sumemos números de 64 bits sin signo para ilustrar lo anterior. Cuando trabaja con números de más de 32 bits, nos encontramos en el campo de la ant tica de precisión múltiple. = Programa 6.19: Sumando numeros sin signo de 64 bis + Cada uno de los numeros sin signo de 64 bits emplea 2 registros de datos: + Número A = (D0)¿DI] Número B=(D2)(D3; + DU contiene los 32 bits mas sigmiicativos de A, D2 contiene los 32 bits + mas significativos de B, etc. * La suma de Ac Bose almacenará en (D4+4D5) El CCRK reflejará los resultados relativos a los números de 64 bits: asi. cuando € = X=1, estaremos ante un acarreo de 64 bits, +21 siel resultado (64 bits) es cero, etc. MOVE, D1,D5 MOVEF.1 D0,Da ADD. D3DS.— DS=DI + D3, El acarreo viene ahora marcado por N ADDX.L D2D4 D4-D0-D2+ Xx, donde X es el “acarreo” anterior. ADDX creará ahora un nuevo NX El resultado de A + B está ahora (D414DS), ELCCR reflejará cualquier acarreo de [4 Pero, ¿qué representa el indicador Z?, ¿que pasa si D4=0 y DS <> mn + La sección siguiente contestará esta pregunta Aritmética extendida y el CCR En la discusión siguiente, los comentarios relativos a ADDX son igual- mente válidos para SUBX y NEGX, dado que atectan al COR de la misma torma. En el programa anterior, el comportamiento del ADDX recordaba to- talmente al comportamiento de un ADD normal al que le hubiéramos in- cluido el indicador X. Un acarreo “tipo X'' representa realmente 2" (bil 32). La suma obtenida en D4 representa la doble palabra más significativa del resultado de 64 bits, porque lo hemos planeado asi. El procesador, des- conociendo, desde luego, la interpretación que planeamos darle a la instrue- ción ADDX.L. cambiará el CCR como si de adiciones de 32 bits se tratara (DO + D2 + X), Si se produce un acarreo, lo encontraremos reflejado en los indicadores X y C (el anterior valor del indicador X se ha perdido, pero, puesto que ya lo hemos usado, no debe importar). El nuevo valor del indi- cador X representa realmente 2* y puede que deseemos crear una arimética de 80, 96 o incluso 128 bits. De este modo somos libres de encadenar una gran variedad de MOVE y SWAP, sabiendo que el registro X está a salvo. De nuevo esto indica la importancia de conocer cómo afectan las diferentes instrucciones del COR. Asi, ADDX pone X = C como ADD. Para actuar correctamente con los números con signo en multiprecisión ADDX, tambien afecta a los indica- dores N y Y como la instrucción ADD. Trucos con el indicador Z Con el indicador Z se necesita un truco especial. Si una instrucción ADDX produce un resultado no nulo, el indicador Z se pondrá a 0, como en el caso de ADD; pero si el resultado es 0, y aqui está la trampa, Z tam- bién se mantendrá a 0. Siempre hay una razón para que Motorola prepare estas trampas, veamos cuál es. 255 4) Volviendo al último programa, supongamos que el resultado de ADDXL D2,D4 resultara nulo, lo que es perfectamente posible (suponer DO y Dz cero y que no se produce ningún acarreo en Dl + D3). En condiciones nor, males, ADD pondria Z = 1, haciéndonos creer que la suma de números de 64 bits ha resultado nula. Está claro que no podemos determinar si Un nú. mero de 64 bits es nulo mirando solamente a los 32 bits más significativo Esta es la razón para que ADDX ponga el indicador Z a U en el caso de q resultado no nulo y lo mantenga inalterado en caso de un resultado Por tanto, en nuestro ejemplo, si D4 fuera cero, el indicador Z ceja resultado de la suma de los 32 bits menos significativos: DS = DI + D3, gi D3 es cero, Z = l, y esto indicaría que el resultado de la suma de 64 bi cero, mientras que si DS no es cero, Z = 0, indicando que D4 o DS (0 am. bos) no son nulos. Ahora ya sabemos el porqué de este truco. Una consecuencia impor- tante de todo lo anterior es que antes de embarcarnos en cualquier opera ción aritmética de multiprecisión debemos estar seguros de que Z = 1 (bit 2 del CCR) y X=0 (bit 4 del CCR). Como sabemos que 4 = 00000100, una forma sencilla de garantizar estas condiciones es: MOVE.X 7*4,CCR Vamos a ver cómo funciona SUBX restando números de 64 bits: * Programa 6.19: Restando numeros sin signo de 64 bits * Los datos se disponen como en el programa 6.18 * Cada uno de los números sin signo de 64 bits emplea 2 registros de datos: + Número A = (DO'(DI)] + Número B=¿(D2/(D3) + DO contiene los 32 bits más sienificativos de A, D2 contiene los 32 bits * mas significativos de B, etc. + La diferencia de A—B se almacenará en (D4)(D5) + El CCR reflejara los resultados relativos a los números de 64 bits: * asi, cuando C = X= 1, estaremos ante un acarreo negativo de 64 bits; + Z=1 si el resultado (64 bits) es cero, etc. MOVE.L D1,D5 MOVE.L D0,D4 SUBL — D3D53 D5=DI-—D3. El acarreo negativo viene ahora marcado pork «dá SUBX.L D2,D4 D4=D0—D2-X, donde X es el “acarreo” negativo ac + El resultado de A—B está ahora (D4)(DS|. El CCR reflejará cualquier acarreo de pe + El indicador Z refleja los valores (D4WD3) y no sólo los de ¿D4) + Nótese que el acarrco negativo X se resta ' a Multiplicaciones de multiprecisión Las instrucciones MULU/MULS del MC68000 permiten multiplicar valores de 16 bits para obtener un resultado de 32 bits. El MC68020 O versiones que permiten realizar el producto de 32 x 32 bits = 64 bits con una sola instrucción (también existen nuevas instrucciones para la división), y el coprocesador matemático MC68881 nos lleva mucho más lejos, con operaciones de punto flotante de 80 bits. En las “peores” versiones del M68000 hay que programar estas extensiones, pero con la ayuda de ADDX y SUBX no es muy dificil. Vamos a esbozar brevemente los pasos necesa- rios para multiplicar dos dobles palabras A y B para obtener un producto de 64 bits. Supongamos Á = (palabral)(palabra2) y B - (palabra3Mpala- bra 4). Primero necesitamos los productos de las cuatro palabras, emplean- do MULU o MULS. uy (palabra2) x (palabrad) = (prod11) (prod12) bits (palabral) x (palabrad) = (prod21) (prod22) (palabra2) x (palabra3) = (prod31) (prod32) (palabral) x (palabra3) = (prod41) (prod42) tad DRA a.-2. ==. Y. el hh y ny — Lu bits Donde cada producto (prod) es una palabra de 16 bits. Hasta ahora no nos hemos tenido que preocupar de los acarreos, Como en la escuela primaria, podemos disponer estos productos en co- lumna para sumarlos de derecha a izquierda: (prod1 1) (prod12) (prod21) (prod22) + (prod31) (prod32) 4 (prod41) (prod42) / (suma 4) (suma 3) (suma 2) (suma 1) donde cada una de las sumas es: suma 1 = prod12 suma 2 =prodl! + prod22 + prod23 con el acarreo X1 suma 3 = prod21 + prod31 + prod42 + X1 con el acarreo X2 suma 4 = prod41 + X2 con el acarreo x3 Con un uso juicioso de ADDX, SWAP y ASL, se obtiene finalmente el producto de dos dobles palabras. Matemáticas extendidas con operandos de la memoria Hasta ahora no hemos empleado la forma: ADDX.z (Am), (An) y y alguien podria preguntarse para qué se ofrece esta extraña opción. respuesta puede hallarse mirando el ejemplo de multiplicación en multi cisión anterior. Si algunos de los componentes de 16 6 32 bits se almacen; hábilmente en la memoria, se puede evitar una gran parte de los maneje con los registros sumando directamente en la memoria y empleando el pra. decremento para recorrer la lista de operandos. e BCD (decimal codificado en binario) El M68000 puede manejar un tipo de datos conocido como BCD nary Coded Decimal = decimal codificado en binario). Para ciertas tareg especialmente para las financieras con gran cantidad de cálculos, los erri de las conversiones decimal a binario pueden ser un problema, incluso poniendo de facilidades de punto flotante de alta precisión. La solucié ofrecida por el BCD tiene un coste en memoria y velocidad, pero mantiene y manipula todos los números en el formato decimal exacto empleando nibble (4 bits) completo para codificar cada digito decimal. Puesto que nibble tiene capacidad para codificar 16 números sin signo, del 0 al 15, yel BCD sólo emplea 10, del O al 9, puede verse la ineficiencia de este métod (véase capitulo 1). Los datos en BCD se manejan de forma similar a como lo hariamos con. un ADDX, SUBX o NEGX: ABCD.B Dm,Dn Sumar (Dm - Dn + X); almacenar el resultado en Dn ADDX.B 44m), 4An) Sumar (fuente + destino + X); almacenar el resultado en el destino SUBX.B Dm,Dn Restar (Dm - Dm —X). almacenar el resultado en Dn ADDX.B —Am).¡An) — Restar (destino — fuente —X); almacenar el resultado en el destino NEGX.B Sustituir por (0— —X] El primer aspecto a notar es que todas las operaciones en BCD se é lizan con bytes, lo que significa que podemos sumar, restar o negar dos! meros decimales con una sola instrucción. La mayoría de los ensamblador utilizará la opción B por omisión, pero aquí la mantendremos como Té datorio. Los números en BCD normalmente se encontrarán formando pos de 4 por palabra o de 8 por palabra doble. Las secuencias más las deben ser consideradas como cadenas en la memoria, de ahi la opt —(Am), —(An), que ya se vio con ADDX y SUBX. Supongamos que dt "os almacenar en la posición de la memoria, a la que apunta AO, el n Es ro decimal 564728. La cadena de números BCD de 3 bytes (6 nid0lE tendria este aspecto: Cadena BCD A = 564728 Dirección Equuvalente del byte Brie almacenado decimal AO (0101)(0110) (5) (6) Más sienificativo AO +1 (0100)(0111) (4) (7) A0O+2 (0010)01000) (2) (8) Menos significativo Nótese la secuencia de níbbles dentro de cada byte y la secuencia de bytes dentro de la cadena. Los digitos menos significativos están más arriba en la memoria, de modo que si situamos el puntero al final de la cadena (AO) + 3, el formato con predecremento de ABCD sumará automáticamente con acarreo decimal y en la secuencia aritmética correcta 28, 47 y 56 con otra secuencia BCD especificada. Operaciones en BCD y el CCR Puesto que el acarreo determinado por el indicador X se suma de la mis- ma forma que en el caso del ADDX, todo lo dicho anteriormente se aplica aquí. En particular, el truco para el indicador Z (ponerlo a 0 en el caso de un resultado no nulo, pero mantenerlo a su valor si el resultado es nulo) $e mantiene como en el caso anterior. El acarreo X puede ser 100, pero re- cordar que un acarreo decimal de 1 representa al número decimal 100 como resultado del acarreo producido por el by1e menos significativo (cuyo rango va de O a 99). Es particularmente importante poner X =0 y Z = l antes de comenzar ninguna tarea en BCD. Las diferencias fundamentales en la forma en que las instrucciones AADX y ABCD afectan al CCR derivan del hecho de que los bytes BCD carecen de signo, o al menos éste no se obtiene como el complemento a 2, de modo que los indicadores N y Y carecen de valor y permanecen indefini- dos durante el tiempo que se empleen operaciones BCD. BCD y el CCR. Resumen X Se pone al mismo valor que € N Indefinido Z 0 siel resultado no es cero, no se altera en otro caso V Indefinido C Se pone a | si se produce un acarreo o un acarreo negativo Sumando cadenas BCD en la memoria Definamos otra cadena de valores BCD, denominada B, y escribamos un programa para sumar esta cadena y la definida anteriormente: 259 Cadena BCD B= 390112 Dirección Equivalente del byte Brre almacenado decimal Al (0011)(1001) (3) (9) Más significativo Al+1 (0000)(0001) (0) (1) Al+2 (00010010) (100) Menos significativo * Programa 6.20: Sumando cadenas BCD en la memoria empleando ABCD = AD y Al apuntan, respecuvamente, a los digitos más significativos = de las cadenas de 3 bres A y B * Sumar Á y B, Almacenar el resultado en B. Señalar cualquier error de acarreo, = es decir, si la suma excede 999999 MOVE.W *4,CCR Poner X=0 y Z= | antes de cualquier operación BCD MOVEQ.W +42,D0 Poner el contador de ciclos a 3 ll ADDQ.W 3,A0 Mover el puntero de la cadena A al final +] ADDQ.W. H3Al Mover el puntero de la cadena B al final +1 BUCLE ABCD.B.— —A0),4A1) Sumar un byte de Á con uno de B, q empleando el indicador X (A + X)+B BDF DO.BUCLE Repetirlo 3 veces BCS ERROR Ir a ERROR si el acarreo está a | E + * ERROR + Al (100140101) (9)(5) — Mas sienificativo * Al=1 (0100310001 (4)(8) *Al=2 (0100)(0000) —(4)(0) — Menos significativo * El CCR tendrá X=0, Z=0. AD y Al volverá a tener sus valores originales Números BCD negativos 2 La instrucción NBCD simplifica el manejo de los números BCD nt- gativos, pero, puesto que no disponemos de indicadores N, X, o €, debe- mos ser cuidadosos para tener la certeza de que la suma se está realizandO. correctamente. NBCD actúa normalmente formando el complemento 4 10 del operando (un byte) (0—!, pero si las operaciones han P sto X =1, entonces NBCD lo tiene en cuenta y proporciona el complemento. a 9 (0-— 1). A ; Esto permite negar una cadena BCD correctamente, como muestra el ejemplo siguiente: F * Programa 6.21: Negar una cadena BCD en la memoria empleando NBCD + Con los mismos datos que en el programa 6.20, sustituir la cadena A * por su opuesta (complemento a 10) + Cadena A = 564728 * A0 (OL01)(0110) — (5)(6) — Más significativo * A0+ 1 (OIO0)(O11) (4,07) *AD=+=2 > (0010)(1000) —(2)(8) — Menos significativo MOVE.W +4,CCR Poner X= 0 y Z=1| antes de cualquier operación BCD MOVEQ.W *2,DU Poner el contador de ciclos a 3 ADDOQ. F3,AO Mover el puntero de la cadena A al final +1 BUCLE NBCD.B AA) Poner en —AD (0-byte BUD AM; BDF DO, BUCLE Repetrlo 3 veces Y Y * + Ahora la cadena A = 435272, que es el complemento a 10 de 564728 + AU (0100) (0011) (4)(3) Más significativo * AD+ 1 (V101)(0010) — (5)(2) A0+ 2 (0111)(0010) —(0)(2) Menos significativo El CCR tendra X 0, Z=0, AO volvera a tener sus valores originales * El valor de X al principio era X = 0, de modo que cuando negamos el primer byte obtenemos (0-28) = 72 con acarreo negativo, de modo que X =1. La siguiente negación nos da (0-47 1) = 52 con X= |, y análoga- mente ocurre con la siguiente. Si más tarde, en el programa, necesitamos la cadena A, obtendremos la cadena 435272, que es tan positiva como la ca- dena 564728, que es la que se ha negado. Existen muchas soluciones, pero todas tienen que ser programadas, puesto que ninguna está implementada. Un método consiste en añadir a cada cadena un byte conteniendo el signo de la misma, por ejemplo los caracteres ASCIL más (+) y menos (-), y al macenar siempre el valor absoluto de la cadena BCD. Como ejemplo final para subrayar la mecánica BCD, restemos dos bytes BCD supuestos positivos que se encuentran en sendos registros de datos. * Programa 6.22: Restar dos números BCD empleando SBCD + Dados dos bytes BCD conteniendo números positivos en DO y DI, calcular DO DI * Almacenar el resultado en DO + Si el resultado es positivo, poner en A] el signo ASCII 040; * en caso contrario, poner en Al el signo ASC MOVE NW 44,CCR Poner Z=1, X=0 SBCD.B D1,D0 Guardar en DO el resultado de DO—D1 BCS NEG S C=1lira NEG MOVEB HSBJAI Poner en (Al) el carácter ASC 040 BRA RESTO NEG ANDLB— HSEF,CCR Poner X=0, el resto del COR permanece inalterado NBCD.B DO Negar el byte BCD en DO MOVE.B. SIDA! Poner en (Al) el carácter ASCII] “— RESTO * * 4 261 Para obtener el valor absoluto del bvie BCD negativo en DO deben, poner X a 0 antes del NBCD. Supongamos, por ejemplo, D1 = (0000100 y DO = (000010001), es decir, Dl =2 y DO= 1, entonces DO—D1 =-—] $ resultado en BCD ¿DO—D1) = (100111001) con X = 1. í Si ahora efectuamos un NBCD con X= 1, obtendremos DO = (0-99 —1) =0, que es incorrecto. Poniendo X = 0 tendremos DO= (0—99) < que es correcto. Instrucciones de manejo de datos Bajo este epigrate incluiremos cinco instrucciones que cubren toda lag cala de dificultades, desde lo más sencillo hasta lo más complicado: SWAP/.W! Dn Intercambia el orden de las palabras en una doble? palabra (la más significativa pasa a menos y vicevs EXG/.1+ — Rm,Rn Intercambia el contenido de los registros MOVEP.Z Dm,d(An) Mueve datos hacia los perifericos MOVEP.Z díAn),Dm Mueve datos desde los periféricos LINK An, Asigna pilas de usuario UNLK An Libera pilas de usuario En estas instrucciones, Z indica L o W (palabras dobles o simples). SWAP: Intercambiar el papel de las palabras en un registro SWAP Dn simplemente transforma la palabra más significativa de CU quier registro en la menos significativa y viceversa, de modo que los biís a 15 pasan a ser los bits l6 a 31. Un ejemplo de SWAP Supongamos que tenemos la doble palabra DO = SABCDEF12 y nece tamos MOVEr la parte superior de la palabra, esto es, Á4ABCD a D6. E driamos emplear: SWAP DO La palabra más significativa de DO es ahora SEFR y la menos significativa es SABCD de modo que ahora DO = $EFI2ABCD. Tras esto podemos usar una Y trucción MOVE: MOVE.W — D6 D6 = SABCD Finalmente devolvemos a DO su valor original con otro SWAP: SWAP DO La palabra más significativa de DO es ahora HABCD y la menos significativa es SEFL2 De hecho, SWAP actúa como una rotación de 16 bits (a derecha o izquier- da), sólo que mucho más rápidamente. La forma en que SWAP afecta a los indicadores del CCR es distinta a la forma en la que los altera una rotación ROR/ROL. SWAP afecta al CCR como un MOVE: X No resulta afectado (útil en los programas que emplean multiprecisión) N Se pone a | siel bit 3l es l; se pone a 0 en otro caso Z Se pone a | si la doble palabra resulta cero; se pone a cero en otro caso (de modo que en realidad Z no cambia durante el SWAP, pero alguien puede necesitar probar para ver $i es cero) V Siempre se pone a 0 Siempre se pone a 0 ROR/ROL afectan de forma diferente al indicador C a medida que los bits rotan. EXG: Intercambia registros EXG(.L| Rm,Rn emplea como operandos fuente y destino, indistinta- mente, registros de datos o de direcciones. Asi, pues, son ejemplos válidos del empleo del EXG los siguientes: EXG(.L) Dm,Dn El contenido de Dm pasa a Dn, y viceversa EXG(.1) Dm,An — El contenido de Dm pasa a Án, y viceversa EXG(.L) Dm,An El parámetro L es opcional, puesto que EXG implica el intercambio de una doble palabra (se intercambian siempre los 32 bits). Todos los formatos para EXG son útiles y resultan equivalentes a la si- guiente secuencia de MOVE: MOVE.L Rm,Rx MOVE.L Rn,Rm MOVE.L Rx,Rm sin necesidad de emplear un tercer registro auxiliar Rx, MOVEP: Intercambio de datos con los periféricos MOVEP es una versión especial de MOVE para simplificar la interea. nexión con la anterior generación de dispositivos de 8 bits, que, por sup to, se continúa empleando. Aunque Motorola ha introducido muchos productos nuevos en la fa lia del 68000, ha decidido conservar una serie de características que pe ten la compatibilidad, con periféricos y chips 1/O”, diseñados para micrg procesadores de 8 bits, especialmente la familia de M6800. | Ya se ha mencionado que, de hecho, el M68000 puede interconectar. con dispositivos asincronos de alta velocidad de 16 bits, asi como con pe ] féricos de baja velocidad, normalmente dispositivos sincronos de 8 La instrucción MOVEP se ha pensado para facilitar la labor del pro mación a la hora de intercambiar información entre los registros de q y los dispositivos I/O. El M68000 emplea un esquema de entrada/salida diante un mapa de memoria (memory-maped 1/0), que para nuestros pósitos significa que podemos acceder a un periférico como si de una po ción de memoria se tratara. En lugar de las instrucciones especiales de que se encuentran en algunos sistemas, el M68000 realiza estos procesos: I/O con un MOVE y los operandos apropiados (desde luego, con al, ayuda de dispositivos tan amables como controladores de discos, imp ras, terminales, etc.). ) Puesto que los dispositivos periféricos de $ bits se conectan preferi mente a las 8 líneas de datos más significativas (o a las 8 menos signifi vas) del bus de datos del sistema (16 bits), los registros de control o direcciones alternativas en el mapa de memoria del M68000, es decir, ciones impares consecutivas o direcciones pares consecutivas. Cuando se envien datos o instrucciones de control a uno de estos pe ricos es necesario efectuar algunos cambios en el MOVE normal. Los me- dos (An)=> y —(An) funcionarán correctamente para transferencias € posiciones contiguas de la memoria, pero una transferencia típica a un Ol positivo 1/0 requerirá un esquema parecido al siguiente. Supongamos € : DO contiene los bytes (byte4Xbyte3)Nbyte2MKbytel) y AO contiene la di ción de entrada del dispositivo de 1/0, entonces para transferir DO a A hariamos algo asi: MOVEr byte4 a la dirección AO MOVEr byte3 a la dirección AO + 2 MOVEr byte2 a la dirección AO + 4 MOVEr bytel a la dirección AO +6 (Nótese la secuencia: el byte más significativo a la dirección más ba p Sin MOVEP, todo esto puede hacerse de varias formas, a cual más tedio por ejemplo: > En adelante, nos referiremos a los dispositivos de entrada/salida por la abre inglesa 1/0 finput/output), que ya está incorporada a la jerga electrónica e informática tellana, dado que nuestro nivel ya nos lo permite y resulta más “realista”. MOVE.B D0,6(A0) ROR.L 248,D0 Rotamos el byte2 a la posición menos significativa MOVE.B_ D0,4(A0) ROR.L 8,D0 Rotamos el byte3 a la posición menos significativa MOVE.B_ D0,2(A0) ROR.L +8,D0 Rotamos el byte a la posición menos significativa MOVE.B._— DOJ(A0) Empleando MOVEP, todo esto se reduce a una linca: MOVEP.L — D0,0(40) Llevar DO a (A0)...(A0 + 6) MOVEP logra esto mediante el uso de rutinas propias para el posincre- mento del puntero de direcciones. MOVEP mueve los bytes comenzan- do por el más significativo y posincrementando en 2. Los formatos para MOVEP en salida son: MOVEP.L Dm,d(An) Llevar los 4 bytes de Dm a posiciones de memoria alternadas empezando en d(An) MOVEP.W Dm,d(An) Como el anterior, pero empleando sólo 2 bytes Vemos que L y W determinan el número de bytes a transferir, y que el des- tino debe ser un registro indice con desplazamiento, que se emplea para determinar la dirección en la que comience éste. Motorola ha tenido una excelente razón para elegir d(An) como un ope- rando. Normalmente se especifica un área de la memoria para zona de 1/0. Se seleccionará un registro de direcciones para apuntar a la base de esta zona y se asignarán los desplazamientos simbólicos en el ensamblado fuente mediante un mnemónico, para distinguir las direcciones de los registros pe- riféricos dentro del mapa de memoria de 1/0. Por ejemplo, podemos en- contrar: MOVEP.W DI,PIAD(AS) De modo que AS apuntará a la base de la memoria de 1/0 y PIAD será el desplazamiento que desde AS se ha asignado, por ejemplo, a la PIA * 6821 de Motorola. En sistemas grandes, el uso de estos mnemónicos es indispen- sable. La figura 6.15 muestra diferentes secuencias posibles para transferir di- ferentes tipos de datos a una dirección dada. Hasta ahora sólo hemos tra- : 1 PIA = Peripheral Interface Adapter; una traducción libre del término serta: “disposi- tivo para conexión y control de periféricos”, MOVEP: tado el procedimiento para enviar información a un periférico, los proc para recibirla desde éstos son similares y nos permiten llevar los datos que el periferico envía a cualquier registro de datos: y MOVEP.Z d(An),Dm Cargar en Dm con 2 0 4 bytes desde las direcciones alternadas que empiezan en d(An) La entrada de datos con MOVEP funciona igual que la salida, sólo que en la dirección opuesta, asignando valores al registro elegido a partir de los datos que se encuentre en las direcciones alternas de I/O. Esta simetría en. los procesos de 1/0 en el M68000 es otro intento de facilitar la tarea del programador. e Finalmente hay que notar que MOVEP no afecta al CCR, lo que es bag tante sencillo. No estamos sino enviando o recibiendo una serie de bytes. y bajo esta base no existen criterios razonables para cambiar el CCR, 7 i Resumen MOVEP simplifica la transferencia de datos desde y hacia dispositivos 1/O orientados al byte, incrementando automáticamente la dirección del Operando en 2 por cada byte transferido. Esto permite que el bus de datos de 16 bits sea asignado de forma simultánea a dos dispositivos 1/O de 8 bits, Introducción al LINK/UNLK 266 Para entender las instrucciones LINK/UNLK se exige un buen conodi miento de cómo funciona la pila; de modo que vamos a repasar las caracté- risticas más notables de este dispositivo. E Como se vio en el capítulo 3, la pila puede emplearse tanto para salvar datos como para preservar el entorno de un programa durante una ll a una subrutina. En particular, la pila se emplea para salvar la circo retorno de las subrutinas. La utilidad de la pila para almacenar datos reste en que emplea un mecanismo tipo LIFO*, de modo que alterar los datos. (introducir o extraer) de la misma no altera para nada la dirección mismá de la pila, es decir, con la pila sólo hav que preocuparse de los datos, no f las direcciones de los mismos. Uno de los punteros de direcciones, el que se conoce como SP (puntero de pila), apunta a la dirección de la úl palabra que se guardó en la pila, Hay muchas situaciones, sin embargo, en las que las subrutinas £ datos temporales o intermedios para a continuación llamar a otra subrul y asi sucesivamente, Cuando nos introducimos varios niveles en lo que Y nominamos “subrutinas anidadas'” puede ser una pesadilla para el pr aa: “ LIFO = Last In First Out; podemos traducirlo como: “sale primero el último: entró”. Instrucción MOVEP actuando sobre una doble palabra con dirección par Registro Tale - RETA ARTE, B2 | sr | 50 << on] 83 | | 2N +2 alto bajo 2N +4 2N +6 TUNEL] se increm. las direc. Instrucción MOVEP actuando sobre una doble palabra con dirección impar ñ 2N+1 Registro Tue AA ST , B3 B2| Bl BO +——s Donde An, que actuará como FP, puede ser cualquier registro de direccio- nes, excepto A7, que ya es el puntero de la pila. Una vez que se ha elegido An como FP, debe emplearse este registro de direcciones para todas las operaciones LINK/UNLK subsiguientes. Veremos cómo la dirección contenida en Án cambia a medida que nos movemos de una subrutina a otra, de modo que Án siempre contiene el ya- lor correcto para el FP de la trama activa. El tamaño de la trama se indica mediante 4< tamaño del bloque>. El signo negativo se debe a que las pilas crecen hacia abajo en la memoria. El tamaño del bloque es un número de 16 bits sin signo (una palabra de extensión en la instrucción LINK), de modo que el máximo tamaño de la irama es de 32K. El tamaño__del_ bloque debe venir dado por un número par de bytes. Para hacer todo lo que se ha dicho hasta ahora, LINK realiza las tres funciones siguientes, que veremos primero rápidamente y luego con más calma para explicar los cómos y los porqués: 1. Salva An en la cima de la pila con un MOVE,L An, (SP). El FP anterior está ahora a salvo en la pila. * Quizá ahora resulte clarificador indicar que LINK puede significar atar, ligar, encá- denar. mientras que UNLinK puede traducirse por desatar. En este contexto, bien puede waducirse LINK“UNLK por asignar liberar (una trampa, es decir, una zona de memoria). 6 FP - Frame Pointer: “puntero de trama!”. 269 1 Salva el nuevo valor del SP en An con un MOVEA.L A7,An; nó tese que A7 = SP. Ahora An es el nuevo puntero FP. 3. Pone SP a ¿SP menos tamaño__del__bloque|. Esto incrementa tamaño de la pila en bytes más. La nueva, trama ocupa ahora desde Án = = FP hasta SP. by Vamos a revisar ahora, paso a paso, el funcionamiento de L INK/UNLK, refiriéndonos a las figuras 6.16, 6.17 y 6.18, Supongamos que estamos ejecutando una subrutina A que emplea AS. como FP para la trama de la subrutina A. El contenido de la trama A ca rece de importancia, pero nótese que la pila ha crecido (SP tiene ahora un valor menor) desde que se llamó a la subrutina A por primera vez. Supongamos que en la subrutina Á se alcanza un BSR que llama ala subrutina B. Como ya sabemos, BSR guarda la dirección de retorno de la subrutina B en la pila. Ahora B va a comenzar su trabajo, si se desea podemos salvar los va lores de CCR y de otros registros en la pila de la forma usual: quedarán alli, a salvo, hasta que B devuelva el control a A. il Supongamos que B necesita $12 bytes de memoria de trabajo (tablas buffers, etc.); entonces la siguiente instrucción de B seria: LINK A5,4-512 — Asignar mediante AS, 512 bytes Esta linea está en realidad realizando las siguientes Operaciones: | MOVE.L AS, 45SP) Salvar el puntero de trama (FP) de la subrutina A en la pila (Se salva el valor de A3 porque este registro de direcciones cambiará su va lor durante la ejecución de LINK, y necesitamos recuperar su valor cuando: ejecutemos un UNLK.) MOVE.A ATAS A7=SP. A3 actúa como el puntero de trama (FP) de la subrutina B (Tras el paso l, el puntero de la pila SP se deja apuntando al FP de A parte de la pila será el comienzo de la trama de B, de modo que copiamos tr valor de SP en A5 para emplearlo como puntero de B.) ADDQ.L *-512,SP (Sumando —512 a SP, incrementamos el tamaño de la pila en $12 b cualquier valor que entre o salga de la pila durante la subrutina B lo hará esta nueva parte de la pila. Podemos emplear A5 como FP para referim8 a cualquier parte de la trama de $12 bytes sin cambiar para nada el resto Durante la subrutina A (USPIA7 | Direc. de la cima de la pila de A ETE] Cima de la pila de A Cima de la pla de A Area de la pila de A AS | Puntero de trama de A Puntero de trama anterior Ahora la subrutina A llama a la B Dirección de retorno de B (USP) A7 | Cima de la pila de A- 4 Introducimos la dirección de retorno de E Cima de la pila de A Zona de la pila reservada para Á A5 | Puntero de trama de A Puntero de trama anterio! Ahora la subrutina B ejecuta un LINK AS, 4512 as 13 pasos) Paso 1 del LINK: Meter AS en la pila dE) AS FP [puntero de trama! de Á Dirección de retorno de E Cima de la pila de A B=Pumoro Push AS derrama de USP: A7 Cima de la pila de Á Zona de la pila reservada par Á Puntero de trama anterior A5 | Puntero de trama de A Figura 6.16 LINK y UNLK (primera parte) EEE 271 Paso 2 de LINK A5, + -512: ra ha cambiado A5=FP de A USP A7 Puntero de trama de B Dirección de retorno para B Cima de la pila de A Zona de la pila reservada para Á A5 Puntero de trama de 8 Puntero de trama anterior A Paso 3 de LINK A5, 4 -512: a ó La pila > Cima de la pila de B USP A7 | Puntero de trama de B 512 Area de la pila reservada do para 8, 512 bytes | Puntero de trama de A | Asignado por el LINK $ E p - Dirección de retorno para B Ñ' Apunta Cima de la pila de A al puntero AS Puntero de trama de B SS Zona de la pila reservada le de trama para A Ñ de A / Puntero de trama anterior Fl puntero de trama de A apunta yl al antenor puntero de trama AE : La subrutina B ahora emplea el área que tiene reservada. El SP cambia (no importa). Even tualmente la subrutina B ejecuta un UNLK A5 (2 pasos) Paso 1 de UNLK: , z 7 restaurar el SP desde A5 Se designan los / 512 bytes de B f La pila Puntero de trama de Á Jl disminuye Dirección de retomo para B Ne Cima de la pila de A Zona de la pila reservada para Á (USP) A7 Puntero de trama de B A5 Puntero de trama anterior A Figura 6.17 LINK y UNLK (segunda parte) Paso 2 de UNLK AS: Restaurar AS desde la pila IMOVE.L (SP) + ,A5] Puntero de trama de A Dirección de retorno de B Cima de la pila de A (USP] A7 Puntero de trama de A +4 Zona de la pila reservada para A Puntero de trama anterior A5 | Puntero de trama de A ETE NE Ahora la subrutina B ejecuta un RTS para volver a la subrutina A: Se toma la dirección de retorno de B de la pila -> SP Dirección de retorno para B Cima de la pala de A sP Cima de la pila de A Zona de la pila reservada para Á Puntero de trama anterior AS | Puntero de trama de A l— : Base de la pila La subrutina retorna con la pila exactamente igual que al principio, PC [Dirección de retornopara B Figura 6.18 LINK y UNLK (tercera parte) la pila; análogamente podemos emplear el puntero de la pila [SP = A7)] para trabajar en ella, sin alterar la trama de B. Con esta disposición, la sub- rutina B puede emplear su propio espacio de trama de $512 bytes en la pila sin generar problemas. Justo antes de alcanzar un RTS o un RTR —supo- niendo que se salvó el CCR—, que devolverá el control a la subrutina A, se necesita una instrucción: UNLK AS Liberar la trama, restaurar los valores del SP que liberará la trama y restaurará la pila automáticamente, empleando los dos pasos siguientes: MOVEA.L AS,A? Restaurar cl puntero de la pila 273 LINK/UNLK: Resumen Más sobre los modos privilegiados 274 (Este es el paso inverso del paso 2 de LINK; ahora SP apunta a la posición. en la que salvamos el FP de A en el paso 1 de LINK.) o MOVE.L (5P)+,A3 — Restaurar el valor de FP de A en AS (Ahora recuperamos el valor del puntero de A de la pila y lo almacenamos en A5: esto cancela el paso de 1 de LINK.) f Si hubiéramos salvado el CCR en la pila, un RTR restauraria el valor de éste y nos llevaria a la subrutina A. Si no se han salvado los valores del CCR, un RTR nos devolverá a la subrutina A. En cualquiera de los casos encontramos exactamente la misma disposi. ción en la pila al retornar de la subrutina B que al abandonar la subrutina A. La pila y los punteros de trama tienen los mismos valores que al comienzo, y la zona de datos de B ha desaparecido. Ml Una vez que la subrutina A se haya completado, se liberará el área t poral asignada a ella y se retornará el control a la subrutina o pro llamantes. En el caso de que no existan más subrutinas anidadas, el co se devolverá al programa principal. En este momento, todas las tramas$ habrán liberado, y AS quedará disponible. E pié Se han descrito estas dos instrucciones en detalle porque nos mue las lineas actuales de desarrollo de software. La elección del nombre LI es significativa. El primer elemento de una trama es siempre una palabra doble e niendo la dirección de la trama previa. De modo que el puntero de trama está apuntando a otra. Estas ideas de punteros apuntando a pun: no es tan complicada como pueda parecer. Esta es la idea de lo que del minamos listas encadenadas: de ahi el nombre de esta instrucción ?. ¿Qué es el modo privilegiado? En el sentido más amplio, la existencl un modo privilegiado implica una estructura de niveles en un ordená estructura que va desde sistemas de acceso en los terminales, progra o ficheros protegidos por claves de acceso, hasta los niveles de prote especiales, donde el sistema operativo puede impedir el acceso, acci0 o voluntario, a usuarios que podrían colapsar el sistema. El M68000 oli "En este caso se emplea la acepción encadenar para traducir la expresión “linked US Si bien en este contexto ésta es la traducción acertada al hacer referencia a 20na5 de li moria, creemos que es más expresivo (sobre todo para las personas poco experin utilizar los terminos asignar: liberar. una combinación única de medios hardware/softrware que proporciona a di- señadores y programadores alguna ayuda en un área tan dificil como ésta. Concluiremos el capítulo 6 revisando las instrucciones del modo privile- giado, algunas de las cuales ya se han visto brevemente. Algunas de estas instrucciones realizan tareas tan familiares como MOVE y ANDI, y no hay ningún misterio en lo que hacen, pero, puesto que alte- ran (o pueden alterar) parámetros vitales del sistema, sólo se permite su uso en el estado supervisor del M68000. Intentar emplear una de estas ins- trucciones en el modo usuario produce el disparo de una señal TRAP, cuyo funcionamiento veremos más adelante. El estado en que se encuentra el procesador se establece mediante el in- dicador S (bit 13) en el registro de estatus. Si S = 1, entonces el M68000 está en el modo supervisor (denominado también modo sistema o modo privile- giado). Si S = 0, el M68000 está en modo o estado usuario. En otras palabras, el M68000 está en un modo o en otro, no hay modos intermedios. Como su nombre indica, los programas de usuario normal- mente se ejecutan en modo usuario, mientras que el modo supervisor se reserva para el sistema operativo. Sentados ante un terminal no nos dare- mos cuenta, pero el indicador S estará constantemente cambiando de 1 40, y viceversa, a medida que el control pasa de una tarea a otra y al sistema operativo. Una notable excepción, por otra parte, es el Macintosh, de Apple Computer, que opera continuamente en modo supervisor. El estado en que se encuentra el M68000 no sólo afecta al número o modo de las instrucciones que se pueden ejecutar, sino que tambien dicta qué registros se pueden acceder. El M68000 indica también el estado en que se encuentra (S= 0 0 S= 1) mediante señales en las patitas de control de funciones FC, permitiendo que otros dispositivos, como chips de manejos de memoria, coprocesadores, etc., detecten su estado real y reaccionen de la forma adecuada. Una aplicación tipica aqui es la de permitir a los diseña- dores de sistemas controlar qué áreas de memoria están asignadas al usua- rio y cuáles al sistema. Pilas en modo usuario y supervisor Una consecuencia importante de estar en uno u otro de los modos es que el mismo símbolo A7 puede emplearse para acceder a dos registros fisicamente diferentes sin ambigúedad. Cuando en modo supervisor se ac- cede al registro A7, se está accediendo en realidad al SSP (puntero de pila del modo supervisor), mientras que si nos encontramos en modo usuario acceder al registro A7 significa acceder al USP (puntero de pila del modo usuario). El M68000 mantiene, pues, dos punteros de pila diferentes y dos pilas, que en ocasiones se denominan pilas del sistema, para evitar confusiones con la multitud de pilas “*privadas”” que pueden mantenerse empleando los registros de A0 a A6. Ahora, el usuario que trabaja en modo usuario es libre de acceder, ma- 275 £! Pilas y modo privilegiado: Resumen Los modos privilegiados y el registro de estado (SR) 276 nipular e incluso mutilar su propia pila empleando el registro A7 o el nl mónico asociado (SP). El daño, si se produce, quedará restringido a 052 ta rea en particular. Dado que el acceso a la pila es en modo supervisor, garantiza una cierta seguridad, que no absoluta, contra los programas diseñados. Como veremos, se emplea la pila en modo supervisor para va y restaurar constantemente información del sistema, de modo que un aL ceso accidental a A? cuando A7 = SSP... ¡puede ser mortal! Por otra parte, el OS” necesita acceder a la pila de usuario (por ejemplo, cuando se necesita salvar el USP al cambiar de tarea) y no podemos hacer esto accediendo a A7, porque A? en modo supervisor indica SSP. Para e tar esto se emplean las instrucciones privilegiadas: MOVE.L USP.An — Instrucción privilegiada. Copiar el puntero de la pila de usuario 4 Án MOVE.L An.USP Instrucción privilegiada. Copiar An al puntero de la pila de usuario En modo usuario, cualquiera de las instrucciones anteriores provocara un frap. Una vez que el OS conoce el puntero de la pila de usuario, puede moverse con total libertad en la pila de usuario, empleándola para sus nece- sidades. La instrucción MOVE.L An,USP le permite restaurar dicho pun tero cuando haya terminado. Resumamos los aspectos de las dos pilas del sistema desde el punto vista del privilegio. En modo usuario se puede manipular como se desee pila de usuario, pero no puede accederse la pila del modo supervisor. modo supervisor, ambas pilas son de libre acceso empleando MOVE y as para acceder a la pila de usuario. El byte menos significativo del registro de estatus es el conocido CUB del que tanto se ha hablado y que es accesible a todo el mundo. Se pul probar, mover y modificar los indicadores del CCR en los estados us y supervisor. El byte más significativo del SR es totalmente diferente modo usuario, este byte es SOLO LECTURA mediante un MOVEr 4 el SR (sin embargo, el MC68010/20 permiten sólo MOVEr desde el * En adelante nos referiremos al sistema operativo por su abreviatura inglesa OS (0p ing System), que, como tantas otras, es ampliamente utilizada en castellano, incluso era nombre comercial de algunos sistemas operativos para ordenadores (DOS: Sistema OP de disco). véase el capítulo 8). En modo supervisor, el byte del sistema (SR) se puede leer y también alterar como MOVEr en los dos sentidos. Puede emplearse tambien ANDI/ORI/EORI. Los indicadores del byte del sistema son: Bits 8-10 Bits de la máscara de interrupciones IM (3 bits) Bn 13 Indicador S (S = 1, modo supervisor; S =0, modo usuario) Bit 15 Indicador T (T = 1, modo traza activo; T =0, modo traza inactivo) Estos indicadores no pueden ser alterados en modo usuario, aunque si que podemos leer su valor en ambos modos: MOVE(.W) SR, Instrucción no privilegiada. Válida en ambos modos lo que nos permitirá comprobar el estado de los indicadores IM, 5 y T (nó- tense las diferencias con respecto al MC68010/20 indicadas más arriba). Cuando se conecta el M68000 freset), éste comienza en modo supervisor, esto es natural y deseable, ya que algunos OS inician el sistema antes de permitir el acceso del usuario. Pasar del modo supervisor al modo usuario no supone ningún proble- ma, dado que, en modo supervisor, el OS siempre puede poner a 0 el indi- cador S con: MOVE,W H0,5R Instrucción privilegiada. Se pone a 0 el indicador $ y todos los demás indicadores en el SR o si no se desea alterar los otros indicadores del SR: EORI.W A S2000,SR Instrucción privilegiada, Se pone a U el indicador 5 sin alterar los demás indicadores ANDLW SSDEFFF,SK Instrucción privilegiada. Se pone a 0 el indicador 5 sin alterar los demas indicadores También se puede emplear: ORI *, SR — Instrucción privilegiada para poner a | los indicadores del SR que se desee. Podemos preguntarnos ahora cómo se pasa del modo usuario al modo supervisor si el indicador S no puede ser alterado en modo usuario. La res- puesta está en el concepto de excepción. Una excepción en modo usuario llevará al procesador al modo supervisor poniendo S = 1, y dependiendo del 27 tipo de excepción, salvará o intentará salvar el contexto del procesador, diferentes formas. Excepciones cesos, algunos de los cuales quedan fuera del alcance de este capitulo, siguientes sucesos en modo usuario desencadenan una excepción: de cepciones, a modo de ejemplo, acerca del funcionamiento del proce y de cómo, eventualmente, se devuelve el control al usuario. Errores que producen un TRAP* tecta automáticamente, produciendo un tipo especial de TRAP. Muy bre mente, esto es lo que ocurre en una división por cero: “cae en la trampa para errores”, que disparará el proceso de excepciones, puesto qué Mé parece oportuno emplear verbos como “trampear””, y dado que TRAP aparecerá mente en conexión con el nombre de una instrucción, optamos por no traducir el ter como norma general. J En la jerga del M68000, las excepciones cubren una gran variedad de gy — Errores que producen un TRAP — Instrucciones TRAP — Violaciones de privilegio — Interrupciones: externas e internas — Errores de bus — Reset Cada uno de estos sucesos pone el procesador en modo supervisor se procesan las excepciones. Vamos a ver los dos primeros tipos Al estudiar DIVU/DIVS, hemos visto que una división por cero $e l. Se entra en modo supervisor (S = 1) 2. Se salva el entorno del sistema en la pila del modo supervisor 3. Se salta al vector 5 en la tabla de vectores de excepciones 4. Se obtiene la dirección del programa de manejo de la except 0 5. Se ejecuta este programa que terminará con una instrucción (retorno de una excepción) 6. Se restaura el entorno del sistema a partir del contenido de la P del modo supervisor Se continúa con el programa de usuario e] TABLA 6,5 Asignación de los vectores de excepción AR o Dec Dip Bloque Función NIINEro hex. 0 0 0000 sP Reset: Inicialmente en el SSP= l 4 004 sP Reset: Inicialmente en el PC-* 2 8 DOS SD Error del his 3 12 DOC SD Error de direcciones 4 16 010 SD Instrucción ilegal 5 20 014 SD División por cero 6 24 018 SD Instrucción CHK 7 28 DIC SD Instrucción TRAPYV 8 32 020 SD Violación del privilegio 9 36 024 SD Traza 10 40 028 SD Emulador de la linea 1010 11 44 00 SD Emulador de la linea 1111 [2 48 030 SD (Reservado: sin asignación actual) 13' 52 034 sD (Reservado: sin asignación actual) 14 56 035 SD Error de formato* 15 60 D3C sD Vector de interrupción no inicializado 16-23 04 040 5D (Reservado: sin asignación actual) 95 Ost — 24 96 060 SD Interrupción espuria 25 100 064 sP Autovector de interrupciones de nivel | 26 104 068 sD Autovector de interrupciones de nivel 2 2 108 06C SD Autovector de interrupciones de nivel 3 2 112 070 SD Autovector de interrupciones de nivel 4 29 116 074 SD Autovector de interrupciones de nivel $ 30 120 OTE 5D Autovector de interrupciones de nivel 6 31 124 07C 5D Autovector de interrupciones de nivel 7 32-47 128 080 SD Vector de la instrucción TRAP* 191 OBF e. 48-63" 192 OCO SD (No asignados, reservados) 235 OFF o 64-255 256 100 SD Vectores de interrupción del usuario 1023 3FF — L Los vectores números 12, 13, 16 al 23 y 48 al 63 están reservados por Motorola para buturas ampliaciones. No se debe asignar ningún periférico de usuario a estos numeros, 2 El vector de reset (vector 0) requiere 4 palabras, a diferencia de los demás vectores, que sólo nece- sitan 2, y está localizado en el bloque de programas del modo supervisor. 3 La interrupción espuria se produce cuando sucede un error de hus durante Un proceso de in terrupción. + La instrucción TRAP n emplea el vector numero 32 4 nm. * Sólo en el MC6S010, Vease la sección de retorno desde las excepciones. Este vector está reservado sinasignación en el MC68000 y MC68008. 279 CHK: Disparar un TRAP si se exceden los límites Se puede programar una TRAmPa similar para detectar si los valo obtenidos durante un cálculo exceden los limites prefijados; para ello, emplea la instrucción: CHK- ,Dn — Disparar un TRAP si Dn es negativo o mayor que Si Dn se mantiene dentro de los limites, ejecutaremos la próxima instruye. ción y si no es asi, se disparará el proceso de excepciones, como en el de división por cero, pero empleando esta vez el vector **6 de la tabla de cepciones, para obtener la dirección del programa de manejo de exc ciones, TRAPV: Disparar un TRAP si se detecta un rebose (Overflow) TRAPYV generará un salto al vector *7 si se detecta un rebose. Otros procesos TRAP La instrucción: TRAP * Salto al A es un TRAP deliberado, de modo que existe una forma de que el progK mador en modo usuario entre en el modo supervisor; de hecho, * es una poderosa instrucción de programación para ampliz repertorio de cualquier sistema. La tabla 6.5 muestra la tabla de vectores de excepción, en la q puede ver que hay 225 vectores independientes para rutinas de excep 10 servados para rutinas presentes o futuras del sistema, tales como mane interrupciones. El resto puede emplearse para propósitos de usuario, TRAP. Como ejemplo simple, digamos que se puede asignar a la expresil COSH la instrucción TRAP 464, de modo que en la dirección $100 (128 rección del vector H64) se encuentra la dirección de la rutina COSH. E* instrucciones, que no pertenecen al set del M68000, se conocen en ocasio? como llamadas al monitor o llamadas de servicio. Están al alcance de 108 y pueden construirse para que parezcan instrucciones del set, con optk dos que pueden pasarse a la rutina en cuestión empleando la pila. Conclusión En este capitulo hemos visto todas las instrucciones y modos de direc- cionamiento básicos del M68000. Los ejemplos propuestos han sido sim- ples, para aislar la mecánica de cada grupo de instrucciones y operandos, Al mismo tiempo se ha pretendido con ellos dar una visión de las tenden- cias actuales de diseño, sus cómos y sus porqués. Ahora, por lo menos, ya conocemos el vocabulario elemental para entenderse con '*el microchip de los ochenta'” y tiene la preparación necesaria para enfrentarse con Otros textos de nivel más elevado y con los ensambladores disponibles en el mer- cado. ¡Ojalá que el MOVE le acompañe! De todas formas, antes de que se encierre con sus máquinas, le invitamos a leer los dos últimos capítulos sobre el MC68010 y el MC68020. El MC68010 En los capitulos precedentes hemos enfocado nuestra atención princi- palmente sobre el MC68000, el primer chip de la familia 68000 de Moto- rola. En este capitulo estudiaremos el siguiente miembro de esta familia, el M68010. A lo largo de este capítulo supondremos que el lector está fami- liarizado con las principales caracteristicas del MC68000, es decir, que ha leido los capitulos 1 al 6. Puesto que las características del MC68000 son de carácter más avanzado, el material de este capitulo es más denso que el de los capitulos precedentes. La clave del MC68010 se encuentra en sus capacidades de emulación, es decir, su capacidad para “simular cosas que no están realmente ali”. En las emulaciones típicas, ciertas caracteristicas hardware que realmente no existen son simuladas por software. Por ejemplo, algunas impresoras ca- recen de la capacidad de producir saltos de página. Esta capacidad puede emularse por sofware, contabilizando las lineas impresas en una página y luego produciendo suficientes saltos de linea hasta completar las 66 lineas de la página. Una de las aplicaciones más interesantes de las emulaciones se encuentra en los sistemas con memoria virtual. En estos sistemas, los pro- gramas pueden acceder a posiciones de memoria que están más allá del li- mite real de memoria disponible en hardware. La capacidad de maneja! memoria virtual habria garantizado, por si sola, un puesto en la historia para el MC68010, pero este chip todavía hace más cosas. El MC68010 es capaz de emular sistemas operativos inexistentes, asi como instrucciones (inexistentes en realidad) definidas por el usuario. Estas 283 caracteristicas se conocen como capacidades de máquina virtual. Toda estas caracteristicas simplifican el diseño de nuevos sistemas operativos, es, por naturaleza, una tarea muy dificil. La máquina virtual permite a torola comprobar (emular) el comportamiento de nuevos chips de la fan del 68000 mucho antes de que estos chips estén realmente disponibles, cluso antes de que el diseño final de éstos se haya llevado realmente al pan El proceso se realiza sobre un MC68010 en emulación. Por si esto poco, el MC68010 realiza además otra función para aquellos Usuarios qu no puedan renovar su microprocesador con una nueva versión existente ap la familia 68000, el MC68010 puede emularlo. Es fácil comprender por qué Motorola ha implementado capacidades emulación en el MC68010: permite reducir el coste de desarrollo de chips de la familia 68000. En este capítulo trataremos los conceptos de memoria virtual y máquin virtual, así como las caracteristicas del MC68010, que le permiten soportar estas facilidades. Después discutiremos las diferentes formas de asign; áreas de la memoria y que papel juegan éstas en el manejo seguro de la y moria virtual. Al final del capitulo discutiremos el modo lazo, que pe acelerar la ejecución de algunos bucles pequeños en un programa; mente discutiremos el MC68012, un pariente cercano del MC68010. Memoria virtual En cualquier ordenador hay una cierta cantidad de memoria real ( moria hardware) disponible. En la mayoria de los ordenadores, los usua están limitados a emplear esta memoria real, si bien es cierto que en alg grandes ordenadores (mainframes) y microordenadores se empleaban nos trucos de software para aparentar que habia más memoria de la mente disponible, es decir, estos sistemas empleaban memoria virtual. É las formas más desarrolladas de memoria virtual, el usuario puede acceder a la misma sin ningún tipo de restricciones y nunca sabe (ni tiene que lestarse en averiguarlo) cuál es la cantidad real de memoria hardware mente disponible. ¿Pero es esto el paraiso de los programadores? ¿Cómo hace? ¿Cuál es la trampa? Como puede sospecharse, hay una trampa ql conlleva importantes dificultades. En cualquier instante, la memoria real contiene sólo una pequeña pal de la memoria virtual a la que se hace referencia. El resto de la mem virtual se almacena mientras tanto en algún sitio, usualmente en un dist4 Por ejemplo, supongamos un sistema de memoria virtual que permite al programas direccionar hasta 384K de memoria, pero que tiene sólo 129K memoria real. En este sistema, la memoria está dividida en páginas de 6 De modo que en cualquier momento no puede haber más de tres páginas la memoria real, aunque a la hora de programar se pueda disponer de La página | está ocupada por el sistema operativo (OS) y tiene que siempre presente en la memoria real. Las páginas 2 a 6 constituyen el Memoria en disco Púgina 2 Página 3 | Página 4 | Página 5 | Página 6 Memoria virtual Página 1 (05) | Página 2 | Página 3 | Página 4 Página 5 | Página 6 Memona hardware Página 1105) | Página 2 Configuración de la memoría al comenzar Memoria en disco Página 2 Página 3 | Página 4 | Página 5 | Página 6 Página 5 Memoria virtual Página 11051 | Página 2 | Página 3 | Página 4 Página 6 Memona hardware Página 1105) | Página 2 Li: Segunda configuración de la memoria Memoria en disco Página 2 Página 3 | Página 4 | Página 5 | Página 6 Memoria virtual Página 1/05) | Página 2 | Página 3 | Página 4 | Página 5 | Página 6 Memoria hardware Página 1/05) | Página 2 Tercera configuración de la memoria Figura 7.1 Configuraciones de la rremoria virtuad enn 600 cio para el programa que se está ejecutando y que reside realmente en el disco. La figura 7.1 compara las disposiciones de la memoria virtual. La memoria virtual no existe realmente en ninguna parte, excepto como un conjunto de punteros que direccionan el disco y la memoria real. Cuando comienza la ejecución de un programa, la memoria se dispone como se indica en la figura 7.1a. El sistema de memoria virtual ha cargado, en este momento, solamente la primera página (página 2) del programa. Su- pongamos que ahora el programa necesita algunos datos que se encuentran en la página 4. Por lo que al programa se refiere, no se plantea ningún pro- blema, simplemente se direccionan los datos de la página 4, pero el sistema de memoria virtual detecta una referencia a una página que no está en la 285 memoria real, de modo que la busca en el disco y la carga en memoria Ahora la configuración de la memoria (disco, real y virtual) se refleja, la figura 7.1b. 3 Cuando el programa del usuario hace referencia a las posiciones d; dl página 4, el sistema de memoria virtual las convierte en las posiciones dela pondientes a la memoria real que ocupa esta página. Nótese que la página a reside, de hecho, en la página 3 de la memoria real; asi, cuando el prog ma pide datos de la página 4, acaba obteniendo los datos pedidos, sacados de la página 3 de la memoria real. Supongamos que el programa necesita ahora datos de la página 5, to que no hay memoria real libre, algunas de las páginas actualmente fa dentes en la misma deben eliminarse para hacer sitio a la página 5. El me uso de los recursos se consigue reemplazando la página 4 por la 5. Sila; gina 4 ha cambiando durante la ejecución, hay que volcarla al disco en sy forma actual para no perder información. En cualquier caso, la memoria queda dispuesta como se indica en la figura 7.1c. = Decidir cuál de las páginas debe volcarse para hacer sitio a las dem es una función de muchas variables. De momento, digamos que si tiene buena idea en este campo su futuro como programador será brillante. Py to que los accesos a disco son hasta 100 veces más lentos que los a a la memoria, está claro que el precio de una mayor canudad de memo memoria virtual sin restricciones y/o mal planeados, el uso de la memo virtual puede llevar a situaciones en las que se produzcan demasiados cesos al disco. Por ejemplo, supongamos que el programa anterior entra. un ciclo en el que se llama alternativamente a las páginas 4 y 5, por plo, 1.000 veces. Esto causaría 1.000 accesos al disco para leer los hay que tener cuidado al emplear la memoria virtual. Para implementar de manera eficiente un sistema de memoria vit es necesario detectar (mediante fraps) las referencias a posiciones ¡legal la memoria y traducirlas de memoria virtual a memoria real mediante ware externo, normalmente una unidad de manejo de memoria (MMU). ME esta capacidad, la CPU se veria obligada a desperdiciar su capacidad A ciones. Cuando se realiza una referencia a una posición ilegal de la memo un sistema sin capacidades de memoria virtual, ésta no es detectada ¡miclé mente por el 68000. Sin pérdida de tiempo, el 68000 pasa la petición al 0% que, a su vez, la transmite a la memoria ('*¡Hay una llamada para el 5 Hex FFFFFFFO0!"), donde se descubrirá que no es una posición permil El bus detecta este hecho y lo notifica al 68000, que generará una excepe debida a un error de bus, salvará (en la pila del sistema) el entorno del grama y llamará a las rutinas estándar de proceso de errores del operativo. Normalmente se notificará un error de bus y se abortará la cución del programa. di ¿Cómo se implementa la memoria virtual? Supongamos que alguna 4 trucción, por ejemplo un MOVE, solicita una localización de la memoria (en memoria virtual) que está fuera de los limites de la memoria real. ¿Cómo es posible detectar este hecho y remediarlo de manera rápida? En un sis- tema con memoria virtual, habitualmente, se implementa una unidad de manejo de la memoria (MMU) entre el 68000 y el bus. Esta unidad inter- cepta cualquier llamada a la memoria y traduce las direcciones virtuales a direcciones reales, a continuación toma los datos y devuelve el control al 68000. Para el programador, y para el 68000, parece que los datos se han tomado de la memoria virtual. La MMU mantiene una tabla de las páginas que están en la memoria y de las posiciones que ocupan. Si la dirección vir- tual solicitada no se encuentra en la memoria real al ser llamada la MMU, generará un error de bus, que interrumpirá la instrucción en ejecución. En este momento se almacena la información del entorno del programa en la pila del sistema y las rutinas de error del bus la analizarán para determinar si se ha tratado de un error de memoria virtual; si es así, se emprenderán las acciones apropiadas para cargar esa parte de la memoria del disco en la me- moria real (quizá sustituyendo a otra parte del programa que también se en- contraba en la memoria real). Finalmente, una instrucción RTE devolverá el control al programa, y éste acabará de ejecutar la instrucción interrum- pida. ¿Por qué es posible implantar sistemas de memoria virtual sobre el MC68010 y no sobre el MC68000? La respuesta se encuentra en que el MC68000, a diferencia del 68010, no almacena en la pila del sistema durante la interrupción que sufre la instrucción en curso, suficiente como para que un RTE concluya dicha instrucción. El MC68000 sólo almacena informa- ción suficiente para permitir un diagnóstico software de lo que ha ocurrido, de modo que se pueda informar al usuario del error del que ha abortado la ejecución del programa. Máquina virtual El M68010 no sólo soporta memoria virtual, sino que también está pre- parado para hacer frente al concepto, más amplio, de máquina virtual. Con un sistema de memoria virtual se consigue que un disco actúe como memo- ria real. Se pueden realizar otras emulaciones de software y hardware de una forma similar. Por ejemplo, el concepto de buffer para un disco es exactamente el opuesto del concepto de memoria virtual; el usuario cree estar escribiendo en un disco, pero en realidad está escribiendo en la memoria real. Todos los accesos a disco se almacenan, de forma redundante, en la memoria, de modo que cuando se requieran estos datos, debido a que la velocidad de ac- ceso a la memoria es varios órdenes de magnitud mayor que la de acceso al disco, los beneficios son obvios. La memoria real que se emplea para este uso se denomina memoria cache. Otro ejemplo típico de emulación de hardware se encuentra en los spools. Un spool es un intermediario entre un dispositivo de alta velocidad 287 (la memoria real o hardware) y otro de baja velocidad (una impresora), cuando un usuario cree que la salida de su programa se está volcando por una impresora, en realidad se está almacenando en un spoo! (que puede re. sidir en un disco o cinta) para, quizá más tarde o quizá nunca, imprimirla. El empleo de spools puede ser muy útil en el caso de sistemas con una sola impresora (quizá de alta velocidad) y varios usuarios que simultáneamente intentan acceder a la misma. Seria absurdo tener a todos los usuarios espe. rando a que aquel que está imprimiendo termine; para evitar esta situación, todas las salidas de cada usuario se almacenan en el spool esperando sy turno, mientras que cada uno de ellos continúa trabajando. Más sofisticada es la capacidad de un sistema operativo (OS) de emular otro sistema operativo. ¿Qué es, en realidad, un OS? El OS es el programa más importante que se ejecuta en cualquier ordenador. 5e carga cuando se enciende el ordenador y permanece allí hasta que se apaga, efectuando per- manentemente funciones de control sobre la ejecución de todos los demás programas. En ocasiones se denomina a este sistema monitor '. En muchos ordenadores personales, el OS se almacena en ROM para evitar una des- trucción accidental. ¿Cómo se generan los OS? Puede partirse de cero, pero sólo con un eran esfuerzo. Un método más sencillo es el de emplear un OS preexistente (OS-1), para controlar el desarrollo del nuevo OS (OS-2), hasta que el nuevo sistema esté lo suficientemente depurado como para sobrevivir por si solo. Durante la fase de desarrollo es el OS-1 el que realmente controla el ordenador y emula al OS-2. Cuando se llega a alguna circunstancia especial se devuelve el control al OS-1, que es el que decide la acción a emprender y si debe o no devolver el control al OS-2. Esta situación requiere una habi- lidad especial. Por definición, un OS es una criatura omnipotente, el único y permanente guardián de todo lo que ocurre en un ordenador. Para emu- lar el sistema que habrá de actuar sólo el OS-1 debe hacer creer al OS-2 que también él es omnipotente. En el M68010 esto se consigue ejecutando el. OS-2 en modo usuario, en una situación de privilegio más bajo que el OS-1,. que está en modo supervisor. Mientras el OS-2 ejecuta una instrucción, RO está haciendo nada más allá de lo que haria un usuario normal, y la vi es fácil. Cuando el OS-2 se encuentra con condiciones especiales (por ejemplo, interrupciones debidas al hardware externo O errores debidos a bugs en el OS-2), se genera una excepción y el control se retorna al OS-1, que deci la acción a emprender (normalmente resolverá la situación empleando guna rutina soft hasta el extremo de poder retornar el control al OS-2)-. Uno de los recursos virtuales a los que el OS-2 debe tener acceso es al bit. del sistema. El OS-2 debe tener acceso a aquellas instrucciones que permi: ten asignarse valores O comprobar su estado, asi como aquellas instruccio-: ñ l No debe confundirse el termino monitor entendido como sistema con el monitor de al gunos ordenadores personales. En estos últimos, el monitor está constituido por el con y de rutinas que el constructor implanta (en ROM). Las rutinas del monitor cubren un 4 Z espectro de funciones, desde rutinas para mostrar un determinado carácter en la pant ] hasta las rutinas que inicialmente cargan el sistema operativo. nes privilegiadas que requieran que éste tenga el valor 1. El OS-2 debe poder hacer todo esto, y hacerlo bien, mientras permanece en modo usuario. El truco no es muy distinto de otros descritos más arriba, consiste en generar la excepción adecuada y permitir que el OS-1 se encargue de todo y retorne el control al OS-2 cuando haya terminado, En el M68000, el OS-2 puede determinar que él no está controlando el sistema mediante un MOVE SR,Dn y probando el bit del sistema. Esto fun- ciona, porque el MOVE desde el SR no es una instrucción privilegiada en el MC68000. Por esto y por otros problemas, el MC68000 no puede realizar emulaciones correctamente. En el MC68010 se resuelve el problema, pues el MOVE desde el SR es una instrucción privilegiada. Cuando en modo usuario se intenta ejecutar un MOVE desde el SR, se genera una excepción, el OS-1 toma el control y tiene la opción de pasar al OS-2 una versión alterada del SR en un regis- tro Dn. El OS-2 no tiene modo de detectar qué es lo que realmente ha suce- dido. La instrucción (no privilegiada) MOVE desde el CCR se ha añadido al MC68010, de modo que los códigos de condición pueden aceptarse sin generar una excepción. Otro de los problemas que impiden al MC68000 realizar emulaciones con éxito es el hecho de que la información almacenada en la pila durante una excepción no es suficiente para completar la instrucción interrumpida, sino sólo para realizar un diagnóstico de lo que ha ocurrido, como ya se mencionó en la sección anterior al hablar de la memoria virtual. ¿Qué es lo que impide al omnipotente OS-2 (al menos eso se cree él) emular un OS-3 dentro aún del entorno de emulación? La respuesta Us: nada. Si no fuera asi, la emulación original no sería una verdadera emula- ción. Podría haber una larga cadena de sistemas emulados, cada uno de ellos creyéndose el principal y sin medios para determinar lo contrario. La más sofisticada de las emulaciones consiste en simular una CPU me- diante otra CPU. Esto permite que el software para la nueva CPU (por ejemplo, el MC68020) sea desarrollado y depurado mientras la nueva CPU está aún en desarrollo. La emulación en la familia del 68000 es posible, por- que los sets de instrucciones se han diseñado para que sean compatibles. Por tanto, cualquier instrucción de un 68000 se ejecutará en cualquier pro- cesador posterior de la familia; en los procesadores fabricados con anterio- ridad, bien se ejecutará normalmente o bien no se ejecutará, provocando una excepción debida a una instrucción ilegal. Por tanto, para emular un MC68020 con un MC68010 sólo es necesario cambiar las rutinas de manejo de instrucciones ilegales del OS para que, en caso de detectar una en par- ticular, la emule en sofrware antes de retornar. Si la emulación es tan versátil, ¿por qué, simplemente, no se emulan CPU u OS en las aplicaciones diarias? La respuesta es eficiencia, El soft ware emulado funciona mucho más lentamente que el software real, debido a los procesos de excepción y al uso de rutinas enteras para emular simples instrucciones. Con esto terminamos nuestra discusión de las nuevas características del MC68010. En las tres próximas secciones examinaremos los nuevos regis- 289 tros e instrucciones que se emplean para soportar los procesos de emul y la memoria virtual. Registro vectorial de base , 290 El MC68010 tiene un registro vectorial de base (VBR) que se emplea. rante las emulaciones. Este registro no se encuentra en el MC68000. El y; se emplea durante las transiciones entre el entorno del sistema ope normal y el simulado. Para apreciar su significado necesita revisar algunos conceptos. ne Cuando se genera una excepción, en el MC68000 ocurren varias cos seguidas. Dependiendo de la clase de excepción, algunos registros especiale se modifican, se salva determinada información en alguna, o en ambas, q las pilas del sistema y, finalmente, se produce un salto a algunas de las; posibles rutinas de excepción. Lo que realmente nos importa aqui es el salto. final que tiene lugar. Por ejemplo, una división por cero provoca el salto a la rutina número 3. Las direcciones de estas 255 rutinas se encuentran en las 256 dobles palabras primeras de la memoria (la primera de las dobles palabras no es una dirección, sino el puntero de la pila al encender el orde» nador). Estrictamente hablando, la dirección para la enésima rutina se cuentra en la palabra localizada en la dirección 4n. La dirección de la tina, por ejemplo, que maneja los errores que se producen al intentar u división por cero se encuentra en la dirección $14 (=4 x 5). En la term logia habitual del 68000, se denomina número del vector de excepción al número n, desplazamiento del vector al número 4n, vector de excepci a la doble palabra almacenada en la dirección 4n y tabla de vectores de € cepción a la tabla de 255 direcciones. Imaginemos ahora un OS que controla la simulación de otro OS. Ba donos en la anterior discusión de este capitulo, es fácil entender que, rante la emulación, las excepciones se tratarán de una forma tota diferente a como se tratarian durante la operación normal del OS prim puesto que este sistema estará controlando, de forma muy rigida, tuación, para que el sistema emulado no se dé cuenta de lo que real está sucediendo. En estas circunstancias se encoñitrará activo un conjuñ alternativo de rutinas con puntos de entrada diferentes a los normales. 4 varias formas de alternar los dos conjuntos de rutinas, algunas de las cua no requieren el uso de ningún registro nuevo, pero la más simple consiste emplear el registro vectorial de base. En el MC68010, las excepciones concluyen con un salto a la dire contenida en la posición 4n + VBR de la memoria, donde VBR indica el né mero que está actualmente almacenado en el registro vectorial de base. sérvese que si el VBR es cero, esta dirección será la misma que en el casó MC68000. De hecho, durante el encendido, el VBR está a cero, de MO que inicialmente la tabla de excepciones del MC68010 coincide con la € MC68000. e Cuando un OS establece un entorno en el que va a tener lugar una ol . 2 Es lación, carga un nuevo conjunto de rutinas de excepción y define una nueva tabla de vectores de excepción (que no se localiza en la posición cero de la memoria). Para habilitar el uso de esta tabla sólo es necesario cargar la lo- calización de la tabla de vectores de excepción en el VBR con una instruc- ción MOVEC. Para volver al modo normal de operación basta con poner, de nuevo, el VBR a cero. El trabajo que hay que realizar para pasar de una tabla de excepciones a otra se reduce al mínimo, cs decir, a una única ins- irucción MOVEC. Este método de alternar las tablas de excepción no sólo es rápido y ahorra pasos de programa, sino que elimina otros problemas potenciales. ¿Qué pasaría, por ejemplo, si durante un largo cambio de ta- blas de excepción se produce una interrupción? ¿Cómo se puede garantizar el uso de la rutina de interrupción correcta? El siguiente ejemplo cambia el valor de VBR a $00100000 (hex): MOVE.L R$100000,D0. — Fijamos el nuevo valor del VBR MOVEC DO,VBR Cambiamos el VBR La instrucción MOVEC se discute en la sección siguiente, La figura 7.2 muestra una distribución típica de la memoria para un sis- tema operativo normal y un sistema emulado. Los pasos del | al 3 muestran lo que sucede durante un intento de división por cero cuando el control del sistema está en manos del sistema operativo real. Los pasos del 4 al 6 indican qué sucedería en el mismo caso, cuando el sistema emulado tiene el control. Para alternar las tablas de excepción basta con alternar el valor del VBR. Las instrucciones MOVEC y MOVES MOVEC es una instrucción privilegiada del MC68010 que mueve los datos desde y hacia los “registros de control”, Una forma fácil de entender esta instrucción consiste en pensar que un MOVEC hace todo lo que no hace MOVE. La única excepción la plantea el USP, que se puede cambiar tanto mediante un MOVE como mediante un MOVEC, Si Motorola tuviera que comenzar, de nuevo, desde el principio, probablemente asignaría a la instrucción MOVEC las funciones de otras instrucciones MOVE especiales, como MOVE USP, MOVE SR y MOVE CCR. Con esto se conseguirla un conjunto de instrucciones más homogéneo. El principal uso de MOVEC, en el MC '68010, se encuentra a la hora de cambiar el VBR (ya discutido) o los registros de códigos de función SFC y DEC (que se discutirán más tarde). La tabla 7.1 resume todas las instrucciones del 68000 que afectan a los registros de control. Para cada registro de control, la tabla indica si el re- pistro se puede alterar con un MOVE o con un MOVEC y cuál fue el primer procesador en el que la instrucción se implementó. Un espacio en blanco indica que dicha instrucción no está disponible en ninguno de los procesa- dores existentes de la familia 68000. La columna del código hexadecimal 291 Dirección de Contenido de la memoria dicha posición VER Se emplea durante la ejecución mormal (1), (21 y (3) VBR 00100000 Se emplea durante la ejecucion en emulación 11), (2) y (3 00000000 i e (2) Se busca la dirección del vector que se encuentra Tabla de en 500000014 = 4 x 5 Inúmero del vector que se e en caso de división por cero! + WBR. El vector apunta a la rutina de manejo de las divisiones por cero. vectores de excepción normal 00000400 Ñ (3) Rutina de división por cero Sistema operativo normal y rutinas de excepción normales: 001 255 Espacio normal del usuario (1) Se ha producido una división por cero. Se genera 5 como número del vector de excepción WBR = $00000000. (5) Se busca la dirección del vector que se encuentra ' en $00000014 = 4 x 5 Inúmero del vector que se emplea en caso de división por cerol + VBR. El vector apunta a lá rutina de manejo de las divisiones por cero. 00100000 Tabla de vectores de excepción durante la emulación Sistema operativo emulado y rutinas de excepción del sistema operativo emulado normales: 2001- 255 00100400 16) Rutina de división por cero. 14) Se ha producido una división por cero. Se genera 5 como número del vector de excepcion. VBR = $00100000. Espacio del programa emulado Figura 7.2 Uso del VBR durante una ernulación TABLA 7.1 Instrucciones MOVE para los registros de control Registro Códiro Instr, Instr. Situación de control hex. MOVEC MOVE de privilegio Al SR 68000 Privilegiado Del SR 68000 No privilegiado Del SR 68010 Privilegiado Al CCR 68000 No privilegiado Del CCR 68010 No privilegiado USP 800 68010 68000 Privilegiado VBR 801 68010 Privilegiado SFC 000 68010 Privilegiado DFC 001 68010 Privilegiado MSP 803 68020 Privilegiado ISP 804 68020 Privilegiado CACR 002 68020 Privilegiado CAAR 802 68020 Privilegiado representa el código de tres digitos hexadecimales empleados para represen- tar el registro de control en la instrucción MOVEC. Se han incluido las ins- trucciones del MC68020 para completar la tabla. los registros SFC y DFC ylos espacios de direcciones Los registros de códigos de función origen y destino (SFC y DFC, res- pectivamente) son registros de 3 bits que designan diferentes espacios de direcciones. Sólo los programadores que trabajen al más bajo nivel en el desarrollo de sistemas tendrán necesidad de emplear, alguna vez, estos re- gistros. Se emplean para controlar el manejo de la memoria y la seguridad del sistema. En un sistema que proteja ciertas partes de la memoria, el SFC y el DEC se emplean, en modo supervisor, para acceder a la memoria que normalmente es inaccesible. Para explicar cómo funcionan estos registros es necesario estudiar el hardware del 68000. En un microprocesador de la familia 68000 pueden emplearse hasta 32 pines como lineas de direcciones. Cuando los datos se leen o se escriben en la memoria de estas lineas, transportan los 32 bits que afectan a la posición en cuestión. Se emplean 3 pines adicionales para determinar el código de función que establece qué tipo de memoria se está accediendo, ya se trale de memoria reservada para contener datos, programas O información del sistema (estos 3 pines proporcionan un máximo de 8 códigos de función, de los que 5 están actualmente implantados). Los códigos de función, tam- bién, indican un banco o un conjunto de direcciones a los que acceder. Téc- 293 nicamente hablando, es posible especificar hasta 8 bancos de direccion (de memoria), cada uno con un rango de 32 bits y cada uno sobre su Prop memoria hard. En la actualidad, sin embargo, sólo 4 bancos de 32 bits «a emplean en la familia del 68000, y en las implantaciones más usuales Se em. plean estos 4 bancos en un solo bloque hardware de 32 bits, lo que r las esperanzas de aquellos que ansiaran un bus de direcciones de más de 32 bits. Se La tabla 7.2 lista los 8 códigos de función y los bancos de direcciones que tienen asignadas actualmente. Cuando el 68000 se encuentra en modo usuario, es decir, si el bit del sistema está a 0, las instrucciones Que se tomen. de la memoria, para su posterior ejecución, tendrán un codigo de función. 001. Cuando, sin salir del modo usuario, se intercambien datos con la me moria, el código de función será 010. En modo supervisor, los códigos serán 101 (instrucciones) y 110 (datos). ij El quinto código de función actualmente implantado se denomina cb+ digo de función del banco de la CPU. Este código se emplea en las comuni- caciones con el hardware externo, es decir, durante las interrupciones, los breakpoints (cada vez que aparece una instrucción BKPT), en el nivel de control de acceso (durante las instrucciones CALLM y RTM del MC68020), y durante las comunicaciones con un coprocesador (MC68020). El banco de la CPU tiene un tratamiento diferente con respecto a los demás, puesto que no controla memoria hard, sino que se emplea para pasar diterentes pará- metros a alguno de los destinos anteriormente citados. Cuando el 68000 escribe (o lee) en la memoria, se manda una dirección de 32 bits junto con un código de función. El hardware externo decide en- tonces qué hacer con la señal. En las situaciones más simples, el hardware simplemente ignora el código de función y se ocupa de la dirección solici tada. En situaciones más sofisticadas, puede haber hasta 4 bancos de mé- moria hardware, uno para cada uno de los 4 primeros códigos de función. En este caso es posible que un OS, su tabla de datos, un programa y los da- tos de éste residan todos en la misma dirección numérica. Todos se acceden con la misma dirección, pero con un código de función diferente. El código de función puede emplearse para implantar barreras de segl- ridad en el sistema. Esto puede lograrse mediante un dispositivo externo de manejo de la memoria. Por ejemplo, un OS puede permitir a los usuarios que ejecuten los programas que se encuentran en el área de programas del sistema (código de función 110), pero no que éstos tengan acceso a los pro- gramas en si (código de función 101). Si los bancos para estos dos códigos de función corresponden realmente a áreas hard diferentes, el usuario no podrá nunca acceder al programa. El programa cs, pues, invisible y a salvo de miradas indiscretas. Si los bancos para los dos códigos de fun- ción corresponden a la memoria hard, el usuario podría acceder al progra" ma, y es necesario emplear un dispositivo externo de manejo de memott para evitar que el usuario examine el programa. El Supongamos que nos encontramos en uno de esos maravillosos sistemas. con cuatro bloques diferentes de memoria. Supongamos que deseamos 82 ceder a la posición 123456 en todos los bloques. Es fácil acceder a los BM z TABLA 7,2 Códigos de función de los bloques de direcciones Bus del código 7 Bloque de direcciones de función 000 No disponible: Reservado por Motorola para uso futuro 001 Bloque de datos del usuario 010 Bloque de programas del usuario 011 Reservado para definición por el usuario 100 Reservado para uso futuro de Motorola 101 Bloque de datos del modo supervisor (incluye los vectores de excepción del 2 al 255) 110 Bloque de programas del modo supervisor (incluye los vec- tores de excepción O y 1) 111 Bloque de la CPU (en el MC68000 sólo se emplea para con- tirnmación de las interrupciones) cos de datos (es decir, a las zonas hard reservadas para datos), pero los bancos de programas resultan inaccesibles. Inaccesibles a menos que se empleen las instrucciones MOVEC y MOVES. El siguiente ejemplo muestra cómo acceder a uno de los cuatro bancos, el banco de programas de usuario. MOVE.L 2,D0 Código de función del banco de programas de usuario MOVEC DO,SFC Asignamos valores al código función fuente MOVE.L 123456,D1 — Se lee el valor de la doble palabra almacenada en el banco de programas del usuario Nota: Cambiar el SFC o el DEC sólo afecta a la instrucción MOVES, nunca a la forma en como se ejecutan otras instrucciones, La capacidad de distinguir entre diferentes bancos de direcciones per- mite al MC68010 indicar al hard externo cuándo está accediendo bien a los programas del sistema, del usuario, o bien a los datos de cada uno de éstos. Resulta asi posible proteger una o varias de estas zonas del acceso no auto- rizado de los usuarios mediante un dispositivo hard, que eliminará che- queos redundantes por parte de la CPU, con el consiguiente ahorro de tiempo. Con el hardware adecuado, cada dirección banco de memoria se puede hacer corresponder con un bloque hardware diferente. Las implementaciones tipicas, sin embargo, usan, como ya se ha dicho, un solo bloque de memoria hard, Empleando los registros SFC, DEC y las instrucciones MOVEC y MOVES en modo supervisor, es posible conseguir que el OS acceda a los cuatro bancos. Modo lazo El MC68010 detecta automáticamente cuándo un bucle de instrucciones de tres palabras se ha repetido más de una vez, y entra en modo lazo. En 295 TABLA 7.3 mM Instrucciones que se pueden emplear en el modo lazo Instrucciones Operandos 5 MOVE lea, lea o rea,lea ADD SUB lea. Ica o Dn,lea CMP lea.rea o (Ax)+,(Ay)+ AND OR lea,Dn o Dn,lea EOR Dn,ica ABCD ADDX SBCD SUBX A Ax), AA) CLR NEG NEGX NOT lea TST NBCD lea ASL ASR LSL LSR lea ROL ROR ROXL ROXR lea este modo, las instrucciones no se toman reiteradamente de la memoria como ocurre en el modo normal, sino que se almacenan en la cola de preen- trada (pre-fetch queue) y en el registro de decodificación de la CPU, ys ejecutan continuamente, sin tener que tomarlas de la memoria de nuevo. Si el modo lazo se interrumpe por una excepción, se saldrá del mismo tras re- tornar y ejecutar dos iteraciones más del bucle. Asi, los bucles simples, como mover un bloque de bytes, sumar una lista de números o desplazar un grupo de números, pueden ejecutarse a velocidades comparables a la de una única instrucción (por ejemplo, un movimiento de un bloque). Ñ Los bucles que pueden entrar en modo lazo consisten en una instrucción de una palabra seguida por una instrucción DBcc. Las instrucciones permi- tidas se resumen en la tabla 7.3, donde lea indica una dirección efectiva de lazo: (An), (An), (An) +, y rea indica An o Dn. El MC68012 La única diferencia entre el MC68010 y el MC68012 es que el primero sólo puede direccionar hasta 16 MBytes de RAM (un bus de direcciones Q 24 bits), mientras que el segundo puede direccionar bien 1024 MBytes (bus de 30 birs) o 2048 MBytes (bus de 32 bits). Para todos los demás efectos po" demos considerarlos idénticos. L ¿Por qué ha diseñado Motorola el MC68012? Si una aplicación sita un bus de más de 24 bits de direcciones, parece apropiado emplear él MC68020, que permite emplear un bus de 32 bits. Hay dos razones quela vorecen el empleo del MC68012: dinero y compatibilidad. El MC68020 más caro que el MC68012, debido a las inversiones que ha habido que? var a cabo para desarrollar muchas de sus nuevas facetas. El MC68020* es compatible pin a pin con el resto de los anteriores miembros de la fi del 68000. Es posible desarrollar sofrware para el MC68010 y más pasar a un bus de direcciones más ancho (30 bits) sin más que reemplazar el MC68010 por un MC68012. Un MC68020 necesitaria un nuevo zócalo. Conclusión A partir del MC68010, los miembros de la familia del 68000 pueden emular todas las instrucciones de otros procesadores de esta familia. Excep- tuando el modo lazo, todas las nuevas caracteristicas añadidas al MC68010 tienen como fin el soportar la posibilidad de estas emulaciones. Se propor- ciona capacidad suficiente al procesador para soportar otros tipos de emu- lación, como memoria virtual y máquinas virtuales. El [VWC68020 En este capítulo se discutirán las nuevas caracteristicas del MC68020 comparadas con las del MC68010, Se supone que el lector está familtari- zado con las caracteristicas generales de la familia del 68000, ast como con las del MC68010 (capitulo 7). Las nuevas posibilidades del MC68020 cubren un extenso campo de aplicación. Estas nuevas caracteristicas incluyen un bus de direcciones de 32 bits y capacidades de cache ' para acelerar la ejecución de las instrucciones; 7 nuevas instrucciones para comunicarse con los nuevos coprocesadores, como el coprocesador de punto flotante Motorola MC68881; 6 nuevos mo- dos de direccionamiento para que sea más versátil, y un bit de master para trabajar en entornos de más de un sistema operativo, Además, muchas de las antiguas instrucciones de propósito general se han ampliado, mientras que otras nuevas se han añadido, incluyendo 8 ins- trucciones para manipular campos de bits; algunos nuevos formatos para multiplicar y dividir, así como las instrucciones de desplazamiento y bifur- cación, que se han ampliado. Finalmente, el MC68020 presenta un tamaño dinámico de hus, lo que permite al procesador comunicarse con dispositivos de 8, 16 6 32 bits, reali Adoptaremos la postura de considerar cache como un termino nducible, puesto que cn este contexto tiene un significado propio, que dificilmente se puede condensar en una solia palabra. En este contexto puede traducirse /nstruciión cache como acelerar una strucción, aun cuando cache indica, originalmente, almacenar para su uso posterior, 299 Instrucciones cache Capacidades cache en la familia del 68000 1) zando transferencias de datos de 8, 16 ó 32 bits, en cualquier combinag; e instante. Todas las restricciones de alineación de los datos se han eli nado, con excepción de aquella que establece que éstos deben encontra dentro de limites pares. El microprocesador tiene ahora 120 pines dispuestos en la parte infe de una estructura de planta cuadrada, en lugar de en los lados. Por ta actualizar un sistema incorporándole un MC68020 implica emplear un n zócalo. E El sistema de instrucciones cache, o sistema cache del MC68020, es q mecanismo que acelera la ejecución de los programas con pequeños bucles. Es una caracteristica del MC68020 que beneficiará a todos sus usuarios Esta capacidad puede ser activada y desactivada fácilmente y no impli cambios en la forma en la que se escriben los programas, ni introduce a ciones a la hora de una ejecución normal de los mismos a cambio de $ ventajas. . Motorola ha empleado los resultados del análisis de sus experi previas para diseñar la familia 68000. Las capacidades cache del MG son resultado de esta filosofia. Sus estudios demuestran que la mayoria los programas escritos en ensamblador emplea la mayor parte del tiempo: bucles de pequeño y mediano tamaño. Cuando no se emplea ningún Mm todo cache, las instrucciones del bucle deben tomarse una y otra vez de memoria; cuantas más veces se ejecute el bucle más veces se tomarán ) mismas instrucciones de la memoria. Asi es como trabaja el MC68000 : mayoría de los microprocesadores. ] El MC68010 introdujo una versión en pequeña escala del sistema cat) denominada modo lazo. El modo lazo sólo permite un total de tres Pi bras de instrucciones y sólo se activa cuando las dos últimas palabras bucle corresponden a una instrucción DBcc. En el capitulo 7 se encuent más detalles acerca del modo lazo. ¡ El MC68020 introduce una versión a gran escala de estas capacid Las instrucciones ya ejecutadas se almacenan en el propio procesador una memoria interna de 256 bytes, es decir, una memoria cache* de 64 0 - Nótese que ahora el sienificado correcto de cache no se corresponde con *'a sino con “almacén”, como ya se comentó anteriormente. Cache se refiere ahora a F en el sentido de memoria hardware, pues el cache es una pequeña memoria implantada microprocesador. A partir de ahora nos referiremos a esta acepción mediante el “memoria cache'', reservando para cache la acepción de ““acelerar””, y emplearemos * mino “sistema cache'' para referirnos al sistema que gestiona y controla todas estas *é£ dades. TABLA 8.1 Acción del sistema cache sobre los diferentes bloques de direcciones Control para el sistema cache Código de función Bloque de direcciones 001 Bloque de datos del usuario No 010 Bloque de programas del usuario Si 101 Bloque de datos del modo supervisor No 110 Bloque de programas del modo supervisor Si 111 Bloque de la CPU No accede a la memoria bles palabras de capacidad. La primera vez que se ejecuta el bucle no se obtiene ningún beneficio del sistema cache, cada instrucción se toma de la memoria, como se haria en un MC68010, A partir de la segunda ejecución del bucle comienzan los beneficios, pues el sistema cache detecta que las instrucciones están aún en la memoria cache y no intenta tomarlas de la me- moria. El resultado neto es una ejecución más rápida del programa. lincionamiento del sistema cache Se discutirá ahora el funcionamiento del sistema cache, pero antes es necesaria alguna preparación. Deberá revisar la discusión acerca de los có- digos de función que se mantuvo en el capitulo 7. En esta discusión estable- cimos que una referencia a una determinada posición de memoria impli- caba un total de 35 bits, de los cuales 3 constituian un código de función. La misión de este código es la de decidir de cuál de los bancos de memoria debe tomarse la dirección que indican los 32 bits restantes. Los cinco ban- cos de direcciones empleados en el 68000 y su uso en los sistemas cache se esboza en la tabla 8.1. Nótese que las instrucciones sólo se toman de la memoria fferch) cuando se emplean los códigos de función 010 6 110; en general, podemos estable- cer que la memoria sólo se ve involucrada, en lo que a las instrucciones se refiere, cuando los códigos de función toman la forma fI0. Los accesos a las demás zonas de memoria (con otros códigos de función) no se refieren a instrucciones y, por tanto, no se someten al sistema cache. Cuando el MC68020 toma de la memoria una palabra que contiene una instrucción, se carga en éste la doble palabra que la contiene. Por tanto, los dos últimos bis de la doble palabra que se cargan son siempre cero, de modo que po- demos imaginar los 35 bits que se han empleado como: Codigo de función Direcciones de la memoria hard (3 bots) (32 his) pAO0 vctere brrrerco correct 00 301 TABLA 8.2a | ' Instrucciones del programa inicial Instrucción Hex E 001000F4 agaa Ñ DO1000F6 bbbb DO1000F8 ecco DOLOO0FA dddd DOLO000FC ecve DOI000FE mE 00100100 gres 00100102 hhhh TABLA 8.2b Contenido de la memoria cache al comienzo de la ejecución Bit + Paipa de validación FC2 10l Dat 00 0 D4-Fa4 0 F4 0 FS 0 FC 0 Los 24 bits 1 se denominan tag del cache y los 6 bits 1 se denominan dice de cache. El índice de cache determina cuál de las 64 posiciones de memoria cache ocupará la doble palabra. Si dos instrucciones tienen el mi mo índice de cache, sólo una de ellas podrá estar en el mismo en un detefs: minado momento. Asi, pues, dos instrucciones que se encuentren separadas 256 bytes exactamente (o un múltiplo de 256) en la memoria no podrán C existir en la misma memoria cache. Nótese que este método de asignac de espacio en la memoria cache satisface dos criterios fundamentales: ejecución es simple (y, por tanto, rápida) y garantiza que cualquier grupo hasta 64 dobles palabras cabrá en la memoria cache en un momento dado: Cuando el sistema cache actúa sobre una instrucción mantiene cinco pe rámetros para cada doble palabra de instrucciones: Indice del cache: Definido por las direcciones [7:2] = 6 bits de la de rección de la doble palabra. Taz del cache: Direcciones [31:8] =los 24 bits más significativo% de la dirección de la doble palabra. Cache FC2: segundo bit del código de función (1 para el blo- que supervisor y 0 para el bloque de usuario). Bi de validación: 1 si el cache es válido y Osi no lo es. Datos del cache: Contenido de la posición de la memoria si cl bit de validación es 1 (el contenido permanece indefi- nido si el bit de validación es 0). El indice del cache es un número de 0 4. 63 y define en cuál es las 64 po- siciones de la memoria cache hay que trabajar. Las otras cuatro cantidades se almacenan en esa posición de la memoria cache. Ejemplos de cache Cuando se enciende un sistema basado en el MC68020. el procesado! pone a cero todos los bits de validación. La tabla 8.2a muestra un progra- ma ejemplo al arrancar y la tabla 8.2b muestra el estado inicial del sistema cache, Nótese que las instrucciones almacenadas en las posiciones indicadas en la tabla 8.2a están representadas, de forma ligurada, por los números hexadecimales SAAAA, SBBBB, .... SFFFE. Las primeras instrucciones que se ejecutan no están sometidas al sistema cache y se toman todas de la memoria. Cada instrucción ejecutada se alma- cena en la memoria cache poniendo su bit de validación a 1 para indicar que hay datos válidos en la memoria cache. Además se almacenan los res- tantes datos relativos a cada instrucción cache tag, cache FC2 y datos del cache. En la tabla 8.3a las instrucciones que se encuentran en las posiciones hexadecimales 001000F6 a 00100100 se han ejecutado como se indica me- diante letra negrita. La tabla 8.3b muestra cómo la memoria cache ha sido convenientemente actualizada, es decir, que el bit de validación se ha puesto a | para indicar la presencia de datos válidos y los demás parámetros del PABLA 8.34 Instrucciones del programa después de que se han ejecutado seis de ellas Dirección Hex D01000F4 adaa 001000F6 bbbb 001000F8 coco VOL000FA dddd 001000 FC eece 001000 FE grrr 00100100 PELE 00100102 hhhh 8 TABLA 8.3b Contenido de la memoria cache después de que se han ejecutado instrucciones Bit di e - - Indice validación FC2 Tuz Datos mi - 00 l 0 001001 2ggghhhh 04-F4 0 ES l 0 001000 aaaabbbb ES 1 0 001000 cccedddd FC ] 0 001000 ecccfffí sistema cache: cache FC2, cache tag y datos del cache, se han actualizado también. Nótese que el sistema cache toma la doble palabra que se encuen- tra en la posición hexadecimal 001000F4, aunque sólo se empleará la pa: labra menos significativa. Esto se debe a que la memoria cache está estruc- turada en dobles palabras, de modo que al leer los datos como si de dobles palabras se tratara se asegura que estarán justamente en los márgenes. Dela misma forma, el sistema cache toma la doble palabra, completa, que se en- cuentra en la posición 500100100, aunque sólo necesita la palabra de orden más bajo. Nótese también que los dos últimos digitos del indice del cache son ahora 00 en lugar de FF, el valor que tenian cuando actuaban como los dos digitos finales de la dirección de la memoria, debido al particular mé- todo que tiene el sistema de asignar posiciones dentro de la memoria cache. Si una instrucción que se encuentra en la memoria cache debe ejecutarse de nuevo, se produce una señal. Cuando esta señal aparece, se toman los. datos del cache en lugar de buscarlos en la memoria, con lo que no se nece- sita emplear ciclos del bus externo. Por ejemplo, en la figura 8.2, si la in- terrupción representada por los digitos Sggg resulta ser un salto a la ins- trucción con el código Saaaa, que se encuentra en la posición 001000FA, se: producirá una señal, porque esa instrucción está ya en la memoria cache. Nótese que la instrucción con el código $aaaa no se ha ejecutado nunca: realmente, pues se cargó en la memoria cache a la vez que la instrucción: Sbbbb, ya que ambas forman parte de la misma doble palabra. Estrictá- ” mente hablando, se produce una señal cada vez que el indice del cache, cache tag y el cache FC2 de una instrucción que se busca en la memoriá coinciden con alguno de los valores previamente almacenados en la memoó-. ria cache. Registros del sistema cache Para soportar el sistema cache se han añadido dos nuevos registros e control al MC68020, denominados registros del control del sistema cacé (CACR) y el registro de direcciones del sistema cache (CAAR). Ambos son registros de 32 bits, aunque sólo 4 bits de CACR y 6 del CAAR están ac- tualmente en uso. Además, la instrucción MOVEC se ha revisado para per- mitir el acceso a estos registros, El CACR contiene 4 bits que permiten controlar el funcionamiento ge- neral del sistema cache. Excepto por el control que estos registros pueden ejercer sobre el sistema cache, éste es automático e inaccesible. Los 4 bits son: Bit]: Activa el sistema cache (E) Bit 2: Congela el sistema cache (F) Bit 4: Pone a cero las entradas del cache (CE); emplea el CAAR Bit 8: Desactiva el sistema cache Si el bit E está a 0, no se aplica el sistema cache, todas las instrucciones se toman de la memoria. Al encender el sistema, el bit E se pone a 0, de modo que debe ser puesto a 1 antes de que el sistema cache pueda entrar en acción; para ello se emplean las instrucciones: MOVE. +1,D0 Asignar valores al bit E MOVEC — DO,CACR — Poner el bit Ea] Si el bit F está a 0, el sistema cache funciona como se ha descrito ante- riormente; cuando el bit F se pone a 1, la memoria cache funciona como memoria de sólo lectura. Es decir, las señales se procesan como anterior- mente, pero las nuevas instrucciones que no se encontraban va en la memo- ria cache no entran en la misma. Esto puede ser interesante durante las emulaciones, cuando el programador desea que una determinada rutina de emulación no entre en la memoria cache. Puede emplearse para optimizar los resultados del sistema cache. Uno de estos casos se discute en la sección siguiente. Se asignan valores al bit 1, según el siguiente ejemplo: MOVE.L *3,D0 Asignar valores a los bits E y E MOVEC DO,CACR Poner los bts EvtFal O, también: MOVEC CACR,DO Se leen los valores actuales del CACR ORI 2,00 Se pone el bit Fa 1 osin cambiar los demás bits MOVEC DO,CACR Actualizar el CACR Si leemos el bit € siempre lo encontraremos a 0. Sin embargo, si el bit € se encuentra a 1 pondrá toda la memoria cache a 0. Se puede poner a | el bit C de la forma siguiente: 305 MOVE.L *5.D0 Asignar valores a los bits C y E MOVEC DO,CACR Actualizar al CACR El bir CE es similar al bi €, a que sólo pone a 0 una de las. tradas de la memoria cache. Si leemos, el bit CE siempre se encontrará a 20, Si el bit CE se pone a 1, la posición de la memoria indicada en el CAAR + pone a 0. Esta posición la proporciona el indice del cache (bits [2:2)) del CAAR. Limitaciones del sistema cache El sistema cache es simple a la hora de la ejecución y de un tamaño mg- derado. Por tanto, hay situaciones en las que el programador debe tener en cuenta las limitaciones del sistema. En las situaciones descritas a conti- nuación se supondrá que, cuando el sistema cache está activo, la velocidad de ejecución será al menos tan grande como cuando está inactivo. Pop. tanto, habilitar el sistema sólo se traduce en un incremento de la velocidad. de ejecución. A continuación expondremos estas limitaciones. Primera: Acelerar las instrueciones mediante el sistema cache puede mo. dar resultados cuando se trata de bucles largos. La memoria cache está limi tada a 256 bytes. Si un bucle ocupa más de 256 bytes y se ejecuta muchas. veces. la memoria cache no podrá albergar todas sus instrucciones, de mo- do que muchas de ellas tendrán que leerse repetidamente de la memoña.. Segunda: Las rutinas que se usan tanto en modo supervisor como en. modo usuario tendrán que tomarse de nuevo en la memoria, incluso aun- que va estén en la memoria cache. El sistema cache considera que los at-: cesos a la memoria en modo usuario son diferentes a los accesos a la me- moria en modo supervisor. En una situación de hardware típica (como se. explicó en el capitulo 7), todos los bloques de direcciones se refieren ala misma memoria hardware. En otros entornos puede haber cuatro bloques diferentes de direcciones. Puesto que todo esto se determina fuera qe MC68020, éste no tiene forma de saber qué es lo que está sucediendo. Por. tanto, tiene que asumir el peor caso, es decir, aquel en el que las memo- rias de programa de modo usuario y supervisor se encuentran en distintos bloques. 4 Si se accede a una instrucción en modo supervisor (código de fun 110) e inmediatamente después se accede a la misma instrucción en m6 usuario (código de función 010), el MC68020 no tiene forma de saber si memorias de programa del modo supervisor y usuario se encuentran EM mismo bloque hardware y, por tanto, tiene que modificar el cache. Tercera: El sistema cache no controla los accesos a las memorias de tos. Supongamos, por ejemplo, que se ejecutan las siguientes instruccio MOVE.L F3XA0) MOVE.L (A1),(A2) El sistema cache controla las dos instrucciones, incluyendo el campo in- mediato. Sin embargo, no controla las referencias a los bancos de datos. Por tanto, si estas instrucciones se ejecutan de nuevo, los accesos a los du- tos (A0) se volverán a efectuar. Esta situación está justificada por diversas razones. Una de ellas es que, para acceder a los bancos de datos, se dupli- caría el espacio utilizado. Otra razón estriba en el hecho de que las áreas de datos están sujetas a cambios, y un funcionamiento correcto obligaría al sistema cache a controlar tanto las entradas como las salidas. Cuarta: La memoria cache debe ponerse a cero en determinados instan- tes críticos. Por ejemplo, si se carga un programa en la memoria y el conte- nido previo de ésta se encuentra aún en la memoria cache, es necesario poner a cero la memoria cache (o al menos desactivarla). De otro modo se producirían falsas señales, que darian lugar a resultados desastrosos. Quinta: El sistema cache puede fallar en sus intentos de acelerar varios bucles pequeños dentro de un programa. Consideremos una rara pero po- sible situación donde parte del bucle A reside entre las posiciones de memo- ra SXxxxxx00 y SXxxxxx7E y parte del bucle B reside entre las oposiciones Svyyyvy00 y Svyyyyv7F. Nótese que cada segmento ocupa 32 dobles pala- bras, es decir, la mitad de la memoria cache; sin embargo, ambas se alma- cenarán en la misma porción de la memoria cache, debido a las formas que tiene el sistema cache de asignar el espacio. Asi, los bucles A y B se alternan en la memoria cache, y el sistema cache no producirá ningún efecto. En este momento el bit IF viene al rescate. Si el bit F del CACR se pone al tras la ejecución del bucle A, entonces el bucle B no obtendrá ningún beneficio, pero el bucle A si, ¡Menos da una piedra! Sexta: Si un programa que se modifica durante su ejecución se almacena en la memoria cache pueden obtenerse resultados erróneos. Los programas “automodificantes'* están en contra de la filosofía de diseño de la familia de 68000, de modo que este problema no debe sorprendernos. Si una ins- trucción que entra en la memoria cache se modifica más tarde, en un pro- grama automodificante, cambiará en la memoria, pero no en la memoria cache. En caso de una llamada posterior a dicha instrucción, se ejecutará la versión antigua, almacenada en la memoria cache, en lugar de la nueva, que se encuentra en la memoria externa. El problema aquí consiste en que el programador está tratando su programa como si de datos de salida se tra- taran, y el sistema cache, ya lo hemos dicho, no está pensado para contro- lar las salidas de datos. Como ejemplo, el siguiente programa halla el primer código de condi- ción que es positivo en la comparación entre DO y DI. Luego se modifica e inicia un bucle empleando la instrucción modificada, BUCLE CMP.L— D0,DI Los dos registros permanecen inalterados EST” BHI PIN Esta instrucción se cambia a LS, CC, CS, ete, LEA TEST,A0 Hallar la dirección de la instrucción de prueba ADD.W — ¿H5100,(A0) — Se cumbia el codigo de condición anterior BRA RUCLE Se realiza otra comparación y otra prueba 307 FIN MOVE.W (40),D2 Se toma la instrucción Bcc ASR $8, D2 Se aisla el codigo de condición AND SF, D2 Se deja todo como estaba, excepto los últimos 4 bits Si el sistema cache está activo, la instrucción Bec se ejecutará como si un BHI se tratara. Si no está activo, no hay problema. La mejor solución consiste en no emplear programas automodificantes. Una solución muy ela. borada podria consistir en sustituir la instrucción que comprueba cada uno de los 16 códigos de condición por 16 instrucciones separadas. Un POCO de espacio extra resolvería un dificil problema. Otra solución, un poco peor en la lista de posible, consistiria en desactivar el sistema cache e impedir el aq. ceso de otros usuarios mientras se ejecute esta peliaguda rutina. Una vez finalizada, se reactiva el sistema cache y se permite de nuevo el acceso de otros usuarios. Nuevos modos de direccionamiento El MC68020 introduce varios modos adicionales de direccionamiento que permiten más y más lareos desplazamientos, un factor de escala y un nivel adicional de indirección. El programador principiante dificilmente en- contrará situaciones (si es que las encuentra) en las que estos modos de di- reccionamiento sean útiles y acabará concluyendo que simplemente ahorran una instrucción y que por este motivo se han implantado. A medida que las situaciones que el programador tiene que resolver se van complicando, se encuentra una mayor utilidad para estos nuevos (y más complejos) modos de direccionamiento. Esperamos que los ejemplos expuestos en esta sección ayuden a comprender lo anteriormente expuesto. Los nuevos modos de direccionamiento implantados se resumen €ñ 6 variantes de 2 de los 12 modos de básicos del 68000. Tres son variantes del modo 110, conocido originalmente como direccionamiento indirecto: con indice y desplazamiento de 8 bits; los otros tres son variantes del modo 110 011, conocido originalmente como direccionamiento indirecto por con: tador de programa con indice y desplazamiento de 8 bits. Estos dos conJulr: tos de variantes se implantan de forma paralela. Debido a este paralelismo, sólo necesitamos discutir en profundidad uno de estos modos, el otro es (0- talmente análogo. Debido a la complejidad de estos modos de direccionamiento, debemos aclarar dos puntos antes de continuar. , Primero: Los nuevos modos de direccionamiento suman varios núme ros, entre los que se incluyen números de 8, 16 y 32 bits, con y sin signo. E esta sección se supondrá que cuando se suman números de 8 y 16 pits $ realiza primero una extensión de sieno a formato de 32 bits. Esto se apli- cará a todos los campos, asi se trate de valores inmediatos, registros de los que sólo se emplea una palabra o byte o posiciones de la memoria. Segundo: Los ensambladores disponibles para los diferentes ordent” ae a dores pueden presentar pequeñas variantes en la sintaxis de los modos de direccionamiento. Esto es especialmente cierto para los modos de direc- cionamiento que se describen a continuación, debido a los múltiples pará- metros y operaciones involucradas. Estas diferencias sintácticas deben, sin embargo, ser de pequeña importancia y fácilmente traducibles de un ensam- blador a otro. En las próximas cinco secciones describiremos la forma original de uno de los modos de direccionamiento del MC68000, el direccionamiento indi- recto con indice y desplazamiento de 8 bits, y las tres variantes que de este modo están disponibles en el MC68020. Para ilustrar el modo de direc- cionamiento original y sus variantes, emplearemos varios ejemplos (en rea- lidad sólo trataremos con la dirección efectiva que se emplearía) construidos en torno al uso de tablas de conversión ASCIH-EBCDIC. A medida que se compliquen las variantes se complicarán los ejemplos. Direccionamiento indirecto por registro y memoria con índice Este modo de direccionamiento se ajusta a la forma 110 rrr, donde rr indica un número de 3 bits de un registro de direcciones (A0..,A7), El nombre de direccionamiento indirecto por registro y memoria con indice se refiere a las cinco variantes existentes en el MC68020, incluyendo la forma original que se encontraba en el MC68000 y las tres variantes disponibles en el MC68020, Como ya se ha mencionado anteriormente, la forma original de este mado disponible en el NC68000 se denominaba direccionamiento indirecto con indice y desplazamiento de 8 bits. Se representa por (d8,An,Rn.SIZE), donde: d8 indica cualquier desplazamiento de 8 bits con signo (valores desde —128 a +127) An cualquier registro de direcciones Rn cualquier registro de direcciones o datos SIZE un código de tamaño que puede indicar bien una palabra, bien una doble palabra La dirección efectiva se obtiene sumando d8, An y Rn.SIZE. Nótese que tanto di como Rn.SIZE sufren una extensión de signo antes de la suma. Un ejemplo útil de la forma original se obtiene considerando (0,A0, DO.W). Sr AO contiene la base de una tabla de conversiones ASCILEBCDIC y D0 contiene un byte ASCII, entonces (0,A0,D0,W) contiene la dirección efectiva del correspondiente byte EBCDIC, Factor de escala El MC68020 permite la inclusión de un tactor de escala en la dirección efectiva, representado por (d8,An,Rn.SIZE*SCALE) *, donde SCALE toma los valores 1, 2,4 u 8. La dirección efectiva se obtiene de forma similar a como se Obtiene la forma original. La dirección efectiva se obtiene sumando d8, An y Rn.sL ZE*SCALE. Nótese que tanto d8 como Rn.SIZE*SCALE sufren una ex. tensión de signo antes de la suma. Un ejemplo del uso del factor de escala se obtiene empleando (0,A0, DO.W*2). Como en el caso anterior, asumiremos que AO contiene la base: de una tabla de conversiones ASCI-EBCDIC. Ahora, sin embargo, la ta- bla contiene dos bytes por cada entrada: el primer byte indica si la conver- sión en el sentido ASCILEBCDIC es posible (indicador de conversión) y el segundo indica el código EBCDIC correspondiente, cuando procesa. Así, si DO contiene un byte ASCII, entonces (0,A0,DO.W=2) contiene la dirección efectiva del indicador de conversión y (1, A0,DO.W*2) la del byte EBCDIC, En la forma original del MC68000 y en la forma escalada del MC d$ puede tomar un valor nulo, pero d8, AO y Rn deben estar presentes, Esto contrasta con las tres variantes descritas a continuación, en las que todos los registros y desplazamientos son opcionales. Variante +1 Esta variante se denomina direccionamiento indirecto por registro con indice y desplazamiento de la base y se representa por (bd,An,Rn.SIZE* SCALE), donde bd es el desplazamiento de la base, de 0, 16 Ó 32 bits. Los tres parámetros son opcionales. Este carácter opcional es Conve- niente cuando uno de estos parámetros no se necesita y no se encuentra Un registro libre para asignarle un valor nulo a la hora de calcular la dirección efectiva. La dirección efectiva en esta variante se evalúa de forma similar a como. se hace en la forma original. Si uno de los tres parámetros no está pre É se le asigna un valor cero. La dirección efectiva se obtiene sumando bd, ÁN y Rn.SIZE*SCALE. Rn.SIZE*SCALE sufre una extensión de signo antes de la suma. Un ejemplo del uso de esta variante se obtiene considerando (des1,A0, D0.W=x*2). Esta vez supondremos que AO es la base de una zona de ( cualquiera que contiene varias tablas, una de las cuales es nuestra vieja e nocida tabla de conversión ASCH-EBCDIC. Si des! es la distancia de? base de la tabla de conversión respecto a la base de la zona de datos y DO contiene un byte ASCII, entonces (des1,A0,D0.W*2) y (desl + 1, A0,DÓ- Hemos optado por no traducir los términos ingleses SIZE (tamaño) y SCAÍ E (escalar pues forman parte de la sintaxis de un modo de direccionamiento del cálculo de la E efectiva. 310 W+*2) contienen las direcciones efectivas del indicador de conversiones y del byte EBCDIC (como se indicó en el ejemplo del factor de escala). Nótese que el modo de direccionamiento indirecto por registro de datos (Dn) se puede generar empleando esta variante. Esto se consigue omitiendo bd y An, y usando un registro de datos para Rn. Variante 42 Esta variante se denomina direccionamiento posindexado indirecto por memoria, y se representa por ([bd,An],Rn.SIZE*SCALE, od), donde od in- dica un desplazamiento exterior de 0, 16 Ó 32 bits. La evaluación de la variante 2 es similar a la de la variante 41, ex- cepto que se emplea un nivel extra de indirección en mitad del cálculo de la dirección efectiva. Los cuatro parámetros bd, An, Rn y od son opcionales. Si un parámetro no está presente, se le asigna un valor cero. La dirección efectiva se evalúa sumando primero los valores de bd y Án y tomando, de la memoria, el contenido de la doble palabra a la que apunta la suma de am- bas. Finalmente, se obtiene la dirección efectiva sumando esta doble pala bra, Rn.SIZE*SCALE y od. Veamos un ejemplo de esta variante empleando ([des!,A0],D0,W>=2). Esta vez supondremos que las tablas de datos no están todas en el mismo si- tio, sino distribuidas por doquier. Conocemos la dirección de cada una de las bases de cada tabla y, además, todas ellas se encuentran en una tabla maestra cuya base está almacenada en AO. La cantidad des! indica el des- plazamiento que hemos de efectuar en esta tabla maestra para hallar un puntero que nos lleve a la tabla de conversión deseada. La expresión [dis!, A0] nos lleva en realidad a la base de la tabla de conversión adecuada, mientras que ([dis!, AO], DO.W*2) es la dirección efectiva del valor EBCDIC correspondiente al byte ASCIL almacenado en AO, si consideramos una tabla de conversión de dos entradas. Variante 43 La tercera de las variantes se denomina direccionamiento preindexado por memoria, y se representa por ([bd,An,Rn.SIZE*SCALE]J,09). Esta variante se evalúa de forma similar a como se hace con la variante %2, sólo que el nivel adicional de indirección tiene lugar en otro momento. Los cuatro parámetros bd, An, Rn y od son opcionales. Si un pará- metro no está presente, se le asigna un valor cero. La dirección efectiva se evalúa sumando primero los valores de bd, An y Rn.SIZE*SCALE y lo- mando, de la memoria, el contenido de la doble palabra a la que apunta la suma anterior. Finalmente se obtiene la dirección efectiva sumando esta doble palabra y od. Nótese que las variantes 42 y 43 difieren sólo en el momento en que el registro indice se suma antes (variante 43) o después (variante %2) de la referencia de la memoria. 311 Direccionamiento indirecto por contador de programa y memoria con desplazamiento e índice Este modo de direccionamiento emplea el código 111 011. El nombre direccionamiento indirecto por contador de programa registro y Memoria con indice se refiere a las cinco variantes existentes en el MC68020, in- cluyendo la forma original que se encontraba en el MC68000, y las tres ya. riantes disponibles en el MC68020. : La discusión precedente, referente al modo de direccionamiento indi- recto por registro y memoria con indice y a sus tres variantes, se aplica por completo a este modo de direccionamiento y a sus variantes. La única dife. rencia entre ambos modos de direccionamiento estriba en que la segunda, es decir, la que actualmente discutimos, emplea el contador de programa (PC) en lugar de un registro de direcciones (An). Para aplicar lo anterior a este modo de direccionamiento basta con reemplazar “registro de direc- ciones”? por “contador de programa”, “An'' por '**PC” y **direcciona- miento indirecto por memoria'' por “direccionamiento indirecto por me- moria relativo al PC”, Nótese que en cada uno de los ejemplos anteriores la tabla de conver- sión ASCIT-EBCDIC podia encontrarse en cualquier lugar de la memoria, Si la tabla está localizada dentro del propio programa, es mejor emplear el direccionamiento relativo al PC (etil,PC,DO.W+*2) en lugar del modo (des. PC,DO0.W+2). El segundo modo nos priva del registro AO, al que, además, hay que asignarle valores mediante una instrucción “LEA etill, AO”. Las tablas 8.4 y 8.3 resumen los nuevos modos de direccionamiento y la sintaxis de sus direcciones efectivas. Los bits de traza TO y T1 312 : Los bits de traza permiten que un programa controle a otro. Asi es po- sible que un programa maestro, P-1, controle la ejecución de otro progra: ma esclavo, P-2, instrucción a instrucción. Esto se hace empleando el bit de traza Tl, que es el bit 15 del registro de estatus. Cuando este bit se pont al, se produce una excepción de traza cada vez que termina una instrue: ción. Asi, P-1 debe poner a 1 el bit Tl empleando una instrucción privile- giada y comenzar la ejecución del programa P-2. Cada vez que se ejeculá una instrucción del programa P-2, el 68000 genera una excepción y retoma el control a P-1, que analiza lo sucedido y devuelve el control a P-2 con un RTE. El proceso se repite hasta que P-1 lo detiene. Los bits de traza permiten crear programas capaces de efectuar Un com trol exhaustivo de los efectos de cada una de las instrucciones. Estos pro gramas incluyen facilidades de ensamblado y depuración, asi como progra” mas que detectan la frecuencia de ejecución de cada instrucción. En el MC68000, el bit de traza TO no se emplea y está siempre a 0; ade- más, el único bit de traza es el bit Tl, que se denomina bit T. El funciona" TABLA 8.4 Direccionamiento indirecto por registro con índice y memoria: Modo LLO rrr Formato CPU Sintaxis de la dirección efectiva Parametros Original 68000 (18, An,Rn.SIZE) Requeridos Original 68020 (d8,An,Rn.SIZE*SCALE) Requeridos Variante +1 68020 (bd, An,Rn.SIZE*SCALE) Opcionales Variante 42 68020 ([bd,An],Kn.SIZE+*SCALE,od) Opcionales Variante 43 68020 ([bd,An,Rn.SIZE*SCALE],od) Opcionales TABLA 8.5 Direccionamiento indirecto por registro con índice y memoria: Modo 110 011 Formato CPU Sintaxis de la dirección efectiva Parámetros Original 68000 (48, PC,Rn.SIZE) Requeridos Original 68020 (48, PC,Rn.SIZE*SCALE) Requeridos Variante 41 68020 (bd, PC,Rn.SIZE*SCALE) Opcionales Variante 42 68020 ([bd, PC), Rn.SIZE*SCALE,od) Opcionales Variante 43 68020 ([bd, PC,Rn.SIZE+*SCALE],od) Opcionales TABLA 8.6 Bits de traza Pl PO Funciones de traza 0 0 Modo traza inactivo 0 1 Se activa el modo traza en las instrucciones que afectan al control del flujo (Bec, JMP,DBec) | 0 Modo traza activo para todas las instrueciones | 1 (Reservado por Motorola) miento de los bits de traza es, pues, compatible, es decir, los programas de MC68000 que empleen Funciones de traza funcionarán correctamente en el MC68020. La única excepción se planteará si algún programador se ha dedicado a jugar con el bit TO en el MC68000: los programas que usen este bit ono se ejecutarán correctamente en el MC68020. 313 Funcionamiento con coprocesador El MC68020 tiene siete nuevas instrucciones para controlar las comuni. caciones entre el mismo y sus coprocesadores. Los coprocesadores SON pro. cesadores que cumplen determinados requerimientos hardware especifico por Motorola. Uno de los requerimientos básicos es que el coprocesador debe tener ciertos registros para comunicarse con el procesador principal. Una discusión completa de los coprocesadores incluye la descripción de- tallada de cada una de las instrucciones del 68000. de los requisitos hard. ware de interconexión y de las funciones particulares que cada coprocesador ofrece. En esta sección nos limitaremos a dar una visión general de las ins- irucciones de comunicación con los coprocesadores del 68000. al tiempo que mostramos cómo tienen lugar, realmente, estas comunicaciones. El propósito de esta sección es el de aclarar, al menos desde el punto de vista del programador, la forma en que el 68000 intercambia instrucciones y da- tos con los coprocesadores. Consideraremos también la situación que se presenta cuando un coprocesador no se encuentra fisicamente presente en el sistema y es emulado por sofware hasta el momento en que se instale el dis positivo hardware. Si los párrafos siguientes resultan oscuros, revise la sección de los có. digos de función del capitulo 7. Comunicaciones con los coprocesadores: Aspectos hardware dt Í 314 Veamos, en primer lugar. lo que ocurre a nivel hardware. Para enten- der correctamente las instrucciones de comunicación coprocesadoras del MC68020, un coprocesador debe tener un conjunto de 13 registros de inter- faz estándar (registro de control, de órdenes, de condición, etc.) con 32 bytes en total. Emplearemos uno de estos registros, el registro de Órdenes, en los ejemplos que siguen. Este registro se encuentra siempre en la posi- ción 10 (decimal) en los 32 bytes. Cuando el 68000 se comunica con un coprocesador, lee o escribe en uno o más de los registros del coprocesador. Para lograr este propósito, el 68000 envia el código 111 por las tres lineas de códigos de función, indicando un bloque de memoria reservado para la CPU. Las 32 lineas de direcciones del 68000 envian 32 bits en el formato! XXXX oXXXX XXXX O010 ccoxoXXXxX o XXXI Trrr las 32 lineas de datos del 68000 envian 32 bits de datos. Cuando el código de función es el 111, los 32 bits de las lineas de direc- ciones no se interpretan como una dirección de 32 bits (como en el caso de otros códigos de función), sino que se parte esta información en trozos pequeños, que se emplean para determinar la posición final del bloque 1é- servado para las funciones 1/0 de la CPU. De este modo, el código indica que nos encontramos ante una transferencia de información hacia/ desde un coprocesador (en contraposición con otras transferencias de info: mación al bloque de la CPU), cc es el código del coprocesador (de 0 a 7) que indica a qué coprocesador estamos accediendo y rrrrr es el registro de direcciones del coprocesador (de 0 a 31, en decimal). Las x indican bits que no se emplean hoy en dia. Los códigos de coprocesador actualmente disponibles son: 000 MC68851, unidad de manejo de memoria paginada 001 MC68881, coprocesador de punto flotante DOI-101. (Reservado por Motorola para su uso) 110-111. (Reservado para los usuarios) Es necesario, para establecer una comunicación eficaz, que el procesá- dor, o cualquier otro dispositivo hardware intermedio, pueda detectar cuándo salen las señales anteriormente descritas del 68000, para, al recono- cerlas como señales de comunicación con un coprocesador, poder responde: adecuadamente, Si el 68000 está intentando enviar información al coprocesador, la res- puesta adecuada del coprocesador será la de recibir los datos que le envian la través de las 32 lineas de datos del 68000) y almacenarlas en el coprocesa- dor ccc en el registro rrrrr. Si el 68000 está intentando leer información del coprocesador cec, éste debe enviar al 68000 el contenido del registro rrr por las lineas de datos. Esto cubre el aspecto hardware de las comunicaciones con los procesadores. Vamos a ver ahora cómo el programador puede en- viar los códigos de función y los bits adecuados de direcciones para acceder al coprocesador deseado, Comunicaciones con los coprocesadores: Aspectos software ¿Cómo se comunica el programador normal con un coprocesador? En general, se empleará un ensamblador que soporte el coprocesador en cues- tión. Se incluirán entonces en el programa algunas instrucciones del copro- cesador, para comunicarse con él siguiendo las normas de la documentación del coprocesador. Asi, finalmente, el ensamblador generará el código ob- jeto adecuado con los parámetros del coprocesador. Nótese que la misma clase de comunicaciones con diferentes coprocesadores dará lugar a dife- rentes códigos objetos, debido a los diferentes códigos de identidad de los coprocesadores y dado que cada uno de ellos tiene su propio conjunto (len- guaje) de comandos. Por ejemplo, supongamos un coprocesador denominado MC99999 que controla el consumo de potencia controlando cientos de medidores. El MC68020 se comunica con el MC99999 inicialmente para arrancarlo y el coprocesador emplea varios segundos o minutos en la tarea de control, re- 315 velando al MC68020 de la pesada carga. El MC99999 deja los resultados en la memoria e indica al MC68020 que ha terminado la misión que se le en- comendó. Una de las instrucciones de comunicación con los procesadores MC68020 es la instrucción cpGEN. Esta instrucción envía un comando de 16 bits a un registro del coprocesador. Supongamos que el MC99999 tiene como código de procesador el número 2 y que la recepción de una instruc- ción de 16 bits, denominada POLL, en su registro de órdenes da lugar a que el MC99999 comience una sesión de medidas. Supongamos que en el len. guaje del MC99999 la instrucción POLL tenga un código $1234. Un ensam- blador hipotético, que soportará el MC99999, aceptaría la instrucción: cpGEN METER,POLI Nuestro hipotético ensamblador habria asociado el simbolo '*METER* con el código del MC99999 (es decir, 2) y ensamblaria el código del coman- do POLL, asignándole el código binario adecuado (hex $1234). Una instruc- ción cpGEN se ensambla en dos palabras, que generalmente se representan como: Donde Ccc es el código del procesador, Xxxxxx es una dirección efectiva opcional (que no se emplea en el MC99999) y la segunda palabra es, real- mente, la instrucción enviada al coprocesador. Entonces. la instrucción cpGEN queda, una vez ensamblada: l l l 1.0.1.00.0. 0.0 0. 0. .0.0.0.0 0.00 0 1 0 0 1 0 0 0 1 1.0 1 0% Ahora que hemos estudiado los aspectos software y hardware del fun- cionamiento con un coprocesador, vamos a ver qué pasa cuando falta al- guno de estos elementos. Emulación de las instrucciones de manejo de coprocesadores del MC68020 ¿Es indispensable tener un MC68020 para acceder a los coprocesadores? No, simplemente es más fácil, más rápido y usa menos registros que MC68010, pero no es indispensable. . La instrucción cpGEN del MC68020 discutida en la sección anterior $: equivalente a las siguientes instrucciones del MC68010: 316 Mid MOVE.L 47,D0 Código de función del bloque de la CPU MOVEC DO,DFC Movemos el código de función al registro de códigos de función MOVE.L HSO00024D0A,A0 — Ponemos el ccc = 2 y el rrrrr= 10 (decimal) MOVE.L +51234,D1 Escogemos los datos a mover MOVES — DI(AO) Y movemos DI al registro 10 del coprocesador 2 (decimal) Nótese que en el MC68020 todo lo anterior se consigue con una sola ins- trucción, y sin emplear los registros DO, Dl y AO, Puesto que todas las instrucciones anteriores forman parte del juego de instrucciones del MC68010, el aspecto sofrwere de las comunicaciones con un coprocesador puede emularse en el MC68000. Discutiremos ahora las capacidades de que están dotados el MC68010 y el MC68000 para comuni- carse con los coprocesadores, Coprocesadores y el MC68010 Si se conecta un MC99999 a un MC68010, es necesario emular las instruc- ciones de comunicación con los coprocesadores de que dispone el MC68020, empleando las instrucciones del MC68010. Una solución más elegante sería, sin embargo, la siguiente: incluir las instrucciones de manejo de coprocesador en el programa, aunque éstas no formen parte del conjunto de instrucciones del MC68010; cambiar el en- samblador para que ensamble las instrucciones de la misma forma que lo haria un ensamblador del MC68020, o emplear un ensamblador para este último procesador, y, finalmente, cambiar las rutinas de excepciones para que al detectar el código 1111, no implementado, lo emule por sofware. Coprocesadores y el MC68000 Desgraciadamente, el MC68000 es totalmente incapaz de comunicarse con los coprocesadores, no sólo porque carece de las instrucciones especi- ficas del MC68020, sino también porque carece de la instrucción MOVEC y MOVES del MC68010, Lo mejor que el MC68000 puede llegar a hacer es emular el MC99999 en software y hardware. La emulación de los coprocesadores por software no es siempre posible. En el caso de un coprocesador con una misión hardware altamente espe- cializado, como el MC99999, la emulación puede ser imposible. Algunos coprocesadores pueden ser emulados implantando otros dispositivos hard- ware. Y para otros coprocesadores, como el MC68881, coprocesador de punto flotante, la emulación sofrware es totalmente posible. De hecho, hay muchos sistemas basados en el 68000 que están empleando simulaciones software del MC68881, Emular las caracteristicas hardware en software presenta muchas ven- 317 tajas. Primera: Permite al fabricante del MC99999 realizar un modelo qa comportamiento del chip antes de invertir en el desarrollo hardware mismo. Segunda: Permite al fabricante del MC99999 instalar estas emula. ciones antes de que el MC99999 este realmente disponible. La emulacié será varias veces más lenta que el MC99999 en si, pero en el mundo de los ordenadores una rutina lenta es mejor que no disponer de ninguna, Percera: Una vez que el MC99999 o el MC68881 estén disponibles, bas- tará con conectarlos al sistema MC68010 o MC68020 y el coprocesador fun- cionará sin necesidad de cambios en el sofware. Coprocesadores no conectados en el MC68020 Si el MC99999 no se encuentra realmente presente y el MC68020 intenta comunicarse con él, se le notificará este hecho tras un ciclo del bus y se pro» ducirá una excepción motivada por una instrucción 1111 no implementada, Todo esto ocurre de forma automática. La rutina de excepción que se dispara en este caso puede simplemente indicar que el MC99999 no se encuentra presente, o bien emularlo en soft ware y devolver el control al programa. Como se ha discutido en la sección anterior, si se emula el MC99999 y éste se conecta más tarde, no serán nece- sarios cambios en el sofware. Coprocesadores no estándar 318 ¿Qué ocurrirá si el MC68020 se conecta a un coprocesador que no dis- pone de un interfaz estándar? Las instrucciones del MC68020 no serán capaces de conectarse con el coprocesador y, por tanto, no lo podrán em: TABLA 8.7 Resumen de las instrucciones de control de coprocesadores Mnemónico Descripción E cpGEN Envia una instrucción general al coprocesador cpSec Como Sec, pero emplea los códigos de condición del co- procesador cpDBec Como Dbcc, pero emplea los códigos de condición del C0- procesador , cpTRAPce Como TRAPec, pero emplea los códigos de condición del coprocesador cpBec Como Bcc, pero emplea los códigos de condición del co- procesador cpSAVE Salva el estatus del coprocesador (privilegiada) cpRESTORE Restaura el estatus del coprocesador (privilegiada) pa plear. Habrá, pues, que sustituirlas por rutinas que empleen de forma expli- cita MOVEC, MOVES y MOVE para comunicarse con las direcciones ade- cuadas dentro del propio coprocesador. Estas rutinas serán similares, pero no idénticas, a las empleadas cuando el MC68010 emula las instrucciones de comunicación con los coprocesadores del MC68020, Resumen de las instrucciones de manejo de coprocesadores del MC68020 Las siete instrucciones de manejo de coprocesadores del MC68020 se adaptan todas, para la primera palabra de instrucciones, al formato: LLE clns A NOOX XxX Donde Cec es un código de 3 bits que identifica al coprocesador, Ins depen- de de la instrucción y Xxxxxx depende de la misma. Nótese que los cuatro primeros bits de cada una de estas instrucciones son 1111. Como en otras instrucciones del 68000, algunas de éstas vienen seguidas de palabras adi- cionales en las que se incluyen desplazamientos, datos o códigos de con- dición. El bit de master El bit de master (M) se emplea en entornos donde varios sistemas opera- tivos (jobs* privilegiados) están activos a la vez. El bit M distingue el sis- tema operativo maestro del resto de los sistemas. Debe notarse que excepto en el caso de desarrollo de sistemas operativos a muy bajo nivel, el progra- mador normal no usará nunca el bit M. Modos usuario y supervisor El bit de master es una extensión del bit S, y el bit S es el mecanismo fundamental del 68000 para controlar las operaciones privilegiadas. Para clarificar la función de los bits S y M explicaremos, en primer lugar, los motivos para disponer de ambos. Algunas funciones del procesador se consideran tan importantes que sólo algunos usuarios privilegiados o algunos programas privilegiados (como sistemas operativos) pueden tener acceso a ellas. En el 68000, estas funcio- nes incluyen: í No traduciremos el término job, que indica cada una de las tareas que se ejecutan bajo el control de cierto sistema operativo (programas, manipulación de ficheros, etc.), pues es un término incorporado a la jerga informática española. 319 Una interrupción irreversible de todos los procesos en curso (RESET STOP , STOP). Errores de cualquier tipo (errores de bus, errores de direcciones, erro. res de instrucción, divisor cero, errores de coprocesador). Traps de usuario. Interrupciones externas provocadas por el hardware. El 68000 simplifica el concepto de privilegio al mecanismo más sj posible, es decir, en cualquier instante el 68000 está en modo privilegiado (supervisor) o en modo no privilegiado (usuario). Cuando se da cualquier condición de las listadas más arriba se abandona el programa en curso estemos en modo usuario o supervisor) y se pasa el control al modo privile. glado (supervisor) y alguna rutina especial decide qué hacer ante la gi. tuación planteada. En algunas de estas rutinas la decisión a tomar depen- derá de forma crítica del modo, supervisor o usuario, en que se encontraba el programa original cuando se produjo la situación anormal. Una vez que el mecanismo de privilegios se ha activado de esta forma, aparecen dos funciones privilegiadas adicionales, a saber: e Alternar entre los modos supervisor y usuario. e Solicitar información acerca del modo activo (MC68010). Llamar al modo supervisor es una función privilegiada y requiere una rutina privilegiada para decidir si se permite o no. Incluso solicitar informa- ción acerca del modo activo (**¿Estoy actualmente en modo supervisor?”) es una función privilegiada. Esta situación de privilegio es necesaria pará posibilitar situaciones en las que el sistema operativo principal emula otro sistema operativo. El sistema emulado se ejecuta en modo usuario, pero piensa que se encuentra en modo supervisor. Debe mantenerse en usuario, de modo que el sistema principal pueda interceptar cualquiera de las preguntas que, acerca de su estado, pueda plantear el sistema emulado, para devolver una respuesta adecuada. Hay sólo dos niveles de privilegio en el sistema del MC68000, pero pué- den implantarse más, de forma artificial, en el sofrware. Simplemente mal: tengamos a todo el mundo en modo usuario (es decir, sin privilegios) y asig- nemos a cada cual un nivel de privilegio (por ejemplo, de O a 255). € alguien intente emplear una función privilegiada, se pasará el control a uni rutina adecuada, que comprobará el nivel de privilegio asignado y decidirá lo que deba permitir. implementaciones de los modos usuario, supervisor y master En el MC68000, el bit 13 del registro de estatus se denomina bit S, o bi supervisor. El bit S se emplea para indicar cuándo el procesador se ente? 320 a tra en modo usuario (de bit S a 0) y cuándo se encuentra en modo supervi- sor (de bit S a 1). Algunas instrucciones, que se consideran privilegiadas, sólo se permiten cuando el sistema se encuentra en modo supervisor. Estas instrucciones son: instrucciones que cambian el bit S, que leen el bit S y MOVE USP, MOVEC, MOVES, RESET, STOP y RTE. Cuando se intenta levar a cabo una operación privilegiada en modo usuario se desencadena una excepción por violación de privilegio. El resto de las excepciones ocurre de la misma forma, esté el procesador en modo usuario o supervisor. Hay dos pilas, cada una con su propio puntero. El puntero de pila de usuario (USP) se emplea mientras el sistema está en modo usuario y el puntero de pila de modo supervisor (SSP) se emplea cuando el sistema se encuentra en modo supervisor. Siempre se hace refe- rencia al puntero de uso mediante A7, ya se esté en USP o SSP. Cuando se produce una excepción se genera un bloque de información (denominado trama de pila), que se almacena en la pila de modo supervisor, y se llama a la rutina de excepción adecuada. Cuando la rutina acaba, se elimina de la pila en modo supervisor trama de pila y se retorna el control al lugar donde ocurrió la excepción (a menos que ésta sea irrecuperable). En el MC68020 se ha señalado otro bit para emplear conjuntamente con el bit S. Este es el bit 12 del registro de estatus, denominado M, o bit de master. En modo usuario (S = 0), las cosas suceden como en el MC68000. En modo supervisor (S = 1), existen, sin embargo, dos nuevos submodos. Cuando el bit M está a cero, el modo de interrupciones se considera activo y A7 se refiere al puntero de interrupciones (1SP), que apunta a la pila de interrupciones. Cuando el bit M está a 1, el modo master está activo y A7 se refiere al puntero de pila en modo master (MSP), que apunta a la pila en modo master. Siempre es posible referirse al puntero de pila activo median- te A77, ya sea éste USP, ISP, o MSP. Cuando el bit M se pone a 0, todos los cambios de modo y pila fun- cionan como en el caso del MC68000, entendiéndose que la pila en modo supervisor actúa como pila de interrupciones. Cuando M se pone a 1, sin embargo, el tratamiento de las excepciones cambia de dos formas. Primera: las excepciones crean ahora tramas de pila en la pila en modo master, en lugar de en la pila en modo supervisor. Segunda: durante una excepción de interrupción por el hardware externo, la trama de pila se introduce en la pila en modo master y también se introduce en la pila del modo de interrup- ciones, al tiempo que se pone el bit M a 0, causando un cambio en el modo de interrupciones para subsiguientes procesos que empleen este bit. Así, un usuario normalmente opera en la pila en modo master, pero durante un proceso de interrupción provocado por el hardware externo opera en la pila de interrupciones, como en otros Jobs. Cada proceso de excepción termina normalmente con una instrucción RTE, que retorna el control al modo original, asi como el acceso a la pila en dicho modo. En el caso de la doble trama de pila descrita más arriba, la instrucción RTE elimina ambas tramas de pila y retorna el control al modo original. 321 Las nuevas instrucciones del MC68020 Se han efectuado algunos cambios en el juego de instrucciones MC68020. Muchas instrucciones antiguas han ampliado sus capacidades, q] tiempo que se han añadido muchas instrucciones nuevas. En la sección fi de este capitulo cubriremos todas las instrucciones que se han ampliado o añadido. Instrucciones de bifurcación que admiten desplazamientos de 32 bits Las instrucciones Bcc, BRA y BSR admiten ahora desplazamientos de 32 bits. Las instrucciones originales, con un formato de una única palabra, contenian 8 bits de código de operación y 8 bits de desplazamiento. Si el desplazamiento de 8 bits es nulo, la palabra siguiente se emplea como des- plazamiento de 16 bits. En el MC68020, si el desplazamiento de 8 bits es 255 (decimal), entonces las dos palabras siguientes se emplean como desplazamiento de 32 bits, El programador en lenguaje ensamblador generalmente no necesita estar al tanto de estas particularidades, porque el ensamblador decide automática- mente el formato a emplear. Versión de 32 bits de la instrucción LINK Originalmente, la instrucción LINK sólo admitía desplazamientos de 16 bits, mientras que ahora admite desplazamientos de 16 y 32 bits. Extensión de bytes a dobles palabras La instrucción EXTB.L amplia el signo de un byte a una doble palabra en un registro de datos. Las instrucciones originales del MC68000 son EXT.W, que amplia el sieno de un byte a una palabra, y EXT.L, que am plia el signo de una palabra a una doble palabra. En los antiguos 68000 erá 2 ”. necesario emplear las dos instrucciones EXT.W y EXT.L para lograr lo qué ahora se hace con una sola instrucción. Ampliación del límite superior a doble palabra para la instrucción CHK La instrucción CHK del MC68000 comprueba que los valores de los Té gistros de datos sean menos que el de una palabra dada. La instruccl CHK del MC68020 realiza la misma operación tanto con palabras CO ] con dobles palabras. No hay cambio aparente en la sintaxis de la operación, pero el ensamblador permitirá limites de 16 bits y decidirá automáticamente qué formato emplear. CHK2 (instrucción nueva) Se trata de una extensión posterior de la instrucción CHK. La instruc- ción CHK2 (comprobar dos límites) nos permite comprobar si un registro de datos o direcciones están dentro de unos limites que pueden ser bytes, palabras o dobles palabras. Todas las combinaciones están permitidas. La sintaxis es CHK2 ea,Rn, donde ea es la posición del límite inferior. El límite superior debe encontrarse inmediatamente después del inferior, a una dis- tancia de 1, 2 0 4 bytes, según el caso. CMP2 (instrucción nueva) La nueva instrucción CMP2 (comparar dos límites) opera como la ins- trucción CHK2, excepto que no produce un frap en el caso de que el valor dado se encuentre fuera de los límites, sino que pone los códigos de condi- ción a los valores adecuados, permitiendo al usuario iniciar la opción opor- tuna. La sintaxis para esta instrucción es CMP2, ea,Rn y los indicadores de condición se ven afectados como sigue: N: Indefinido Z: Se pone a | si Rn coincide con cualquiera de los límites ya 0D en los demás casos V: Indefinido C: Se pone a | si Rn está fuera de los límites y a 0 en los demás casos X: No se ve afectado CAS y CAS2 (instrucciones nuevas) CAS y CAS2 son instrucciones de comparación e intercambio, y ambas previenen contra el acceso de varios usuarios a las mismas áreas. Se pueden considerar como extensiones de la instrucción original TAS del MC68000, En un entorno multiusuario, la forma más sencilla de evitar que varios usuarios intenten actualizar la misma zona de datos se consigue estable- ciendo en algún lugar un indicador al que (por mutuo acuerdo) sólo puede asignar valores un usuario cada vez. La instrucción TAS permite a un usua- rio comprobar si un indicador está a 1 y, si no lo está, ponerlo a este valor. Además, TAS garantiza (y esto es lo más importante) que nadie tenga ac- ceso al indicador durante el ciclo completo de lectura-modificación-escri- tura. 323 Por tanto, TAS satisface los requisitos minimos necesarios para implan. tar con garantias un entorno multiusuario, Después de poner a | el ingj > dor. el usuario es libre de ejecutar la rutina de actualización, sabiendo am sólo él tiene acceso a esa zona de datos. Los otros jobs deben abstenerse ejecutar la rutina de actualización hasta que tengan el control del indic Por otra parte, el afortunado poseedor del indicador debe cooperar, lib rándolo lo antes posible. Asi, cuando un programa no consigue acceder gl indicador, puede continuar probándolo, sabiendo que no caerá en un ciclo infinito, porque el indicador se liberará pronto. Incluso en un entorno monousuario se necesita la instrucción TAS, por. que existen otros usuarios en forma de interrupciones externas que pu ocurrir en cualquier momento y con cualquier frecuencia. La posibilidad de restringir temporalmente el acceso a determinados recursos puede ser crítica, CAS va más allá que TAS, y CAS2 más aún. Tienen los siguientes for. matos: CAS Dc,Du,cea CAS2 Dcl:Dc2,Dul:Du2 (Rn1:Rn2) CAS compara De y ea y, si son iguales, Du reemplaza a ea. En el caso más simple, ea es un contador que cualquiera puede incrementar. El proce- dimiento consiste en copiar el valor de ea en De (el valor antiguo o compa- rado) y asignar a Du un nuevo valor (el valor nuevo o actualizado); enton- ces se ejecuta la instrucción CAS. Si falla, se ejecuta de nuevo. Precaución; si el contador De sufre una actualización continuada y rápida, probable- mente sea más seguro emplear TAS; de otra forma, algunos usuarios pueden quedar bloqueados en sus intentos de actualización. CAS2 es similar a CAS, salvo que realiza dos comparaciones. Si alguna de ellas falla, no se realiza la actualización. Nótese que alli donde CAS per- mite cualquier modo de direccionamiento por posición efectiva alterable de la memoria, CAS2 sólo permite modos de direccionamiento indirecto por registro (de cualquier tipo). Las precauciones que hay que tomar con CAS también son aplicables en este caso. Nuevos formatos de las instrucciones DIV y MUL 324 Se han añadido algunos formatos nuevos para las instrucciones de mul- tiplicación y división del MC68020. Todos los formatos usan 1 ó 2 registros de datos y una dirección efectiva para los operandos fuente, y almacenan los resultados en uno o más registros de datos. A continuación se indican todos los formatos, incluyendo los antiguos, que se encuentran disponibles en el MC68020. Los distintos subíndices que se emplean con los registros de datos son: n para cualquier registro, r para los restos, q para los cocientes, h para doble palabra más significativa y 1 para la doble palabra menos significar TABLA 8.8 Formatos para división y multiplicación Instrucción Acción que realiza Procesador DIVU.W - dea,Dn Dn(32) ¿dea(16) -= Dn(16r:169) 68000 DIVU.L dea, Dg Dq(32) ¿dea(32) = Da(32) 68020 DIVU.L dea,Dr:Dq Dr:Daí64) /dea(32) = Dr(32),Dq(32) 68020 DIVUL.L. dea,Dr:Dq Dqí32) /dea(32) — = Dr(32), Dq(32) 68020 DIVS.W dea, Dn Dn(32) /dea(16) — = Dn(l6r:16q) 68000 DIVS.L dea,Dq Dy(32) ¿dea(32) = Dg(32) 68020 DIVS.L dea,Dr:Dq Dr:Dq(64) “dca(32) = Dr(32), Dq(32) 68020 DIVSL.L dea,Dr:Dq Dq(32) /dea(32) = Dr(32), Dq(32) 68020 MULU.W dea, Dn dea(16) x Dn(16) =Dn(32) 68000 MULU.I dea, Dl dea(32) x DIG2) =DI(32) 68020 MULU.L dea,Dh:D] dea(32) x DM32) = Dh:DI(64) 68020 MULS.W dea,Dn dea(16) x Dn(16) = Dn(32) 68020 MULS.L dea,Dl dea(32) x DI(3G2) = DI(32) 68020 MULS.L dea,Dh:DI- dea(32) x DI32) - Dh:DI(64) 68020 tiva. Los números 16, 32 y 64 indican palabra, doble palabra y palabra cuá- druple. PACK y UNPK (instrucciones nuevas) PACK realiza la conversión de números ASCII y EBCDIC a BCD, y UNPK realiza la conversión en sentido inverso. En una situación normal, se lee la secuencia ASCII! o EBCDIC de un dispositivo de entrada (por ejem- plo, una terminal, una cinta o un fichero en disco), se convierten interna- mente a BCD empleando una instrucción PACK y se realizan los cálculos en BCD empleando las instrucciones ABCD, SBCD y NBCD. Después se convierten de nuevo a ASCII o EBCDIC empleando la instrucción UNPK, enviándose finalmente a un dispositivo de salida. Los formatos disponi- bles son: PACK —(Ax),—(Ay), margen PACK Dx,Dy, %*margen UNPK —(Ax),—(Ay), margen UNPK Dx,Dy, %margen PACK toma una palabra del operando fuente, le suma el margen y es- cribe los digitos segundo y cuarto en hexadecimal (bits [11:8] y [3:0)) del resultado en el byte de destino. Para una conversión ASCII, el desplaza- miento es —$3030 = $CFDO. Para conversiones EBCDIC, el desplazamiento es —$FOFO = $0F10. Una cadena de digitos de cualquier longitud puede 325 convertirse empleando un bucle, que consiste en una instrucción PA, predecrementada y una instrucción DBcc. Asi, por ejemplo, una cadena de digitos de cualquier longitud podria convertirse como sigue: MOVE.L. *,D0 Establece el contador de digitos MOVEA.L *,40 Fin de los digitos empaquetados MOVEA.L *=.Al Fin de los digitos no empaquetados BUCLE PACK A4A0), 4A1),45CFDO — Convertir a ASCII DBF DO.BUCLE Para llegar a —1 UNPK toma un byte del operando fuente, crea una palabra a partir de él, cuyos digitos hexadecimales segundo y cuarto son los dos digitos del operando fuente, y los digitos primero y tercero son 0, le suma el desplaza. miento y lo escribe en la palabra que se encuentra en la dirección de des. tino. Para conversiones ASCII, el desplazamiento es + 53030. Para conver- siones EBCDIC, es + $FOFO. Nuevos modos de direccionamiento para las instrucciones TST y CMPI En el MC68000, las instrucciones TST (probar) y CMPI (comparar de modo inmediato) sólo permiten direcciones efectivas alterables de datos (adea). En el MC68020, TST.B y CMPL.B siguen restringidas a modos adea, mientras que TST.W, CMPI.W, TST.L y CMPI.L pueden operar con cualquier dirección efectiva. El efecto neto de este cambio es el de in- eluir los modos de direccionamiento por PC y directo por registro de direc- ciones. TRAPcc (instrucción nueva) TRAPcce es una nueva instrucción del MC68020 que genera un ¿rap cuando se verifica un determinado código de condición. Se permiten los 16 códigos de condiciones, incluyendo “siempre trap (TRAPT)" y “nunca trap (TRAPE)". Opcionalmente, una palabra o una doble palabra puede seguir a la instrucción TRAPcc; el procesador no emplea esta palabra O do- ble palabra, pero queda a disposición de la rutina de frap del usuario. Los formatos disponibles son: TRAPcc TRAPcc.W *Fdl6 TRAPcc.W- 432 Instrucciones de manejo de coprocesadores Véase la sección de coprocesadores en otro lugar de este capítulo. _ sl TABLA 8.9 Resumen de las instrucciones de manejo de campos de bits Mnemónico Operando Descripción BFEXTS ealoffser:width],Dn- Extrae el bit de signo (extendido) BFEXTU eafoffset:width],Dn Extrae el bit de signo para números sin signo (lo reemplaza por 0) BFEFO ca[offsetiwidth],Dn-— Encuentra el primer bit 1 en el campo de bits indicado BFFINS Dn, eafoffsctiwidih] Inserta bits (a partir de la posición menos significativa) en el campo indicado BFCLR eafoffset:width] Pone todos los bits a O BFSET cafoffset:width] Pone todos los bits a 1 BFCHG caloffser:width] Prueba un campo de bits, después lo com- plementa BFTST ealolfset:width) Prueba un campo de bits Nuevos registros de control accesibles mediante la instrucción MOVEC La instrucción MOVEC puede acceder ahora a los registros CAAR y CACR. Véase el capitulo 7 para una discusión más amplia de la instrue- ción MOVEC, Instrucciones de manejo de campos de bits (nuevas) Hay 8 instrucciones de manejo de campos de bits en el MC68020. En cada una de ellas, el operando principal es un campo de bits con una exten- sión variable (de 1 a 32). Se hace referencia a este campo mediante un re- gistro de datos a una posición de la memoria. Se considera que el bit situado más a la izquierda es el bit cero, y se define el campo de bits especificando, mediante un desplazamiento, el número de bits a contar desde el bit cero, El segundo de los operandos es un registro de datos. En la tabla 8.9 tenemos: e ea indica una dirección efectiva e El desplazamiento es un valor inmediato que va de 0 a 31 o el valor de un registro de datos entre —2.147.483.647 y +2.147.483.648 * Longitud es la longitud del campo de bits entre 0 y 31 o el valor de un registro de datos en módulo 32. O representa un valor 32 e Dn es un registro de datos 327 A continuación se dan algunos ejemplos de instrucciones de manejo de campos de bits: BFEXTU DO0[8:15],D1 Mover el bit 2 de DO a DI BFCLR — (A0)[2:5] Poner a cero 4 bits de un byte de la memoria (A0) BFFFO — (A0)[DO:32,D! — Encontrar el primer bit 1 comenzando en la posición DO del byte (A0) de la memoria; buscar en 32 bits Conclusión Mientras las nuevas caracteristicas del MC68010 están construidas en su práctica totalidad en torno a una única función (la emulación), el MC68020 introduce una gran variedad de nuevas funciones. Comparado con el MC68010, el MC68020 tiene un rango de direcciones 256 veces mayor, una mayor velocidad de ejecución, debido a su sistema cache, y es capaz de co- municarse de forma más rápida con los coprocesadores. Los nuevos modos de direccionamiento (6 en total), las instrucciones mejoradas y las nuevas instrucciones permiten programas más rápidos, que emplean menos memo- ria y más fáciles de desarrollar. Las instrucciones de bifurcación, que han sido mejoradas, permiten saltos de 32 bits. Las instrucciones de multiplica- ción y división soportan ahora operaciones de 64 bits. Finalmente, las nue- vas instrucciones se manejo de campos de bits incrementan la velocidad y la potencia de las instrucciones que cambian los bits individualmente; esto avuda en la actualización de los birmaps* de los directorios de los discos y es de importancia critica en el manejo de sistemas gráficos en tiempo real. 5 El bitmap es una zona del disco (generalmente de los diskertes de 3 6 5 pulgadas) or la que se indica qué partes del mismo están ocupadas. Generalmente se asigna a cada un bit, que se pone a | cuando está libre y a O cuando está ocupado (o viceversa). Apéndice A Instrucciones del M68000: Número de operandos Sin operando: NOP ILLEGAI RESET+ RTE*/RTR/RTS TRAPV Un operando: ASL/ASR Bcc¿BRA/BSR CLR EXT JMP/JSR NBCD NEG/NEGX NOl PEA RTD SECC sSTOP+* SWAP TAS TRAP TST UNLK Dos operandos: ABCD AND/ADDA/“ADDI/“ADDQ/ADDX AND/ANDI/ANDI=CCR/ANDIAWSR* ASL/ASR BCHG/BCLR/BSET/BTST CHK CMP/CMPA/CMPI/CMPM DBcc DIVS/DIVU EOR/EORI/EORI“CCR/EORI“SR* EXG LEA LINK LSL/LSR MOVE/MOVE-desde-CCRMOVE-al-CCR/MOVE-al-SR*/ MOVE-desde-SR+*/MOVE-USP*MOVEAMOVEC+**MOVEM/ MOVEP/MOVEQ/MOVES+*+ MULS/MULU OR/ORI/ORI-CCR/ORI-SR* ROL/ROR/ROXL/RORX" SBCD SUB/SUBA/SUBI/SUBIQ/SUBX Leyenda: % = Puede tener uno o dos operandos. * = Privilegiada en el MC68000. ** = Privilegiada en el MC68010. Apéndice B Modos de direccionamiento del M68000 = Cualquier dirección efectiva Dirección efectiva de un registro = Dirección efectiva de los datos = Dirección efectiva de la memoria = Dirección efectiva de control = Dirección efectiva alterable (datos o memoria) Dirección efectiva alterable de datos = Dirección efectiva alterable de la memoria = Dirección efectiva alterable de control Modo ea rea dea mea cea «ea adea amea acceda Dn > - * . * An + * » ( An) * * * . a » » + (An) 4 * * * * * * —ÁH An) » + e . * * dí An) $ - - ” » * e e d(An,X1i) » * * » * * . . Abs.W . * * * » , * » Abs. L + » + + » + * * APC) * . * + 331 Modo ea rea dea meu cea daa adea amea acea diPC,X1) , + + + Inmed » * * bd(An.Xi) > + * > * * + , MC68020 bd(PC,Xi) + + * + MC68020 [bd,An],X:1,0d > + * » . ad + » MC68020 [bd,An,XiJ.od + * “ + > + , . MC68020 [bd,PC],Xi,od + . + , MC68020 [bd,PC,Xi],od + * . , MC68020 Descripción de los Modos comunes q Dn An (An) (An) + —(An) dl16(An) dNAn,X1.Z) Abs. W Abs.L dsN(PC) ds(PCX1.Z) Inmed modos de direccionamiento toda la familia: Registro de datos directo Registro de direcciones directo Registro de direcciones indirecto Registro de direcciones indirecto con posincremento Registro de direcciones indirecto con predecremento Registro de direcciones indirecto con desplazamiento; también se escribe d(An) Registro de direcciones indirecto con desplazamiento e indice; también se escribe d(An,Xi) Dirección absoluta corta; también se escribe como xxx.W o como una etiqueta Dirección absoluta larga; también se escribe como xxx.L O como una etiqueta Contador de programa con desplazamiento (modo rela- tivo); también se escribe como d(PC) o como una etiqueta Contador de programa con desplazamiento e indice (modo relativo); también se escribe como d(PC,Xi) o como una etiqueta y (PC,Xi) Operando inmediato; también se escribe como * Variantes y adiciones para el MC68020: bd(An,X1.Z*s) bd(PC,X1.Z*s) [bd, An], X1.Z*s,od [bd,An,X1.Z*],0d Registro de direcciones indirecto con desplazamien- to de la base e indice (similar al d(An,X1.Z*S), pero bd puede ser d16 o d32] Contador de programa con desplazamiento de la base e indice [similar al d(PC,Xi.Z+*s), pero db puede ser dl6 o d32 Posindexado indirecto en la memoria Preindexado indirecto en la memoria [bd,PC],Xi.Z*s,od Contador de programa indirecto posindexado en la memoria [bd,PC,Xi.Z*s],od Contador de programa indirecto preindexado en la memoria Abreviaturas: Dn Cualquier registro de datos, DO-D7 An Cualquier registro de direcciones, A0-A7 Xi Cualquier An o Dn empleado como registro indice 2 Indicador del tamaño de los datos (B, W, o l.) Z Indicador del tamaño de los datos (L o W) S Factor de escala (1, 2, 4 u 8) PC Contador de programa (20, 24 ó 32 bits) SR Registro de estado CCR- Registro de códigos de condición d Un desplazamiento extendido o en complemento a 2: d16, d8, 43, ete., indican el número de bits bd Un desplazamiento de la base en complemento a 2 (160 32 bits) od Un desplazamiento exterior en complemento a 2 (16 6 32 bits) xxx Cualquier dirección absoluta válida Muemonico ABCD ADD ADDA ADDI ADDOQ ADDX AND ANDI ANDI + UCR ANDI -> SR ASL/ASR ASL/ASR Bcc Bcc.S Apéndice C Instrucciones del MC68000: Modos legales Función Sumar en decimal Sumar en binario Sumar direcciones Suma inmediata Suma rapida Suma extendida Y lógico Y inmediato Suma inmediata con el CCR Suma directa con el SK Desplazamientos aritméticos Desplazamientos aritmúticos Condición de bifurcación Condición de desplazamiento corto Modos permitidos Dm,Dn o (Am), (An) ,Dn o Dn, , An *.
, Dm, Dn o (Am), (An) Dn o Dn, *, ,CCR F,SR Dm, Dn o ,Dn <ámea > Tumaño del operando W LW,B (Dm mod 64) W (contador de desplazamiento = 1) Desplazamiento de 16 bis Desplazamiento de 8 bits Mnemonico Funcion Modos permitidos Tamaño del operando ! BCHG BCHG BCLR BRA BSET BSR BTST BTST CHR CLR CMP CMPA CMPI CMPM DBcc DIVS/DIVU EOR EORI EORI>CCR EORI>SR+* EXG EXT ILLEGAL JMP/JSR LEA LINK LSL/LSR MOVE MOVE >CCR MOVE >SR> MOVE USP= MOVEA Comprobar/Cambiar un bit Dm, o , Probar'Poner a cero un bit Salto incondicional Comprobar'Poner a 1 un bit Saltar a una subrutina Comprobar un bit Comprobar los limites de los registros Poner a 0 un operando Comparar Comparar direcciones Comparación inmediata Comparar con la memoria Salto cond. decimal División con y sin signo OR exclusivo OR exclusivo inmediato Codigos de condiciones de EORI Registro de estado de EORI Intercambiar registros Extensión de signo No permitido Salto/Salto a subrutina Cargar una dirección efectiva Asignar espacio Desplazamientos logicos Mover datos Mover al CCR Mover al SR Mover desde el CCR Mover al USP Mover una dirección Dm.Da v *,Dn Igual que BCHG Igual que BOHG leual que BRA Dm.Dn o +,Dn Dm, o *, ,Dn ,Dn ,An +*, (Am) + (An) + Dm, .Dn Dn, *+, %,CCR F*,SR Rm.,Rn Dn Sin operando ,An An. ¿+ Igual que ASL/ASR , ,CCR , SR CCR, SR, USP,An o An,USP , An —= L (Dim mod 32) Desplazamiento de 8 0 16 bits L (Dm mod 32) B (Dm mod 8) w L,W,B L,W.(B) L,W L,W,B L,W,B Desplazamiento de 16 bits W L,W.B L,W,B B W E L,W Sin tamaño L Sin tamano L,W,(B) / W (palabra más baja) W (* todos los modos) W (palabra más baja) W (+ solo para el 68010) L L,W Tamaño Mnenonico Función Modos permitidos del operando MOVEC + Mover a los registros de control Re,Rn o Rn,Re L MOVEM Mover varios registros ,+, —L,W [+ —XAn)] +, L,W [+ +(An)] MOVEP Mover datos desde! hacia los periféricos Dn,d(An) o d(An),Dn L,W MOVEO Mover rápidamente % Dn L (extensión de signo MOVES 7+ MULS'MULU NBCD NEG/NEGX NOP NOT OR ORI ORI>CCR ORI>SR+* PEA RESET+* ROL/ROR ROXL/ROXR RTD"" RTE+ RTE""* RTR RTS SBCD Sec STOP* SUB SUBI SUBO SUBX Mover espacios de direcciones Multiplicar con y sin signo Negar en decimal Negar/Negar en modo extendido No efectua operación alguna Complemento lógico OR lógico inclusivo OR inclusivo inmediato ORI con los codigos de condición ORI con el registro de estado Obtener una dirección efectiva de control Reinicia un dispositivo externo Rotar a la izquierda o a la derecha Rotación con extensión Retornar/Desasienar Retornar de una excepción Retornar y restaurar el COR Retornar de una subrutina Resta decimal Poner a 1 condicionalmente Carga un SR/STOP Resta binaria Resta inmediata Resta rapida Resta extendida RN,DFC o SFC,Rn Dn Sin operandos Igual que AND Igual que ANDI Igual que ANDI>CCR Igual que ANDI>SR Sin operandos Igual que ASL/ASR Igual que ASL/ASR $ Sin operando Sin operando Sin operando Sin operando Igual que ABCD H Igual que ADD leual que ADDI Teual que ADDQ Igual que ADDX a 32 bits) L,W,B W B L,W,B Sin tamaño L,W,B L Sin tamano Sin tamano (extensión de signo a 32 bits) Sin tamaño Sin tamano Sin tamano Sin tamaño B Sin tamaño 337 Mnerónico Funcion Modos permitidos Tamaño del operando SWAP TAS TRAP TRAPYV TST UNLK Intercambia registros Comprueba y pone a | un operando Trap Trap cuando se produce un overflow Comprobar un operando Desasignar Dn $ Sin operando An W B Sin tamano Sin tamano L,W,B Sin tamano Modos Apéndice D Resumen de las instrucciones del M68000 Este apéndice constituye una referencia para todas las instrucciones implementadas hasta ahora en la familia del 68000, es decir, el MC68000, el MC68010 y el MC68020, Se incluyen las secuencias de bits para cada ins- trucción, asi como las secuencias de bits que identifican a cada uno de los modos de direccionamiento. Este apéndice no describe cómo se ejecutan en realidad cada una de estas instrucciones, aspecto que constituye el capitulo 1 de esta obra. Aquí se contempla el set de instrucciones desde un punto de vista muy general y esperamos proporcionar algunos trucos que avuden a memorizarlo. de direccionamiento del 68000 La familia del 68000 emplea un rico juego de modos de direccionamien to. Hay 12 modos de direccionamiento básico, además de algunos modos de direccionamiento implicados para algunas instrucciones, El MC68020, además, amplia las posibilidades de dos de los modos de direccionamiento básicos, proporcionando un total de 18 variaciones sobre los 12 modos de direccionamiento básicos. (Véase el capitulo 8 para ampliar más detalles.) La tabla D. | contiene información realtiva a estos modos de direcciona- miento. La primera columna contiene el nombre completo o la descripción de estos 18 modos de direccionamiento. Nótese que algunas de estas des- cripciones son largas. 339 La columna “CPU” indica en qué microprocesador de la familia se en. cuentra disponible este modo de direccionamiento; si se encuentra en blanco, esto indica que el modo de direccionamiento se aplica a todos los procesa. dores de la familia del 68000; un **20” indica que el modo de direcciona. miento sólo se encuentra disponible en el MC68020. La columna marcada como “Mod Reg” contiene los códigos de 6 bits disponibles para cada modo de direccionamiento. Los números binarios que identifican los registros se representan por ““rrr'”, que puede variar entre “000% y “111%, Las cuatro columnas siguientes definen cuatro categorias de modos de direccionamiento. Estas categorias son muv útiles para definir que modos de direccionamiento están permitidos en cada una de las instrucciones del 68000. Registros Estos modos de direccionamiento se refieren a los registros. Esto (REAJ: incluye los direccionamientos directos por registros de direccio- nes y datos. Datos Estos modos de direccionamiento se refieren a los operandos (DEAJ: — constituidos por datos. Esto incluye todos los modos, excepto el direccionamiento directo por registro de direcciones. Muchas instrucciones del 68000 que operan sobre datos están diseñadas de modo que no pueden alterar los registros de direcciones. Esto forma parte de la filosofia del 68000, basada en la creencia de que evitar errores en el manejo de los registros de dirección (que pueden dar lugar a grandes perdidas de tiempo durante las fases de desarrollo de un programa), compensan los esfuerzos extra de programación que habrá que realizar para hacer las manipula- ciones deseadas sobre los registros de datos. Memoria Estos modos de dirección se refieren a los operandos de la me- (MEA): moria. Esto incluve todos los modos, excepto los de direcciona- miento directo por registro. Hay dos instrucciones con sus modos de direccionamiento restringidos a este tipo, porque se trata de instrucciones que realmente se ocupan del manejo de la memo- ria, éstas son TAS y MOVES. Las cuatro instrucciones de des- plazamiento OR, AND y ADD también imponen restricciones MEA en algunos de sus formatos. Por ejemplo, ADD DO,D1 se permite en el formato ADD ea,DI, pero no se permite en el for- mato ADD ea,D] (para evitar duplicaciones). Por tanto, el forma- to ADD DO,ea sólo permite MEA como destino, mientras que el formato ADD ea,D1 permite cualquier ea —dirección efectiva— como fuente. Control Estos modos de direccionamiento se refieren a posiciones de me- (CEA): — moria sin especificar si se trata, por su tamaño, de dobles pa- labras, palabras o bytes. Esto se aplica a los comandos de salto (Jxx) y a aquellos de con destino de tamaño indefinido (LEA, PEA, MOVEM, BExxxx). LvE TABLA D.] Modos de direccionamiento efectivos Nombre del modo CPL Mod Res Registro Datos Memoria Control Alterable Sintaxis Palabras de de direccionamiento E (R; 112) (Mi (9) (4) del ensamblador — extensión Registro de datos directo 000 rrr X X - Xx Dn 0 Registro de direcciones directo 001 rr Xx =- == = XxX An 0 Registro de direcciones indirecto D10 rr = Ne Xx Xx Xx (An) 0 Registro de direcciones indirecto con posincremento on rr - X Xx — X (An) + 0 Registro de direcciones indirecto con predecremento 100 rr - Xx Xx — Xx (An) 0 Registro de direcciones indirecto con desplazamiento 101 rrr = ps xX Xx X (d16,An) 1 Registro de direcciones indirecto con indice y desplazamiento de $ bits 110 rr = X X X x (ds, An,Rn) l Registro de direcciones indirecto con indice y desplazamiento de la base 2 110 rrr - X Xx Xx XxX (bd,An,Rn) 13 Memoria indirecta posindexada uN 110 rrT - Xx Xx Xx Xx ([bd,An].Rn,od) 1-5 Memoria directa preindexada 20 110 rr = Xx XxX Xx X ([bd, An.Rn].od) 1-5 Absoluto corto m1 000 = XxX Xx Xx XxX addr.W 1 Absoluto largo 111 DO! = Xx Xx X XxX addr.L 2 Contador de programa indirecto con desplazamiento na 001 = Xx Xx XxX - (d16.PC) 1 Contador de programa indirecto con indice y desplazamiento de $ bits 11 01 =- Xx X X - (d8.PC,Rn) l Contador de prozrama indirecto con indice 1 azamient de la base 20 111 011 - XxX XxX Xx — (bd,PC,Rn) 1-3 Nombre del modo CPU Mod Rer Registro Datos — Memoria Control Alterable Sintaxis Palabras de de direccionamiento á (K) 1D) 1M) 10) LA) del ensamblador — extensión Contador de programa indirecto posindexado 20 ni 01 = XxX Xx XxX =- ([bd,PC],Rn,od) 1-5 Contador de programa indirecto preindexado 20 mi 011 = XxX XxX Xx - ([bd,PC,Rn],od) 5] Inmediato mi 100 —- Xx XxX = - n 12 (Reservado por Motorola) 7 m1 101 (Reservado por Motorola) ? nm 110 (Reservado por Motorola) 2 mi 1 Alterable Esto se refiere a operandos que pueden cambiarse. Esto excluye (AxEa): los modos inmediato y relativo al PC, Motorola toma la postura de no considerar los programas automodificantes. Realmente. un programa diseñado para el 68000 puede automodificarse, pero normalmente requerirá una instrucción extra (normalmente LEA) para lograrlo. Esta es la parte de la filosofía de diseño del 68000 que considera que los beneficios que se obtienen de evitar los errores de un programa que se automodifica (evitando asi las consiguientes pérdidas de tiempo en la fase de desarrollo) con- pensan con creces los pequeños esfuerzos adicionales que habrá que realizar en la programación para legitimar este tipo de cam- bios. Si se planea realizar muchas referencias de carácter auto- modificante en un programa, basta con incluir una instrucción “LEA etiquetal,An'” al comienzo del mismo y realizar todas estas referencias empleando “etiquetal-ctiquetal (An)”. Combinando las categorias anteriores se pueden crear otras, como datos alterables, memoria laterable y control alterable. Por ejemplo, las direccio- nes de datos alterables son aquellas que son tanto direcciones alterables y de datos. La columna etiquetada “sintaxis de ensamblador” contiene una repre- sentación figurativa de los caracteres realmente empleados para codificar cada uno de los modos de direccionamiento en un programa del 68000. El ensamblador que se emplee en un determinado sistema puede tener su pro- pia sintaxis que difiera de la presentada aquí. El simbolo an representa cualquier registro de AÓ a A7, Dn cualquier registro de DO a D1, Rn indica An o Dn, d8 cualquier número sin signo de 0 a 255 o cualquier número con sieno de —128 a +127, d16 cualquier número sin signo de O a 65536 o con signo de -32768 a +32767, d32 cualquier número sin signo de O a 4294967295 o con signo de —2147483648 a +2147483647 y %n d8, d16 o d32 en las instrucciones relativas a bytes, palabras o dobles palabras. Modos de direccionamiento permitidos y ortogonalidad Una caracteristica importante del diseño del set de instrucciones del M68000 es la ortogonalidad entre sus instrucciones y sus modos de direc- cionamiento. Una ortogonalidad completa en el direccionamiento indicaria que cada instrucción es capaz de emplear todos los modos de direccio- namiento en cada uno de sus operandos (fuente, destino, contador, etc.), Mexibilizando y facilitando la programación en ensamblador. Pocos micro- procesadores, sin embargo, se han diseñado con una ortogonalidad com- pleta, porque esto representaria también inconvenientes. La ortogonalidad completa se consigue normalmente pagando un elevado precio en la poten- cia del set de instrucciones, ya que combinaciones irrelevantes de instruc- 343 ción/modo de direccionamiento emplean secuencias de bits que podrian emplearse para otras instrucciones más poderosas. El M68000 consigue una maravillosa optimización, logrando un set de instrucciones altamente Orto. ronal y muy potente. Cada instrucción del M68000 consiste en un operador y cero o más ope- randos. Se relacionan a continuación algunas instrucciones con diferentes números de operandos: RTS 0 operandos BR ETIQUETA l operando OR.W DO, 4(A0) 2 operandos CAS2.W D0:D1,D2:D3,4A0) 5 operandos En la mayoria de las instrucciones, cada uno de los operandos sólo puede encontrarse en uno de los 12 modos de direccionamiento, o bien se le per- mite que tenga cualquiera de los 12 modos de direccionamiento permitidos. Es importante, para todos los programadores, comprender los criterios que Motorola ha empleado para definir los modos permitidos para una determi- nada instrucción. Estos criterios se han aplicado de una forma consistente en todo el set de instrucciones del 68000. Sin comprender estos criterios, pa- recerá que el 68000 carece de gran parte de su ortogonalidad; sin embargo, si estos criterios se entienden resultará fácil memorizar completamente el set de instrucciones del 68000, Un ejemplo puede ayudar a aclarar todo lo anteriormente expuesto. La instrucción OR señalada más arriba forma parte de un grupo de instruccio- nes que tienen todas el mismo formato: OR.tamaño Dn, y están representadas por una secuencia de 16 bits que corresponde con: 1000SdrI1iSzDestin No es necesario explicar las abreviaturas Sdr, Sz y Destin para esta des- cripción, pero pueden encontrarse más adelante. Hay dos operandos en esta instrucción. El primero de los operandos debe ser siempre un registro de datos en modo directo, pero el primero puede ser cualquiera de los modos de direccionamiento permitidos. En este grupo de instrucciones OR, cinco de los 12 modos de direccionamiento per- mitidos son ilegales. Los cinco modos ilegales violan tres de las reglas de legalidad. Los modos ilegales, con las reglas violadas, son: 1. Modos relativos o inmediatos al PC: Este no puede ser nunca alte- rado. An: Las operaciones sobre datos no están en general permitidas sobre un registro Án. 3. Dn: Esto duplica la función de otro grupo de instrucciones. pd La regla | es rigurosamente cierta para aquellas instrucciones que alte- ran el operando destino. La regla 2 es casi siempre cierta, pero se permiten algunas operaciones sobre An, como, por ejemplo, MOVE, ADD, SUB, ADDO y SUBO. Algunos ensambladores permiten emplear estas instruccio- nes sin restricciones. Algunos, sin embargo, requieren el empleo de MO- VEA, ADDA y SUBA en lugar de MOVE, ADD y SUB cuando el destino es un registro de direcciones. El resultado neto es el mismo, pero es más difícil que se produzcan errores inadvertidos. Para comprender la regla 3 es necesario saber que hay otro grupo de instrucciones OR, que tienen la forma: OR.tamaño ,Dn y están representadas por una secuencia de 16 bits que corresponde con: 1000DdroszFuente Si ambos grupos se permitiesen en el caso: OR,tamaño — Dn,Dm la ortogonalidad del set de instrucciones sería mayor, pero éste seria menos potente, al reducirse el número de secuencias de bits que quedarian libres para otras instrucciones. De hecho, algunas de las secuencias de bits que la regla 3 deja libres se emplean para la instrucción NBCD. Un programador no necesita conocer la regla 3, pues cualquier ensamblador ensamblará una instrucción OR. tamaño Dn,Dm en la forma correcta. Por otra parte, si se está diseñando un ensamblador o desensamblando un programa, la regla 3 es de capital importancia. El ejemplo anterior hará, probablemente, más fácil de entender la si- guiente lista de reglas que —junto con sus excepciones— gobiernan los mo- dos de direccionamiento del 68000. Il. Los modos relativos al PC o los inmediatos son ilegales si se altera el destino. Esta es la causa de que exista una categoria de modos de direccionamiento “alterables”* (AFA). Nótese que las instrucciones de comprobación no alteran el destino, aunque simulan una resta de éste. Las excepciones son: TST y CMPM; con estos modos de di- reccionamiento son ilegales, aunque no alteren el destino. En el MC68020, TST.W, TST.L, CMPLW y CMPLLL son legales en todos los modos, pero TST>B y CMPI.B no. Las funciones duplicadas son competencia únicamente de una de las instrucciones. Por ejemplo, en todas las instrucciones de desplaza- miento “op X%1,Dn” está permitido, mientras que “op Dn'”” no lo está. Las excepciones a esta regla son CMP 4c,Dn y CMPI 4c,Dn, ba 345 An que, aunque son equivalentes, se ensamblan en dos instrucciones dj- ferentes (ambas con dos palabras). Lo mismo es cierto para los pares de instrucciones siguientes: ADD/ADDI, SUB/-SUBI, AND/ANDI y OR/ORI. Nota: s11<=c<=8, entonces ADDO *c,Dn y SUBQ *c,Dn están también permitidos y son equivalentes a los casos ante- riores, pero ocupan una palabra menos. Por tanto, ADDOQ y SUBQ no se consideran duplicadas (o triplicadas). Muchas de las operaciones de datos no se permiten con An (regis- tros de direcciones). Esta es la razón para las categorías de direc- cionamientos tipo “datos”. Las siguientes subreglas cubren todos los casos y se dan en orden creciente de categoria, es decir, las reglas posteriores se aplican en caso de conflicto: a) Un registro An jamás participa en una operación a nivel de bytes. b) An no interactúa con los registros especiales de datos. Excep- ción: La instrucción MOVES puede mover cualquier registro especial a cualquier registro de datos o direcciones. e) Un registro An puede participar en movimientos directos. Así, EXG y MOVE se permiten. MOVE.B queda excluido por la re- gla 3a. Nótese que An puede moverse desde/hacia los registros especiales de direcciones (al USP, por ejemplo), pero no desde/ hacia otros registros de datos especiales (CCR, SR), según esta- blece la regla 3b. d) Se pueden comprobar los valores de cualquier registro An (pero no alterarlos de forma permanente). Por tanto, están permiti- dos CMP (excepto CMP.B), CMPA y TST (excepto TST.B). e) Sobre los registros An se permiten las siguientes operaciones: ADD, An1,Dn2 y SUB Anl,Dn2 (excepto en tamaño byte), asi como ADDA, SUBA, ADDQ y SUBO (de nuevo, excepto en tamaño byte). En las siguientes instrucciones no están permiti- dos ADD Dn!,An2 y SUB Dn!,An2. Nótese que ADDI 4c,An y SUBI *c,An están excluidos por la regla 2. Las instrucciones LEA, PEA, MOVEM, Jxx y BFxxxx utilizan úni- camente direcciones de operandos de control. Excepciones: MO- VEM permite (An) + y —(An) como fuente y destino; BFxxxx per- mite Dn como un operando de bits. permitidas. La excepción a esta regla la constituve la instrucción BTST *a,*b, que debe ser reemplazada por ANDI u ORI al CCR. Tabla resumen de las instrucciones ' del MC68000: Preliminares Columna Columna La tabla D.2 resume los sets de instrucciones de los cinco microprocesa- dores en la familia del 68000, es decir, el MC68008, el MC68000, el MC68010, el MC68012 y el MC68020. Los sets del MC68008 y el MC68000 son idénti- cos, del mismo modo que lo son los del MC68010 y MC68012, de modo que en la tabla sólo es necesario distinguir entre las instrucciones del MC68000, MC68010 y MC68020. Además hay que tener presente la estricta compatibi- lidad que ha presidido el diseño de la familia del 68000, es decir, la com- patibilidad de las instrucciones de los microprocesadores más modernos res- pecto a las de aquellos diseñados con anterioridad. Por tanto, las instruc- ciones del MC68000 se ejecutan de la misma forma en los cinco micropro- cesadores, las instrucciones del MC68010 se ejecutan de la misma forma en el MC68010, MC68012 y MC68020. Las instrucciones del MC68020 son exclusivas de éste. Por construcción, la tabla D.2 es muy compacta, emplea muchas abre- viaturas y no incluye detalles exhaustivos de cómo funciona cada una de las instrucciones. Para detalles acerca de cada una de las instrucciones, vease el capítulo 4. Las siguientes secciones explican los simbolos empleados en cada columna de la tabla D.2. de instrucciones La primera columna en la tabla D.2 proporciona los nemónicos estándar de Motorola para cada una de las instrucciones. Cada ensamblador puede, por otra parte, emplear aquellas pequeñas variaciones respecto a estos mne- mónicos. Se emplean las siguientes abreviaturas: Código Representa .S Instrucciones de byte, palabra o doble palabra .s2 Palabra .s3 Carga de operando, operando de palabra y de palabra larga (sólo para TRAPcc y cpTRAPcc) cc Indica un código de condición (CC,CS, EQ, GE, GT, HI, LE, LS, LT, MI, NE, PL, VC, VS) de la CPU Esta columna indica cuándo una instrucción es del MC68000 (en blan- co), del MC68010 (“10”) o del MC68020 (20). Véanse las notas ante- riores acerca de la compatibilidad en la familia del 68000. 347 Columna de sintaxis E] Esta columna proporciona la sintaxis general para las instrucciones, en la forma en que aparecerán en la familia del 68000. En los casos en los que aparecen los operandos fuente y destino, el operando fuente va en primer lugar. Así, en caso de duda, recordar las instrucciones “*MULtiplicar el pri- mer operando por (almacenándolo en) el segundo", ““DIVidir el primer operando entre (almacenándolo en) el segundo”. Para algunas instrucciones se proporcionan dos sintaxis. En estas ing- trucciones siempre hay un bit D o Q (como se explica más abajo) en el có. digo de instrucción. La primera de las sintaxis corresponde al caso en que este bi D o Q esté a 0 y la segunda al caso en que esté a 1. Las abreviaturas que se emplean en esta columna son: Código Representa Dn,Dn1,Dn2 Cualquier registro de datos (de DO a D7) An,Anl,An2 Cualquier registro de direcciones (de AO a A7) Rn,Rn!,Rn2_ Cualquier registro de datos o direcciones PE Contador de programa (doble palabra) SR Registro de estado (palabra) CCR Registro de códigos de condición (byte) ssP Puntero de pila en modo supervisor (doble palabra) USP Puntero de pila en modo usuario (doble palabra) SP Puntero de pila activo RC Cualquier registro de control (USP, MSP, ISP, VBR, SFC, DFC, CACR, CAAR) d3 Cualquier número sin sigeno de 3 bits, es decir, un número de 0 a 7 (excepto para la instrucción BKPT, el O representa el valor 8) d4 Cualquier número sin signo de 4 bits, es decir, de O a 15 (un vector (rap) ds Cualquier número sin sieno de 5 bits, es decir, de O a 31 (un número que identifica la posición de un bit) d8 Cualquier número sin signo de 8 bits, es decir, de O a 255, o bien un número con signo de —128 a +127 dl6 Cualquier número sin signo de 16 bits, es decir, de O a 65536, o bien un número con signo de —-32768 a + 32767 d32 Cualquier número sin signo de 32 bits, es decir, de 0 a 4294967295, o bien un número con signo de —2147483648 a +2147483648 *n Indica *d8 para instrucciones de byte, 4d16 para instruc- ciones de palabra y 432 para instrucciones de doble pa- labra Códizo ea,eal,ea2 Dc,Dc1,De2 Du,Dul,Du2 reglist etiqueta Representa Direcciones efectivas (véase la tabla D.1 para los 12 modos de direccionamiento). En la mayoría de las instrucciones no todos los modos de direccionamiento están permitidos; las columnas FUE y DAT de la tabla D.2 indican cuáles de los modos son legales (véanse las indicaciones para estas columnas más abajo) Cualquier registro de datos; se emplean cn las compara- ciones Cualquier registro de datos; se emplean en las actualiza- ciones Cualquier lista de O a 16 registros (todos An o Dn) separa- dos por comas En el código fuente: cualquier etiqueta que se encuentre en cualquier lugar del programa. En el código objeto: un des- plazamiento d8, d16 o d32 relativo a la posición indicada por el PC Cualquier expresión entre llaves (por ejemplo, (Wn)) es opcional, es de- cir, puede estar presente u omitirse. Las comas, paréntesis, puntos o guio- nes corresponden realmente al código que puede encontrarse en un pro- grama. Columna de códigos de instrucción Esta columna contiene una descripción bit a bit de las instrucciones ya ensambladas. Cada bit viene representado por un |, un 0 o como parte de un campo de bits. Cada campo de bits comienza con una letra mayúscula y puede tener una longitud entre 1 y 32 bits. Los campos de bits empleados se describen a continuación. Sz Siz Q ty bits que indica el tamaño de los byte, 01 = palabra, 10 = doble pa- Un campo de operandos (00 labra). Un campo de 1 bit que indica tramaño (0 = pala- bra, 1 = doble palabra). Excepción: en el caso de la instrucción CHK se invierte el significado (véase la nota “a” en la tabla D.2). Un operando de 3 bits que indica tamaño (010 = pa- labra, 011 = doble palabra, 100 = ninguna de las dos). Un indicador de tamaño de 1 bit para las instruc- ciones MULx y DIVx (0 = doble palabra, | = pala- bra cuádruple). 11 350 Fuente Destin Tindes Sar Dar Sdr,Ddr Sdar,Ddar Fefadr Tefadr Fdr Tdr Far Tar Un indicador de 6 bits que informa del modo de di- reccionamiento aplicado al operando fuente. Pue- den codificarse 12 modos de estos 6 bits (véase la tabla D.1 para un resumen de los mismos). Un indicador de 6 bits que informa del modo de di- reccionamiento aplicado al operando destino. lgual que Destin, pero los tres primeros y los tres últimos bits han alterado sus posiciones. Sólo se emplea en la instrucción MOVE. Un campo de 3 bits que indica un registro fuente, Un campo de 3 bits que indica un registro de direc- ciones. Un campo de 3 bits que indica un registro de datos (fuente, destino). Un campo de 4 bits que indica un registro de datos o direcciones. Se indica un registro de direcciones mediante un 0 seguido de los 3 bits correspondien- tes al número que lo identifica; análogamente se hace con los registros de datos, pero sustituyendo el 0 por un 1. Un campo de 1 bit que determina cuál de los dife- rentes campos posibles corresponde al operando fuente y cuál al operando destino. En general, cuando una instrucción contiene un campo D, to- dos los campos “desde” corresponden a operandos fuente y todos los campos ““hacia'' corresponden a fuentes. Todos los campos que se ven afectados por el bit D se incluyen en las próximas 8 entradas: Un campo de 6 bits que indica una dirección efec- tiva “desde”. Es fuente cuando D está a O y des- tino cuando D está a 1. Un campo de 6 bits que indica una dirección efec- tiva ““hacia”'. Es destino cuando D está a O y fuente cuando D está a 1. Un campo de 3 bits que indica un registro de datos “desde”. Se toma como fuente cuando D está a 0 v como destino cuando D está a 1. Un campo de 3 bits que indica un registro de datos “hacia”, Se toma como fuente cuando D está a l y como destino cuando D está a 0. Un campo de 3 bits que indica un registro de direc- ciones “desde'”. Se toma como fuente cuando está a O y como destino cuando D está a 1. Un campo de 3 bits que indica un registro de diret- Fdar Tdar Udr Cdr Hdr limm Immediat Displace Cnt Argcont Bitno Vec WVect Registerlistmask ciones de “hacia”. Se toma como fuente cuando D está a | y como destino cuando D está a 0, Un campo de 4 bits que indica un registro de direc- ciones o datos de “desde”, Se toma como Puente cuando D está a 0 y como destino cuando Destá a 1. Un campo de 4 bits que indica un registro de direc- ciones o datos hacia". Se toma como fuente cuan- do D está a | y como destino cuando D está a 0, Un campo de 3 bits que indica un registro de datos empleado para actualizaciones (para las instruccio- nes CAS y CAS2). Un campo de 3 bits que indica un registro de direc- ciones empleado para actualizaciones (para las ins- trucciones CAS y CAS2). Un campo de 3 bits que indica la palabra de orden más alto de un registro de datos (para MULx y DIVx). Un campo de 3 bits de datos inmediatos. Un campo de 8, 166 32 bits de datos inmediatos. Un campo de 8, 166 32 bits que contiene un des plazamiento inmediato. Un campo que contiene un contador de desplaza- miento de 3 bits. Un campo de 8 bits que proporciona un argumento para CALLM ( byte). Un campo de 3 60 $5 bits que indica la posición de un bit (para BTST, BCHG, BCLR y BSET). Un campo de 3 bits que contiene un vector para la instrucción BKPT. Un campo de 4 bits que contiene un vector para la instrucción TRAP, Un campo de 16 bits que selecciona de O a 16 re- gistros para la instrucción MOVEM. Los registros están asociados por orden, cada uno a un bit con DO asociado al bit 0 y A? al bit 15, excepto en el caso de direcciones en modo predecrementado en el que se invierte el orden. Un campo de | bit que indica el si hay que conside- rar o no el signo en las instrucciones DO MULx y DIVx (0 =sin signo, | = con signo). Un campo de | bit que indica el sentido en que han de efectuarse las rotaciones (0 = derecha, 1 = iz- quierda). 351 Bitoff Bitwid Coprocessorcommd Cpi Cpcond Controlregis Cond Un campo de 6 bits que indica un desplazamiento, bien On nn nn, si se emplea un valor de 5 bits, bien 100n nn para el caso en que se emplee un registro de datos Dn. Un campo de 6 bits que indica una distancia (em- plea el mismo formato que Bitoff). Un campo de 16 bits que contiene una instrucción de un coprocesador. Un campo de 3 bits que identifica a uno de los co- procesadores disponibles. Un campo de 6 bits que contiene un código de con- dición de coprocesador. Un campo de 12 bits que contiene la identidad de uno de los registros de control: 0000 0000 0000 = SFC (68010) 0000 0000 0001 = DFC (68010) 0000 0000 0010 = CACR (68020) 1000 0000 0000 = USP (68010) 1000 0000 0001 = VBR (68010) 1000 0000 0010 = CARR (68020) 1000 0000 0011 = MSP (68020) 1000 0000 0100 = ISP (68020) Un campo de 4 bits que contiene un código de con- dición. Los códigos de condición definidos son: 0000 = Verdadero 0001 = Falso 0010 = Más grande 0011 = Más pequeño/ igual 0100 = No hay acarreo 0101 = Acarreo 0110 = No es igual 0111 = Es igual 1000 = No hay rebose 1001 = Hay rebose 1010 = Positivo 1011 = Negativo 1100 = Mayor/igual 1101 = Menor que 1110 = Mayor que 1111 = Menor/igual Cada una de las instrucciones del 68000 ocupa de l a 11 palabras y está formada por un número variable de palabras, de | a 3, que constituyen la instrucción básica que van seguidas, cuando procede, por 0 a 10 palabras de extensión. La tabla D.1 lista sólo las palabras básicas. Cualquier conjun- | to de 16 bits encerrado entre paréntesis es opcional; asi, por ejemplo, cuan- do un campo inmediato puede estar formado por 16 6 32 bits, siempre se mostrarán los 16 finales entre paréntesis. Para cada uno de los 12 modos posibles de direccionamiento, las palabras de extensión de la dirección tie- nen el mismo formato. La tabla D.1 lista el número de palabras de extensión que se necesitan para la dirección en cada uno de los modos de direcciona- miento. Debido a su regularidad, las palabras de extensión de la dirección no se han incluido en la tabla D.2. Las columnas SRC y DST Las columnas SRC y DST resumen, en unos cuantos simbolos, los mo- dos de direccionamiento permitidos para los operandos fuente y destino, Los simbolos son consistentes, concisos y fáciles de memorizar. Si sólo uno de los 12 posibles modos de direccionamiento está permi- tido, se representa por uno de los siguientes simbolos: Dn, An, (An), (An) +, (An), d(An), SP, (SP) +, (SP) o |. Como puede verse, todos los simbolos son autoexplicativos excepto !, que indica un campo inmediato. Una “Q” indica que el operando es un valor inmediato de 3 bits. Si hay varios modos de direccionamiento para un operando, se indica esta condición mediante alguno de los siguientes símbolos: EA, REA, DEA, MEA, CEA, AFA, ADEA, AMEA, o ACEA. Estos simbolos ya se han explicado en este capítulo. EA indica que todos los modos de direc- cionamiento están permitidos. Los registros especiales se indican mediante los simbolos: CCR, SR, PC y USP, que deben ser autoexplicativos. El simbolo “er” representa cual- quiera de los registros de control: USP, MSP, ISP, VBR, SFC, DFC, CACR y CAAR. Unos cuantos casos requieren una notación especial: (Dn) Representa direccionamiento indirecto por registro de datos. « Se emplea para unir grupos diferentes; por ejemplo, “CEAKDn” indicaría “cualquier dirección de control o cualquier dirección Ob- tenida mediante direccionamiento directo por registro de datos”. mu Se emplea para eliminar partes de un grupo; asi, “DEA“1I” indica “cualquier DEA excepto direccionamiento inmediato”. ; Empleada para indicar dos operandos : “*Dn,An” significa un operando Dn y un operando An”; “Dn,Dn” significa “dos ope- randos Dn”. Probablemente, los programadores cuidadosos notarán que en aquellos operandos con sólo un modo de direccionamiento permitido el código del modo de direccionamiento a menudo coincide con los 6 últimos bits de la instrucción. Por ejemplo, la instrucción SWAP usa solamente direcciona- miento directo por registros de direcciones, que corresponde al código 353 0O0Orrrr. Los últimos 6 bits de SWAP son, de hecho, estos 6 bits. Pero, cuje dado, estas coincidencias no se dan siempre. Columna de códigos de condición Esta columna indica qué códigos de condición se ven afectados por cada instrucción. Los simbolos que se emplean aqui son: — El código no se ve afectado por la instrucción. 0 El código se pone a 0, 1 El código se pone a 1. * Se cambia el código. U Se deja el código con un valor indefinido. Columna de privilegio Esta columna indica qué instrucciones son privilegiadas. Las instruccio- nes privilegiadas sólo se pueden ejecutar cuando el bit de privilegio se pone a 1. De otro modo se generará una instrucción. Columna de notas Las letras en esta columna se refieren a las notas a pie de página al final de la tabla. : a TABLA D.2. Resumen de las instrucciones del Mo68000 Instrucción cru Sintaxis Codigo de instrucción SRC psi legio Vea FEDCBA9876543210 XNZVC ORL.s *n,ca 000000005Sz7Destin 1 ADEA 00 Immediatxxxxxxxx (NX XXX AX NA XAXAXA) ORL.B *n,CCR 0000000000111 100 I CCR diia (to CCR) 00000000 Immediat ORI.W 2n.SR 00000000011 11100 ! SR raso. xX (to SR) Immediatxxaxx xx xx CMP2.s 20 ea,Rn 00000Sz0!ISource CEA REA UU Ddar000000000000 CHK2s 20 ca,Rn 00000Sz201ISource CEA REA -UrUr Ddari00000000000 BTST Dn.ea 0000SdrIi00Destin Dn DEA BCHG Dn,ea DO00Sdrl0IDestin Dn ADEA BCLR Dn,ea 0000Sdri10Destin Dn ADEA o BSET Dn,ca 0000SdrIilIlDestin Dn ADEA MOVEP.52 dIb(Ant),Dn2 0000TdrIDSO0DIFar diAn) Dn — Dn!,d16(An2) Displacexxxxxxxx Dn diAn) ANDI.s *n,ca 00000010SzDestin | ADEA 00 Immedia lxxxxxxxx (AX NANA MN) ANDLB 8 COR 0000001000111100 1 COR hr (tOCCR) 00000000 Immediat ANDL.W +16,SR V00000 1001111100 I SR X ito SR) ImmedialxxXxXxxXxxXx SUBI.s Fn,ca 00000100S7Destin l ADEA *x121 Immediatxxxxxxxx (CEA ARMAR A Instrucción cpu Sintavis Código de instrucción SRC Ds! can a Nola condición —legio ADDIs Panes 000001 10S27Destin 1 ADEA Immedialxxxxxxxx (UN XA NANA NANA MN) RTM 20 Kn 0D00001]101100Sdar REA a.a., CALEM 20 Ad8ea 000001101 I1Source CEA D0000000Argcount CAS.s 20. De,Duca V0001S201 IDestin Dn AMEA 49h V000000U4rOV0UCdAr CAS2s 20 Del:Dc2,Dul:Du2 (Ral:Rn2). 00001Sz¿011 111100 Dn (Am (Dn) ARAA Im] Diaro00Ud4rovouCdr Ddar000Udro0o0Cdr BISI dS.ca V000100000Destin 1 DEA=1 .. 00000000000B:itno BCHG AS, ca 000010000 IDestin 1 ADEA 00000000000B11tno BCLR *dS.ca 00001000 10Destin I ADEA 00000000000B1tno BSET MáS ca 00001000! IDestin l ADEA A 00000000000Bitno FORLs nea 00001010S7Destin ADEA 00 Immediatxxxixxxxa (ANA XANAX NANO XX) EORLB HUROCR d0001010001 11100 1 CCK aan (to CCR) 00000000 Immediat EORI.W 2OL6.SRK 000010100111 1100 1 SK bat Xx (to SR) Immediatxxxxxraxa CMPIs le] ¿nea 00001100SsDestin I ADEA ...s Immediatxxxxxxrx (NANA XANAX NA XA ANN) MOVE.s 10. ea Kn 00001110Sz7Fefadr AMÉA la] REA — Xx Kn,ca Ida rD00000000000 REA AMEA la) MOVE,B eal,ea2 000ITindesSource DEA ADEA 00 Instrucción co Simtaris Código de instrucción ski DST e Nola MOVEA 1 ca, An 0010Dar001Source EA An MOVE.1 eal.eal 0010TindesSource EA ADEA 00 MOVEA.W ea.An 00l1DaróDlISource EA An MOVE.W ea,ea2 DO!lITindesSourcce EA ADFA 00 NEGX 5 ca 01000000SzDestin ADEA id MOVE,W SR,ca 01000000lIDestin CCR ADEA a rl (from SR) CHKs2 le] ea,Dn 0100DdrIS0Source DEA Dn -=ULU la LEA 010UDarllIlSource CFA An — CLR.s ea 01000010SzDestin ADEA 0100 MOVE.W 10. CCRica 01000010! 1Destin CCR - hi (from CCR) NEG.s ea 01000100SzDestin ADEA se MOVE.W ea, CCR 010001001 ISource DEA CCR — ] (to CCR) NOT. ea 010001 10S¿Destin ADEA 00 MOVE. W ca,CR 010001101 ISource DEA CCR — XxX (to SR) NBCD Ea 0100100000Destin ADEA u*u- LINK 20 Anda 001010000000IDar 1 An.Pc en Displacerikrxx ox XNXXNMAXXMNNNAXNNXXXX SWAP Dn 0100100001000Ddr Dn 200 BKPT 10 *d 010010000100 1Vec a le PEA es 0100:10000¡Source CEA ASP) — EXT 52 Dn 010010001S000Ddr Dn 00 EXTB.1 20 Dn 0100100111000Dár Dn 00 MOVEM.52 reglist,ea 01001D001STefadr all REA ACEA4 (An) — ea.reglist Registerlistmask CEARIAn)- all REA Instrucción CPL Sentixas Código de instrucción SRC DsT pa de a Notas TST. 5 cal 01001010S7Destin ADEA -*=00 le) IST. WTST 1 M0 cea, EA TAS ca 0100/0101 JDestin ADEA "00 ILLEGAL 010010101 1111100 (b] MULS.L/MULU.L 20 ca,Dn 01001 10000Source DEA Dn,Dn celda) 20 ca.Dnl:Dn2 0DArTQO0VUVOVOHAT DIVS.L/DIVU,L 20 63 3F 77 011 1111 7 64 40 100 100 0000 1d 65 41 101 100 0001 A 66 42 102 100 0010 B 67 43 103 100 0011 € 68 44 104 100 0100 D 69 45 105 100 0101 E 70 46 106 100 01 10 F 71 47 107 1000111 G UD, 48 110 100 1000 H 13 49 111 100 1001 l 14 JA 112 100 1010 J ha 4B 113 100 1011 K 76 q 114 100 1100 LB mn 4D Is 100 1161 M TN 4E 116 100 1110 N 7Y9 4+ 117 100 1111 O 80 $0 120 101 0000 p gl SI 121 101 0001 Q 82 52 122 101 0010 R 82 33 123 101 0011 S 84 53 124 101 0100 | 8S 33 125 101 0101 U 86 $6 126 1010110 V 87 3 27 1010111 W 88 58 130 101 1000 YX sy 5$y 131 101 1001 Y 90 SA 132 101 1010 £ 91 SB IRA] 101 1011 | 92 M 134 101 1100 ] Y $sD 145 101 1101 ] 94 SE 136 101-1110 A ys Ss 197 101-1111 Y 60 140 110 0000 97 61 141 110 0001 a Y8 b2 142 110 0010 b YY 63 143 1100011 C 100 64 144 110 0100 d 10] 65 145 1100101 C 102 66 146 1100110 1 103 67 147 1100111 E 374 DEC | HEX OCT Binario ASCU X 10 X o Xx, X, 104 68 150 110 1000 h 105 69 151 110 1001 l 106 65A 152 1101010 j 107 6B 153 110 1011 h 108 60 14 110 1100 | 109 6D 155 1101101 m 110 BE 156 1101110 n 111 bF 157 1101111 o 112 70 160 111 0000 p 113 71 161 111-0001 y 114 72 162 1110010 Tr 115 Ri 163 111 0011 $ 116 74 1564 111 0100 ! E 75 165 111 010] y IIS TA 166 1110110 y 119 1 167 1110111 Ú 120 78 170 1111000 Xx 121 79 171 111 1001 y 122 TA 172 111 1010 Ll 123 7B 173 1111011 | 124 YC 174 111 1100 125 7D 175 1111101 126 TE ITA 111 1110 - 127 TF 177 11131111 EJE] Indice alfabético Acceso directo a memoria, $52, 54. Acumuladores, 92. ADD, 43, 120, 151, 196. ADDI, 138, 196. ADDQ, 135-136, 227 Alan M. Turing, 30. Algebra de Boole, 31, 33. ALU, 39, 46. AND, 31, 37, 203, 215, Aritmética binaria, 22. ASCH, 27. ASL, 182, 184, 226. ASR, 184, 226. Bancos de pruebas, 82. Base 30, 41. Bcc, 128-129, 322. BCD, 26, 99, 258. Biestable, 36. Binary Coded Decimal, 26. Bit de acarreo, 105. Bit de master, 319. Bit de signo, 26, 102. Bit S, 320. Bit supervisor, 320. Bits, 20-21. Bits de traza, 312. BRA, 125, 196, 322. BSR. 169-170, 322, BTST, 234, 236. Buffer. 39, 145. Bus de control, 39, Bus de datos, 39. Bus de direcciones, 39, Bus dedicado, 89, Bus del sistema, 37-38, 41. Bus interno, 41. Bus VME, 60, Búsqueda de datos, 43, Búsqueda de instrucción, 43, Byte, 24, 27. Byte del sistema, 110, CAAR, 305. CACR, 305, CAS, 323. CAS2, 323, ECR, 93, 122, 220. 375 376 Ciclo de cjecución, 43. Ciclo de escritura, 41. Ciclo de lectura, 39. Circuitos integrados, 33, 67. Claude E. Shannon, 20-21. CLR, 135, CMP, 243. CMP2, 323: COMPA, 244, CMPI, 326. Codificador, 21. Código ASCII, 27, Código de operación, 117. Código de tamaño, 119, Códigos, $54. Compatibilidad, $5. Compilador, 78. Concurrencias, 44, Contador de programa, 43, 93, 96, 185. Control, 38. Controladores de E/S, 38. Controladores DMA, 54. Conversión binario-hexadecimal, 30, Conversión binario-octal, 29. Coprocesador malemático, 46. CPU, 18, 41. CHK, 280, 322. CHK2, 323, Datos, 38. DBcc, 247, 250. DC, 145. Decodificación de instrucción, 43. Decodificador, 21. Desplazamiento aritmético, 223. Desplazamiento aritmético a la dere- cha, 184, Desplazamiento aritmético a la izquier- da, 182. Desplazamiento del vector, 290. Desplazamiento lógico, 216, 220. DFC, 293. Digitos binarios, 20, Dirección del byte, 84, Direccionamiento absoluto, 141-142, 149. Direccionamiento indirecto por PC, 312, Direccionamiento lineal, 50. Direccionamiento por PC indexado, 190. Direccionamiento posindexado indirec- to, 311. Direccionamiento preindexado por me- moria, 311. Direccionamiento relativo, 185, 190. 191. Direcciones, 38. Directivas del ensamblador, 144. Disco RAM, 54. Dispositivos discretos. 21. División, 179. División por hardware, 46. División por sofiware, 46. DIVS/DIVU, 179, 181, 278. DMA, $2, 54, Doble palabra, 26. DS, 145, Emulación, 87, 283. Ensamblador, $0. EOR, 37, 205, 210, 215. EPROM, 56. Error de página, 53. Espacio lineal de direcciones, 84. Espacio lineal de memoria, 85. Estado del procesador, $2, Estados, 21. Etiquetas, 123, 143. EXG, 263. EXT, 252. Extensión, 105, Extensión del bit de signo, 107, 252. ES, 31382 Factor de escala, 310, Familia M68000, 62-63, FIFO, 164, Firmware, $6-57. HCMOS, 60, HMOS, 67. IC, 33,07. Identificadores de segmentos, 50. JEEE, :60. Indicador C, 104, Indicador N, 113, Indicador T, 110, Indicador Y, 104. Indicador X, 105, 254, Indicador Z, 113, 255. Indicadores de condición, 113. Indice de cache, 302. Ingenieria software, 57. Instrucción, 83-84, 115. Instrucciones aritméticas extendidas, 254, Instrucciones cache, 300. Instrucciones lógicas, 210. Intertaz, 48. Intérprete, 78. Inversor, 33, IR, 43, ISO, 73. IMP, 187, 196, LEA, 188, 190. Lenguaje de bajo nivel, 80, Lenguaje de nivel medio, 80, Lenguaje máquina, 78. Lenguajes de alto nivel, 78. Ley de decodificación, 23. Ley de Gerswhin, 39, Leyes de composición, 28, LIFO, 112, 164, LINK“UNLK, 266, 268, 274, Lógica, 3L. Lógica random, 73. LSB, 26. LSL, 226. LSR, 226. MACSS, 66-68, Máquina virtual, 87, 287, Máscara de interrupciones, 110. MC68010, 296, 300. MC68012, 296. MC68020, 299-300, 314. MC68451, $2, MCÓS881, 46. Memoria, 37-38. Memoria cache, 45. Memoria de masas, $2, Memoria virtual, 52, 284, Mensajes codificados, 22. Microcódigo, 81. Microprogramación, 73, MIPS, 44. MMU, 52, Modo de memoria, 131-132. Modo directo a registros, 131-132. Modo indexado, 176, 184, Modo indirecto con posincremento, 153. Modo indirecto de registro con prede- cremento, 158, Modo inmediato, 134, 141. Modo lazo, 295, Modo privilegiado, 274, 276. Modo supervisor, 111. Modo traza, 96, 110. Modo usuario, 111. Modos de direccionamiento, 131, 193- 194. MOS, 60. MOVE, 43, 196. MOVEA, 151, 196. MOVEC, 291, 327. MOVEM, 162, 167. MOVEP, 264, 266. MPS, 18. MPU, 18, 37. MPU esclava, 19. MPU maestra, 19. MSB, 26, MULSMULU, 177, 182, 196, 256. Multiplexación, 39, Multiplicación, 177. Multitarca, 49, MV, 52. NAND, 32, 37. Nanocódigo, Sl. NBCD, 260. NEG, 251, Negación, 278, Nibble, 24, NOP, 201. NOR, 37, NOT, 31, 37, 203, 215. Notación de Turing, 30. Numeración binaria, 30, 377 Número del vector de excepción, 290. Numeros binarios, 28. ba — Ln Operaciones lógicas, 31, 203 Operando destino, 118. Operando origen, 118. Operandos, 11 Operandos implicitos, 197. OR, 31, 37, 205, 215. Ordenador, 20, ORG, 144. OS, 49, 56, 288. PACK, 325. Palabra, 27. Palabra de estado del procesador, 93. Paquete, 55. Pastilla, 18. Patrones, 22. PC, 43, 93, 185. PEA, 188. Pila, 93, 112, 164. Pila del sistema, 50. Portátil, 55, 81. Prebúsqueda, +4. Programa fuente, 78, 83, Proerama objeto, 7 Programación, 77. Programas, 19, 122 Programas residentes, 49. PROM, 56. Pseudocódigos, 144. PSW, 93. Puertas, 33. Puertas lógicas, 32, Puntero de pila de usuario, 94. Puntero de pila supervisor, 94. Punteros de pila, 94, RAM, 38, 47, 52 RAM disco, 87. Ramificación, 44, 12 Ramificación condicional, 1 Ramificación incondicional, Es 2 Rango, 26. Registro de códigos de condición, 43, 930122. Registro de códigos de función desti- no, 293. Registro de códigos de función origen, 293, Registro de estado, 93, 96, 110, 214, Registro de instrucciones, 43. Registro de señal, 43 Registro de subrutina, 118. Registro indice, 97. Registro vectorial de base, 290. Registros, 37, 47. Registros de dirección, 92, 107, Registros del sistema cache, 304, Reloj del sistema, 37. ROL, 230. ROM. 38. ROR, 230. RORG, 186. Rotaciones, 230. ROXL, 230. A e RTR, RTS, he 169. 2 ccionamiento, 49. ementación, 44. Segmentación de la memoria, 50. Ser de instrucciones, 83. Ser de instrucciones ortogonal, 97, 343, SFC, 293. Silicio, 18. Sistema, 18, 55, Sistema cache, 301, 306. Sistema hexadecimal, 29. Sistema microprocesador, 18. Sistema multibús, 39. Sistema muluprocesador, 19. Sistema octal, 29. Sistema operativo, 49, 56. Software, 54, Sofware de aplicación, 35. Software del sistema, 55. Spool!, 287. SR, 93, 110, 215. SSP, 94. SUB, 243. SUBA, 244. Subrutina, 167. Suma binaria, 29. A Se Se Se Sumador, 35. Supervisor, 52, SWAP, 262. Tabla de vectores de excepción, 290, Tablas de verdad, 32. Tax del cache, 302. TAS, 241, 323. Teoria de la información, 20. Terminales FC, 52. TRAP, 111, 278, 280. TRAPcc, 326. TST, 234, 326, Unidad aritmética y lógica, 39, 46, Unidad central de proceso, 18, Unidad microprocesadora, 18. Unidades de manejo de memoria, 52. UNPK, 325-326. USP, 94. Utilidades, 56. Variante 49, 311. Variante 410, 311. VBR, 290. Vector de excepción, 290, Velocidad de la CPU, 44. Versión compilada, 78. VLSI, 60, 65.