Escuela de Ingenierías Industriales (Badajoz) Universidad de Extremadura Programación en Lenguaje Ensamblador para el Procesador MC68000 Estructura de los Microprocesadores (2º I.T.I. Electrónico) José Ignacio Suárez Marcelo Escuela de Ingenierías Industriales (Badajoz) - UEx Estructura de los Microprocesadores Introducción a la Programación en Ensamblador 1. Lenguaje Máquina El lenguaje que utiliza y entiende un procesador digital está formado exclusivamente por unos y ceros (transistores trabajando en corte/saturación a alta velocidad). Los datos y las instrucciones son un conjunto de unos y de ceros almacenados en memoria. Por tanto, el procesador sólo entiende programas escritos con unos y ceros. Este “idioma” que es capaz de entender el procesador recibe el nombre de lenguaje máquina. 2. Lenguaje Ensamblador Sería una tarea muy engorrosa y tediosa para los programadores escribir el código correspondiente al programa usando unos y ceros, es decir, usando el lenguaje máquina. Además, se podrían cometer muchos errores. Los programas escritos en lenguaje máquina serían difíciles de entender y de depurar. En lugar de ello, los fabricantes de procesadores facilitan al programador las instrucciones escritas en un lenguaje cercano a la máquina, pero más fácilmente entendible por el ser humano, que recibe el nombre de lenguaje ensamblador. Este lenguaje usa valores simbólicos, en lugar de binarios, llamados nemónicos, es decir, códigos mnemotécnicos1 (fáciles de memorizar) que identifican su funcionalidad, (por ejemplo, MOVE representa una instrucción de movimiento de datos). El lenguaje ensamblador conserva las principales ventajas del lenguaje máquina, ya que, cada instrucción en ensamblador se corresponde con una instrucción en lenguaje máquina. Además, el lenguaje ensamblador presenta ciertas ventajas adicionales, como por ejemplo, que se pueden definir zonas de memoria y sus contenidos, se pueden utilizar comentarios, macros, etc. de tal forma que se ayude a estructurar el programa y a la comprensión del mismo. 3. Programa Ensamblador La traducción del código mnemónico o lenguaje ensamblador al código máquina se realiza con ayuda de un ordenador sobre el que corre un software llamado programa ensamblador.2 El código que corresponde al programa escrito en lenguaje ensamblador y que va a ser traducido a lenguaje máquina recibe el nombre de código fuente. Y el código en lenguaje máquina generado por el programa ensamblador recibe el nombre de código objeto. 1 La Real Academia de la Lengua Española define “mnemotécnico” como “perteneciente o relativo a la mnemotecnia” y “mnemotecnia” como “procedimiento de asociación mental para facilitar el recuerdo de algo”. 2 Conviene advertir que la palabra ensamblador, que se utiliza tanto para denominar al lenguaje de programación como al programa que lo traduce, tiene dos acepciones diferentes que no deben ser confundidas. Programación en Lenguaje Ensamblador para el Microprocesador MC68000 1 Escuela de Ingenierías Industriales (Badajoz) - UEx Estructura de los Microprocesadores Cuando el ordenador que se utiliza para el ensamblado es el mismo o tiene el mismo procesador que el sistema en el que se va a ejecutar el código máquina resultante, se dice que el programa ensamblador utilizado es un autoensamblador. Pero, si el procesador destino es diferente al procesador del ordenador donde corre el programa ensamblador, entonces se habla de un ensamblador cruzado (cross assembler). En estas prácticas se emplea un “ensamblador cruzado de 68000” ya que el ordenador que soporta al programa ensamblador corre en un ordenador personal compatible IBM (plataforma Intel o AMD) y el procesador destino es un MC68000 de Motorola. 4. Programa Montador de Enlaces En general, el código objeto producido por el programa ensamblador, aunque está en código máquina, todavía no es directamente ejecutable en el procesador. Esto es debido a que el fichero con el código objeto incluye información adicional que será empleada por otro programa llamado montador de enlaces. El montador de enlaces utiliza esta información para organizar el código máquina procedente de uno o varios códigos objeto, con el fin de generar un programa ejecutable. El programador, por tanto, en lugar de generar un programa muy extenso, puede optar por dividirlo varios módulos más pequeños, de tamaño razonable, de forma que el programa completo tenga una mayor facilidad de comprensión y depuración. Además, con esta forma de trabajo se pueden insertar otros módulos, llamados bibliotecas (en inglés, libraries), desarrollados para otras aplicaciones, ya depurados y probados, con lo cual se reduce el tiempo de desarrollo. En muchas ocasiones es el propio fabricante del procesador quien facilita dichas bibliotecas. CÓDIGO FUENTE 1 CÓDIGO FUENTE 2 ENSAMBLADOR CÓDIGO OBJETO LINKADOR CÓDIGO EJECUTABLE CÓDIGO FUENTE n Programación en Lenguaje Ensamblador para el Microprocesador MC68000 2 Escuela de Ingenierías Industriales (Badajoz) - UEx Estructura de los Microprocesadores El ensamblador 68000 (IDE68K) 1. Características Generales • Es un ensamblador cruzado. • El código fuente debe estar escrito en código ASCII. Las líneas del programa o sentencias están divididas en tres campos: [Etiqueta] [Código[Operando(s) ]] [Comentario] Campo de Etiquetas: La etiqueta es un nombre inventado por el programador que sirve para definir posiciones de memoria específicas o valores constantes. Liberan al programador de recordar datos numéricos, posiciones de memoria, etc. − Reglas para la definición de etiquetas: Cadena de caracteres de cualquier longitud, aunque sólo los 15 primeros son significativos. Puede ser cualquier código ASCII mayor de 32 (espacio), salvo: + - 1 & ! | ^ < > ( ). El primer carácter no puede ser un número ni los símbolos $, ni %. Mayúsculas y minúsculas se consideran caracteres diferentes. Tienen que estar en la primera columna de texto, salvo que terminen con el carácter : ( dos puntos), en cuyo caso, sí puede haber espacios delante de ellas. Ejemplos de etiquetas válidas Ejemplos de etiquetas no válidas Esto_es_una_etiqueta LAZO1 SALTO: Bucle_n1 bucle_n1 1LB12 (empieza por número) LAZO&1 (contiene carácter ilegal) Programación en Lenguaje Ensamblador para el Microprocesador MC68000 3 Escuela de Ingenierías Industriales (Badajoz) - UEx Estructura de los Microprocesadores Campo de Códigos: En el campo de códigos pueden aparecer: • Instrucciones: las pertenecientes al juego de instrucciones del ensamblador. • Directivas del Ensamblador: son códigos mnemónicos que actúan sobre el programa ensamblador y que, por tanto, no tienen traducción al código máquina. − Reglas para la definición de códigos: El campo de código debe estar separado del margen izquierdo con, al menos, un espacio (normalmente se usa una tabulación). Pueden ser todos los mnemónicos del juego de instrucciones así como las directivas del ensamblador. No se hace distinción entre mayúsculas o minúsculas. Los sufijos utilizados para indicar el tamaño de los datos son: .B (byte), .W (palabra) y .L (doble palabra). Para la instrucción BRA, donde el salto puede ser de 8 ó 16 bits, se usan los sufijos .S (short) y .L (long), respectivamente. A pesar de esto, se recomienda no usar este sufijo, ya que el programa ensamblador se encarga de seleccionar el tipo de salto que mejor se adapte a cada caso. − Operandos: Dentro del campo de códigos puede aparecer el campo de operandos, donde se ubicarán los operandos que utilicen las instrucciones o las directivas del ensamblador. La sintaxis, cuando son operandos de instrucciones, es la ya vista en los modos de direccionamiento. Existen variantes en los direccionamientos relativos al PC: Dir. Relativo al PC con desplazamiento: Dsp(PC) o Etiqueta Relativa Dir. Relativo al PC con índice (Dm) y desplazamiento (dsp): Dsp(PC,Dm.X) o Etiqueta Relativa(PC,Dm.X ) Si para una instrucción determinada no usamos el tamaño de operando adecuado, el ensamblador nos dará un mensaje de error. El ensamblador reconoce al puntero de pila, A7, como SP (Stack Pointer). Si utilizamos un direccionamiento inmediato tendremos que usar el carácter # (almohadilla). Además, si el dato es: Programación en Lenguaje Ensamblador para el Microprocesador MC68000 4 Escuela de Ingenierías Industriales (Badajoz) - UEx Estructura de los Microprocesadores binario, usaremos %. hexadecimal, el carácter $. decimal, no será necesario ningún prefijo (excepto #). código ASCII, se utilizarán comillas simples. Por ejemplo: #'A' Los operandos también pueden ser representados mediante etiquetas. Por ejemplo: move.b #valor,D0 Se pueden utilizar expresiones aritméticas y lógicas para definir el valor numérico de un operando. Las operaciones permitidas son: O lógica (OR): | O exclusiva (XOR): ^ Y lógica: & Suma de enteros: + Resta de enteros: − División entera de enteros: / Desplazamiento lógico a derecha: > Desplazamiento lógico a izquierda: < Signo: + − Negación: ! Paréntesis sin límites de nivel: ( ) Campo de Comentarios: Este campo debe estar separado del anterior por, al menos, un espacio. En el caso de sentencias que únicamente contengan comentarios, el primer carácter puede ser un punto y coma (;), y en este caso, tiene que coincidir con la primera columna, o también puede ser un asterisco (*). El uso de comentarios es fundamental para la buena interpretación de un programa en ensamblador, su depuración y el entendimiento de dicho programa por una persona distinta a quien lo programó. Programación en Lenguaje Ensamblador para el Microprocesador MC68000 5 Escuela de Ingenierías Industriales (Badajoz) - UEx Estructura de los Microprocesadores 2. Directivas del ensamblador Únicamente vamos a ver las directivas más importantes y son las siguientes: Directiva “ORG”: (program ORiGing) Indica al ensamblador la posición de memoria inicial a partir de la cual debe situar el código que se genere detrás de esta directiva. Por ejemplo: ORG $25000. Directiva “DC”: (Define Constant data) Define constantes. Se usa para crear datos constantes en memoria, por ejemplo, tablas, texto y números. Su sintaxis es la siguiente: [Etiqueta] DC[.B] [.W] [.L] [Operando1] [, Operando2] [, ...] Reserva e inicializa una o varias posiciones consecutivas de memoria del tamaño indicado (bytes, palabras o dobles palabras) cuyos valores vienen indicados por los operandos. Si no se indica nada se supone “.W”. Si es necesario los datos numéricos son truncados para adaptarse al tamaño indicado. Se pueden generar hasta 256 bytes con una simple directiva DC. Si no se incluye ningún operando, entonces se reserva e inicializa a cero. La etiqueta tiene asignada la dirección del primer dato almacenado. Ejemplos: ETIQ1 ETIQ DC.B 10, 5, 7 ETIQ2 MEMORIA ETIQ → 2N 2N+1 10 7 5 Programación en Lenguaje Ensamblador para el Microprocesador MC68000 DC.B ‘A’, ‘B’ DC.W $2A34 DC.L MEMORIA 2N ETIQ1 → ‘A’ $2A ETIQ2 → $00 $00 2N+1 ‘B’ $34 $00 $00 6 Escuela de Ingenierías Industriales (Badajoz) - UEx Estructura de los Microprocesadores Directiva “DS”: (Define Storage) Define una zona de variables. Esta directiva es usada para reservar memoria para propósitos específicos. Su sintaxis es la siguiente: [Etiqueta] DS[.B] [.W] [.L] longitud Reserva en memoria tantas posiciones como indique longitud del tamaño definido por el sufijo de la etiqueta (bytes, palabras o dobles palabras), y los inicializa a cero. Si no se indica nada se supone “.W”. Ejemplo: ETIQ DS.W 3 MEMORIA ETIQ → 2N 2N+1 $00 $00 $00 $00 $00 $00 Directiva “EQU”: (EQUal) Iguala. Define un valor simbólico (el definido en el campo de Etiqueta) cuyo valor es el del campo “expresión”. Su sintaxis es la siguiente: Etiqueta EQU expresión Asigna el valor de expresión a etiqueta. Ejemplos: num dir EQU EQU $32A0 (dir1+dir2)/2 Directiva “END”: (END of source code) Final del código fuente. Indica al programa ensamblador dónde termina el programa. Todo lo que se escriba detrás de esta directiva no será ensamblado. Si no se encuentra se ensambla todo. Su sintaxis es la siguiente: END [punto de entrada] Se puede especificar un parámetro opcional, el punto de entrada (entry point), es decir, la dirección de inicio del programa. Programación en Lenguaje Ensamblador para el Microprocesador MC68000 8