Universidad Rey Juan Carlos
ESTRUCTURA Y TECNOLOGÍA DE COMPUTADORES Programación en ensamblador del MC68000: conceptos avanzados Luis Rincón Córcoles Licesio J. Rodríguez-Aragón
Programación en ensamblador del MC68000: conceptos avanzados
Programa 1. 2. 3. 4. 5. 6. 7. 8. 9.
Entrada/Salida. Clasificación de los Computadores. Tiempos de Ejecución de Instrucciones. Inclusión de ficheros. Sentencias de control optimizadas. Ensamblaje condicional. Macroinstrucciones. Ensamblaje y montaje de un programa con referencias externas. Estructuras de Datos.
2
Programación en ensamblador del MC68000: conceptos avanzados
Programa 10. Traducción de programas. 11. Bibliotecas de subprogramas. 12. Código independiente de la posición. 13. Carga y ejecución de programas. 14. Código de arranque de programas. 15. Secciones en ensamblador. 16. Compilación de programas. 17. Optimización de código por parte del compilador. 18. Ubicación de variables en registros. 19. Excepciones en el MC68000.
3
Programación en ensamblador del MC68000: conceptos avanzados
Bibliografía  D.A. PATTERSON, J.L HENNESSY. Estructura y diseño de computadores. Reverté, 2000.  D.A. PATTERSON, J.L HENNESSY. Computer Organization and Design. 3rd edition, Morgan Kaufmann, 2004.  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  Página de GCC: http://gcc.gnu.org Manual de GCC: http://gcc.gnu.org/onlinedocs Optimización: http://gcc.gnu.org/onlinedocs/gcc-3.4.2/gcc/Optimiza-Options.html 4
Programación en ensamblador del MC68000: conceptos avanzados
Bibliografía (cont.) Â D. SWEETMAN. See MIPS Run. Morgan Kaufmann, 2002. Â E. FARQUHAR, P. BUNCE. The MIPS Programmer’s Handbook. Morgan Kaufmann, 1994. Â J. GOODMAN, K. MILLER. A Programmer’s View of Computer Architecture. Saunders College Pub., 1993. Â MIPS32 Architecture For Programmers – Volume I: Introduction to the MIPS32 Architecture. MIPS Technologies Inc., 2003. Â MIPS32 Architecture For Programmers – Volume II: The MIPS32 Instruction Set. MIPS Technologies Inc., 2003. Â MIPS32 Architecture For Programmers – Volume III: The MIPS32 Privileged Resource Architecture. MIPS Technologies Inc., 2003. Â MIPS64 Architecture For Programmers – Volume I: Introduction to the MIPS64 Architecture. MIPS Technologies Inc., 2003. Â MIPS64 Architecture For Programmers – Volume II: The MIPS64 Instruction Set. MIPS Technologies Inc., 2003. Â MIPS64 Architecture For Programmers – Volume III: The MIPS64 Privileged Resource Architecture. MIPS Technologies Inc., 2003.
5
Programación en ensamblador del MC68000: conceptos avanzados
1. Entrada / Salida El computador se comunica con el exterior mediante dispositivos de E/S.
ARQUITECTURA VON NEUMANN PERIFÉRICOS
REGISTROS
MEMORIA PRINCIPAL CIRCUITOS
U N I D A D
PERIFÉRICOS
PERIFÉRICOS
D E
U.A.L.
E / S PERIFÉRICOS
UNIDAD DE CONTROL
PUNTERO
6
Programación en ensamblador del MC68000: conceptos avanzados
Esquemas de entrada / salida •
Bus dedicado (E/S aislada). Buses diferentes para acceder a memoria y a E/S. Espacios de direcciones diferentes para memoria y E/S.
•
Bus único (E/S localizada en memoria). Espacio de direcciones único para memoria y E/S.
7
Programación en ensamblador del MC68000: conceptos avanzados
Ejemplo: conexión mediante bus único
8
Programación en ensamblador del MC68000: conceptos avanzados
Controlador de entrada / salida Constituye el interfaz entre la UCP y los periféricos. Interfaz con el bus del sistema Datos
Interfaz con los periféricos Datos Datos Lógica de interfaz con el periférico
Estado Control
Direcciones Lógica E/S
Control
Datos Lógica de interfaz con el periférico
Estado Control
Datos
Estado/Control
9
Programación en ensamblador del MC68000: conceptos avanzados
Gestión de entrada / salida •
Alternativas para gestionar la entrada/salida: – Espera activa (E/S controlada por programa). – Interrupciones. – DMA (robo de ciclo).
•
Todos los computadores modernos cuentan con las tres alternativas.
10
Programación en ensamblador del MC68000: conceptos avanzados
E/S controlada por programa •
Transferencias UCP → periférico: la UCP envía el dato cuando el periférico pueda aceptarlo ejecutando las instrucciones necesarias.
•
Transferencias periférico → UCP: la UCP debe esperar a que el periférico tenga el dato disponible antes de recibir el dato.
•
En ambos casos, la UCP puede verse obligada a esperar varios ciclos antes de que el periférico responda a su solicitud de lectura o escritura.
11
Programación en ensamblador del MC68000: conceptos avanzados
E/S controlada mediante interrupciones •
La UCP envía una petición de lectura o escritura al periférico, y continúa la ejecución normal.
•
Cuando el periférico está listo para efectuar la transferencia, lanza una petición de interrupción.
•
Si el nivel de prioridad de la interrupción es suficientemente elevado, la UCP atiende la interrupción: 1) Interrumpe el programa en curso. 2) Ejecuta una rutina de servicio de la interrupción (RSI) que realiza la transferencia. 3) Retorna al programa que estaba ejecutando antes de producirse la interrupción.
12
Programación en ensamblador del MC68000: conceptos avanzados
E/S mediante acceso directo a memoria (DMA) Proceso del DMA (robo de ciclo) 1. La UCP envía una petición al controlador de DMA indicándole: – Si la operación es de lectura o escritura. – La dirección del periférico. – La posición de comienzo donde están (escritura) o se quieren almacenar lectura) los datos. – El número de datos que se quiere leer o escribir. 2. La UCP continúa con su ejecución normal. 3. Mientras, el controlador de DMA se encarga de acceder al periférico y de realizar la transferencia. 4. El controlador de DMA envía una interrupción a la UCP para avisarla de que la transferencia se ha completado. 13
Programación en ensamblador del MC68000: conceptos avanzados
2. Clasificación de los computadores  No todos los modos de direccionamiento están disponibles en todos los computadores.  Según el tipo de los operandos utilizados en su repertorio de instrucciones, los computadores pueden ser de diferentes tipos: • Máquinas de pila. • Máquinas de acumulador. • Máquinas de memoria-memoria. • Máquinas de registros de propósito general. • Máquinas de registro-registro. • Máquinas de registro-memoria.
14
Programación en ensamblador del MC68000: conceptos avanzados
Máquinas de pila  La UCP no contiene registros de propósito general, sino una pequeña memoria implementada como una pila que utiliza para almacenar datos temporales y evaluar expresiones. • Para utilizar un dato (variable o constante) en una expresión, es preciso insertarlo previamente en la pila. PUSH variable • Para almacenar una variable en memoria, habrá que extraerla de la cima de la pila. POP variable  Operandos en instrucciones aritméticas y lógicas: • 2 operandos origen, que se toman siempre de la cima de la pila (son extraídos de ella). • 1 operando destino, que se inserta en la cima de la pila. • Los tres operandos son implícitos.
15
Programación en ensamblador del MC68000: conceptos avanzados
Máquinas de pila: ejemplo  Escribir un fragmento de programa para evaluar la expresión A=B/C+D*E • A,B,C,D y E son variables en memoria. PUSH B PUSH C DIV PUSH D PUSH E MUL ADD POP A
Insertar el contenido de la variable B en la pila Insertar el contenido de la variable C en la pila Dividir B entre C y guardar resultado en la pila Insertar el contenido de la variable D en la pila Insertar el contenido de la variable E en la pila Multiplicar D*E y guardar resultado en la pila Sumar B/C con D*E Almacenar el resultado en la variable A
16
Programación en ensamblador del MC68000: conceptos avanzados
Máquinas de acumulador  La UCP no contiene registros de propósito general, sino un acumulador que almacena el resultado de la última operación aritmética realizada.  Operandos en instrucciones aritméticas y lógicas: • 2 operandos origen, uno está en el acumulador y el otro está en memoria. • 1 operando destino, que siempre es el acumulador. • El acumulador es un operando implícito.
17
Programación en ensamblador del MC68000: conceptos avanzados
Máquinas de acumulador: ejemplo  Escribir un fragmento de programa para evaluar la expresión A=B/C+D*E • A,B,C,D y E son variables en memoria. LOAD B DIV C STORE TEMP LOAD D MUL E ADD TEMP STORE A
Cargar el contenido de la variable B en el acumulador Dividir B/C (resultado en el acumulador) Guardar el cociente en una variable temporal Cargar el contenido de la variable B en el acumulador Multiplicar D*E (resultado en el acumulador) Sumar B/C con D*E (resultado en el acumulador) Almacenar el contenido del acumulador en la variable A
18
Programación en ensamblador del MC68000: conceptos avanzados
Máquinas de memoria-memoria  No tienen registros de propósito general.  Usan tres operandos explícitos, todos ellos variables residentes en memoria.  Ejemplo: escribir un fragmento de programa para evaluar la expresión A=B/C+D*E • A,B,C,D y E son variables en memoria. • Supondremos que los dos primeros operandos son los fuentes y el tercero es el destino. DIV B,C,TMP1 MUL D,E,TMP2 ADD TMP1,TMP2,A
Dividir B/C (resultado en variable temporal) Multiplicar D*E (resultado en variable temporal) Sumar B/C con D*E (resultado en variable A)
19
Programación en ensamblador del MC68000: conceptos avanzados
Máquinas de registros de propósito general  Tienen un número variable de registros de propósito general para almacenar datos temporales y resultados de cálculos intermedios.  A este tipo pertenecen la mayoría de las máquinas modernas.  Tipos de máquinas de registros de propósito general: • Máquinas de registro-memoria. • Máquinas de registro-registro (máquinas de carga-almacenamiento).
20
Programación en ensamblador del MC68000: conceptos avanzados
Máquinas de registro-memoria  Las instrucciones aritméticas y lógicas normalmente tienen dos operandos explícitos, uno en registro y el otro en un registro o en memoria  Uno de los operandos actúa a la vez como fuente y destino (casi siempre un registro).  Estas máquinas no suelen contar con demasiados registros de propósito general (8 ó 16).
21
Programación en ensamblador del MC68000: conceptos avanzados
Máquinas de registro-memoria: ejemplo  Escribir un fragmento de programa para evaluar la expresión A=B/C+D*E • A,B,C,D y E son variables en memoria. • Supondremos que el segundo operando debe ser un registro y es a la vez fuente y destino, salvo en instrucciones de transferencia. MOVE B,R1 DIV C,R1 MOVE D,R2 MUL E,R2 ADD R1,R2 MOVE R2,A
Cargar el contenido de la variable B en un registro Dividir B/C Cargar el contenido de la variable D en un registro Multiplicar D*E Sumar B/C con D*E Almacenar el resultado en la variable A
22
Programación en ensamblador del MC68000: conceptos avanzados
Máquinas de registro-registro  Las instrucciones aritméticas y lógicas tienen tres operandos explícitos, los tres residentes en registros. • En estas instrucciones el segundo operando fuente puede ser un dato inmediato.  Para usar una variable residente en memoria, siempre hay que cargarla previamente en un registro. LOAD variable,registro  Para guardar un resultado en una variable, siempre hay que realizar un almacenamiento. STORE registro,variable  Estas máquinas cuentan con no menos de 32 registros de propósito general.
23
Programación en ensamblador del MC68000: conceptos avanzados
Máquinas de registro-registro: ejemplo  Escribir un fragmento de programa para evaluar la expresión A=B/C+D*E • A,B,C,D y E son variables en memoria. • Supondremos que el primer operando es el destino, y los dos siguientes son los fuentes. LOAD B,R1 LOAD C,R2 DIV R3,R1,R2 LOAD D,R4 LOAD E,R5 MUL R6,R4,R5 ADD R7,R3,R6 STORE R7,A
Cargar el contenido de la variable B en un registro Cargar el contenido de la variable C en un registro Dividir B/C Cargar el contenido de la variable D en un registro Cargar el contenido de la variable E en un registro Multiplicar D*E Sumar B/C con D*E Almacenar resultado en la variable A
24
Programación en ensamblador del MC68000: conceptos avanzados
3. Tiempos de ejecución de las instrucciones  Como el MC68000 es un procesador CISC, tiene instrucciones muy diversas con diferentes duraciones.  En las transparencias siguientes se presentan las duraciones de las instrucciones del MC68000, incluyendo los ciclos de bus.  Los datos se expresan con la notación n(r/w) donde: • n: número total de ciclos de reloj. • r: número de ciclos de lectura. • w: número de ciclos de escritura. donde n incluye los tiempos de lectura de la instrucción y las lecturas y escrituras de los operandos.  Se asume que cada operación de lectura o escritura en memoria consume cuatro ciclos de reloj.
25
Programación en ensamblador del MC68000: conceptos avanzados
Tiempo de cálculo de la dirección efectiva  En ocasiones hay que sumar este tiempo al indicado en las tablas.
26
Programación en ensamblador del MC68000: conceptos avanzados
Tiempo de instrucciones de transferencia de byte o palabra
27
Programación en ensamblador del MC68000: conceptos avanzados
Tiempo de instrucciones de transferencia de palabra larga
28
Programación en ensamblador del MC68000: conceptos avanzados
Tiempo de instrucciones estándares
29
Programación en ensamblador del MC68000: conceptos avanzados
Tiempo de instrucciones con operando inmediato
30
Programación en ensamblador del MC68000: conceptos avanzados
Tiempo de instrucciones con operando único
31
Programación en ensamblador del MC68000: conceptos avanzados
Tiempo de rotaciones y desplazamientos
32
Programación en ensamblador del MC68000: conceptos avanzados
Tiempo de instrucciones de manipulación de bits
33
Programación en ensamblador del MC68000: conceptos avanzados
Tiempo de instrucciones condicionales
34
Programación en ensamblador del MC68000: conceptos avanzados
Tiempo de JMP, JSR, LEA, PEA y MOVEM
35
Programación en ensamblador del MC68000: conceptos avanzados
Tiempo de instrucciones multiprecisión y MOVEP
36
Programación en ensamblador del MC68000: conceptos avanzados
Tiempo de instrucciones misceláneas
37
Programación en ensamblador del MC68000: conceptos avanzados
Tiempo de proceso de excepciones
38
Introducción a la programación en ensamblador del MC68000
4.MC68000: inclusión de ficheros  INCLUDE: inclusión de un fichero de texto en el código fuente. Sintaxis: INCLUDE
nombre_fichero
Efecto: inserta el contenido del fichero dentro del código que va a traducir. Cuando termina de ejecutar la directiva sigue leyendo en el módulo fuente donde lo había dejado.
39
Introducción a la programación en ensamblador del MC68000
5.MC68000: sentencia WHILE - DO Â Versión optimizada del bucle WHILE: Â PASCAL (variables enteras): n := 5; fant := 1; f := 1; i := 2; WHILE i <= n DO BEGIN faux := f; f := f + fant; fant := faux; i := i+1; END;
BLOQUE_WHILE
¿COND? CIERTA FALSA
 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;
 Ensamblador MC68000: MOVE.W MOVE.W MOVE.W MOVE.W WHILE EQU BRA BLOQUE MOVE.W MOVE.W ADD.W MOVE.W ADDQ.W COND MOVE.W CMP.W BLE FIN EQU
