Traducción de programas en ensamblador a código máquina.

Anuncio
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
Descargar