ESTRUCTURA Y TECNOLOGÍA DE COMPUTADORES

Estructura y diseño de computadores. Reverté, 2000. ÂD.A. PATTERSON, J.L HENNESSY. Computer Organization and Design. 3rd edition, Morgan Kaufmann, 200...

6 downloads 381 Views 1MB Size
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



Privado

0x00000000

1 2

SUMAR

Relativo

No

Importado

Desconocido (0x00000000)

VAR

Relativo



Privado

0x00000000

3

N

Relativo



Privado

0x00000000

4

S

Relativo



Privado

0x00000002

5

BEGIN

Relativo



Privado

0x00000004

6

MAXPILA

Relativo



Privado

0x00000030

16

MINPILA

Relativo



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



Exportado

0x00000000

1: inserción como exportado sin definir 2: inserción del valor

NUM

Absoluto



Privado

0x0000000C

3

SUMA

Absoluto



Privado

0x00000008

4

I

Absoluto



Privado

0xFFFFFFFE

5

FOR

Relativo



Privado

0x0000000A

9

INC

Relativo



Privado

0x00000020

15

BLOQUE

Relativo



Privado

0x00000024

16

FIN

Relativo



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



Privado

0x00000000

000006

4 octetos

Relativo

No

Importado

Desconocido (0x00000000)

00000E

4 octetos

VAR

Relativo



Privado

0x00000000

000014

4 octetos

N

Relativo



Privado

0x00000000

00001A

4 octetos

S

Relativo



Privado

0x00000002

BEGIN

Relativo



Privado

0x00000004

MAXPILA

Relativo



Privado

0x00000030

MINPILA

Relativo



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



Exportado

0x00000000

SUMAR

Relativo

0x000000

Absoluto



Privado

0x0000000C

SUMA

Absoluto



Privado

0x00000008

I

Absoluto



Privado

0xFFFFFFFE

FOR

Relativo



Privado

0x0000000A

INC

Relativo



Privado

0x00000020

BLOQUE

Relativo



Privado

0x00000024

FIN

Relativo



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