#5,N #1,FANT #1,F #2,I * COND F,FAUX FANT,D6 D6,F FAUX,FANT #1,I I,D7 N,D7 BLOQUE * 40
Introducción a la programación en ensamblador del MC68000
MC68000: sentencia FOR - DOWNTO Â Si el límite final del bucle es 0 se puede usar la instrucción DBRA: Â PASCAL (variables enteras): i:= valor_inicial
CIERTO ¿i < 0?
FALSO
BLOQUE_FOR
i <> -1
DBRA i,BLOQUE_FOR
n := 5; fant := 1; f := 1; FOR i := n-2 DOWNTO 0 DO BEGIN faux := f; f := f + fant; fant := faux; END;
 C (variables enteras): n = 5; fant = 1; f = 1; for (i=n-2; i>=0; i--) { faux = f; f = f + fant; fant = faux; }
 Ensamblador MC68000: MOVE.W MOVE.W MOVE.W FOR EQU MOVE.W SUBQ.W BLT BLOQUE EQU MOVE.W MOVE.W ADD.W MOVE.W COND DBRA FIN EQU
#5,N #1,FANT #1,F * N,D7 #2,D7 FIN * F,FAUX FANT,D6 D6,F FAUX,FANT D7,BLOQUE *
i = -1
41
Traducción de programas en ensamblador a código máquina en el MC68000
6.Ensamblaje condicional  Permiten incluir o no fragmentos de programa en el código objeto.  Sintaxis de las directivas de ensamblaje condicional en el MC68000: IFcond expresión1[,expresión2] ... bloque_sentencias_SI ... ENDIF
Efecto: si la condición cond es cierta, el bloque_sentencias_SI se traduce y pasa a formar parte del código objeto; si cond es falsa, el traductor se salta el código de bloque_sentencias_SI y no lo traduce. En la expresión de la condición no se permiten referencias adelantadas.
42
Traducción de programas en ensamblador a código máquina en el MC68000
Ensamblaje condicional  Posibles condiciones para IFcond (entre otras): IFEQ IFNE IFGT IFLE IFLT IFGE IFC IFNC IFD IFND
expresión expresión expresión expresión expresión expresión cadena1,cadena2 cadena1,cadena2 símbolo símbolo
cierto si expresión = 0 . cierto si expresión <> 0 . cierto si expresión >0 . cierto si expresión <= 0 . cierto si expresión <0 . cierto si expresión >= 0 . cierto si cadena1 = cadena2. cierto si cadena1 = cadena2. cierto si el símbolo ha sido definido. cierto si el símbolo no ha sido definido.
43
Traducción de programas en ensamblador a código máquina en el MC68000
Ensamblaje condicional  También hay directivas de ensamblaje condicional alternativo.  Sintaxis: IFcond expresión1[,expresión2] ... bloque_1 ... ELSE ... bloque_2 ... ENDIF
Efecto: si la condición cond es cierta, se traduce el bloque_1 (y no el bloque_2); si cond es falsa, se traduce el bloque_2 (y no el bloque_1). En la expresión de la condición no se permiten referencias adelantadas, y debe poder ser evaluada en tiempo de ensamblaje.
44
Traducción de programas en ensamblador a código máquina en el MC68000
7.MC68000: macroinstrucciones  Una macroinstrucción es una pseudoinstrucción definida por el programador.  Las directivas para definir una macroinstrucción permiten dar un nombre a una secuencia de instrucciones, pseudoinstrucciones y/o directivas, e incluso pasarle parámetros.  Sintaxis de las directivas para macroinstrucciones: ETIQ
MACRO ... bloque_sentencias ... ENDM
Efecto: crear una macroinstrucción de nombre ETIQ. 45
Traducción de programas en ensamblador a código máquina en el MC68000
MC68000: macroinstrucciones  MEXIT: directiva que aborta la expansión de la macroinstrucción. • Se suele usar en combinación con las directivas de ensamblaje condicional.  Dentro de una macroinstrucción se pueden utilizar diversos símbolos especiales: • \0: tamaño especificado en la llamada (B,W,L). • \1, \2, ..., \n: argumentos. • \@: número de veces que se ha expandido la macro. • NARG: número de argumentos en la llamada.
46
Traducción de programas en ensamblador a código máquina en el MC68000
MC68000: macroinstrucciones  Ejemplo con macroinstrucciones: * Definición de la macroinstruccion MACIN MACRO CLR.B \2 ETIQ\@ ADDI.\0 #NARG,\1 ADDQ.B #1,\2 CMPI.B #4,\2 BNE ETIQ\@ ENDM ... ORG $1000 * Primera llamada MACIN.B D1,D2 * Segunda llamada MACIN.W D3,D4,D5 ... 47
Traducción de programas en ensamblador a código máquina en el MC68000
MC68000: macroinstrucciones Expansión de las dos llamadas a la macroinstrucción: 11 12 13 14 15 16 17 18 19 20 21 22 23 24
00001000 00001000 00001002 00001006 00001008 0000100C
4202 06010002 5202 0C020004 66F4
0000100E 0000100E 00001010 00001014 00001016 0000101A
4204 06430003 5204 0C040004 66F4
( ( ( ( ( ( ( ( ( ( ( ( ( (
11) * Primera llamada 12) MACIN.B 12) CLR.B 12) ETIQ.000: ADDI.B 12) ADDQ.B 12) CMPI.B 12) BNE 13) * Segunda llamada 14) MACIN.W 14) CLR.B 14) ETIQ.001: ADDI.W 14) ADDQ.B 14) CMPI.B 14) BNE
D1,D2 D2 #NARG,D1 #1,D2 #4,D2 ETIQ.000 D3,D4,D5 D4 #NARG,D3 #1,D4 #4,D4 ETIQ.001
48
Traducción de programas en ensamblador a código máquina en el MC68000
Macroensamblador Es un traductor de ensamblador que admite macroinstrucciones. El proceso de expansión de las macroinstrucciones se puede realizar de dos formas: • En la misma pasada y fase en la que se genera la tabla de símbolos (macroensambladores de dos pasadas). • En una fase inicial específica con una pasada previa adicional (macroensambladores de dos o tres pasadas). La adición de macroinstrucciones al lenguaje complica significativamente la estructura del programa traductor.
49
Traducción de programas en ensamblador a código máquina en el MC68000
8. Ensamblaje y montaje de un programa con referencias externas • La tabla de símbolos necesita más campos: Símbolo definido. Estatus: importado, exportado, privado.
• En el ensamblaje se crean las tablas de símbolos importados y exportados. • El montador calcula y asigna direcciones de carga a cada uno de los módulos. • El montador reubica la información relativa de cada módulo por separado: Otra alternativa es construir una tabla de reubicación global con las direcciones de carga de todos los símbolos y las tablas de reubicación de cada uno de ellos (necesario para código ejecutable reubicable).
• El montador resuelve las referencias cruzadas: Las tablas de símbolos importados y exportados son necesarias. Se construye una tabla de símbolos global con todos los símbolos exportables de todos los módulos. 50
Traducción de programas en ensamblador a código máquina en el MC68000
MC68000: directivas de enlace entre módulos  XDEF: directiva para definir símbolos exportados. • Otros nombres habituales: PUBLIC, EXPORT, DEF Sintaxis: XDEF S1,S2,...,Sn Efecto: inserta los símbolos en la tabla de símbolos exportados.  Un símbolo exportado por un módulo está definido dentro del mismo módulo.  Un símbolo es exportado si aparece en una directiva de exportación.  Los símbolos exportados aparecen en la TS general.
51
Traducción de programas en ensamblador a código máquina en el MC68000
MC68000: directivas de enlace entre módulos  XREF: directiva para definir símbolos importados. • Otros nombres habituales: EXTERN, IMPORT, REF Sintaxis: XREF S1,S2,...,Sn Efecto: marca los símbolos como externos, y los inserta en la tabla de símbolos.  Un símbolo importado por un módulo está definido fuera del mismo.  Un símbolo es importado si aparece en una directiva de importación.  Los símbolos importados aparecen en la TS general.  No se suele permitir que los símbolos importados participen en expresiones.
52
Traducción de programas en ensamblador a código máquina en el MC68000
Ensamblaje y montaje de un programa con referencias externas: ejemplo Programa principal Subrutina PROGRAM EQU XREF VAR EQU N DS S DS BEGIN EQU MOVEA.L MOVE.W MOVE.W PEA JSR ADDA.L MOVE.B TRAP
* SUMAR * 2 2 * #MINPILA,SP #5,N N,-(SP) S SUMAR #6,SP #9,D0 #15
MAXPILA EQU DS MINPILA EQU END
* 400 * BEGIN
SUMAR NUM SUMA I
FOR
INC BLOQUE
FIN
XDEF EQU SET SET SET LINK MOVEA.L CLR.W EQU MOVE.W MOVE.W CMP.W BLT BRA ADDQ.W MOVE.W MULS ADD.W CMP.W BNE EQU UNLK RTS END
SUMAR * 12 8 -2 A6,#-2 SUMA(A6),A5 (A5) * #1,I(A6) NUM(A6),D7 I(A6),D7 FIN BLOQUE #1,I(A6) I(A6),D6 D6,D6 D6,(A5) I(A6),D7 INC * A6
53
Traducción de programas en ensamblador a código máquina en el MC68000
Ensamblaje con referencias externas: 1ª pasada PRIMERA PASADA Â Se realiza la primera fase de la traducción. Â Funciones: • Construir la tabla de símbolos. Â Supondremos que el módulo no tiene secciones. Â Inicialmente, CDE = 0.
54
Traducción de programas en ensamblador a código máquina en el MC68000
1ª pasada con 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 y estaba definido, dar un mensaje de error (salvo que se permitan etiquetas locales). • Si el símbolo existía en la TS como símbolo importado, dar un mensaje de error. • El símbolo es implícito. • Campos de la tabla: Definido: sí. Valor = CDE. Tipo: relativo. Puede ser privado o exportable, pero nunca importado.
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. 55
Traducción de programas en ensamblador a código máquina en el MC68000
1ª pasada con 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 resuelta (sin referencias adelantadas ni símbolos importados).
DIRECTIVA END Â No admite etiqueta. Â A veces acepta un único operando. Â Efecto: finaliza la primera fase de traducción. 56
Traducción de programas en ensamblador a código máquina en el MC68000
Primera pasada: 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 y estaba ya definido, dar un mensaje de error (salvo que se permitan etiquetas locales). • Si el símbolo existía en la TS como símbolo importado, dar un mensaje de error. • El símbolo es implícito. • Campos de la tabla: Definido: sí. Valor = CDE. Tipo: relativo Estatus: privado o exportable.
2. Determinar la longitud del espacio reservado. • 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.
57
Traducción de programas en ensamblador a código máquina en el MC68000
Primera pasada: directivas (III) DIRECTIVAS DE DEFINICIÓN DE CONSTANTES: EQU Â La etiqueta es obligatoria. Â El operando no puede contener referencias no resueltas. • 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 estaba ya definido, dar un mensaje de error. • Si el símbolo existía previamente en la TS como símbolo importado, dar un mensaje de error. • El símbolo es explícito. • Campos de la tabla: Definido: sí. Valor: el resultante de evaluar la expresión que aparece como operando. Tipo: absoluto o relativo, según la expresión que lo define. Estatus: privado o exportable. 58
Traducción de programas en ensamblador a código máquina en el MC68000
Primera pasada: 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 como símbolo importado, dar un mensaje de error. • Si el símbolo existía previamente en la TS, estaba ya definido y no era redefinible, dar un mensaje de error. • El símbolo es explícito. • Campos de la tabla: Definido: sí. Valor: el resultante de evaluar la expresión que aparece como operando. Tipo: redefinible absoluto o relativo, dependiendo de la expresión lo define. Estatus: privado o exportable. 59
Traducción de programas en ensamblador a código máquina en el MC68000
Primera pasada: directivas (V) DIRECTIVAS DE ENSAMBLAJE CONDICIONAL: IF ... ENDIF Â No pueden llevar etiqueta. Â La acción realizada depende de la evaluación de la condición: • Si la condición se cumple, se continúa procesando el código normalmente. • Si la condición no se cumple, el código comprendido entre las directivas IF ... ENDIF se ignora. • La condición no puede contener referencias adelantadas.
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.
60
Traducción de programas en ensamblador a código máquina en el MC68000
Primera pasada: directivas (VI) DIRECTIVAS DE IMPORTACIÓN Â No pueden llevar etiqueta. Â Cada uno de los operandos se inserta en la TS. • 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. • Campos de la tabla: Definido: no. Valor: desconocido. Tipo: desconocido. Estatus: importado.
61
Traducción de programas en ensamblador a código máquina en el MC68000
Primera pasada: directivas (VII) DIRECTIVAS DE EXPORTACIÓN Â No pueden llevar etiqueta. Â Cada uno de los operandos se inserta en la TS. • Si el símbolo contiene caracteres no válidos, dar un mensaje de error. • Si el símbolo existía previamente en la TS como símbolo importado, dar un mensaje de error. • Si el símbolo existía previamente en la TS, modificar su estatus de exportación. • Campos de la tabla: Definido: no (salvo que el símbolo estuviese ya insertado en la tabla). Valor: desconocido (salvo que estuviese ya definido). Tipo: desconocido (salvo que estuviese ya definido). Estatus: exportado.
62
Traducción de programas en ensamblador a código máquina en el MC68000
1ª pasada con referencias externas: ejemplo 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). • El símbolo es relativo e implícito. • Campos de la tabla: Definido: sí. Valor = CDE. Tipo: relativo. Puede ser privado o exportable, pero nunca importado.
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.
63
Traducción de programas en ensamblador a código máquina en el MC68000
1ª pasada con referencias externas: ejemplo (I) Programa principal Línea
CDE (hex.)
1
000000
2
000000
3
000000
Línea de código PROGRAM
VAR
Tamaño
Acción
EQU
*
-
Insertar en TS
XREF
SUMAR
-
Insertar en TS como importado
EQU
*
-
Insertar en TS
4
000000
N
DS.W
1
2
Insertar en TS e incrementar CDE
5
000002
S
DS.W
1
2
Insertar en TS e incrementar CDE
6
000004
BEGIN
EQU
*
-
Insertar en TS
7
000004
MOVEA.L
#MINPILA,SP
6
Incrementar CDE
#5,N
8
00000A
MOVE.W
8
Incrementar CDE
9
000012
MOVE.W
N,-(SP)
6
Incrementar CDE
10
000018
PEA
S
6
Incrementar CDE
11
00001E
JSR
SUMAR
6
Incrementar CDE
12
000024
ADDA.L
#6,SP
6
Incrementar CDE
13
00002A
MOVE.B
#9,D0
4
Incrementar CDE
14
00002E
TRAP
#15
2
Incrementar CDE
15
000030
-
Línea en blanco: ignorar
16
000030
EQU
*
-
Insertar en TS
17
000030
DS.L
100
EQU
*
-
Insertar en TS
END
BEGIN
-
Fin de la primera fase
18
0001C0
19
0001C0
MAXPILA
MINPILA
400
Incrementar CDE
64
Traducción de programas en ensamblador a código máquina en el MC68000
1ª pasada con referencias externas: ejemplo (II) Tabla de símbolos del programa principal Nombre del símbolo
Tipo del símbolo
Definido
Estatus
Valor del símbolo
Línea en que se produjo la inserción
PROGRAM
Relativo
Sí
Privado
0x00000000
1 2
SUMAR
Relativo
No
Importado
Desconocido (0x00000000)
VAR
Relativo
Sí
Privado
0x00000000
3
N
Relativo
Sí
Privado
0x00000000
4
S
Relativo
Sí
Privado
0x00000002
5
BEGIN
Relativo
Sí
Privado
0x00000004
6
MAXPILA
Relativo
Sí
Privado
0x00000030
16
MINPILA
Relativo
Sí
Privado
0x000001C0
18
65
Traducción de programas en ensamblador a código máquina en el MC68000
1ª pasada con referencias externas: ejemplo (III) Subrutina Línea
CDE (hex.)
Línea de código
Tamaño
Acción
1
000000
XDEF
SUMAR
-
Insertar en TS como exportado
2
000000
SUMAR
EQU
*
-
Insertar valor en TS
3
000000
NUM
SET
12
-
Insertar en TS
4
000000
SUMA
SET
8
-
Insertar en TS
5
000000
I
SET
-2
-
Insertar en TS
6
000000
LINK
A6,#-2
4
Incrementar CDE
7
000004
MOVEA.L
SUMA(A6),A5
4
Incrementar CDE
CLR.W
(A5)
2
Incrementar CDE
EQU
*
-
Insertar en TS
8
000008
9
00000A
10
00000A
MOVE.W
#1,I(A6)
6
Incrementar CDE
11
000010
MOVE.W
NUM(A6),D7
4
Incrementar CDE
12
000014
CMP.W
I(A6),D7
4
Incrementar CDE
13
000018
BLT
FIN
4
Incrementar CDE
14
00001C
FOR
BRA
BLOQUE
4
Incrementar CDE
ADDQ.W
#1,I(A6)
4
Insertar en TS e incrementar CDE
MOVE.W
I(A6),D6
4
Insertar en TS e incrementar CDE
15
000020
INC
16
000024
BLOQUE
17
000028
MULS
D6,D6
2
Incrementar CDE
18
00002A
ADD.W
D6,(A5)
2
Incrementar CDE
66
Traducción de programas en ensamblador a código máquina en el MC68000
1ª pasada con referencias externas: ejemplo (IV) Subrutina Línea
CDE (hex.)
19
00002C
CMP.W
Línea de código I(A6),D7
4
Incrementar CDE
20
000030
BNE
INC
2
Incrementar CDE
21
000032
EQU
*
-
Insertar en TS
A6
FIN
Tamaño
Acción
22
000032
UNLK
2
Incrementar CDE
23
000034
RTS
2
Incrementar CDE
24
000036
END
-
Fin de la segunda fase
Tabla de símbolos de la subrutina Nombre del símbolo
Tipo del símbolo
Definido
Estatus
Valor del símbolo
Línea en que se produjo la inserción
SUMAR
Relativo
Sí
Exportado
0x00000000
1: inserción como exportado sin definir 2: inserción del valor
NUM
Absoluto
Sí
Privado
0x0000000C
3
SUMA
Absoluto
Sí
Privado
0x00000008
4
I
Absoluto
Sí
Privado
0xFFFFFFFE
5
FOR
Relativo
Sí
Privado
0x0000000A
9
INC
Relativo
Sí
Privado
0x00000020
15
BLOQUE
Relativo
Sí
Privado
0x00000024
16
FIN
Relativo
Sí
Privado
0x00000032
21
67
Traducción de programas en ensamblador a código máquina en el MC68000
Ensamblaje con 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 símbolos importados (TSI). • Generar la tabla de símbolos exportados (TSE). • 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. Â La TSE puede generarse al comienzo de la segunda fase a partir de la TS general completada en la primera fase. Â Inicialmente, CDE = 0 (el módulo no tiene secciones). 68
Traducción de programas en ensamblador a código máquina en el MC68000
Tablas de símbolos exportados (TSE) Â Un símbolo exportado por un módulo está definido dentro del mismo módulo. Â Un símbolo es exportado si aparece en una directiva de exportación. Â La TSE asocia cada símbolo interno exportado con el valor que les asigna el traductor. Â Los símbolos exportados aparecen en la TS general. Â Ejemplo: fragmento de código para el MC68000 Valor del CDE
Etiqueta
Nemotécnico
Operandos
XREF
S1,S2
Tabla de símbolos exportados (TSE)
...
Nombre del símbolo
Tipo del símbolo
Valor del símbolo
S1
Relativo
V
V
S1
DC.W
33
S2
Absoluto
25
V+2
S2
EQU
25
...
...
... 69
Traducción de programas en ensamblador a código máquina en el MC68000
Tablas de símbolos importados (TSI) Â Un símbolo importado por un módulo está definido fuera del mismo. Â Un símbolo es importado si aparece en una directiva de importación. Â La TSI asocia cada aparición del símbolo con la dirección en la que aparece. Â Un símbolo importado aparece en tantas entradas de la TSI como veces se use. Â Los símbolos importados aparecen en la TS general. Â No se suele permitir que los símbolos importados participen en expresiones. Â Ejemplo: fragmento de código para el MC68000 Valor del CDE
Etiqueta
Nemotécnico
Operandos
XDEF
S1
... V
MOVE.B
S1,D0
V+4
MOVE.W
#S1,D1
Tabla de símbolos importados (TSI) Nombre del símbolo
Dirección del símbolo
Tipo (absoluto o relativo)
Tamaño reservado (bytes)
S1
V+2
Absoluto
4
S1
V+6
Absoluto
2
...
...
... 70
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
...
... 71
Traducción de programas en ensamblador a código máquina en el MC68000
2ª pasada con 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 con un direccionamiento absoluto o inmediato depende de un símbolo importado, generar una entrada en la TSI y considerar que su valor es 0. En otro caso, si un operando tiene direccionamiento absoluto o inmediato dado por una 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. 72
Traducción de programas en ensamblador a código máquina en el MC68000
2ª pasada con 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 carga del programa ejecutable.
73
Traducción de programas en ensamblador a código máquina en el MC68000
Segunda pasada: directivas (II) DIRECTIVAS DE RESERVA DE DATOS (DS, DC) 1. Si existe etiqueta, se ignora. 2. Determinar la longitud del espacio reservado. • 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. En directivas DC, generar el código objeto correspondiente al valor inicial de las posiciones de memoria indicadas. • Si la expresión que asigna el valor inicial a un objeto definido con DC es relativa, incuir una entrada en TR.
4. Incrementar el CDE con la longitud del espacio reservado.
74
Traducción de programas en ensamblador a código máquina en el MC68000
Segunda pasada: 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 DIRECTIVAS DE IMPORTACIÓN Y DE EXPORTACIÓN Â Se ignoran.
DIRECTIVAS DE ENSAMBLAJE CONDICIONAL: IF ... ENDIF DIRECTIVAS DE ALINEAMIENTO: EVEN, ALIGN Â Igual que en la primera fase
75
Traducción de programas en ensamblador a código máquina en el MC68000
2ª pasada con referencias externas: ejemplo (I) Programa principal Línea
CDE (hex.)
1
000000
2
000000
3
000000
Línea de código PROGRAM
VAR
Código máquina generado (hex.)
Acción
EQU
*
-
EQU: se ignora
XREF
SUMAR
-
XREF: se ignora
EQU
*
-
EQU: se ignora
4
000000
N
DS.W
1
XX XX
Incrementar CDE
5
000002
S
DS.W
1
XX XX
Incrementar CDE
6
000004
BEGIN
EQU
*
7
000004
MOVEA.L
-
EQU: se ignora
#MINPILA,SP
2E7C 0000 01C0
Generar código
#5,N
8
00000A
MOVE.W
33FC 0005 0000 0000
Generar código
9
000012
MOVE.W
N,-(SP)
3F39 0000 0000
Generar código
10
000018
PEA
S
4879 0000 0002
Generar código
11
00001E
JSR
SUMAR
4EB9 0000 0000
Generar código
12
000024
ADDA.L
#6,SP
DFFC 0000 0006
Generar código
13
00002A
MOVE.B
#9,D0
103C 0009
Generar código
14
00002E
TRAP
#15
4E4F
Generar código
15
000030
16
000030
MAXPILA
EQU
*
17
000030
DS.L
100
MINPILA
EQU
*
-
EQU: se ignora
END
BEGIN
-
Fin de la segunda fase
18
0001C0
19
0001C0
-
Línea en blanco: ignorar
-
EQU: se ignora
XX ... XX (400 octetos)
Dejar espacio: 400 octetos
76
Traducción de programas en ensamblador a código máquina en el MC68000
2ª pasada con referencias externas: ejemplo (II) Tabla de símbolos del programa principal Nombre del símbolo
Tipo del símbolo
Definido
PROGRAM
Relativo
SUMAR
Tabla de reubicación (palabras subrayadas en las tablas del código)
Estatus
Valor del símbolo
Dirección del objeto (hex.)
Tamaño del objeto
Sí
Privado
0x00000000
000006
4 octetos
Relativo
No
Importado
Desconocido (0x00000000)
00000E
4 octetos
VAR
Relativo
Sí
Privado
0x00000000
000014
4 octetos
N
Relativo
Sí
Privado
0x00000000
00001A
4 octetos
S
Relativo
Sí
Privado
0x00000002
BEGIN
Relativo
Sí
Privado
0x00000004
MAXPILA
Relativo
Sí
Privado
0x00000030
MINPILA
Relativo
Sí
Privado
0x000001C0
Tabla de símbolos importados (en negrita en el código) Nombre del símbolo
Dirección del símbolo
Tipo
Tamaño reservado (octetos)
SUMAR
0x000020
Absoluto
4
 La tabla de símbolos importados registra las apariciones de símbolos importados en el código.  La tabla de símbolos exportados está vacía. 77
