Universidad Rey Juan Carlos ESTRUCTURA Y TECNOLOGÍA DE COMPUTADORES Traducción de programas en ensamblador a código máquina en el MC68000 Luis Rincón Córcoles Licesio J. Rodríguez-Aragón Traducción de programas en ensamblador a código máquina en el MC68000 Programa 1. Introducción. 2. Algunos conceptos básicos. 3. Ensamblaje y montaje de un programa sin referencias externas. 2 Traducción de programas en ensamblador a código máquina en el MC68000 Bibliografía  P. DE MIGUEL. Fundamentos de los computadores. 7ª edición. Paraninfo, 1999.  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  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. 3 Traducción de programas en ensamblador a código máquina en el MC68000 1. Introducción  Proceso de traducción de un programa fuente a su versión ejecutable: High-level language program Program Compiler Assembler Linker Computer Assembly language program 4 Traducción de programas en ensamblador a código máquina en el MC68000 Introducción  El proceso de traducción de un programa de ensamblador a código máquina consta de dos etapas: • Traducción de los módulos fuente en ensamblador a módulos objeto. • Montaje de los módulos objeto para formar el programa ejecutable.  El traductor toma el código ensamblador y lo traduce a código máquina creando un módulo objeto no ejecutable directamente. • Le pueden faltar referencias cruzadas, código de otros módulos, reubicar direcciones, etc.  El montador genera el código ejecutable reuniendo los módulos objeto, resolviendo las referencias cruzadas y reubicando el código.  En este tema estudiaremos: • Algunas directivas no estudiadas aún. • El proceso de traducción de un módulo ensamblador a módulo objeto. • El proceso de montaje estático de un programa ejecutable.  Los sistemas operativos con bibliotecas dinámicas (DLL) exigen montaje dinámico. 5 Traducción de programas en ensamblador a código máquina en el MC68000 2. Algunos conceptos básicos  Contador de dirección de ensamblaje.  Tabla de códigos de operación.  Tabla de símbolos.  Tabla de reubicación.  Referencias adelantadas.  Tipos de traductores de ensamblador. 6 Traducción de programas en ensamblador a código máquina en el MC68000 Contador de dirección de ensamblaje (CDE)  Variable propia del traductor a código máquina utilizada para asignar direcciones de memoria a los objetos del programa (datos e instrucciones). •El CDE lleva la cuenta de la dirección asignada al último objeto traducido. •La dirección asignada por el CDE a un objeto viene a ser la dirección de memoria en la que se encontrará cuando el programa esté en ejecución. •El CDE se puede usar como operando en instrucciones y directivas como una constante que en cada momento tiene un valor diferente (¡!). •Dentro de un programa en ensamblador el CDE se identifica por el símbolo *.  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)  Si un módulo en ensamblador tiene secciones, cada una de ellas cuenta con su propio CDE. 7 Traducción de programas en ensamblador a código máquina en el MC68000 Tabla de códigos de operación (TCO)  Tabla que contiene los nemotécnicos correspondientes a los códigos de operación del repertorio de instrucciones del computador objetivo, así como los de las pseudoinstrucciones y directivas.  Esta tabla también deberá contener indicaciones acerca de cómo debe procesarse cada instrucción, pseudoinstrucción o directiva.  Es una tabla estática, es decir, existe antes de comenzar a traducir el programa fuente, y es independiente del código que éste contiene. 8 Traducción de programas en ensamblador a código máquina en el MC68000 Tabla de símbolos (TS)  Es una tabla en la cual el traductor va almacenando los símbolos definidos en el programa. •Cuando aparece en el programa una definición de un símbolo, el programa traductor ensamblador lo inserta en la tabla de símbolos, junto con la información correspondiente. •Si un símbolo está definido más de una vez en un módulo, normalmente el traductor devolverá un mensaje de error.  La información para cada símbolo incluirá: •La cadena de caracteres ASCII que compone en nombre del símbolo. •El tipo de símbolo: absoluto, reubicable (relativo) o redefinible. •Indicación de si el símbolo está ya definido o no (si su valor es conocido o no). •El valor del símbolo. •Estatus del símbolo: importado, exportado o privado. •Otras informaciones: tamaño del símbolo, líneas de código donde es referenciado, etc. 9 Traducción de programas en ensamblador a código máquina en el MC68000 Tabla de reubicación (TR)  Es una tabla que contiene referencias a todos los datos u operandos de instrucciones en un programa cuyo valor puede ser reubicado en el montaje.  Esta tabla a veces recibe el nombre de tabla de direcciones absolutas (TDA).  Ejemplo: fragmento de código para el MC68000 Valor del CDE Etiqueta Nemotécnico Operandos ... Tabla de símbolos (TS) Nombre del símbolo Tipo del símbolo Valor del símbolo V S1 DC.W 33 S1 Relativo V V+2 S2 DC.L 25 S2 Relativo V+2 ... ... ... ... W W+6 MOVE.W S1,D0 LEA S2,A0 Tabla de reubicación (TR) Dirección del objeto Tamaño del objeto W+2 4 W+8 4 ... ... 10 Traducción de programas en ensamblador a código máquina en el MC68000 Referencias adelantadas  Se produce una referencia adelantada cuando un símbolo aparece en un programa en una sentencia previa a la sentencia en la que está definido.  Todos los traductores de ensamblador deben contemplar obligatoriamente la posible aparición de referencias adelantadas. •En ensamblador no siempre es posible eliminar todas las apariciones de referencias adelantadas.  El tratamiento de las referencias adelantadas será diferente dependiendo del tipo de traductor utilizado.  Una sentencia con una referencia adelantada no puede ser traducida completamente hasta que dicha referencia adelantada sea resuelta, es decir, hasta que se conozca el valor de todos los símbolos que participan en ella.  En ciertas situaciones, las referencias adelantadas no están permitidas. 11 Traducción de programas en ensamblador a código máquina en el MC68000 Traductores de ensamblador  Los traductores de ensamblador convierten a código máquina las sentencias de un programa escrito en ensamblador. • Al traducir un programa de ensamblador se genera un fichero con el código objeto equivalente al código fuente completo, junto con información necesaria para el montaje.  Tipos de traductores de ensamblador: • • • • • • • Ensamblador cruzado. Ensamblador residente. Ensamblador de una fase. Ensamblador de dos fases. Ensamblador de una pasada. Ensamblador de dos pasadas. Macroensamblador. 12 Traducción de programas en ensamblador a código máquina en el MC68000 Traductores de ensamblador ENSAMBLADOR CRUZADO Es un traductor de ensamblador en el cual la máquina de desarrollo y la máquina objetivo tienen diferentes repertorios de instrucciones. ENSAMBLADOR RESIDENTE Es un traductor de ensamblador que se ejecutan en la misma máquina para la cual generan el código objeto, es decir, la máquina de desarrollo y la máquina objetivo coinciden (o tienen el mismo repertorio de instrucciones). 13 Traducción de programas en ensamblador a código máquina en el MC68000 Traductores de ensamblador ENSAMBLADOR DE UNA FASE Es un traductor de ensamblador que va leyendo las líneas del programa fuente y las va traduciendo directamente. Problema: referencias adelantadas: • Las líneas de código con referencia adelantada se retienen en memoria para ser procesadas más adelante, cuando la referencia sea resuelta. • Para simplificar el diseño del traductor se suelen introducir ciertas restricciones en cuanto a la aparición de referencias adelantadas. ENSAMBLADOR DE DOS FASES Es un traductor de ensamblador que realiza la traducción en dos pasos para resolver el problema de las referencias adelantadas. Enfoques: • Ensamblador de una pasada. • Ensamblador de dos pasadas. 14 Traducción de programas en ensamblador a código máquina en el MC68000 Ensamblador de dos pasadas Es un traductor de ensamblador en dos fases que realiza las siguientes tareas: Primera fase • El traductor lee el programa fuente y se ocupa de construir la tabla de símbolos, calculando los valores que corresponden a todos los símbolos presentes en el código. • Al concluir esta fase, la tabla de símbolos está completamente rellena. Segunda fase • El traductor vuelve a leer el programa fuente y genera el código objeto línea por línea. • Todos los símbolos han sido ya calculados en la primera fase de ensamblaje, por tanto el problema de las referencias adelantadas está resuelto. Comentarios • La implementación de cada una de las fases es bastante sencilla. • Se procesa el código fuente dos veces, por lo que un ensamblador de dos pasadas es más lento que un ensamblador de una pasada. 15 Traducción de programas en ensamblador a código máquina en el MC68000 3. Ensamblaje y montaje de un programa sin referencias externas  Los traductores de ensamblador leen el programa fuente línea por línea, y dentro de cada una analizan los campos que la componen por separado.  La descomposición de la línea de código fuente en campos es muy sencilla, puesto que éstos se encuentran demarcados por delimitadores.  Las líneas de código fuente pueden ser de varios tipos: • Instrucciones de ensamblador. • Pseudoinstrucciones: se expanden por el traductor en una secuencia de instrucciones de ensamblador. • Directivas: cada una exige un tratamiento diferenciado. • Comentarios o líneas en blanco: se ignoran. 16 Traducción de programas en ensamblador a código máquina en el MC68000 Ensamblaje y montaje de un programa sin $400 referencias externas: ejemplo BEGIN ORG EQU *  Estudaremos el proceso de traducción y montaje mediante un ejemplo. •En él supondremos que no es posible utilizar directivas de enlace entre módulos, y por tanto el programa sólo puede constar de un único módulo. CAUX CAUX WHILE  Código fuente del ejemplo: FIN MOVE.L SET MOVE.W MOVE.W SET MOVE.L EQU MOVE.L CMP.L BGT MOVE.W ADD.W MOVE.W ADDQ.L BRA EQU MOVE.B TRAP #TERMINO,N 1 #CAUX,D0 #CAUX,F 2 #CAUX,I * I,D7 N,D7 FIN F,D1 D0,F D1,FANT #1,I WHILE * #9,D0 #15 * Variables y constantes TERMINO EQU 5 N DS.L 1 F DS.W 1 I DC.L 2 END BEGIN 17 Traducción de programas en ensamblador a código máquina en el MC68000 Ensamblaje sin referencias externas: 1ª pasada  Se realiza la primera fase de la traducción.  Función: construir la tabla de símbolos general.  Supondremos que el módulo no tiene secciones, y que no pueden usarse directivas de enlace entre módulos.  Inicialmente, CDE = 0. 18 Traducción de programas en ensamblador a código máquina en el MC68000 1ª pasada sin referencias externas: ejemplo (I) Línea CDE (hex.) 1 000000 2 000400 3 000400 4 00040A 5 00040A 6 00040E Línea de código Tamaño Acción ORG $400 - Modificar CDE BEGIN EQU * - Insertar en TS MOVE.L #TERMINO,N CAUX SET 1 - Insertar en TS MOVE.W #CAUX,D0 4 Incrementar CDE 8 Incrementar CDE CAUX 10 Incrementar CDE MOVE.W #CAUX,F SET 2 MOVE.L #CAUX,I EQU * - Insertar en TS - 7 000416 8 000416 9 000420 10 000420 MOVE.L I,D7 6 Incrementar CDE 11 000426 CMP.L N,D7 6 Incrementar CDE 12 00042C BGT FIN 4 Incrementar CDE 13 000430 MOVE.W F,D1 6 Incrementar CDE 14 000436 ADD.W D0,F 6 Incrementar CDE 15 00043C MOVE.W D1,D0 2 Incrementar CDE 16 00043E ADDQ.L #1,I 6 Incrementar CDE 17 000444 BRA WHILE 2 Incrementar CDE 18 000446 EQU * - Insertar en TS 19 000446 MOVE.B #9,D0 4 Incrementar CDE 20 00044A TRAP #15 2 Incrementar CDE WHILE FIN Modificar el valor de CAUX en TS 10 Incrementar CDE 19 Traducción de programas en ensamblador a código máquina en el MC68000 1ª pasada sin referencias externas: ejemplo (II) Línea CDE Línea de código 21 00044C Tamaño Acción - Línea en blanco: se ignora 22 00044C * Variables y constantes - Línea de comentario: se ignora 23 00044C TERMINO EQU 5 - Insertar en TS 24 00044C N DS.L 1 4 Insertar en TS 25 000450 F DS.W 1 2 Incrementar CDE 26 000452 I DC.L 2 4 Incrementar CDE 27 000456 END BEGIN - Fin de la primera fase Tabla de símbolos del módulo Nombre del símbolo Tipo del símbolo Valor del símbolo Línea en que se produjo la inserción BEGIN Relativo 0x000400 2 CAUX Redefinible absoluto 2 (valor final) 7 (modifica la entrada de línea 4, que insertaba el símbolo con valor 1) WHILE Relativo 0x000420 9 FIN Relativo 0x000446 18 TERMINO Absoluto 5 23 N Relativo 0x00044C 24 F Relativo 0x000450 25 I Relativo 0x000452 26 20 Traducción de programas en ensamblador a código máquina en el MC68000 1ª pasada sin referencias externas: instrucciones 1. Si existe etiqueta, añadirla a la TS y asignarle el valor del CDE. • Si el símbolo contiene caracteres no válidos, dar un mensaje de error. • Si el símbolo existía previamente en la TS, dar un mensaje de error (salvo que se permitan etiquetas locales). • Campos de la tabla: Valor = CDE (el símbolo es implícito). Tipo: relativo. 2. Identificar el código de operación a partir de la tabla de códigos, y determinar la longitud de la instrucción. • Si el nemotécnico no aparece en la TCO, dar un mensaje de error y pasar a la siguiente línea de código. 3. Incrementar el CDE con la longitud de la instrucción. 21 Traducción de programas en ensamblador a código máquina en el MC68000 1ª pasada sin referencias externas: directivas (I) DIRECTIVA ORG  Esta directiva lleva un único operando y normalmente no admite etiqueta.  Efecto: actualizar el CDE con el valor del operando. • Si el valor del operando es menor que el valor actual del CDE, dar un mensaje de error. • El operando puede ser una expresión absoluta sin referencias no resueltas. DIRECTIVA END  No admite etiqueta.  A veces acepta un único operando.  Efecto: finaliza la primera fase de traducción. 22 Traducción de programas en ensamblador a código máquina en el MC68000 Tipos de símbolos  Símbolo implícito: el traductor le asigna automáticamente un valor igual al del contenido del CDE al traducir el objeto al cual está asociado.  Símbolo explícito: el programador le asigna su valor mediante una directiva específica.  Símbolo reubicable o relativo: su valor se puede alterar en la fase de montaje. Son símbolos reubicables (relativos): • El valor del contador de dirección de ensamblaje • Los símbolos definidos con EQU y SET cuyos operandos sean relativos. • Las etiquetas de las demás sentencias.  Símbolo absoluto: su valor no se altera en la fase de montaje. Son símbolos absolutos: • Las constantes numéricas. • Las etiquetas de directivas que hayan sido definidas con EQU y SET cuyos valores sean absolutos. 23 Traducción de programas en ensamblador a código máquina en el MC68000 Expresiones  Las expresiones pueden ser absolutas o relativas.  Expresiones absolutas válidas: • Formada por cualquier combinación válida de símbolos absolutos. • Expresión relativa – Expresión relativa  Expresiones relativas válidas: • Un símbolo relativo. • Expresión relativa + Expresión absoluta • Expresión relativa - Expresión absoluta • Expresión absoluta + Expresión relativa  Expresiones NO válidas: • Expresión relativa + Expresión relativa • Expresión absoluta - Expresión relativa • Las que contengan símbolos relativos y algún operador distinto de “+” ó “-”. • Cualquier expresión que incluya un símbolo externo definido en otro módulo. 24 Traducción de programas en ensamblador a código máquina en el MC68000 1ª pasada sin referencias externas: directivas (II) DIRECTIVAS DE RESERVA DE DATOS (DS, DC) 1. Si existe etiqueta, añadirla a la TS y asignarle el valor del CDE. • Si el símbolo contiene caracteres no válidos, dar un mensaje de error. • Si el símbolo existía previamente en la TS, dar un mensaje de error (salvo que se permitan etiquetas locales). • Campos de la tabla: Valor = CDE (el símbolo es implícito). Tipo: relativo 2. Determinar la longitud del espacio reservado. • Restricciones en directivas DS: Una directiva de tipo DS no puede contener referencias no resueltas en el operando: si es el caso, dar un mensaje de error. Se puede exigir que en directivas DS el operando esté definido mediante una expresión absoluta. 3. Incrementar el CDE con la longitud del espacio reservado. 25 Traducción de programas en ensamblador a código máquina en el MC68000 1ª pasada sin referencias externas: directivas (III) DIRECTIVAS DE DEFINICIÓN DE CONSTANTES: EQU  La etiqueta es obligatoria.  El operando no puede contener referencias adelantadas. • Si es el caso, dar un mensaje de error.  La etiqueta se añade a la TS y se le asigna el valor del operando. • Si el símbolo contiene caracteres no válidos, dar un mensaje de error. • Si el símbolo existía previamente en la TS, dar un mensaje de error. • Si el símbolo contiene alguna referencia no resuelta y no puede calcularse su valor, dar un mensaje de error. • El símbolo es explícito. • Campos de la tabla: Valor: el resultante de evaluar la expresión que aparece como operando. Tipo: el mismo que el de la expresión que define el valor del símbolo (absoluta o relativa). 26 Traducción de programas en ensamblador a código máquina en el MC68000 1ª pasada sin referencias externas: directivas (IV) DIRECTIVAS DE DEFINICIÓN DE CONSTANTES REDEFINIBLES: SET  La etiqueta es obligatoria.  El operando no puede contener referencias adelantadas. • Si es el caso, dar un mensaje de error.  La etiqueta se añade a la TS y se le asigna el valor del operando. • Si el símbolo contiene caracteres no válidos, dar un mensaje de error. • Si el símbolo existía previamente en la TS y no era de tipo redefinible, dar un mensaje de error. • Si el símbolo contiene alguna referencia no resuelta y no puede calcularse su valor, dar un mensaje de error. • El símbolo es explícito. • Campos de la tabla: Valor: el resultante de evaluar la expresión que aparece como operando. Tipo: redefinible absoluto o relativo, dependiendo de la expresión que define el valor del símbolo. 27 Traducción de programas en ensamblador a código máquina en el MC68000 1ª pasada sin referencias externas: directivas (V) DIRECTIVAS DE ALINEAMIENTO: EVEN  No pueden llevar etiqueta.  Efecto: • Si el valor del CDE está alineado, no surte ningún efecto. • Si el valor del CDE no está alineado, lo alinea al siguiente múltiplo del valor de alineamiento. 28 Traducción de programas en ensamblador a código máquina en el MC68000 Ensamblaje sin referencias externas: 2ª pasada SEGUNDA PASADA  Se realiza la segunda fase de la traducción.  Funciones: • Traducir el código fuente completo. • Generar la tabla de reubicación (TR). • Generar el módulo objeto como un fichero en disco, incluyendo las tablas anteriores. • Generar un fichero de listado.  Inicialmente, CDE = 0 (el módulo no tiene secciones). 29 Traducción de programas en ensamblador a código máquina en el MC68000 2ª pasada sin referencias externas: ejemplo (I) Línea CDE (hex.) 1 000000 2 000400 3 000400 4 00040A 5 00040A 6 00040E 7 000416 8 000416 9 000420 Línea de código Código máquina generado (hex.) Acción ORG $400 - Generar código BEGIN EQU * - EQU: se ignora MOVE.L #TERMINO,N CAUX SET 1 MOVE.W #CAUX,D0 303C 0001 Generar código 33FC 0001 0000 0450 Generar código CAUX WHILE 23FC 0000 0005 0000 044C - Generar código Modificar CAUX en TS MOVE.W #CAUX,F SET 2 MOVE.L #CAUX,I EQU * - EQU: se ignora I,D7 23FC 0000 0002 0000 0452 Modificar CAUX en TS Generar código 10 000420 MOVE.L 2E39 0000 0452 Generar código 11 000426 CMP.L N,D7 BEB9 0000 044C Generar código 12 00042C BGT FIN 6E00 0018 Generar código 13 000430 MOVE.W F,D1 3239 0000 0450 Generar código 14 000436 ADD.W D0,F D179 0000 0450 Generar código 15 00043C MOVE.W D1,D0 3001 Generar código 16 00043E ADDQ.L #1,I 52B9 0000 0452 Generar código 17 000444 BRA WHILE 60DA Generar código 18 000446 EQU * 19 000446 MOVE.B #9,D0 103C 0009 Generar código 20 00044A TRAP #15 4E4F Generar código FIN - EQU: se ignora 30 Traducción de programas en ensamblador a código máquina en el MC68000 2ª pasada sin referencias externas: ejemplo (II) Línea CDE 21 00044C Línea de código Código máquina generado (hex.) Acción - Línea en blanco: se ignora - Línea de comentario: se ignora - EQU: se ignora 22 00044C * Variables y constantes 23 00044C TERMINO EQU 5 24 00044C N DS.L 1 DS.W 1 XX XX Dejar espacio: 2 octetos DC.L 2 0000 0002 Generar dato END BEGIN 25 000450 F 26 000452 I 27 000456 Tabla de reubicación (palabras subrayadas en las tablas del código) Dirección del objeto (hex.) XX XX XX XX Dejar espacio: 4 octetos - Fin de la segunda fase Tabla de símbolos del módulo (no visible para el montador) Nombre del símbolo Tipo del símbolo Valor del símbolo BEGIN Relativo 0x00000400 Tamaño del objeto 000406 4 octetos 000412 4 octetos CAUX Redefinible absoluto 0X00000002 (valor final) 00041C 4 octetos WHILE Relativo 0x00000420 000422 4 octetos FIN Relativo 0x00000446 000428 4 octetos TERMINO Absoluto 0x00000005 000432 4 octetos N Relativo 0x0000044C 000438 4 octetos F Relativo 0x00000450 000440 4 octetos I Relativo 0x00000452 31 Traducción de programas en ensamblador a código máquina en el MC68000 2ª pasada sin referencias externas: instrucciones 1. Si existe etiqueta, se ignora. 2. Obtener el nemotécnico de la instrucción. 3. Analizar y evaluar los operandos de la instrucción, usando la TS si es preciso. 4. Localizar el código de operación en la tabla de códigos. • Si no existe, se pasa a la siguiente línea sin dar mensaje de error. 5. Determinar los direccionamientos y los tamaños y valores de los operandos. • Si un operando tiene direccionamiento absoluto o inmediato y viene dado por un símbolo o expresión relativa, incluir una entrada en la TR. 6. Aplicar el tratamiento correspondiente para generar el código binario de la instrucción. • Si los modos de direccionamiento o los tamaños de los operandos son incorrectos, generar el correspondiente mensaje de error. 7. Incrementar el CDE con la longitud de la instrucción. 32 Traducción de programas en ensamblador a código máquina en el MC68000 2ª pasada sin referencias externas: directivas (I) DIRECTIVA ORG  Efecto: actualizar el CDE con el valor del operando. DIRECTIVA END  No admite etiqueta.  A veces acepta un único operando.  Efectos: • Finaliza la segunda fase de traducción. • Si existe operando, se evalúa la expresión y se asigna como dirección de arranque del programa ejecutable. 33 Traducción de programas en ensamblador a código máquina en el MC68000 2ª pasada sin referencias externas: directivas (II) DIRECTIVAS DE RESERVA DE DATOS (DS, DC) 1. Si existe etiqueta, se ignora. 2. Determinar la longitud del espacio reservado. 3. En directivas DC, generar el código objeto correspondiente al valor inicial de las posiciones de memoria indicadas. 4. Incrementar el CDE con la longitud del espacio reservado. 34 Traducción de programas en ensamblador a código máquina en el MC68000 2ª pasada sin referencias externas: directivas (III) DIRECTIVAS DE DEFINICIÓN DE CONSTANTES REDEFINIBLES: SET  Se analiza la etiqueta, y se escribe el valor del operando en la TS. DIRECTIVAS DE DEFINICIÓN DE CONSTANTES: EQU  Se ignoran. DIRECTIVAS DE ALINEAMIENTO: EVEN, ALIGN  Igual que en la primera fase 35 Traducción de programas en ensamblador a código máquina en el MC68000 Fichero de listado (LST)  Contiene información muy valiosa para: • Encontrar e interpretar los errores sintácticos presentes en el programa. • Conocer el código máquina generado por cada instrucción y directiva.  El fichero de listado suele incluir opcionalmente: • La tabla de símbolos privados del módulo. Un símbolo es privado si está definido en el propio módulo y no es visible desde otros módulos. • La tabla de símbolos exportables. Un símbolo es exportable si está definido en el propio módulo y es visible desde otros módulos. • La tabla de símbolos importados. Un símbolo es importado si está definido en un módulo externo y es visible desde nuestro propio módulo. • La tabla de reubicación.  Existen directivas de ensamblador destinadas a: • Indicar qué información aparece en el fichero de listado. • Formatear el fichero de listado. 36 Traducción de programas en ensamblador a código máquina en el MC68000 MC68000: directivas para listados e informes  LIST: incluir información en el fichero de listado. Sintaxis: LIST Efecto: a partir de ella se incluye información en el fichero de listado.  NOLIST: interrumpir la inclusión de información en el fichero de listado. Sintaxis: NOLIST Efecto: a partir de ella se deja de incluir información en el fichero de listado.  FAIL: incluir un mensaje de error en el listado. Sintaxis: FAIL expresión Efecto: genera un mensaje de error e imprime el resultado de la expresión como número del error. 37 Traducción de programas en ensamblador a código máquina en el MC68000 MC68000: directivas para listados e informes  TITLE (NAME): insertar un título en todas las páginas. Sintaxis: TITLE Efecto: se inserta un título en todas las páginas del fichero de listado.  PAGE (SPAGE): saltar de página. Sintaxis: PAGE Efecto: se inserta un salto de página en el fichero de listado.  SYMBOLS (TABLE): insertar información sobre la tabla de símbolos. Sintaxis: SYMBOLS Efecto: inserta información de la tabla de símbolos en el fichero de listado, o bien en el código objeto para que aparezca en el fichero de referencias cruzadas. 38 Traducción de programas en ensamblador a código máquina en el MC68000 Fichero de listado (LST) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 000400 000400 00040A 00040E 000416 000420 000426 00042C 000430 000436 00043C 00043E 000444 000446 00044A 0000 23FC 044C 0000 303C 33FC 0000 23FC 0452 0000 2E39 BEB9 6E00 3239 D179 3001 52B9 60DA 0000 103C 4E4F 0400 0000 0005 0000 BEGIN 0001 0001 0001 0000 0450 0002 0000 0002 0000 CAUX 0420 0000 0000 0018 0000 0000 WHILE 0452 044C 0450 0450 0000 0452 0446 0009 FIN 0000 0002 Lines Assembled : $400 * #TERMINO,N SET MOVE.W MOVE.W SET MOVE.L 1 #CAUX,D0 #CAUX,F 2 #CAUX,I EQU MOVE.L CMP.L BGT MOVE.W ADD.W MOVE.W ADDQ.L BRA EQU MOVE.B TRAP * I,D7 N,D7 FIN F,D1 D0,F D1,D0 #1,I WHILE * #9,D0 #15 * Variables y constantes TERMINO EQU 5 N DS 4 F DS 2 I DL 2 END BEGIN 0000 0005 00044C 000450 000452 000456 CAUX ORG EQU MOVE.L 27 Assembly Errors : 0 39 Traducción de programas en ensamblador a código máquina en el MC68000 Montadores y cargadores  El código objeto procedente del traductor normalmente no puede ejecutarse directamente, ya que le suele faltar cierta información que lo impide. • • • • Código objeto procedente de bibliotecas predefinidas. Código objeto procedente de la traducción de otros módulos. Referencias cruzadas entre objetos de diferentes módulos. Información dependiente del sistema operativo.  El montador se encarga de: • • • • Resolver las referencias entre elementos de varios módulos. Asignar direcciones a los diferentes módulos del programa. Buscar las rutinas de biblioteca y añadirlas como módulos objeto. Unir todos los módulos generando un fichero conteniendo el módulo ejecutable.  Los montadores pueden generar código de dos tipos: • Código absoluto: el montador asignará direcciones absolutas a las instrucciones y los datos. • Código reubicable: el montador genera un módulo ubicable en diferentes direcciones de memoria, adjuntando la información necesaria para la reubicación (la tabla de reubicación global). 40 Traducción de programas en ensamblador a código máquina en el MC68000 Montaje del programa ejecutable Object file sub: · · · Object file Instructions Relocation records Executable file main: jal ??? · · · jal ??? Linker call, sub call, printf C library print: main: jal printf · · · jal sub printf: · · · sub: · · · · · · 41 Traducción de programas en ensamblador a código máquina en el MC68000 Fichero de referencias cruzadas (MAP)  Contiene información referida a las tareas realizadas por el montador.  El fichero de referencias cruzadas suele incluir: • La dirección de comienzo, dirección de fin y tamaño de cada módulo y de cada uno de los fragmentos o secciones que lo componen. • La tabla de símbolos exportables de cada módulo. • La tabla de símbolos global. • A veces se incluye la tabla de símbolos privada de cada módulo.  Existen directivas de ensamblador destinadas a: • Indicar qué información aparece en el fichero de referencias cruzadas. • Formatear el fichero de referencias cruzadas. 42 Traducción de programas en ensamblador a código máquina en el MC68000 Montaje: ejemplo  En este ejemplo, la tarea del montador es sencilla, ya que sólo hay un módulo: 1. Determinar la dirección de carga del módulo. • La dirección de carga se puede especificar en la orden de montaje. • Si la dirección de carga no se especifica en la orden de montaje, se asume que es la especificada en el fichero objeto. 2. Reubicar las direcciones y operandos relativos del módulo mediante la TR sumando la dirección de carga. • El montador no recibe la TS, porque puede contener símbolos privados que no deben ser visibles. 3. Escribir en disco un fichero ejecutable y un fichero de referencias cruzadas (MAP).  En el ejemplo supondremos que en la orden de montaje se especifica la dirección de carga $001000. 43 Traducción de programas en ensamblador a código máquina en el MC68000 Fichero MAP Global Symbol Name Global Value BEGIN CAUX F FIN I N TERMINO WHILE 001400 000002 001450 001446 001452 00144C 000005 001420 ****************************************************************************** * L O A D M A P * ****************************************************************************** * Section Name Starting Address Ending Address Size * ****************************************************************************** * EJ1.OBJ * * CODE 001400 00144B 00004C * * 001452 001455 000004 * ****************************************************************************** Linker Output Filename : ej1.rec Disk Listing Filename : ej1.map Link Errors : 0 Output Format : Motorola S28 44 Traducción de programas en ensamblador a código máquina en el MC68000 Código reubicado: ejemplo  El montador no tiene constancia de que existan etiquetas (se muestran para ayudar) Dirección final (hex.) 001400 Línea de código BEGIN 00140A Código máquina generado (hex.) Acción MOVE.L #5,N 23FC 0000 0005 0000 144C Reubicado 2º operando MOVE.W #1,D0 303C 0001 00140E MOVE.W #1,F 33FC 0001 0000 1450 Reubicado 2º operando 001416 MOVE.L #2,I 23FC 0000 0002 0000 1452 Reubicado 2º operando MOVE.L I,D7 2E39 0000 1452 Reubicado 1er operando 001426 CMP.L N,D7 BEB9 0000 144C Reubicado 1er operando 00142C BGT FIN 6E00 0018 001430 MOVE.W F,D1 3239 0000 1450 Reubicado 1er operando 001436 ADD.W D0,F D179 0000 1450 Reubicado 2º operando 00143C MOVE.W D1,D0 3001 00143E ADDQ.L #1,I 52B9 0000 1452 001444 BRA WHILE 60DA MOVE.B #9,D0 103C 0009 001420 001446 WHILE FIN TRAP #15 4E4F 00144C N DS.L 1 XX XX XX XX 001450 F DS.W 1 XX XX 001452 I DC.L 2 0000 0002 END BEGIN 00144A 001456 Reubicado 2º operando - 45 Traducción de programas en ensamblador a código máquina en el MC68000 Fichero ejecutable  Contiene información necesaria y suficiente para cargar en memoria y ejecutar un programa.  La estructura de un fichero ejecutable puede ser similar a la de un fichero objeto, con la diferencia de que el ejecutable no puede contener referencias sin resolver. • Excepción: programas para sistemas operativos capaces de gestionar bibliotecas dinámicas.  Ciertos formatos de programas ejecutables se estructuran en bloques con: • • • • • Cabecera Dirección de carga. Tamaño. Código y/o datos. Información redundante de paridad.  Si el programa va a ser depurado mediante una herramienta adecuada, necesita información extra. • Esta información puede estar grabada en el propio ejecutable o en un fichero aparte. 46 Traducción de programas en ensamblador a código máquina en el MC68000 Código ejecutable  Formato de registros S28 • Este es un fichero de texto legible. • Lo normal es que los ejecutables no sean legibles con editores de texto. S21400140023FC000000050000144C303C000133FCB7 S21400141000010000145023FC0000000200001452DB S2140014202E3900001452BEB90000144C6E0000188D S214001430323900001450D17900001450300152B9EE S2100014400000145260DA103C00094E4F09 S208001452000000028F S804001400E7 Tipo del Dirección registro Tamaño del registro Código Paridad 47