Universidad Rey Juan Carlos ESTRUCTURA Y TECNOLOGÍA DE COMPUTADORES Introducción a la programación en ensamblador del MC68000 Luis Rincón Córcoles Licesio J. Rodríguez-Aragón Introducción a la programación en ensamblador del MC68000 Programa 1. 2. 3. 4. 5. 6. 7. 8. Introducción. Directivas básicas de los ensambladores para MC68000. MC68000 y las operaciones con bits. MC68000 y los tipos de datos simples. MC68000 y las variables simples. MC68000 y la evaluación de expresiones aritméticas. MC68000 y la evaluación de expresiones booleanas. MC68000 y las sentencias de control. 2 Introducción a la programación en ensamblador del MC68000 Bibliografía  D.A. PATTERSON, J.L HENNESSY. Estructura y diseño de computadores. Reverté, 2000.  M68000 8/16/32 Bit Microprocessors User’s Manual. 9th edition. Motorola, 1993.  Motorola M68000 Family Programmer’s Reference Manual. Motorola, 1992.  A. CLEMENTS. Microprocessor Systems Design. 3rd edition, ITP - PWS Publishing Company, 1997.  J. SEPTIÉN, H. MECHA, R. MORENO, K. OLCOZ. La familia del MC68000. Síntesis, 1995.  C. CERRADA, V. FELIU. Estructura y Tecnología de Computadores I. UNED, 1993  F.G. McCABE. High-Level Programmer’s Guide to the 68000. Prentice-Hall, 1992. 3 Introducción a la programación en ensamblador del MC68000 1. Introducción  Hasta ahora hemos estudiado los fundamentos del lenguaje ensamblador: • • • • • Repertorios de instrucciones. Modos de direccionamiento. Directivas de ensamblador. Herramientas de traducción de programas. Proceso de creación de un programa.  Ahora vamos a estudiar los fundamentos de la programación en ensamblador: • • • • Uso de las directivas más habituales. Manejo de bits individuales y datos simples. Evaluación de expresiones aritméticas y booleanas. Implementación de estructuras de control.  Más adelante trataremos conceptos más avanzados: • • • • Implementación y manejo de estructuras de datos. Gestión de subrutinas. Bibliotecas de subprogramas. Etc. 4 Introducción a la programación en ensamblador del MC68000 Introducción  Los objetivos perseguidos son: • Aprender a programar en ensamblador. • Aprender cómo generan código los compiladores.  Los lenguajes de programación de alto nivel habitualmente no definen en sus estándares los tamaños exactos de los datos (al menos de los datos numéricos). • Normalmente el entero base coincide en tamaño con la palabra del computador. • Diferentes compiladores del mismo lenguaje en una misma máquina manejan tamaños de datos que pueden no coincidir.  Los computadores convencionales entienden los datos como ristras de bits: • • • • El ensamblador no es un lenguaje tipado. Ciertas instrucciones distinguen entre enteros con signo y enteros sin signo. Instrucciones específicas para coma flotante de precisión simple o doble. Algunas máquinas tienen instrucciones para vectores o tiras de caracteres. 5 Introducción a la programación en ensamblador del MC68000 Introducción  MC68000: máquina de 16 bits. • Se tomarán como base los tipos de TurboPascal y de TurboC. • Son compiladores pensados para PC XT y AT con procesadores 8086 y 80286 de 16 bits.  Las implementaciones de las estructuras de control pueden realizarse mediante diferentes secuencias de código máquina. • La secuencia concreta en código máquina es indiferente mientras el programa en alto nivel funcione correctamente.  Por otra parte, compiladores diferentes generan secuencias de instrucciones de máquina diferentes dependiendo de: • Los convenios adoptados: Comprobaciones de la corrección de los cálculos. Ubicación y gestión de variables. Gestión de subprogramas. • Las optimizaciones de código realizadas. 6 Introducción a la programación en ensamblador del MC68000 2. Directivas básicas en MC68000 1. 2. 3. 4. 5. 6. Manipulación del contador de dirección de ensamblaje. Definición de símbolos explícitos. Reserva de espacio en memoria (definición de variables). Fin de traducción. Alineamiento. Inclusión de ficheros. 7 Introducción a la programación en ensamblador del MC68000 MC68000: contador de dirección de ensamblaje  El valor del CDE se va modificando a medida que se traduce el programa, de acuerdo con el tamaño de los objetos traducidos (datos o instrucciones). (suponemos que CDE = d) OBJETO (instrucción o definición de datos, con sus operandos) (ahora CDE = d+t, siendo t el tamaño de la instrucción o de los datos en octetos)  El valor del CDE puede ser modificado a voluntad mediante la directiva ORG.  Sintaxis: ORG valor Efecto: CDE = valor.  El nuevo valor asignado al CDE no debería ser inferior a su valor actual. 8 Introducción a la programación en ensamblador del MC68000 MC68000: símbolos explícitos  La directiva EQU sirve para definir un símbolo explícito cuyo valor permanece constante a lo largo del programa:  Sintaxis: SIMB EQU valor Efecto: se inserta SIMB en la tabla de símbolos, con el valor especificado. Nombre del símbolo Tipo del símbolo Valor del símbolo ... ... ... SIMB EQU valor ... ... ...  Una vez definido un símbolo mediante EQU, dicho símbolo no puede ser redefinido.  EQU se utiliza para definir constantes (igual que CONST en PASCAL).  En directivas EQU no se permiten referencias adelantadas. 9 Introducción a la programación en ensamblador del MC68000 MC68000: símbolos explícitos  La directiva SET sirve para definir un símbolo explícito redefinible. • No se permiten referencias adelantadas.  Sintaxis: SIMB SET valor1 Efecto: se inserta SIMB en la tabla de símbolos, con el valor especificado. Nombre del símbolo Tipo del símbolo Valor del símbolo ... ... ... SIMB SET valor1 ... ... ...  Una vez definido un símbolo mediante SET, dicho símbolo puede ser redefinido tantas veces como se quiera únicamente mediante otras directivas SET. SIMB SET valor2 Nombre del símbolo Tipo del símbolo Valor del símbolo ... ... ... SIMB SET valor2 ... ... ... 10 Introducción a la programación en ensamblador del MC68000 Variables en un programa  En un programa de computador, una variable es un espacio en memoria utilizado para almacenar un dato cuyo valor puede ser modificado a lo largo del programa.  Tipos de variables: • Estáticas: creadas al inicio del programa, existen mientras el programa se encuentra en ejecución. • Locales: propias de procedimientos y funciones, existen mientras se ejecuta el procedimiento o función al que pertenecen. Se crean cuando arranca el procedimiento o función, y se destruyen en el momento en que éste termina de ejecutarse. • Dinámicas: creadas a lo largo de la ejecución del programa, su existencia no está ligada (en sentido estricto) a la ejecución de ningún procedimiento o función. Son creadas y destruidas mediante el gestor de memoria dinámica, perteneciente al sistema operativo. 11 Introducción a la programación en ensamblador del MC68000 Variables en un programa  Las variables estáticas ocupan espacio en el código objeto.  Una variable estática recibe un nombre que se asocia a la dirección que ocupa dentro de la zona de datos.  Ejemplo (PASCAL) PROGRAM P (input, output); VAR V: INTEGER; ... Direcciones Memoria ... dir (asociado al nombre V) ???? Espacio ocupado por la variable V ... 12 Introducción a la programación en ensamblador del MC68000 Variables en un programa  El valor de una variable puede modificarse una o varias veces a lo largo del programa.  Ejemplo (PASCAL) Direcciones Memoria ... ... dir (asociado al nombre V) 5 ... ... Direcciones Memoria ... ... dir (asociado al nombre V) 8 ... ... V := 5; V := V+3;  Las directivas para reserva de espacio en memoria se suelen emplear para definir variables estáticas. 13 Introducción a la programación en ensamblador del MC68000 MC68000: reserva de espacio en memoria  La directiva DS (Define Storage) reserva un espacio en memoria sin asignarle un valor inicial determinado.  Sintaxis: (suponemos que CDE = d) [ETIQ] DS.t n Reserva n datos de tamaño t (t=B, W ó L) (ahora CDE = d+t*n, siendo t el tamaño de cada dato) Efecto: se reservan en memoria n*t octetos para variables. Direcciones Memoria ... d (asociado al nombre ETIQ si existe la etiqueta) ???? d+t*n ... Espacio reservado: t*n octetos  La etiqueta es opcional, y si existe se inserta en la tabla de símbolos como un símbolo implícito (tipo LABEL).  En esta directiva no se permiten referencias adelantadas. 14 Introducción a la programación en ensamblador del MC68000 MC68000: reserva de espacio en memoria  La directiva DC (Define Constant) reserva un espacio en memoria asignándole un valor inicial determinado. • El nombre es confuso, porque en realidad define una variable (espacio en memoria).  Sintaxis: (suponemos que CDE = d) [ETIQ] DC.t val Reserva un dato de tamaño t (t=B, W ó L) (ahora CDE = d+t, siendo t el tamaño del dato reservado) Efecto: se reserva en memoria un dato de t bytes para una variable, y se le asigna un valor inicial. Direcciones Memoria ... d (asociado a ETIQ si hay etiqueta) val d+t ... Espacio reservado: t octetos  La etiqueta es opcional, y si existe se inserta en la tabla de símbolos como un símbolo implícito (tipo LABEL). 15 Introducción a la programación en ensamblador del MC68000 MC68000: reserva de espacio en memoria  Para abreviar, con DC se pueden definir varias variables, todas ellas del mismo tamaño, separando sus valores por comas. • La etiqueta, si existe, se asocia únicamente al primer dato de la lista. (suponemos que CDE = d) [ETIQ] DC.t val1,val2,val3,...,valN (ahora CDE = d+t*N, siendo t el tamaño de cada dato) Direcciones Memoria ... d (asociado a ETIQ si hay etiqueta) val1 t octetos d+t (asociado a ETIQ+t si hay etiqueta) val2 t octetos d+2*t (asociado a ETIQ+2*t si hay etiqueta) val3 t octetos ... ... d+t*(N-1) (asociado a ETIQ+(N-1)*t si hay etiqueta) valN d+t*N ... t octetos 16 Introducción a la programación en ensamblador del MC68000 MC68000: directiva de fin de traducción  La directiva END indica al traductor que ha llegado el final del programa fuente, y que no debe seguir traduciendo. • Lo que vaya detrás de una directiva END se ignora.  Sintaxis: END [dir] Efecto: la traducción del programa finaliza.  Cuando lleva un operando, esta directiva se usa para indicar la dirección de comienzo del programa principal (o la etiqueta de la primera instrucción que queremos ejecutar al iniciar el programa, si la tiene). 17 Introducción a la programación en ensamblador del MC68000 MC68000: directivas de alineamiento  En las máquinas con restricciones de alineamiento, la definición de variables en posiciones indebidas puede dar lugar a errores de ejecución de los programas.  A veces los traductores realizan el alineamiento de los objetos correctamente a fin de evitar dichos errores de ejecución.  En el MC68000 se usa la directiva EVEN para alinear en una posición par el objeto que se encuentra inmediatamente a continuación de la directiva.  Sintaxis: EVEN Efecto: si el CDE tiene valor impar, le suma 1; en caso contrario no tiene efecto ninguno. 18 Introducción a la programación en ensamblador del MC68000 3. MC68000 y las operaciones con bits  Dependiendo de su tipo de datos, las variables utilizadas en los programas pueden tener diferentes tamaños. • En general el tamaño mínimo de una variable es un octeto.  En ocasiones es preciso actuar sobre bits concretos de un operando, obviando sus bits restantes.  Existen computadores que disponen de instrucciones que permiten acceder a: • Un bit concreto de un operando (sin acceder al resto). • Un subconjunto (campo) de varios bits contiguos del operando.  El MC68000 dispone de instrucciones de acceso a bit: • • • • BCLR: pone a 0 un bit del operando destino. BSET: pone a 1 un bit del operando destino. BCHG: invierte un bit del operando destino. BTST: testea un bit del operando destino y afecta al bit Z del CCR.  El MC68000 no tiene instrucciones que manejen campos de bits, aunque otros procesadores de la familia sí disponen de ellas (del MC68020 en adelante). 19 Introducción a la programación en ensamblador del MC68000 MC68000 y las operaciones con bits  Una máscara de bits se puede entender como un dato binario (normalmente constante) que permite actuar selectivamente sobre ciertos bits de otro dato a través de una operación lógica (AND, OR, EOR).  Convenientemente utilizadas, las máscaras de bits pueden emplearse para actuar sobre subconjuntos de bits (no necesariamente contiguos) de un operando. • Poner bits a 0: AND máscara,dato • Poner bits a 1: OR máscara,dato • Invertir bits: EOR máscara,dato  Si la máscara es constante, se almacena en un dato inmediato.  Si la máscara es variable, debe almacenarse en un registro o variable de memoria.  Las máscaras pueden escribirse en cualquier base de numeración. • Lo normal es usar base binaria o hexadecimal. 20 Introducción a la programación en ensamblador del MC68000 MC68000 y las operaciones con bits  AND máscara,dato: permite poner a 0 un conjunto de bits de un dato, dejando inalterados los restantes. • Ejemplo: borrar los bits 2, 3, 5 y 7 del registro D2, dejando intactos los demás ANDI.B #%10010011,D2  OR máscara,dato: permite poner a 1 un conjunto de bits de un dato, dejando inalterados los restantes. • Ejemplo: poner a 1 los bits 1, 2 y 4 del registro D1, dejando intactos los demás ORI.B #%00010110,D3  EOR máscara,dato: permite invertir un conjunto de bits de un dato, dejando inalterados los restantes. • Ejemplo: invertir los bits 4, 5, 6 y 7 del registro D4, dejando intactos los demás EORI.B #%11110000,D4 21 Introducción a la programación en ensamblador del MC68000 MC68000 y las operaciones con bits  Las máscaras pueden emplearse en datos de cualquier tamaño: • Ejemplo: ANDI.L #$00FFFFFF,D5 pone a 0 los 8 bits superiores de D5.  Las operaciones AND, OR y EOR afectan a los biestables Z y N del CCR, y ponen a 0 los bits V y C. • Tras usarlas es posible tomar decisiones mediante instrucciones condicionales. • Condiciones susceptibles de ser utilizadas: EQ, NE, PL y MI.  Las máscaras pueden emplearse para realizar tareas tan complejas como se desee. 22 Introducción a la programación en ensamblador del MC68000 4. MC68000 y los tipos de datos simples  El MC68000 considera tres tipos de datos según su tamaño: .B, .W y .L.  A nivel de máquina, el MC68000 considera que los datos que maneja son numéricos, o a lo sumo ristras de bits. • A veces se distingue entre datos en binario puro (unsigned) o en complemento a 2 (signed). • Hay algunas instrucciones que usan operandos codificados en BCD. • No existe un tipo específico para caracteres, ni tampoco para datos booleanos.  El MC68000 no maneja datos en coma flotante, salvo que cuente con un coprocesador 68881 asociado.  Vamos a estudiar la correspondencia entre los tipos de datos simples en TurboPascal y su definición y manejo en el MC68000. 23 Introducción a la programación en ensamblador del MC68000 MC68000 y los tipos de datos simples  Equivalencia de tipos en TurboPascal, TurboC y MC68000 (máquina de 16 bits): Comentarios Turbo Pascal TurboC .B Entero sin signo 8 bits BYTE unsigned char X Entero sin signo 16 bits WORD unsigned int unsigned short Entero sin signo 32 bits No existe unsigned long Entero con signo 8 bits SHORTINT signed char Entero con signo 16 bits INTEGER int, short Entero con signo 32 bits LONGINT long Carácter CHAR char signed char unsigned char X Booleano BOOLEAN ? X Puntero ^Tipo Tipo * No se han considerado datos en BCD ni en coma flotante .W .L X X X X X X 24 Introducción a la programación en ensamblador del MC68000 MC68000 y los tipos de datos simples  Las variables de los programas se ubicarán en memoria.  Los registros de datos del MC68000 se utilizarán generalmente para almacenar resultados intermedios de cálculos.  Los registros de direcciones del MC68000 servirán como punteros temporales a variables o estructuras de datos residentes en memoria.  El acceso a datos almacenados en memoria es notablemente más lento que el acceso a datos ubicados en registros.  Mantener variables en registros aumenta la velocidad de ejecución y disminuye el tamaño de las instrucciones, pero el MC68000 hay muy pocos registros. • Se puede complicar mucho la gestión de variables (los compiladores hacen mejor esta tarea que los programadores). 25 Introducción a la programación en ensamblador del MC68000 5. MC68000 y las variables simples  Analizaremos la definición y el manejo de los tipos de datos simples del lenguaje PASCAL (en la implementación de TurboPascal) trasladados al lenguaje ensamblador del MC68000.  Se analizarán los siguientes tipos: • • • • • • Entero con signo de 8 bits: SHORTINT, signed char. Entero con signo de 16 bits: INTEGER, int, short. Entero con signo de 32 bits: LONGINT, long. Carácter de 8 bits: CHAR, char. Booleano de 1 bit: BOOLEAN. Puntero de 32 bits. 26 Introducción a la programación en ensamblador del MC68000 MC68000 y los enteros con signo Turbo Pascal C .B SHORTINT signed char X INTEGER int, short LONGINT long .W .L Comentarios Entero con signo X Entero con signo X Entero con signo * Definición de variables SHORTINT AS BS CS DS ES DC.B DC.B DC.B DC.B DS.B -5 20 $80 $7F 1 Valor Valor Valor Valor Valor inicial: -5 inicial: 20 inicial: –128 inicial: 127 inicial indeterminado Valor Valor Valor Valor Valor inicial: -5 inicial: 20 inicial: –32768 inicial: 32767 inicial indeterminado Valor Valor Valor Valor Valor inicial: -5 inicial: 20 inicial: –2147483648 inicial: 2147483647 inicial indeterminado * Definición de variables INTEGER AI BI CI DI EI DC.W DC.W DC.W DC.W DS.W -5 20 $8000 $7FFF 1 * Definición de variables LONGINT AL BL CL DL EL DC.L DC.L DC.L DC.L DS.L -5 20 $80000000 $7FFFFFFF 1 27 Introducción a la programación en ensamblador del MC68000 MC68000 y los enteros con signo  Suma y resta • Instrucciones: ADD y SUB (o derivados). • Condiciones para enteros con signo:GT, GE, LT, LE, PL, MI, EQ, NE, VS, VC.  Producto: instrucción MULS. • Operandos fuente: 16 bits (tipo INTEGER de TurboPascal) •Resultado: 32 bits (tipos LONGINT en TurboPascal)  División: instrucción DIVS. • Dividendo: 32 bits (tipo LONGINT en TurboPascal). • Divisor y cociente: 16 bits (tipo INTEGER de TurboPascal) •Resto: 16 bits en mitad superior (para usarlo como un dato de tipo INTEGER hay que intercambiar antes las dos mitades del registro resultado con SWAP).  Extensión de signo: EXT. • No se puede hacer extensión de signo de 8 a 32 bits directamente. EXT.W D0 Extensión de signo de 8 bits a 16 sobre D0 EXT.L D0 Extensión de signo de 16 bits a 32 sobre D0  Cambio de signo: instrucción NEG (un solo operando). 28 Introducción a la programación en ensamblador del MC68000 MC68000 y los enteros con signo Condición Nemotécnico Instrucciones Menor que LT (less than) slt blt dblt op etiqueta Dn,etiqueta Menor o igual LE (less or equal than) sle ble dble op etiqueta Dn,etiqueta Igual que EQ (equal) seq beq dbeq op etiqueta Dn,etiqueta Distinto a NE (not equal) sne bne dbne op etiqueta Dn,etiqueta Mayor o igual que GE (greater or equal than) sge bge dbge op etiqueta Dn,etiqueta Mayor que GT (greater than) sgt bgt dbgt op etiqueta Dn,etiqueta Cierto T (true) st dbt op Dn,etiqueta Falso F (false) sf dbf op Dn,etiqueta / dbra Dn,etiqueta 29 Introducción a la programación en ensamblador del MC68000 MC68000 y las variables carácter Turbo Pascal C .B Comentarios CHAR char - signed char - unsigned char X Carácter  Correspondencia caracteres - enteros: un carácter se corresponde con el ordinal que tiene asignado en su código de representación. • Ordinal en PASCAL: función ORD (devuelve un número en binario puro). • Ordinal en C: número con signo (dato unsigned char) o sin signo (signed char). En C los enteros y los caracteres pueden intercambiarse: los caracteres son enteros de 8 bits con o sin signo. * Definición de variables CHAR C1 C2 C3 C4 C5 C6 C7 DC.B DC.B DC.B DC.B DC.B DC.B DS.B ‘A’ ‘a’ $9A %10011010 20 ‘A’+3 1 Asignado el carácter ‘A’ Asignado el carácter ‘a’ Asignado el carácter con ordinal 154 Asignado el carácter con ordinal 154 Asignado el carácter con ordinal 20 Asignado el carácter ‘D’ Sin valor inicial asignado  En ensamblador (como en C) los caracteres se pueden utilizar en operaciones aritméticas como números enteros de 8 bits con o sin signo. 30 Introducción a la programación en ensamblador del MC68000 MC68000 y las variables booleanas Tipo MIPS Pascal C Booleano 1 bit BOOLEAN ?  Para almacenar una variable booleana es suficiente con un bit, pero en el MC68000 las variables ocupan un mínimo de 8 bits.  Se pueden definir las siguientes constantes: TRUE FALSE EQU EQU 1 0 * Definición de variables booleanas A B C D DC.B DC.B DC.B DS.B TRUE FALSE 1 1 Asignado valor 1 (TRUE) Asignado valor 0 (FALSE) Asignado valor 1 (TRUE) Sin valor inicial asignado 31 Introducción a la programación en ensamblador del MC68000 MC68000 y las variables booleanas  En lenguaje C no existen variables booleanas, ya que todos los datos los maneja como cantidades numéricas (igual que el lenguaje ensamblador).  El lenguaje C sí tiene operadores booleanos para realizar operaciones lógicas. • • • • • AND lógico bit a bit: & OR lógico bit a bit: | OR exclusivo bit a bit: ^ Negación lógica bit a bit:! Comparaciones: =, !=, >, <, >=, <=  Evaluación booleana de un dato en C: • Si el dato tiene todos sus bits a 0 se considera que es falso. • Si el dato tiene uno o más bits distintos de 0 se considera que es cierto.  Esto concuerda con la instrucción Scond operando del MC68000: • Si cond es cierta, operando toma el valor $FF (tamaño octeto, todos los bits a 1). • Si cond es falsa, operando toma el valor $00 (tamaño octeto, todos los bits a 0). 32 Introducción a la programación en ensamblador del MC68000 MC68000 y los punteros  En los lenguajes de alto nivel, los punteros son un concepto abstracto en cuanto a que no se especifican sus características ni su rango válido de valores.  Físicamente, un puntero es un valor numérico que no contiene un dato en sí, sino la dirección de una variable que está ubicada en memoria.  En lenguaje PASCAL el uso de los punteros está muy limitado. • Asignaciones • Comparaciones de igualdad. • Creación o borrado dinámico de una variable apuntada por un puntero (S.O.).  En C los punteros se pueden usar en expresiones aritméticas como los enteros.  En el MC68000 la noción de puntero variable coincide con la de registro de direcciones. • Los registros de direcciones se pueden usar en operaciones aritméticas.  Los punteros pueden tener 16 bits o preferentemente 32 bits. 33 Introducción a la programación en ensamblador del MC68000 6. MC68000 y las expresiones aritméticas  Las expresiones aritméticas se pueden evaluar mediante el modelo de notación polaca inversa con la ayuda de una pila. • En el MC68000 la pila de evaluación se puede sustituir total o parcialmente por los registros de datos. Expresión en PASCAL con variables enteras: x:=(x*y+z*z) DIV (x-y); Expresión en C con variables enteras: x=(x*y+z*z)/(x-y); Evaluación de la expresión en ensamblador: MOVE.W X,D7 MULS Y,D7 MOVE.W Z,D6 MULS D6,D6 ADD.W D6,D7 MOVE.W X,D6 SUB.W Y,D6 EXT.L D7 DIVS D6,D7 MOVE.W D7,X x x*y z z*z x+y+z*z x-y valor en D7 valor almacenado en x 34 Introducción a la programación en ensamblador del MC68000 MC68000 y las expresiones aritméticas  Los compiladores de PASCAL generan código para comprobar posibles desbordamientos en cálculos o en índices, no así los de C. Expresión en PASCAL con variables enteras: x:=(x*y+z*z) DIV (x-y); Expresión en C con variables enteras: x=(x*y+z*z)/(x-y); MOVE.W MULS CMPI.L BHI MOVE.W EOR.W EOR.W BTST BNE MOVE.W MULS CMPI.L BHI MOVE.W EOR.W EOR.W BTST BNE ADD.W BVS MOVE.W SUB.W BVS BEQ EXT.L DIVS BVS MOVE.W X,D7 Y,D7 #$0000FFFF,D7 DESBORDE D7,D0 X,D0 Y,D0 #15,D0 DESBORDE Z,D6 D6,D6 #$0000FFFF,D7 DESBORDE D7,D0 X,D0 Y,D0 #15,D0 DESBORDE D6,D7 DESBORDE X,D6 Y,D6 DESBORDE DIV_0 D7 D6,D7 DESBORDE D7,X x x*y z z*z x+y+z*z x-y valor en D7 valor almacenado en x 35 Introducción a la programación en ensamblador del MC68000 7. MC68000 y las expresiones booleanas  Al igual que las expresiones aritméticas, las expresiones booleanas se pueden evaluar mediante el modelo de notación polaca inversa. Expresión en PASCAL con variables: zb := (x > y) AND (NOT xb OR yb); • • • • xb, yb y zb son variables booleanas; x e y son variables INTEGER. FALSE: dato con todos sus bits a 0. TRUE: dato con uno o varios bits a 1, preferentemente igual a $FF. Expresión en C (todas las variables enteras): zb = (x > y) && (!xb || yb); MOVE.W CMP.W SGT TST.B SNE NOT.B TST.B SNE OR.B AND.B MOVE.B X,D7 Y,D7 D7 XB D6 D6 YB D5 D5,D6 D6,D7 D7,ZB x Comparar x con y Resultado parcial en zb xb NOT xb yb NOT xb OR yb Resultado final en D7 Resultado final en zb 36 Introducción a la programación en ensamblador del MC68000 MC68000 y las expresiones booleanas  Las expresiones se pueden evaluar mediante cortocircuito: puede ser que el resultado final se conozca sin necesidad de evaluar la expresión completamente. PASCAL: C: zb := (x > y) AND (NOT xb OR yb); (xb, yb y zb son variables booleanas; x e y son variables INTEGER) zb = (x > y) && (!xb || yb); (Se asume que todas las variables son enteras) MOVE.W CMP.W SGT BLE MOVE.B SNE NOT.B BNE TST.B SNE MOVE.B FIN X,D7 Y,D7 D7 FIN XB,D7 D7 D7 FIN YB D7 D7,ZB x Comparar x con y Resultado parcial en D7 Cortocircuito xb NOT xb Cortocircuito Testear yb Resultado final en D7 Resultado final en zb 37 Introducción a la programación en ensamblador del MC68000 8. MC68000 y las sentencias de control  Analizaremos las sentencias de control sencillas del lenguaje PASCAL trasladadas al lenguaje ensamblador del MC68000.  Se analizarán las siguientes sentencias de control: • • • • • • Selección IF - THEN. Selección IF - THEN - ELSE. Bucle REPEAT - UNTIL. Bucle WHILE - DO. Bucle FOR - TO. Bucle FOR - DOWNTO. 38 Introducción a la programación en ensamblador del MC68000 MC68000: sentencia IF - THEN  PASCAL (variables enteras): FALSA ¿COND? CIERTA IF x >= y THEN BEGIN x := x+2; y := y-2; END;  Ensamblador MC68000: IF EQU MOVE.W CMP.W BLT ADDQ.W SUBQ.W EQU BLOQUE_THEN  C (variables enteras): FIN * X,D7 Y,D7 FIN #2,X #2,Y * if (x >= y) { x = x+2; y = y-2; }; 39 Introducción a la programación en ensamblador del MC68000 MC68000: sentencia IF - THEN - ELSE  PASCAL (variables enteras): CIERTA ¿COND? FALSA BLOQUE_ELSE IF x >= y THEN BEGIN x := y := END; ELSE BEGIN x := y := END;  Ensamblador MC68000: IF x+2; y+2; ELSE x-2; y-2;  C (variables enteras): BLOQUE_THEN THEN FIN EQU MOVE.W CMP.W BGE SUBQ.W SUBQ.W BRA ADDQ.W ADDQ.W EQU * X,D7 Y,D7 THEN #2,X #2,Y FIN #2,X #2,Y * if (x >= y) { x = x+2; y = y+2; } else { x = x-2; y = y-2; } 40 Introducción a la programación en ensamblador del MC68000 MC68000: sentencia REPEAT - UNTIL  PASCAL (variables enteras): a := 81; b := 18; REPEAT mcd := b; resto := a MOD b; a := b; b := resto; UNTIL resto = 0; BLOQUE_REPEAT  C (variables enteras): ¿COND? FALSA CIERTA a = 81; b = 18; do { mcd = b; resto = a % b; a = b; b = resto; } while (resto <> 0);  Ensamblador MC68000: MOVE.W MOVE.W REPEAT EQU MOVE.W CLR.L MOVE.W DIVS SWAP MOVE.W MOVE.W MOVE.W UNTIL TST.W BNE FIN EQU #81,A #18,B * B,MCD D7 A,D7 B,D7 D7 D7,RESTO B,A RESTO,B RESTO REPEAT * Algoritmo del ejemplo: cálculo del máximo común divisor. 41 Introducción a la programación en ensamblador del MC68000 MC68000: sentencia WHILE - DO  PASCAL (variables enteras):  Ensamblador MC68000: ¿COND? CIERTA BLOQUE_WHILE FALSA n := 5; fant := 1; f := 1; i := 2; WHILE i <= n DO BEGIN faux := f; f := f + fant; fant := faux; i := i+1; END; WHILE  C (variables enteras): n = 5; fant = 1; f = 1; i = 2; for ( ; i <= n; ) { faux = f; f = f + fant; fant = faux; i = i+1; END; FIN MOVE.W MOVE.W MOVE.W MOVE.W EQU MOVE.W CMP.W BGT MOVE.W MOVE.W ADD.W MOVE.W ADDQ.W BRA EQU #5,N #1,FANT #1,F #2,I * I,D7 N,D7 FIN F,FAUX FANT,D6 D6,F FAUX,FANT #1,I WHILE * Algoritmo del ejemplo: cálculo del término enésimo de la serie de Fibonacci. 42 Introducción a la programación en ensamblador del MC68000 MC68000: sentencia FOR - TO  En PASCAL estándar, el valor final del contador es indefinido, y además el contador no debería ser modificado dentro del bucle (¡puede haber resultados inesperados!).  El límite final no cambia a lo largo de la ejecución del bucle (aun cuando sea una variable y ésta se modifique en el bucle).  Ensamblador MC68000 i:= valor inicial CIERTO ¿i > límite final? FALSO i := i+1 BLOQUE FOR  PASCAL (variables enteras): (versión PASCAL): n := 5; fant := 1; f := 1; FOR i := 2 TO n DO BEGIN faux := f; f := f + fant; fant := faux; END; MOVE.W MOVE.W MOVE.W FOR EQU MOVE.W MOVE.W CMP.W BLT BRA INC ADDQ.W BLOQUE EQU MOVE.W MOVE.W ADD.W MOVE.W CMP.W BNE FIN EQU  C (variables enteras): n = 5; fant = 1; f = 1; for (i=2; i<=n; i++) { faux := f; f := f + fant; fant := faux; } ¿i <> límite final? CIERTO FALSO #5,N #1,FANT #1,F * #2,I N,D7 I,D7 FIN BLOQUE #1,I * F,FAUX FANT,D6 D6,F FAUX,FANT I,D7 INC 43 * Introducción a la programación en ensamblador del MC68000 MC68000: sentencia FOR - DOWNTO  PASCAL (variables enteras): i:= valor inicial CIERTO ¿i < límite final? i := i-1 BLOQUE FOR ¿i <> límite final? CIERTO FALSO FALSO n := 5; fant := 1; f := 1; FOR i := n DOWNTO 2 DO BEGIN faux := f; f := f + fant; fant := faux; END;  C (variables enteras): n = 5; fant = 1; f = 1; for (i=n; i<=2; i--) { faux = f; f = f + fant; fant = faux; }  Ensamblador MC68000 (versión PASCAL): MOVE.W MOVE.W MOVE.W FOR EQU MOVE.W MOVE.W CMP.W BGT BRA DEC SUBQ.W BLOQUE EQU MOVE.W MOVE.W ADD.W MOVE.W CMP.W BNE FIN EQU #5,N #1,FANT #1,F * N,I #2,D7 I,D7 FIN BLOQUE #1,I * F,FAUX FANT,D6 D6,F FAUX,FANT I,D7 DEC * 44 Introducción a la programación en ensamblador del MC68000 Comentarios sobre sentencias de control  En cualquier caso, las condiciones que regulan el comportamiento de las sentencias de control pueden evaluarse de forma completa o mediante cortocircuito.  Las implementaciones presentadas para los bucles FOR corresponden con el comportamiento demostrado por el FOR de TurboPascal. • • • El límite final para el contador queda prefijado al inicio del bucle. Si se modifica el contador en el cuerpo del bucle pueden obtenerse resultados inesperados. En PASCAL estándar, al terminar un FOR el valor del contador es indefinido.  Un bucle FOR es un bucle WHILE con una condición dependiente de un contador que se incrementa o decrementa unitariamente, y con un límite final prefijado al comienzo del bucle.  Los bucles WHILE pueden dar problemas con condiciones del tipo <= o >= si el valor del límite final coincide con un extremo del rango. • • ¿Qué sucede si se pide calcular el término 32767 de la serie de Fibonacci en el ejemplo? Ejercicio: proponer e implementar posibles soluciones (aumentar el tamaño de la variable del contador, reestructurar el bucle, etc).  Sentencia CASE: • Puede implementarse mediante estructuras IF-THEN-ELSE anidadas. • Es más eficiente (y complicado) implementarla mediante tablas de saltos. 45