Traducción de programas en ensamblador a código máquina en el MC68000
Fichero de listado (LST): programa principal 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
0000 0000 0000 0000 000000 000002 000004 00000A 000012 000018 00001E 000024 00002A 00002E
0000 2E7C 33FC 3F39 4879 4EB9 DFFC 103C 4E4F
0004 0000 0005 0000 0000 0000 0000 0009
01C0 0000 0000 0000 0002 0000 0006
0000 0030 000030 0000 01C0 0001C0
Lines Assembled :
19
PROGRAM EQU XREF VAR EQU N DS S DS BEGIN EQU MOVEA.L MOVE.W MOVE.W PEA JSR ADDA.L MOVE.B TRAP
* SUMAR * 2 2 * #MINPILA,SP #5,N N,-(SP) S SUMAR #6,SP #9,D0 #15
MAXPILA EQU DS MINPILA EQU END
* 400 * BEGIN
Assembly Errors :
0
78
Traducción de programas en ensamblador a código máquina en el MC68000
2ª pasada con referencias externas: ejemplo (III) Subrutina Línea
CDE (hex.)
Línea de código
Código máquina generado (hex.)
XDEF
SUMAR
Acción
1
000000
-
XDEF: se ignora
2
000000
SUMAR
EQU
*
-
EQU: se ignora
3
000000
NUM
SET
12
-
Modificar NUM en TS
4
000000
SUMA
SET
8
-
Modificar SUMA en TS
5
000000
I
SET
-2
-
Modificar I en TS
6
000000
LINK
A6,#-2
4E56 FFFE
Generar código
7
000004
MOVEA.L
SUMA(A6),A5
2A6E 0008
Generar código
CLR.W
(A5)
4255
EQU
*
8
000008
9
00000A
10
00000A
MOVE.W
11
000010
MOVE.W
12
000014
13
000018
14
00001C
FOR
Generar código -
EQU: se ignora
#1,I(A6)
3D7C 0001 FFFE
Generar código
NUM(A6),D7
3E2E 000C
Generar código
CMP.W
I(A6),D7
BE6E FFFE
Generar código
BLT
FIN
6D00 0018
Generar código
BRA
BLOQUE
6000 0006
Generar código
ADDQ.W
#1,I(A6)
526E FFFE
Generar código
MOVE.W
I(A6),D6
3C2E FFFE
Generar código
15
000020
INC
16
000024
BLOQUE
17
000028
MULS
D6,D6
CDC6
Generar código
00002A
ADD.W
D6,(A5)
DD55
Generar código
18
79
Traducción de programas en ensamblador a código máquina en el MC68000
2ª pasada con referencias externas: ejemplo (IV) Subrutina Línea
CDE (hex.)
Línea de código
Código máquina generado (hex.)
Acción
I(A6),D7
BE6E FFFE
Generar código
66EE
Generar código
19
00002C
CMP.W
20
000030
BNE
INC
21
000032
EQU
* A6
FIN
22
000032
UNLK
23
000034
RTS
24
000036
END
4E5E
Generar código
4E75
Generar código -
Tabla de símbolos de la subrutina Nombre del símbolo
Tipo del símbolo
Definido
SUMAR
Relativo
NUM
EQU: se ignora
Fin de la segunda fase
Tabla de símbolos exportables
Estatus
Valor del símbolo
Nombre del símbolo
Tipo del símbolo
Valor del símbolo
Sí
Exportado
0x00000000
SUMAR
Relativo
0x000000
Absoluto
Sí
Privado
0x0000000C
SUMA
Absoluto
Sí
Privado
0x00000008
I
Absoluto
Sí
Privado
0xFFFFFFFE
FOR
Relativo
Sí
Privado
0x0000000A
INC
Relativo
Sí
Privado
0x00000020
BLOQUE
Relativo
Sí
Privado
0x00000024
FIN
Relativo
Sí
Privado
0x00000032
 La tabla de símbolos exportados y la de reubicación están vacías.
80
Traducción de programas en ensamblador a código máquina en el MC68000
Fichero de listado (LST): subrutina 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
000000 000004 000008 00000A 000010 000014 000018 00001C 000020 000024 000028 00002A 00002C 000030 000032 000034 000036
0000 0000 0000 FFFF 4E56 2A6E 4255 0000 3D7C 3E2E BE6E 6D00 6000 526E 3C2E CDC6 DD55 BE6E 66EE 0000 4E5E 4E75
0000 000C 0008 FFFE FFFE 0008
SUMAR NUM SUMA I
000A 0001 FFFE 000C FFFE 0018 0006 FFFE FFFE
FOR
INC BLOQUE
FFFE 0032
Lines Assembled :
FIN
24
XDEF EQU SET SET SET LINK MOVEA.L CLR.W EQU MOVE.W MOVE.W CMP.W BLT BRA ADDQ.W MOVE.W MULS ADD.W CMP.W BNE EQU UNLK RTS END
SUMAR * 12 8 -2 A6,#-2 SUMA(A6),A5 (A5) * #1,I(A6) NUM(A6),D7 I(A6),D7 FIN BLOQUE #1,I(A6) I(A6),D6 D6,D6 D6,(A5) I(A6),D7 INC * A6
Assembly Errors :
0 81
Traducción de programas en ensamblador a código máquina en el MC68000
Montaje: ejemplo 1. Determinar la dirección de carga de cada uno de los módulos que componen el ejecutable. 2. Modificar los valores de los símbolos exportados relativos de la TSE de cada uno de los módulos en función de la dirección de carga del módulo. 3. Construir una tabla de símbolos global (TSG) a partir de todas las TSE. 4. Por cada módulo: • Resolver las referencias cruzadas a partir de su TSI y de la TSG. • Si hay alguna referencia cruzada sin resolver, dar un mensaje de error. • Reubicar las direcciones mediante su TR. Un montador para código reubicable crea una TR global con todos los objetos relativos del programa a partir de las TR y las TSI de todos los módulos para que el cargador reubique dinámicamente el programa en el momento de su ejecución.
5. 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 0x001000. 82
Traducción de programas en ensamblador a código máquina en el MC68000
Fichero MAP (I) Filename : EJ2-2.OBJ Global Symbol Name BLOQUE FIN FOR I INC NUM SUMA SUMAR
Global Value 001024 001032 00100A FFFFFE 001020 00000C 000008 001000
Filename : EJ2-1.OBJ Global Symbol Name BEGIN MAXPILA MINPILA N PROGRAM S VAR
Global Value 00103A 001066 0011F6 001036 001036 001038 001036 83
Traducción de programas en ensamblador a código máquina en el MC68000
Fichero MAP (II) ****************************************************************************** * L O A D M A P * ****************************************************************************** * Section Name Starting Address Ending Address Size * ****************************************************************************** * EJ2-2.OBJ * * CODE 001000 001035 000036 * * EJ2-1.OBJ * * CODE 00103A 001065 00002C * ****************************************************************************** Linker Output Filename : modular.rec Disk Listing Filename : modular.map Link Errors :
0
Output Format :
Motorola S28
84
Traducción de programas en ensamblador a código máquina en el MC68000
Código reubicado: ejemplo (I) Â El montador no tiene constancia de que existan etiquetas (se muestran para ayudar) Dirección final (hex.)
Línea de código
Código máquina generado (hex.)
001000
LINK
A6,#-2
4E56 FFFE
001004
MOVEA.L
SUMA(A6),A5
2A6E 0008
CLR.W
(A5)
4255
MOVE.W
#1,I(A6)
3D7C 0001 FFFE
001010
MOVE.W
NUM(A6),D7
3E2E 000C
001014
CMP.W
I(A6),D7
BE6E FFFE
001018
BLT
FIN
6D00 0018
00101C
BRA
BLOQUE
6000 0006
001008 00100A
FOR
001020
INC
ADDQ.W
#1,I(A6)
526E FFFE
001024
BLOQUE
MOVE.W
I(A6),D6
3C2E FFFE
001028
MULS
D6,D6
CDC6
00102A
ADD.W
D6,(A5)
DD55
00102C
CMP.W
I(A6),D7
BE6E FFFE
001030 001032
FIN
BNE
INC
66EE
UNLK
A6
4E5E
RTS
001034
Acción
4E75
001036
N
DS.W
1
XX XX
001038
S
DS.W
1
XX XX
85
Traducción de programas en ensamblador a código máquina en el MC68000
Código reubicado: ejemplo (II) Dirección final (hex.)
Código máquina generado (hex.)
Acción
MOVEA.L
#MINPILA,SP
2E7C 0000 11F6
Reubicado 1er operando
001040
MOVE.W
#5,N
33FC 0005 0000 1036
Reubicado 2º operando
001048
MOVE.W
N,-(SP)
3F39 0000 1036
Reubicado 1er operando
00104E
PEA
S
4879 0000 1038
Reubicado 1er operando
001054
JSR
SUMAR
4EB9 0000 1000
Referencia cruzada resuelta
00105A
ADDA.L
#6,SP
DFFC 0000 0006
001060
MOVE.B
#9,D0
103C 0009
001064
TRAP
#15
4E4F
DS.L
100
XX ... XX (400 octetos)
END
BEGIN
00103A
Línea de código BEGIN
001066
MAXPILA
0011F6
MINPILA
0011F6
-
 Direcciones absolutas presentes en el código reubicado final: • Referencias a variables del programa principal. • Llamada a la subrutina (es con JSR). • Referencias a zonas de memoria (fondo de la pila).
86
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. S2140010004E56FFFE2A6E000842553D7C0001FFFE4C S2140010103E2E000CBE6EFFFE6D000018600000063F S214001020526EFFFE3C2EFFFECDC6DD55BE6EFFFEA9 S20A00103066EE4E5E4E75F2 S21400103A2E7C000011F633FC0005000010363F39FE S21400104A000010364879000010384EB9000010002B S21000105ADFFC00000006103C00094E4FB2 S80400103AB1
Tipo del Dirección registro Tamaño del registro
Código
Paridad 87
Traducción de programas en ensamblador a código máquina en el MC68000
Comentarios finales  En este tema se han estudiado los procesos de traducción, montaje y carga de un programa escrito completamente en ensamblador.  Se ha presentado brevemente un ejemplo de proceso de montaje de tipo estático: • El montador asigna direcciones y valores definitivos a cada uno de los módulos y elementos (referencias, datos) del programa ejecutable. • Se pueden utilizar bibliotecas estáticas. Serían módulos objeto agrupados en ficheros en disco.
• Ventaja del montaje estático: el proceso es bastante sencillo. • Inconveniente: el proceso es poco flexible. El programa sólo puede cargarse a partir de una dirección de memoria concreta. Si la memoria que debería ocupar el programa está ocupada, no sería posible cargarlo (las máquinas con memoria virtual podrían soslayar dicho problema, pues asignan espacios virtuales independientes a cada proceso).
• Los sistemas operativos con bibliotecas dinámicas requieren montaje dinámico.
 El proceso de montaje presentado podría ser válido para lenguajes como PASCAL, C, Fortran, etc., siempre utilizando bibliotecas estáticas. • Lenguajes como C++ o Java exigen montadores mucho más complejos. 88
MC68000 y las estructuras de datos
9.MC68000 y las tiras de caracteres: manipulación Cálculo de la longitud de una tira Optimización: sacar fuera del bucle el cálculo de la dirección de origen de la tira. CONST N VAR T * LON:
#define N 10 char t[N], *p; int lon; lon = 0; p = t; for ( ; *(p+lon); ) lon = lon+1;
EQU * EQU 10 EQU * DS.B N registro D0 ... CLR.W D0 LEA T,A0 WHILE EQU * BRA COND BLOQUE ADDQ.W #1,D0 COND TST.B (A0,D0.W) BNE BLOQUE FIN EQU *
89
MC68000 y las estructuras de datos
MC68000 y las tiras de caracteres: manipulación Cálculo de la longitud de una tira Optimización: usar direccionamiento indirecto con posincremento
#define N 10 char t[N], *p; int lon;
for (p = t; *p; p++); lon = (int) (p-t);
CONST N VAR T * P: * LON:
WHILE
FIN
EQU EQU EQU DS.B registro A0 registro D0 ... LEA EQU TST.B BNE SUBA.L MOVE.L SUBI.L EQU
* 10 * N
T,A0 * (A0)+ WHILE #1,A0 A0,D0 #T,D0 * 90
MC68000 y las estructuras de datos
MC68000 y los vectores: manipulación Suma de los elementos de un vector Optimización: control mediante aritmética de punteros. #define N ?? int v[N]; int suma, *p1, *p2; suma = 0; p1 = v; p2 = p1 + N; for ( ; p1 != p2; p1++) suma = suma + *p1;
CONST N VAR V TEV SUMA * P1: * P2:
EQU * EQU ?? EQU * DS.W LV EQU (*-V)/N DS.W 1 registro A4 registro A5
CLR.W LEA MOVEA.L ADDA.L FOR EQU BRA BLOQUE EQU MOVE.W ADD.W INC ADDQ.L COND CMPA.L BNE FIN EQU
SUMA V,A4 A4,A5 #N*TEV,A5 * COND * (A4),D7 D7,SUMA #TEV,A4 A4,A5 BLOQUE *
Se puede optimizar más con direccionamiento indirecto con posincremento.
91
MC68000 y las estructuras de datos
MC68000 y las matrices: manipulación Suma de los elementos de la matriz Optimización: control mediante aritmética de punteros. #define NF 5 #define NC 6 int m[NF][NC]; int suma, *p1, *p2; suma = 0; p1 = m; p2 = p1 + NF*NC; for ( ; p1 != p2; p1++) suma = suma + *p1; CONST NF NC VAR * P1: * P2: SUMA M TEM
EQU * EQU 5 EQU 6 EQU * registro A4 registro A5 DS.W 1 DS.W NF*NC EQU (*-M)/(NF*NC)
CLR.W LEA MOVEA.L ADDA.L FOR EQU BRA BLOQUE EQU MOVE.W ADD.W INC ADDQ.L COND CMPA.L BNE FIN EQU
SUMA V,A4 A4,A5 #NF*NC*TEM,A5 * COND * (A4),D7 D7,SUMA #TEM,A4 A4,A5 BLOQUE *
Se puede optimizar más con direccionamiento indirecto con posincremento. 92
MC68000 y las estructuras de datos
Estructuras de datos (RECORD, struct) Â Un RECORD (struct en C) es una estructura de datos formada por un número fijo de campos de igual o distinto tipo, cada uno con su propio identificador. • La información contenida en los campos forma entonces un todo que permite representar objetos o conceptos de una cierta complejidad.
 PASCAL: TYPE TipoEstructura =
RECORD Campo1: Tipo1; {Tamaño: t1 octetos} ... CampoN: TipoN; {Tamaño: tN octetos} END;
VAR t: TipoEstructura;
 C: typedef struct TipoEstructura { Tipo1 Campo1; … TipoN CampoN; }; struct TipoEstructura t; 93
MC68000 y las estructuras de datos
Estructuras de datos (RECORD, struct) Â Los campos de una variable de tipo RECORD (struct) se almacenan de forma consecutiva en memoria.
94
MC68000 y las estructuras de datos
MC68000 y las estructuras de datos: definición * Definición de una estructura de datos en PASCAL TYPE TipoEmpleado = RECORD Nombre: ARRAY [0 .. 29] OF CHAR; {30 octetos} DNI: LONGINT; {4 octetos} Letra: CHAR; {1 octeto} Departamento: BYTE; {1 octeto} Sueldo: LONGINT; {4 octetos} END; {TOTAL: 40 octetos} VAR Empl: TipoEmpleado; * Definición en ensamblador TNOMBRE EQU 30 Tamaños de los campos y tamaño total TDNI EQU 4 TLETRA EQU 1 TDEPTO EQU 1 TSUELDO EQU 4 TEMPL EQU TNOMBRE+TDNI+TLETRA+TDEPTO+TSUELDO NOMBRE EQU 0 Desplazamientos respecto de la dirección base DNI EQU NOMBRE+TNOMBRE Valor del símbolo: 30 LETRA EQU DNI+TDNI Valor del símbolo: 34 DEPTO EQU LETRA+TLETRA Valor del símbolo: 35 SUELDO EQU DEPTO+TDEPTO Valor del símbolo: 36 * Definición de una variable TipoEmpleado: reserva del espacio necesario EMPL DS.B TEMPL 95
MC68000 y las estructuras de datos
MC68000 y las estructuras de datos: manipulación Acceso a un campo de la estructura
VAR empl: TipoEmpleado; s: LONGINT; BEGIN sueldo := empl.Sueldo; END.
EMPL
DS.B TEMPL ... LEA EMPL,A0 MOVE.L SUELDO(A0),S
TipoEmpleado empl; long sueldo; s = empl.Sueldo;
96
MC68000 y las estructuras de datos
Tablas  Una tabla es un vector unidimensional de estructuras de tipo RECORD (struct).  PASCAL: Tabla: ARRAY [ind_min .. ind_max] OF TipoEstructura;  C: TipoEstructura Tabla[N]; • La tabla tiene N elementos. • El índice del primer elemento de la tabla siempre es 0.
97
MC68000 y las estructuras de datos
MC68000 y las tablas: definición * Definición de una estructura de datos en PASCAL TYPE TipoEmpleado = RECORD Nombre: ARRAY [0 .. 29] OF CHAR; {30 octetos} DNI: LONGINT; {4 octetos} Letra: CHAR; {1 octeto} Departamento: BYTE; {1 octeto} Sueldo: LONGINT; {4 octetos} END; {TOTAL: 40 octetos} VAR Tabla: ARRAY [0 .. 99] OF TipoEmpleado; * Definición en ensamblador TNOMBRE EQU 30 Tamaños de los campos y tamaño total TDNI EQU 4 TLETRA EQU 1 TDEPTO EQU 1 TSUELDO EQU 4 TEMPL EQU TNOMBRE+TDNI+TLETRA+TDEPTO+TSUELDO NOMBRE EQU 0 Desplazamientos respecto de la dirección base DNI EQU NOMBRE+TNOMBRE Valor del símbolo: 30 LETRA EQU DNI+TDNI Valor del símbolo: 34 DEPTO EQU LETRA+TLETRA Valor del símbolo: 35 SUELDO EQU DEPTO+TDEPTO Valor del símbolo: 36 * Definición de la tabla: reserva del espacio necesario LTABLA EQU 100 TABLA DS.B TEMPL*LTABLA 98
MC68000 y las estructuras de datos
MC68000 y las tablas: manipulación  La estructura de datos de tipo tabla favorece principalmente el empleo del modo de direccionamiento indirecto a registro con desplazamiento. • En dicho direccionamiento tenemos tres componentes, que son: desp(reg_base,reg_indice) • La dirección resultante es reg_base + reg_indice + desp
 El problema de acceder a un campo de un RECORD de la tabla se reduce a: • Introducir en reg_base la dirección de comienzo de la tabla. • Introducir en reg_indice el desplazamiento del RECORD al que queremos acceder en relación a la dirección base de la tabla. • Introducir en desp el desplazamiento del campo al que queremos acceder en relación al comienzo del RECORD en el que se encuentra.
 Por tanto: • reg_base permite acceder a la tabla • reg_base+reg_indice permite acceder al elemento de la tabla • reg_base+reg_indice+desp permite acceder al campo concreto dentro del elemento
99
MC68000 y las estructuras de datos
MC68000 y las tablas: manipulación Acceso a un campo de un elemento concreto CONST N = 100; VAR tabla: ARRAY [0..N-1] OF TipoEmpleado; s: LONGINT; BEGIN s := empl[25].Sueldo; END.
#define N 100 TipoEmpleado tabla[N]; long sueldo;
CONST N TABLA S
EQU EQU DS.B DS.L ... LEA MOVE.L
* 100 TEMPL*N 1 TABLA,A0 25*TEMPL+SUELDO(A0),S
s = empl[25].Sueldo;
100
MC68000 y las estructuras de datos
MC68000 y las tablas: manipulación Acceso a un campo de un elemento genérico CONST N = 100; VAR tabla: ARRAY [0..N-1] OF TipoEmpleado; s: LONGINT; i: INTEGER; BEGIN s := empl[i].Sueldo; END.
CONST N VAR TABLA S I
#define N 100 TipoEmpleado tabla[N]; long sueldo; int i; s = empl[i].Sueldo;
EQU EQU ... EQU DS.B DS.L DS.W ... LEA MOVE.W MULS MOVE.L
* 100 * TEMPL*N 1 1 TABLA,A0 I,D0 #TEMPL,D0 SUELDO(A0,D0.L),S
101
MC68000 y las estructuras de datos
MC68000 y las tablas: manipulación Suma de un campo de los elementos de la tabla CONST N = 100; VAR tabla: ARRAY [0..N-1] OF TipoEmpleado; suma: LONGINT; i: INTEGER; BEGIN suma := 0; FOR i:= 0 TO N-1 DO suma := suma+empl[i].Sueldo; END.
#define N 100 TipoEmpleado tabla[N]; long suma; int i; suma = 0; for (i=0; i < N-1; i++) suma = suma+empl[i].Sueldo;
CLR.L EQU CLR.W MOVE.W SUBQ.W CMP.W BLT BRA INC ADDQ.W BLOQUE EQU LEA MOVE.W MULS MOVE.L ADDQ.L CMP.W BNE FIN EQU FOR
SUMA * I #N,D7 #1,D7 I,D7 FIN BLOQUE #1,I * TABLA,A0 I,D6 #TEMPL,D6 SUELDO(A0,D6.L),D5 D5,SUMA I,D7 INC * 102
MC68000 y las estructuras de datos
MC68000 y las tablas: manipulación Suma de un campo de los elementos de la tabla Optimización: control mediante aritmética de punteros. #define N 100 TipoEmpleado tabla[N]; long suma; int i; TipoEmpleado *p1, *p2; suma = 0; p1 = tabla; p2 = p1 + N; for ( ; p1 != p2; p1++) suma = suma + p1->Sueldo;
CONST N SUELDO TEMPL VAR TABLA SUMA * P1: * P2:
EQU * EQU 100 EQU 36 EQU 40 EQU * DS.B TEMPL*N DS.L 1 registro A4 registro A5
CLR.L LEA MOVEA.L ADDA.L FOR EQU BRA BLOQUE EQU MOVE.W ADD.L INC ADDQ.L COND CMPA.L BNE FIN EQU
SUMA TABLA,A4 A4,A5 #N*TEMPL,A5 * COND * SUELDO(A4),D7 D7,SUMA #TEMPL,A4 A4,A5 BLOQUE *
103
MC68000 y las estructuras de datos
Listas encadenadas  Una lista encadenada es una secuencia de datos simples o complejos que no están alineados consecutivamente en memoria. • Cada elemento de la lista es una estructura de tipo RECORD (struct), uno de cuyos campos es un puntero que señala al elemento siguiente de la lista.
 PASCAL: TYPE
Puntero = ^TipoEstructura; TipoEstructura = RECORD Campo1: Tipo1; ... CampoN: TipoN; Siguiente: Puntero;
{Tamaño: t1 octetos} {Tamaño: tN octetos} {Tamaño: 4 octetos}
END; VAR lista: Puntero;
 C: typedef struct TipoEstructura { Tipo1 Campo1; … TipoN CampoN; struct TipoEstructura *Siguiente; }; typedef struct TipoEstructura *Puntero; Puntero Lista;
104
MC68000 y las estructuras de datos
Listas encadenadas  Estructura de un elemento de una lista encadenada:
 Estructura de una lista encadenada:
 El último elemento de la lista apunta a NIL (puntero nulo con todos sus bits a 0). • En C el puntero nulo es NULL. 105
MC68000 y las estructuras de datos
MC68000 y las listas encadenadas: definición * Definición de una lista encadenada en PASCAL TYPE
VAR
Puntero = ^TipoEmpleado; TipoEmpleado = RECORD Nombre: ARRAY [0 .. 29] OF CHAR; DNI: LONGINT; Letra: CHAR; Departamento: BYTE; Sueldo: LONGINT; Siguiente: Puntero; END; Lista: Puntero;
{30 octetos} {4 octetos} {1 octeto} {1 octeto} {4 octetos} {4 octetos} {TOTAL: 44 octetos}
* Definición en ensamblador TNOMBRE EQU 30 Tamaños de los campos y tamaño total TDNI EQU 4 TLETRA EQU 1 TDEPTO EQU 1 TSUELDO EQU 4 TSIG EQU 4 TEMPL EQU TNOMBRE+TDNI+TLETRA+TDEPTO+TSUELDO+TSIG NOMBRE EQU 0 Desplazamientos respecto de la dirección base DNI EQU NOMBRE+TNOMBRE Valor del símbolo: 30 LETRA EQU DNI+TDNI Valor del símbolo: 34 DEPTO EQU LETRA+TLETRA Valor del símbolo: 35 SUELDO EQU DEPTO+TDEPTO Valor del símbolo: 36 SIG EQU SUELDO+TSIG * Definición de la lista LISTA DS.L 1
106
MC68000 y las estructuras de datos
MC68000 y las listas encadenadas: manipulación Suma de un campo de los elementos de la lista VAR lista, p: Puntero; suma: LONGINT; BEGIN suma := 0; p = lista; WHILE p.siguiente <> NIL DO BEGIN suma := suma+p.Sueldo; p := p.Siguiente; END. Puntero lista, p; long suma; suma = 0; for (p = lista; p != NULL; p = p->Siguiente) suma = suma+p->Sueldo;
SUELDO SIG LISTA P SUMA
EQU EQU DS.L DS.L DS.L ... CLR.L MOVE.L WHILE EQU BRA BLOQUE MOVEA.L MOVE.L ADD.L MOVE.L COND TST.L BNE FIN EQU *
36 40 1 1 1 SUMA LISTA,P * COND P,A0 SUELDO(A0),D0 D0,SUMA SIG(A0),P P BLOQUE
107
Programación en ensamblador del MC68000: conceptos avanzados
10. Traducción de programas
Source file
Assembler
Object file
Source file
Assembler
Object file
Linker
Source file
Assembler
Object file
Program library
Executable file
108
Programación en ensamblador del MC68000: conceptos avanzados
11. Bibliotecas de subprogramas  Son almacenes en los que se guardan rutinas que realizan operaciones que pueden ser útiles en diversos programas.  Una biblioteca de subprogramas no es más que una secuencia de módulos objeto ensamblados por separado y unidos en un solo fichero en disco. Las bibliotecas no contienen nunca programa principal, sólo subprogramas.  Por cada módulo objeto se almacena la siguiente información: • Símbolos exportados. • Tamaño (incluyendo posibles datos estáticos).
 Las bibliotecas de subprogramas incorporan un índice global que permite gestionar sus módulos de forma eficiente. • El índice permite acceder a los distintos módulos por su posición en el fichero de biblioteca.
 Gestor de bibliotecas (library manager, librarian): programa que se encarga de crear el fichero de biblioteca, insertar o eliminar módulos, crear el índice, etc. 109
Programación en ensamblador del MC68000: conceptos avanzados
Tarea del montador si hay bibliotecas 1. Determinar la dirección de carga de cada uno de los módulos que componen el ejecutable. 2. Modificar los valores de los símbolos exportados relativos de la TSE de cada uno de los módulos en función de la dirección de carga del módulo. 3. Construir una tabla de símbolos global (TSG) a partir de todas las TSE. 4. Por cada módulo: • Resolver las referencias cruzadas a partir de su TSI y de la TSG. • Si hay alguna referencia cruzada sin resolver: Buscar en las bibliotecas e incorporar al ejecutable nuevos módulos de las mismas si es necesario. Determinar las direcciones de carga de los módulos de biblioteca incorporados y actualizar su TSE, así como la TSG.
• Si al final del todo quedan referencias cruzadas sin resolver, dar un mensaje de error. • Reubicar las direcciones mediante su TR. Un montador para código reubicable crea una TR global con todos los objetos relativos del programa a partir de las TR y las TSI de todos los módulos para que el cargador reubique dinámicamente el programa en el momento de su ejecución.
5. Escribir en disco un fichero ejecutable y un fichero de referencias cruzadas (MAP).
110
Programación en ensamblador del MC68000: conceptos avanzados
12. Código independiente de la posición  Si el programa contiene alguna referencia absoluta en las instrucciones, sólo puede cargarse y ejecutarse en una posición de memoria determinada.  Cuando se va a lanzar una aplicación en un computador con un sistema operativo medianamente complejo, la dirección de carga de la misma dependerá del nivel de ocupación de la memoria.  Solución: evitar referencias absolutas en el programa.  Un programa puede calcular su propia dirección de carga en tiempo de ejecución y cargarla en un registro: PROGRAM BEGIN
EQU LEA
* PROGRAM-(BEGIN+2)(PC),A0
 Así, es posible evitar referencias absolutas, pues basta con hacer referencias relativas al registro A0 • Podría emplearse esto para cargar direcciones de comienzo de zonas de datos estáticos, direcciones de carga de subrutinas, etc.
111
Programación en ensamblador del MC68000: conceptos avanzados
13. Carga y ejecución de programas  La carga de programas es realizada por el programa cargador, y la ejecución es iniciada por él.  El cargador es una herramienta del sistema operativo que es invocada de forma transparente al usuario en el momento en que es preciso proceder a cargar y ejecutar un programa.  Si el cargador es absoluto, el montador se habrá encargado previamente de reubicar las referencias del programa.  Si el cargador es reubicador, el montador habrá almacenado en el ejecutable la información de reubicación. • Un montador para código reubicable crea una TR global con todos los objetos relativos del programa a partir de las TR y las TSI de todos los módulos para que el cargador reubique dinámicamente el programa en el momento de su ejecución. • Es el propio cargador quien se encarga de realizar la tarea de reubicación.
 Si el código es independiente de la posición, no es necesario que el cargador reubique el código ejecutable para que todo funcione correctamente.
112
Programación en ensamblador del MC68000: conceptos avanzados
14. Código de arranque de programas  La mayor parte de los programas de computador se ejecutan bajo el control de un sistema operativo.  Los sistemas operativos suelen requerir que los programas realicen ciertas operaciones antes y después de ejecutar el código escrito por el programador.  Es muy frecuente que, al montar un programa ejecutable, el montador incluya un bloque de código de arranque que se encargue de las tareas de inicio y finalización del programa. • El código de arranque depende del sistema operativo y del entorno de ejecución. • A veces el programa principal se constituye en forma de una subrutina que es invocada por el código de arranque, que a su vez recibe de nuevo el control cuando el programa principal retorna (finaliza).
 El código de arranque: • Realiza tareas de inicio de la ejecución del programa (iniciar registros, pila, etc). • Llama al código del programa principal y espera a que éste finalice. • Cuando el programa principal finaliza, se retorna al código de arranque, y éste realiza las tareas de terminación (borrado de la pila, etc). 113
Programación en ensamblador del MC68000: conceptos avanzados
15. Secciones en ensamblador  Las secciones son zonas de código destinadas a contener instrucciones, datos o ambos. • Un módulo objeto puede tener una o varias secciones. • Las secciones suelen tener espacios de nombres independientes. • En el proceso de ensamblaje de un módulo con secciones, cada una de ellas cuenta con su propio CDE.
Sintaxis de la directiva de definición de secciones en el MC68000: SECTION nombre, tipo Efecto: define el comienzo de una sección, le da nombre y especifica su tipo. • Una sección termina donde empieza otra o al encontrar la directiva END. • Tipos de secciones: CODE: instrucciones, definiciones de datos con DS y definiciones de símbolos importados. DATA: datos reservados e iniciados con DC. BSS: datos reservados con DS y definiciones de símbolos exportables.
 En MIPS los programas siempre están divididos en secciones predefinidas (.text, .ktext, .data, .kdata, .rdata, .sdata).
114
Programación en ensamblador del MC68000: conceptos avanzados
16. Compilación de programas  Un compilador es una herramienta que traduce un módulo fuente escrito en un lenguaje de alto nivel a un lenguaje de bajo nivel.  Fases de la compilación: Dependencias Dependiente del lenguaje. Independiente de la máquina. Algo dependiente del lenguaje. Casi independiente de la máquina.
Fase
Función
Front-end
Transforma el lenguaje de alto nivel a una representación intermedia.
Optimizador de Transformaciones en bucles, integración de procedimientos en línea, etc. alto nivel
Poco dependiente del lenguaje. Poco dependiente de la máquina.
Independiente del lenguaje. Muy dependiente de la máquina.
Optimizador global Generador de código
Optimizaciones locales y globales, ubicación de variables en registros. Selección de instrucciones, optimizaciones dependientes de la máquina. Puede ir seguido de un ensamblador, o generar directamente código máquina.
 Un compilador debe ser conservador: debe proporcionar código que funcione tal como lo espera el programador. 115
Programación en ensamblador del MC68000: conceptos avanzados
Compilación de programas  La función del front-end es: • Leer el código fuente. • Chequear la sintaxis y la semántica del código fuente. • Transformar el código fuente a una representación intermedia.
 Partes del front-end: • Scanner: lee caracteres individuales y crea tokens (palabras reservadas, constantes, nombres de variable, símbolos, signos, etc). • Parser: toma los tokens, asegura que la sintaxis es correcta y produce un árbol sintáctico abstracto que representa la estructura sintáctica del programa. • Analizador semántico: toma el árbol y chequea la corrección semántica del programa, creando la tabla de símbolos. • Generador de representación intermedia: toma la tabla de símbolos y el árbol y genera la representación intermedia.
 La representación intermedia generada por el front-end suele ser muy simple, y consta de: • Operaciones simples. • Conjunto pequeño de tipos primitivos: caracteres, enteros y reales. 116
Programación en ensamblador del MC68000: conceptos avanzados
Compilación de programas Ejemplo en C: Equivalente en PASCAL Árbol sintáctico
while (save[i] == k) i+=1; WHILE save[i] = k DO i:=i+1; Representación intermedia
117
Programación en ensamblador del MC68000: conceptos avanzados
17. Optimización de código Nombre
Explicación
ALTO NIVEL
Nivel de código fuente, independiente del procesador
Transformaciones en bucles
Modificaciones en los bucles para aumentar su velocidad de ejecución
Nivel en gcc
O1
Desenrollamiento de bucles
Replicar el cuerpo del bucle varias veces para reducir el número de iteraciones y la sobrecarga en su control
Integración de procedimientos
Reemplazar llamada a procedimiento por el cuerpo del mismo
LOCAL
Dentro de un bloque secuencial de código
Eliminación de expresiones comunes
Eliminar repeticiones del mismo cálculo
O1
Propagación de constantes
Reemplazar apariciones de una variable a la que se ha asignado una constante por la propia constante
O1
Reducción del tamaño de la pila
Reorganización de expresiones para minimizar los recursos necesarios para su evaluación
Indep.
O3
O1
118
Programación en ensamblador del MC68000: conceptos avanzados
Optimización de código (cont.) Nombre
Explicación
GLOBAL
Abarca diferentes bloques secuenciales del código
Eliminación global de expresiones comunes
Igual que la local, pero atravesando saltos.
O2
Reemplazar apariciones de una variable a la que se ha asignado un valor por dicho valor
O2
Propagación de copia
Nivel en gcc
Sacar de un bucle un cálculo que siempre da el mismo valor y se repite en todas las iteraciones
O2
Eliminación de variables de inducción
Simplificar o eliminar cálculos de direcciones en vectores o matrices en bucles (a veces usando punteros que se incrementan o decrementan).
O2
DEPENDIENTE DEL PROCESADOR
Depende del conocimiento del procesador
Reducción de fuerza
Cambiar operaciones complejas por otras más simples.
O1
Planificación de la segmentación
Reordenar instrucciones para mejorar las prestaciones de la segmentación
O1
Optimización del desplazamiento en saltos
Elegir el desplazamiento más corto posible para acceder al destino en saltos.
O1
Movimiento de código
119
Programación en ensamblador del MC68000: conceptos avanzados
18. Ubicación de variables en registros  En las arquitecturas de carga / almacenamiento, la ubicación de variables en registros (register allocation) es la optimización más importante. • Esta tarea es más sencilla cuanto mayor sea el número de registros disponibles.
 La ubicación de registros se puede hacer a nivel local o global, siempre dentro de una misma función o procedimiento. • La ubicación de registros local se suele hacer en las últimas fases de la compilación, ya en la fase de generación de código.
 La optimización global de código se basa en analizar los rangos de vida de las variables: • Rango de vida de una variable: región de código en el que se utiliza la variable. • Si la intersección de los rangos de vida de dos variables es vacía, ambas pueden compartir un único registro (las dos variables no estarán nunca en uso a la vez). • Si la intersección de los rangos de vida de dos variables no es vacía, ambas no pueden compartir el mismo registro (porque en la zona de la intersección las dos variables están en uso al mismo tiempo). 120
Programación en ensamblador del MC68000: conceptos avanzados
Ubicación de variables en registros  Grafo de interferencia: representa las intersecciones de los rangos de vida de las variables. • Cada nodo representa una variable. • Si entre dos nodos hay un arco, significa que los rangos de vida de las variables consideradas tienen intersección no vacía.
 Coloreado de grafos: encontrar un color para cada nodo de modo que dos nodos adyacentes no pueden tener el mismo color. • Al final, cada color representa un registro. • Si el número de colores es menor o igual que el número de registros disponibles, todas las variables se pueden ubicar en registros. • Si el número de colores es mayor que el número de registros disponibles, habrá que dividir en varios nodos el rango de vida de una o más variables y rehacer el grafo de interferencia.
 Una correcta ubicación de variables en registros disminuye el número de instrucciones de carga y almacenamiento necesarias en los programas. 121
Programación en ensamblador del MC68000: conceptos avanzados
19. Excepciones en el MC68000 • Excepción: situación que requiere un tratamiento inmediato por parte del procesador. • Tipos de excepciones: Excepciones internas: se deben a errores producidos por las instrucciones, o bien cuando se ejecuta una instrucción especial. Excepciones externas: se deben a eventos externos al procesador como son las interrupciones, los errores de bus y la señal de RESET.
• Cada excepción requiere un tratamiento particular. • Cada vez que se produce una excepción: El procesador realiza una serie de acciones automáticamente (procesamiento de la excepción). El procesador llama a una rutina de servicio de la excepción (manejador de la excepción).
• Las rutinas de manejo de las excepciones forman parte del sistema operativo de los computadores. Por tanto, el código de las mismas reside en memoria principal.
122
Programación en ensamblador del MC68000: conceptos avanzados
Vectores de excepción en el MC68000 Vector de excepción: posición de memoria que contiene la dirección de comienzo del código correspondiente a una rutina de tratamiento de una excepción. En el MC68000, los vectores de excepción están numerados y se almacenan entre las direcciones $0 y $3FF de memoria. Cada vector de excepción ocupa 4 octetos.
123
Programación en ensamblador del MC68000: conceptos avanzados
Tratamiento de excepciones en el MC68000 • Cuando se produce una excepción y es atendida por el procesador, éste realiza de modo automático las siguientes tareas: 1. Se realiza una copia del SR en un registro interno del procesador. 2. Se entra en modo supervisor (S=1) y se desactiva el bit de traza (T=0). 3. Si la excepción es externa, se actualiza el valor de la máscara de interrupciones. 4. Se salva en la pila el contenido del contador de programa PC y la copia interna del SR (en ese orden).
Si la excepción es de grupo 0 (salvo reset), se almacenan también en la pila una palabra con el contenido del registro de instrucción, dos palabras con la dirección de memoria que causó la excepción, y una palabra adicional indicando el tipo de acceso a memoria que se estaba realizando.
5. Se determina el número de vector de excepción para acceder a la tabla de vectores de excepción, tomar la dirección del vector correspondiente y cargarla en el PC. • A partir de este momento se reanuda la ejecución normal de instrucciones.
El PC contiene ahora la dirección del punto de entrada de la rutina de servicio de la excepción. 124
Programación en ensamblador del MC68000: conceptos avanzados
Rutinas de tratamiento de excepciones • Las rutinas de tratamiento (manejadores) de excepciones están obligadas a conservar el contenido de los registros para no perturbar la ejecución del programa en curso (estrategia de guarda-llamado).
EXC_HAND EQU * MOVEM.L lista-regs,-(SP) .... instrucciones para procesar la excepción .... MOVEM.L (SP)+,lista-regs RTE
125
Programación en ensamblador del MC68000: conceptos avanzados
Tratamiento de excepciones en el MC68000 • Tipos de excepciones:
126
Programación en ensamblador del MC68000: conceptos avanzados
Excepciones internas en el MC68000 • Excepciones internas por error de ejecución: Error en dirección: se produce al intentar acceder a una palabra o palabra doble en dirección impar. División por cero: se produce cuando el divisor es 0 en una instrucción DIVU o DIVS. Instrucción de emulación: salta cuando el código de operación de la instrucción es 1010 ó 1111. Son dos excepciones distintas utilizadas para emular (mediante las correspondientes rutinas de excepción) instrucciones que no pertenecen al repertorio del MC68000 (ejemplo: coma flotante).
127
Programación en ensamblador del MC68000: conceptos avanzados
Excepciones internas en el MC68000 • Excepciones internas por error de ejecución (cont.): Instrucción ilegal: se produce cuando al buscar la primera palabra de una instrucción el MC68000 detecta que no contiene un código válido ni de emulación. Violación de privilegio: sucede cuando se intenta ejecutar una instrucción privilegiada estando el procesador en modo usuario (S=0).
128
Programación en ensamblador del MC68000: conceptos avanzados
Excepciones internas en el MC68000 • Excepción de traza: se produce tras ejecutar cada instrucción si el bit T del CCR vale 1. • Excepciones por instrucciones: TRAPV: genera una excepción si el bit V del CCR vale 1. CHK op_mem,Dn Se compara el contenido del registro con el operando en memoria, que se supone que es su límite superior. Si el registro contiene un valor mayor que el límite, se genera una excepción.
TRAP #n Excepción explícita. 129
Programación en ensamblador del MC68000: conceptos avanzados
Excepción TRAP: llamada al S.O. • Excepción por instrucción TRAP #n: Se utiliza para realizar llamadas explícitas a servicios de sistema operativo. Estas llamadas se identifican por un número n que es el operando de la instrucción, junto con algunos parámetros que pueden estar en registros o en memoria. La instrucción TRAP tiene un único operando inmediato en el rango 015. Hay 16 vectores reservados para la instrucción TRAP, ubicados en la zona de memoria comprendida entre las direcciones de memoria $80 y $BF, ambas inclusive. El vector de excepción utilizado al ejecutar la instrucción TRAP #n se encontrará en la dirección $80+4·n.
130
Programación en ensamblador del MC68000: conceptos avanzados
Excepciones externas en el MC68000 • Generadas por eventos externos al procesador. • Excepción externa por error de bus: se puede producir por diversas causas, por ejemplo por intentar acceder a una posición de memoria que no existe. • Excepción externa por interrupción: es el mecanismo establecido para que los periféricos puedan comunicar algo a la UCP, ya sea para transmitir datos, o porque están listos para recibirlos, o para comunicarle la situación en que se encuentran. • Tipos de excepciones externas por interrupción: Interrupciones autovectorizadas: el vector de excepción se calcula automáticamente por el procesador. Interrupciones no autovectorizadas: el dispositivo que interrumpe se encarga de proporcionar la dirección del vector de excepción que le corresponde.
• Excepción de reset: se produce al iniciar o reiniciar el procesador.
131
Programación en ensamblador del MC68000: conceptos avanzados
Excepción de arranque (reset) en el MC68000 • Tiene un tratamiento especial, pues se usa para iniciar o reiniciar el procesador. • Cuando sucede esta excepción, el tratamiento es el siguiente: 1. Se entra en modo supervisor (S=1) y se desactiva el bit de traza (T=0) 2. La máscara de interrupciones pasa a tomar el valor máximo (111). 3. Se carga en el SSP el valor contenido en el vector de excepción 0 (posiciones 0 a 3 de memoria). 4. Se carga en el PC el valor contenido en el vector de excepción 1 (posiciones 4 a 7 de memoria), que deberá estar grabado en memoria ROM.
• En el vector de excepción 1 se encuentra la dirección de comienzo del programa de arranque del computador, por lo cual el PC se encontrará entonces apuntando a la primera instrucción de dicho programa. 132
Programación en ensamblador del MC68000: conceptos avanzados
Excepción de arranque (reset) en el MC68000 • Tras este proceso se inicia la ejecución normal de instrucciones. El procesador se encuentra en modo supervisor (S=1). Lo primero es lanzar el programa de arranque del computador, que suele estar almacenado en ROM, y normalmente se encargará de cargar en memoria el sistema operativo.
• Al cargarse el sistema operativo se asignan valores iniciales a los vectores de excepción en RAM y se cargan en memoria las correspondientes rutinas de servicio. Salvedad: los dos primeros “vectores” (direcciones 0 a 7 de memoria) están en ROM y son usados por la excepción de reset.
• Al arrancar también se realiza un test del computador.
133