67
Universidad Rey Juan Carlos ESTRUCTURA Y TECNOLOG ESTRUCTURA Y TECNOLOGÍ A DE A DE COMPUTADORES 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 2 1. Entrada/Salida. 2. Clasificación de los Computadores. 3. Tiempos de Ejecución de Instrucciones. 4. Inclusión de ficheros. 5. Sentencias de control optimizadas. 6. Ensamblaje condicional. 7. Macroinstrucciones. 8. Ensamblaje y montaje de un programa con referencias externas. 9. Estructuras de Datos. Programa

ESTRUCTURA Y TECNOLOGÍA DE COMPUTADORES · El computador se comunica con el exterior mediante dispositivos de E/S. 1. Entrada / Salida. Programación en ensamblador del MC68000:

  • Upload
    dangnhu

  • View
    216

  • Download
    0

Embed Size (px)

Citation preview

Universidad

Rey Juan Carlos

ESTRUCTURA Y TECNOLOGESTRUCTURA Y TECNOLOGÍÍA DE A DE COMPUTADORESCOMPUTADORES

Programación en ensamblador del MC68000:

conceptos avanzados

Luis Rincón CórcolesLicesio J. Rodríguez-Aragón

Programación en ensamblador del MC68000: conceptos avanzados

2

1. Entrada/Salida.

2. Clasificación de los Computadores.

3. Tiempos de Ejecución de Instrucciones.

4. Inclusión de ficheros.

5. Sentencias de control optimizadas.

6. Ensamblaje condicional.

7. Macroinstrucciones.

8. Ensamblaje y montaje de un programa con referencias externas.

9. Estructuras de Datos.

Programa

Programación en ensamblador del MC68000: conceptos avanzados

3

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.

Programa

Programación en ensamblador del MC68000: conceptos avanzados

4

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.orgManual de GCC: http://gcc.gnu.org/onlinedocsOptimización: http://gcc.gnu.org/onlinedocs/gcc-3.4.2/gcc/Optimiza-Options.html

Bibliografía

Programación en ensamblador del MC68000: conceptos avanzados

5

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.

Programación en ensamblador del MC68000: conceptos avanzados

6

ARQUITECTURA VON NEUMANN

U.A.L.

REGISTROS

CIRCUITOS

MEMORIA PRINCIPAL

UNIDAD DE CONTROL PUNTERO

PERIFÉRICOS

PERIFÉRICOS

PERIFÉRICOS

PERIFÉRICOS

UNIDAD

DE

E/S

El computador se comunica con el exterior mediante dispositivos de E/S.

1. Entrada / Salida

Programación en ensamblador del MC68000: conceptos avanzados

7

• 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.

Esquemas de entrada / salida

Programación en ensamblador del MC68000: conceptos avanzados

8

Ejemplo: conexión mediante bus único

Programación en ensamblador del MC68000: conceptos avanzados

9

Constituye el interfaz entre la UCP y los periféricos.

Datos

Lógica E/S

Interfaz con elbus del sistema

Direcciones

Control

Datos

Estado

Control

Datos

Estado

Control

Lógica deinterfaz con el

periférico

Lógica deinterfaz con el

periférico

Estado/Control

Datos

Datos

Interfaz con losperiféricos

Controlador de entrada / salida

Programación en ensamblador del MC68000: conceptos avanzados

10

• 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.

Gestión de entrada / salida

Programación en ensamblador del MC68000: conceptos avanzados

11

• 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.

E/S controlada por programa

Programación en ensamblador del MC68000: conceptos avanzados

12

• 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.

E/S controlada mediante interrupciones

Programación en ensamblador del MC68000: conceptos avanzados

13

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.

E/S mediante acceso directo a memoria (DMA)

Programación en ensamblador del MC68000: conceptos avanzados

14

2. Clasificación de los computadoresNo 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.

Programación en ensamblador del MC68000: conceptos avanzados

15

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.

Programación en ensamblador del MC68000: conceptos avanzados

16

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 Insertar el contenido de la variable B en la pila

PUSH C Insertar el contenido de la variable C en la pila

DIV Dividir B entre C y guardar resultado en la pila

PUSH D Insertar el contenido de la variable D en la pila

PUSH E Insertar el contenido de la variable E en la pila

MUL Multiplicar D*E y guardar resultado en la pila

ADD Sumar B/C con D*E

POP A Almacenar el resultado en la variable A

Programación en ensamblador del MC68000: conceptos avanzados

17

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.

Programación en ensamblador del MC68000: conceptos avanzados

18

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 Cargar el contenido de la variable B en el acumulador

DIV C Dividir B/C (resultado en el acumulador)

STORE TEMP Guardar el cociente en una variable temporal

LOAD D Cargar el contenido de la variable B en el acumulador

MUL E Multiplicar D*E (resultado en el acumulador)

ADD TEMP Sumar B/C con D*E (resultado en el acumulador)

STORE A Almacenar el contenido del acumulador en la variable A

Programación en ensamblador del MC68000: conceptos avanzados

19

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 Dividir B/C (resultado en variable temporal)

MUL D,E,TMP2 Multiplicar D*E (resultado en variable temporal)

ADD TMP1,TMP2,A Sumar B/C con D*E (resultado en variable A)

Programación en ensamblador del MC68000: conceptos avanzados

20

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).

Programación en ensamblador del MC68000: conceptos avanzados

21

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).

Programación en ensamblador del MC68000: conceptos avanzados

22

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 Cargar el contenido de la variable B en un registro

DIV C,R1 Dividir B/C

MOVE D,R2 Cargar el contenido de la variable D en un registro

MUL E,R2 Multiplicar D*E

ADD R1,R2 Sumar B/C con D*E

MOVE R2,A Almacenar el resultado en la variable A

Programación en ensamblador del MC68000: conceptos avanzados

23

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.

Programación en ensamblador del MC68000: conceptos avanzados

24

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 Cargar el contenido de la variable B en un registro

LOAD C,R2 Cargar el contenido de la variable C en un registro

DIV R3,R1,R2 Dividir B/C

LOAD D,R4 Cargar el contenido de la variable D en un registro

LOAD E,R5 Cargar el contenido de la variable E en un registro

MUL R6,R4,R5 Multiplicar D*E

ADD R7,R3,R6 Sumar B/C con D*E

STORE R7,A Almacenar resultado en la variable A

Programación en ensamblador del MC68000: conceptos avanzados

25

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.

Programación en ensamblador del MC68000: conceptos avanzados

26

Tiempo de cálculo de la dirección efectiva

En ocasiones hay que sumar este tiempo al indicado en las tablas.

Programación en ensamblador del MC68000: conceptos avanzados

27

Tiempo de instrucciones de transferenciade byte o palabra

Programación en ensamblador del MC68000: conceptos avanzados

28

Tiempo de instrucciones de transferenciade palabra larga

Programación en ensamblador del MC68000: conceptos avanzados

29

Tiempo de instrucciones estándares

Programación en ensamblador del MC68000: conceptos avanzados

30

Tiempo de instrucciones con operando inmediato

Programación en ensamblador del MC68000: conceptos avanzados

31

Tiempo de instrucciones con operando único

Programación en ensamblador del MC68000: conceptos avanzados

32

Tiempo de rotaciones y desplazamientos

Programación en ensamblador del MC68000: conceptos avanzados

33

Tiempo de instrucciones de manipulación de bits

Programación en ensamblador del MC68000: conceptos avanzados

34

Tiempo de instrucciones condicionales

Programación en ensamblador del MC68000: conceptos avanzados

35

Tiempo de JMP, JSR, LEA, PEA y MOVEM

Programación en ensamblador del MC68000: conceptos avanzados

36

Tiempo de instrucciones multiprecisión y MOVEP

Programación en ensamblador del MC68000: conceptos avanzados

37

Tiempo de instrucciones misceláneas

Programación en ensamblador del MC68000: conceptos avanzados

38

Tiempo de proceso de excepciones

Introducción a la programación en ensamblador del MC68000

39

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.

4.MC68000: inclusión de ficheros

Introducción a la programación en ensamblador del MC68000

40

5.MC68000: sentencia WHILE - DO

Ensamblador MC68000:

MOVE.W #5,NMOVE.W #1,FANTMOVE.W #1,FMOVE.W #2,I

WHILE EQU *BRA COND

BLOQUE MOVE.W F,FAUXMOVE.W FANT,D6ADD.W D6,FMOVE.W FAUX,FANTADDQ.W #1,I

COND MOVE.W I,D7CMP.W N,D7BLE BLOQUE

FIN EQU *

Versión optimizada del bucle WHILE:

BLOQUE_WHILE

FALSA

CIERTA¿COND?

PASCAL (variables enteras):n := 5; fant := 1;f := 1; i := 2;WHILE i <= n DOBEGIN

faux := f;f := f + fant;fant := faux;i := i+1;

END;

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;

Introducción a la programación en ensamblador del MC68000

41

MC68000: sentencia FOR - DOWNTO

Ensamblador MC68000:MOVE.W #5,NMOVE.W #1,FANTMOVE.W #1,F

FOR EQU *MOVE.W N,D7SUBQ.W #2,D7BLT FIN

BLOQUE EQU *MOVE.W F,FAUXMOVE.W FANT,D6ADD.W D6,FMOVE.W FAUX,FANT

COND DBRA D7,BLOQUEFIN EQU *

Si el límite final del bucle es 0 se puede usar la instrucción DBRA:

PASCAL (variables enteras):n := 5;fant := 1;f := 1;FOR i := n-2 DOWNTO 0 DOBEGIN

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;

}

i:= valor_inicial

i = -1

i <> -1

BLOQUE_FOR

DBRAi,BLOQUE_FOR

¿i < 0?CIERTO

FALSO

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

42

6.Ensamblaje condicionalPermiten 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.

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

43

Posibles condiciones para IFcond (entre otras):

IFEQ expresión cierto si expresión = 0 .

IFNE expresión cierto si expresión <> 0 .

IFGT expresión cierto si expresión >0 .

IFLE expresión cierto si expresión <= 0 .

IFLT expresión cierto si expresión <0 .

IFGE expresión cierto si expresión >= 0 .

IFC cadena1,cadena2 cierto si cadena1 = cadena2.

IFNC cadena1,cadena2 cierto si cadena1 = cadena2.

IFD símbolo cierto si el símbolo ha sido definido.

IFND símbolo cierto si el símbolo no ha sido definido.

Ensamblaje condicional

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

44

Ensamblaje condicionalTambié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.

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

45

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.

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

46

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.

MC68000: macroinstrucciones

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

47

Ejemplo con macroinstrucciones:

* Definición de la macroinstruccionMACIN MACRO

CLR.B \2ETIQ\@ ADDI.\0 #NARG,\1

ADDQ.B #1,\2CMPI.B #4,\2BNE ETIQ\@ENDM...ORG $1000

* Primera llamadaMACIN.B D1,D2

* Segunda llamadaMACIN.W D3,D4,D5...

MC68000: macroinstrucciones

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

48

Expansión de las dos llamadas a la macroinstrucción:

11 ( 11) * Primera llamada12 00001000 ( 12) MACIN.B D1,D213 00001000 4202 ( 12) CLR.B D214 00001002 06010002 ( 12) ETIQ.000: ADDI.B #NARG,D115 00001006 5202 ( 12) ADDQ.B #1,D216 00001008 0C020004 ( 12) CMPI.B #4,D217 0000100C 66F4 ( 12) BNE ETIQ.00018 ( 13) * Segunda llamada19 0000100E ( 14) MACIN.W D3,D4,D520 0000100E 4204 ( 14) CLR.B D421 00001010 06430003 ( 14) ETIQ.001: ADDI.W #NARG,D322 00001014 5204 ( 14) ADDQ.B #1,D423 00001016 0C040004 ( 14) CMPI.B #4,D424 0000101A 66F4 ( 14) BNE ETIQ.001

MC68000: macroinstrucciones

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

49

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.

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

50

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.

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

51

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.

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

52

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.

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

53

Ensamblaje y montaje de un programa con referencias externas: ejemplo

PROGRAM EQU *XREF SUMAR

VAR EQU *N DS 2S DS 2BEGIN EQU *

MOVEA.L #MINPILA,SPMOVE.W #5,NMOVE.W N,-(SP)PEA SJSR SUMARADDA.L #6,SPMOVE.B #9,D0TRAP #15

MAXPILA EQU *DS 400

MINPILA EQU *END BEGIN

XDEF SUMARSUMAR EQU *NUM SET 12SUMA SET 8I SET -2

LINK A6,#-2MOVEA.L SUMA(A6),A5CLR.W (A5)

FOR EQU *MOVE.W #1,I(A6)MOVE.W NUM(A6),D7CMP.W I(A6),D7BLT FINBRA BLOQUE

INC ADDQ.W #1,I(A6)BLOQUE MOVE.W I(A6),D6

MULS D6,D6ADD.W D6,(A5)CMP.W I(A6),D7BNE INC

FIN EQU *UNLK A6RTSEND

Programa principal

Subrutina

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

54

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.

Ensamblaje con referencias externas: 1ª pasada

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

55

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 lasiguiente línea de código.

3. Incrementar el CDE con la longitud de la instrucción.

1ª pasada con referencias externas: instrucciones

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

56

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.

1ª pasada con referencias externas: directivas (I)

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

57

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: relativoEstatus: 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.

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

58

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.

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

59

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.

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

60

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.

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

61

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.

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

62

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.

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

63

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 lasiguiente línea de código.

3. Incrementar el CDE con la longitud de la instrucción.

1ª pasada con referencias externas: ejemplo

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

64

1ª pasada con referencias externas: ejemplo (I)

Insertar en TS-*EQUMINPILA0001C018

Insertar en TS-*EQUBEGIN0000046

-

400

-

-

2

4

6

6

6

6

8

6

2

2

-

-

-

Tamaño

BEGIN

100

*

#15

#9,D0

#6,SP

SUMAR

S

N,-(SP)

#5,N

#MINPILA,SP

1

1

*

SUMAR

*

Fin de la primera faseEND0001C019

Incrementar CDEDS.L00003017

Insertar en TSEQUMAXPILA00003016

Línea en blanco: ignorar00003015

Incrementar CDETRAP00002E14

Incrementar CDEMOVE.B00002A13

Incrementar CDEADDA.L00002412

Incrementar CDEJSR00001E11

Incrementar CDEPEA00001810

Incrementar CDEMOVE.W0000129

Incrementar CDEMOVE.W00000A8

Incrementar CDEMOVEA.L0000047

Insertar en TS e incrementar CDEDS.WS0000025

Insertar en TS e incrementar CDEDS.WN0000004

Insertar en TSEQUVAR0000003

Insertar en TS como importadoXREF0000002

Insertar en TSEQUPROGRAM0000001

AcciónLínea de códigoCDE (hex.)Línea

Programa principal

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

65

1ª pasada con referencias externas: ejemplo (II)

Tabla de símbolos del programa principal

160x00000030PrivadoSíRelativoMAXPILA

180x000001C0PrivadoSíRelativoMINPILA

10x00000000PrivadoSíRelativoPROGRAM

2Desconocido (0x00000000)

ImportadoNoRelativoSUMAR

Definido

Privado

Privado

Privado

Privado

Estatus

40x00000000RelativoN

50x00000002RelativoS

60x00000004RelativoBEGIN

0x00000000

Valor del símbolo

3

Línea en que se produjo la inserción

Tipo del símbolo

Nombre del símbolo

RelativoVAR

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

66

1ª pasada con referencias externas: ejemplo (III)

Incrementar CDE4SUMA(A6),A5MOVEA.L0000047

Incrementar CDE4A6,#-2LINK0000006

2

2

4

4

4

4

4

4

6

-

2

-

-

-

-

-

Tamaño

D6,(A5)

D6,D6

I(A6),D6

#1,I(A6)

BLOQUE

FIN

I(A6),D7

NUM(A6),D7

#1,I(A6)

*

(A5)

-2

8

12

*

SUMAR

Incrementar CDEADD.W00002A18

Incrementar CDEMULS00002817

Insertar en TS e incrementar CDEMOVE.WBLOQUE00002416

Insertar en TS e incrementar CDEADDQ.WINC00002015

Incrementar CDEBRA00001C14

Incrementar CDEBLT00001813

Incrementar CDECMP.W00001412

Incrementar CDEMOVE.W00001011

Incrementar CDEMOVE.W00000A10

Insertar en TSEQUFOR00000A9

Incrementar CDECLR.W0000088

Insertar en TSSETI0000005

Insertar en TSSETSUMA0000004

Insertar en TSSETNUM0000003

Insertar valor en TSEQUSUMAR0000002

Insertar en TS como exportadoXDEF0000001

AcciónLínea de códigoCDE (hex.)Línea

Subrutina

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

67

1ª pasada con referencias externas: ejemplo (IV)

Incrementar CDE2RTS00003423

Fin de la segunda fase-END00003624

Incrementar CDE4I(A6),D7CMP.W00002C19

2

-

2

Tamaño

A6

*

INC

Incrementar CDEUNLK00003222

Insertar en TSEQUFIN00003221

Incrementar CDEBNE00003020

AcciónLínea de códigoCDE (hex.)Línea

Subrutina

Tabla de símbolos de la subrutina

160x00000024PrivadoSíRelativoBLOQUE

150x00000020PrivadoSíRelativoINC

210x00000032PrivadoSíRelativoFIN

1: inserción como exportado sin definir2: inserción del valor

0x00000000ExportadoSíRelativoSUMAR

Definido

Privado

Privado

Privado

Privado

Estatus

40x00000008AbsolutoSUMA

50xFFFFFFFEAbsolutoI

90x0000000ARelativoFOR

0x0000000C

Valor del símbolo

3

Línea en que se produjo la inserciónTipo del símbolo

Nombre del símbolo

AbsolutoNUM

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

68

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).

Ensamblaje con referencias externas: 2ª pasada

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

69

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

Tabla de símbolos exportados (TSE)

.........

Valor del símbolo

Tipo del símbolo

Nombre del símbolo

VRelativoS1

25AbsolutoS233DC.WS1V

25EQUS2V+2

Valor del CDE

OperandosNemotécnicoEtiqueta

S1,S2XREF

...

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

70

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

Tabla de símbolos importados (TSI)

Absoluto

Absoluto

Tipo (absoluto o

relativo)

.........

Tamaño reservado

(bytes)

Dirección del

símbolo

Nombre del

símbolo

4V+2S1

2V+6S1S1,D0MOVE.BV

#S1,D1MOVE.WV+4

Valor del CDE

OperandosNemotécnicoEtiqueta

S1XDEF

...

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

71

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

Tabla de símbolos (TS)

.........

Valor del símbolo

Tipo del símbolo

Nombre del símbolo

VRelativoS1

V+2RelativoS2

S1,D0MOVE.WW

...

25DC.LS2V+2

S2,A0LEAW+6

33DC.WS1V

Valor del CDE

OperandosNemotécnicoEtiqueta

...

Tabla de reubicación (TR)

......

Tamaño del objetoDirección del objeto

4W+2

4W+8

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

72

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.

2ª pasada con referencias externas: instrucciones

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

73

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.

2ª pasada con referencias externas: directivas (I)

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

74

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.

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

75

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: EQUDIRECTIVAS DE IMPORTACIÓN Y DE EXPORTACIÓN

Se ignoran.

DIRECTIVAS DE ENSAMBLAJE CONDICIONAL: IF ... ENDIFDIRECTIVAS DE ALINEAMIENTO: EVEN, ALIGN

Igual que en la primera fase

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

76

2ª pasada con referencias externas: ejemplo (I)

EQU: se ignora-*EQUMINPILA0001C018

EQU: se ignora-*EQUBEGIN0000046

-

XX ... XX (400 octetos)

-

-

4E4F

103C 0009

DFFC 0000 0006

4EB9 0000 0000

4879 0000 0002

3F39 0000 0000

33FC 0005 0000 0000

2E7C 0000 01C0

XX XX

XX XX

-

-

-

Código máquina generado (hex.)

BEGIN

100

*

#15

#9,D0

#6,SP

SUMAR

S

N,-(SP)

#5,N

#MINPILA,SP

1

1

*

SUMAR

*

Fin de la segunda faseEND0001C019

Dejar espacio: 400 octetosDS.L00003017

EQU: se ignoraEQUMAXPILA00003016

Línea en blanco: ignorar00003015

Generar códigoTRAP00002E14

Generar códigoMOVE.B00002A13

Generar códigoADDA.L00002412

Generar códigoJSR00001E11

Generar códigoPEA00001810

Generar códigoMOVE.W0000129

Generar códigoMOVE.W00000A8

Generar códigoMOVEA.L0000047

Incrementar CDEDS.WS0000025

Incrementar CDEDS.WN0000004

EQU: se ignoraEQUVAR0000003

XREF: se ignoraXREF0000002

EQU: se ignoraEQUPROGRAM0000001

AcciónLínea de códigoCDE (hex.)Línea

Programa principal

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

77

2ª pasada con referencias externas: ejemplo (II)Tabla de símbolos del programa principal

0x00000030PrivadoSíRelativoMAXPILA

0x000001C0PrivadoSíRelativoMINPILA

0x00000000PrivadoSíRelativoPROGRAM

Desconocido (0x00000000)

ImportadoNoRelativoSUMAR

Definido

Privado

Privado

Privado

Privado

Estatus

0x00000000RelativoN

0x00000002RelativoS

0x00000004RelativoBEGIN

0x00000000

Valor del símbolo

Tipo del símbolo

Nombre del símbolo

RelativoVAR

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.

Tabla de reubicación (palabras subrayadas en las tablas del código)

4 octetos00000E

4 octetos000014

4 octetos00001A

Tamaño del objetoDirección del objeto (hex.)

4 octetos000006

Tabla de símbolos importados(en negrita en el código)

Absoluto

TipoTamaño

reservado (octetos)

Dirección del

símbolo

Nombre del

símbolo

40x000020SUMAR

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

78

Fichero de listado (LST): programa principal

1 0000 0000 PROGRAM EQU *2 XREF SUMAR3 0000 0000 VAR EQU *4 000000 N DS 25 000002 S DS 26 0000 0004 BEGIN EQU *7 000004 2E7C 0000 01C0 MOVEA.L #MINPILA,SP8 00000A 33FC 0005 0000 0000 MOVE.W #5,N9 000012 3F39 0000 0000 MOVE.W N,-(SP)

10 000018 4879 0000 0002 PEA S11 00001E 4EB9 0000 0000 JSR SUMAR12 000024 DFFC 0000 0006 ADDA.L #6,SP13 00002A 103C 0009 MOVE.B #9,D014 00002E 4E4F TRAP #1515 16 0000 0030 MAXPILA EQU *17 000030 DS 40018 0000 01C0 MINPILA EQU *19 0001C0 END BEGIN

Lines Assembled : 19 Assembly Errors : 0

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

79

2ª pasada con referencias externas: ejemplo (III)

Generar código2A6E 0008SUMA(A6),A5MOVEA.L0000047

Generar código4E56 FFFEA6,#-2LINK0000006

DD55

CDC6

3C2E FFFE

526E FFFE

6000 0006

6D00 0018

BE6E FFFE

3E2E 000C

3D7C 0001 FFFE

-

4255

-

-

-

-

-

Código máquina generado (hex.)

D6,(A5)

D6,D6

I(A6),D6

#1,I(A6)

BLOQUE

FIN

I(A6),D7

NUM(A6),D7

#1,I(A6)

*

(A5)

-2

8

12

*

SUMAR

Generar códigoADD.W00002A18

Generar códigoMULS00002817

Generar códigoMOVE.WBLOQUE00002416

Generar códigoADDQ.WINC00002015

Generar códigoBRA00001C14

Generar códigoBLT00001813

Generar códigoCMP.W00001412

Generar códigoMOVE.W00001011

Generar códigoMOVE.W00000A10

EQU: se ignoraEQUFOR00000A9

Generar códigoCLR.W0000088

Modificar I en TSSETI0000005

Modificar SUMA en TSSETSUMA0000004

Modificar NUM en TSSETNUM0000003

EQU: se ignoraEQUSUMAR0000002

XDEF: se ignoraXDEF0000001

AcciónLínea de códigoCDE (hex.)Línea

Subrutina

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

80

2ª pasada con referencias externas: ejemplo (IV)

Generar código4E75RTS00003423

Fin de la segunda fase-END00003624

Generar códigoBE6E FFFEI(A6),D7CMP.W00002C19

4E5E

-

66EE

Código máquina generado (hex.)

A6

*

INC

Generar códigoUNLK00003222

EQU: se ignoraEQUFIN00003221

Generar códigoBNE00003020

AcciónLínea de códigoCDE (hex.)Línea

Subrutina

Tabla de símbolos de la subrutina

0x00000024PrivadoSíRelativoBLOQUE

0x00000020PrivadoSíRelativoINC

0x00000032PrivadoSíRelativoFIN

0x00000000ExportadoSíRelativoSUMAR

Definido

Privado

Privado

Privado

Privado

Estatus

0x00000008AbsolutoSUMA

0xFFFFFFFEAbsolutoI

0x0000000ARelativoFOR

0x0000000C

Valor del símbolo

Tipo del símbolo

Nombre del símbolo

AbsolutoNUM

Tabla de símbolos exportables

Relativo

Tipo del símbolo

0x000000

Valor del símboloNombre del símbolo

SUMAR

La tabla de símbolos exportados y la de reubicación están vacías.

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

81

Fichero de listado (LST): subrutina1 XDEF SUMAR2 0000 0000 SUMAR EQU *3 0000 000C NUM SET 124 0000 0008 SUMA SET 85 FFFF FFFE I SET -26 000000 4E56 FFFE LINK A6,#-27 000004 2A6E 0008 MOVEA.L SUMA(A6),A58 000008 4255 CLR.W (A5)9 0000 000A FOR EQU *

10 00000A 3D7C 0001 FFFE MOVE.W #1,I(A6)11 000010 3E2E 000C MOVE.W NUM(A6),D712 000014 BE6E FFFE CMP.W I(A6),D713 000018 6D00 0018 BLT FIN14 00001C 6000 0006 BRA BLOQUE15 000020 526E FFFE INC ADDQ.W #1,I(A6)16 000024 3C2E FFFE BLOQUE MOVE.W I(A6),D617 000028 CDC6 MULS D6,D618 00002A DD55 ADD.W D6,(A5)19 00002C BE6E FFFE CMP.W I(A6),D720 000030 66EE BNE INC21 0000 0032 FIN EQU *22 000032 4E5E UNLK A623 000034 4E75 RTS24 000036 END

Lines Assembled : 24 Assembly Errors : 0

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

82

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.

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

83

Filename : EJ2-2.OBJ

Global Symbol Name Global Value

BLOQUE 001024FIN 001032FOR 00100AI FFFFFEINC 001020NUM 00000CSUMA 000008SUMAR 001000

Filename : EJ2-1.OBJ

Global Symbol Name Global Value

BEGIN 00103AMAXPILA 001066MINPILA 0011F6N 001036PROGRAM 001036S 001038VAR 001036

Fichero MAP (I)

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

84

******************************************************************************* 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.recDisk Listing Filename : modular.map

Link Errors : 0 Output Format : Motorola S28

Fichero MAP (II)

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

85

XX XX1DS.WN001036

XX XX1DS.WS001038

BE6E FFFEI(A6),D7CMP.W00102C

66EEINCBNE001030

4E5EA6UNLKFIN001032

4E75RTS001034

DD55D6,(A5)ADD.W00102A

2A6E 0008SUMA(A6),A5MOVEA.L001004

4E56 FFFEA6,#-2LINK001000

CDC6

3C2E FFFE

526E FFFE

6000 0006

6D00 0018

BE6E FFFE

3E2E 000C

3D7C 0001 FFFE

4255

Código máquina generado (hex.)

D6,D6

I(A6),D6

#1,I(A6)

BLOQUE

FIN

I(A6),D7

NUM(A6),D7

#1,I(A6)

(A5)

MULS001028

MOVE.WBLOQUE001024

ADDQ.WINC001020

BRA00101C

BLT001018

CMP.W001014

MOVE.W001010

MOVE.WFOR00100A

CLR.W001008

AcciónLínea de códigoDirección final (hex.)

Código reubicado: ejemplo (I)El montador no tiene constancia de que existan etiquetas (se muestran para ayudar)

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

86

Reubicado 1er operando2E7C 0000 11F6#MINPILA,SPMOVEA.LBEGIN00103A

-MINPILA0011F6

-

XX ... XX (400 octetos)

4E4F

103C 0009

DFFC 0000 0006

4EB9 0000 1000

4879 0000 1038

3F39 0000 1036

33FC 0005 0000 1036

Código máquina generado (hex.)

BEGIN

100

#15

#9,D0

#6,SP

SUMAR

S

N,-(SP)

#5,N

END0011F6

DS.LMAXPILA001066

TRAP001064

MOVE.B001060

ADDA.L00105A

Referencia cruzada resueltaJSR001054

Reubicado 1er operandoPEA00104E

Reubicado 1er operandoMOVE.W001048

Reubicado 2º operandoMOVE.W001040

AcciónLínea de códigoDirección final (hex.)

Código reubicado: ejemplo (II)

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).

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

87

Formato de registros S28• Este es un fichero de texto legible.• Lo normal es que los ejecutables no sean legibles con editores de texto.

S2140010004E56FFFE2A6E000842553D7C0001FFFE4CS2140010103E2E000CBE6EFFFE6D000018600000063FS214001020526EFFFE3C2EFFFECDC6DD55BE6EFFFEA9S20A00103066EE4E5E4E75F2S21400103A2E7C000011F633FC0005000010363F39FES21400104A000010364879000010384EB9000010002BS21000105ADFFC00000006103C00094E4FB2S80400103AB1

Código ejecutable

Tipo delregistro

Tamaño del registro

Dirección Código

Paridad

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

88

Comentarios finalesEn 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.

MC68000 y las estructuras de datos

89

9.MC68000 y las tiras de caracteres: manipulaciónCálculo de la longitud de una tira

CONST EQU *N EQU 10VAR EQU *T DS.B N* LON: registro D0

...CLR.W D0LEA T,A0

WHILE EQU *BRA COND

BLOQUE ADDQ.W #1,D0COND TST.B (A0,D0.W)

BNE BLOQUEFIN EQU *

Optimización: sacar fuera del bucle el cálculo de la dirección de origen de la tira.

#define N 10char t[N], *p;int lon;

lon = 0;p = t;for ( ; *(p+lon); )

lon = lon+1;

MC68000 y las estructuras de datos

90

MC68000 y las tiras de caracteres: manipulaciónCálculo de la longitud de una tira

Optimización: usar direccionamiento indirecto con posincremento

CONST EQU *N EQU 10VAR EQU *T DS.B N* P: registro A0* LON: registro D0

...LEA T,A0

WHILE EQU *TST.B (A0)+BNE WHILESUBA.L #1,A0MOVE.L A0,D0SUBI.L #T,D0

FIN EQU *

#define N 10char t[N], *p;int lon;

for (p = t; *p; p++);lon = (int) (p-t);

MC68000 y las estructuras de datos

91

Suma de los elementos de un vector

CLR.W SUMALEA V,A4MOVEA.L A4,A5ADDA.L #N*TEV,A5

FOR EQU *BRA COND

BLOQUE EQU *MOVE.W (A4),D7ADD.W D7,SUMA

INC ADDQ.L #TEV,A4COND CMPA.L A4,A5

BNE BLOQUEFIN EQU *

CONST EQU *N EQU ??VAR EQU *V DS.W LVTEV EQU (*-V)/NSUMA DS.W 1* P1: registro A4* P2: registro A5

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;

Se puede optimizar más con direccionamiento indirecto con posincremento.

MC68000 y los vectores: manipulación

MC68000 y las estructuras de datos

92

Suma de los elementos de la matriz

CLR.W SUMALEA V,A4MOVEA.L A4,A5ADDA.L #NF*NC*TEM,A5

FOR EQU *BRA COND

BLOQUE EQU *MOVE.W (A4),D7ADD.W D7,SUMA

INC ADDQ.L #TEM,A4COND CMPA.L A4,A5

BNE BLOQUEFIN EQU *

CONST EQU *NF EQU 5NC EQU 6VAR EQU ** P1: registro A4* P2: registro A5SUMA DS.W 1M DS.W NF*NCTEM EQU (*-M)/(NF*NC)

Optimización: control mediante aritmética de punteros.

#define NF 5#define NC 6int m[NF][NC];int suma, *p1, *p2;

suma = 0; p1 = m; p2 = p1 + NF*NC;for ( ; p1 != p2; p1++)

suma = suma + *p1;

Se puede optimizar más con direccionamiento indirecto con posincremento.

MC68000 y las matrices: manipulación

MC68000 y las estructuras de datos

93

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;

MC68000 y las estructuras de datos

94

Estructuras de datos (RECORD, struct)Los campos de una variable de tipo RECORD (struct) se almacenan de forma

consecutiva en memoria.

MC68000 y las estructuras de datos

95

MC68000 y las estructuras de datos: definición* Definición de una estructura de datos en PASCALTYPE 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 ensambladorTNOMBRE EQU 30 Tamaños de los campos y tamaño totalTDNI EQU 4TLETRA EQU 1TDEPTO EQU 1TSUELDO EQU 4TEMPL EQU TNOMBRE+TDNI+TLETRA+TDEPTO+TSUELDONOMBRE EQU 0 Desplazamientos respecto de la dirección baseDNI EQU NOMBRE+TNOMBRE Valor del símbolo: 30LETRA EQU DNI+TDNI Valor del símbolo: 34DEPTO EQU LETRA+TLETRA Valor del símbolo: 35SUELDO EQU DEPTO+TDEPTO Valor del símbolo: 36* Definición de una variable TipoEmpleado: reserva del espacio necesarioEMPL DS.B TEMPL

MC68000 y las estructuras de datos

96

Acceso a un campo de la estructura

EMPL DS.B TEMPL...LEA EMPL,A0MOVE.L SUELDO(A0),S

VAR empl: TipoEmpleado;s: LONGINT;BEGINsueldo := empl.Sueldo;END.

TipoEmpleado empl;long sueldo;

s = empl.Sueldo;

MC68000 y las estructuras de datos: manipulación

MC68000 y las estructuras de datos

97

TablasUna 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.

MC68000 y las estructuras de datos

98

MC68000 y las tablas: definición* Definición de una estructura de datos en PASCALTYPE 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 ensambladorTNOMBRE EQU 30 Tamaños de los campos y tamaño totalTDNI EQU 4TLETRA EQU 1TDEPTO EQU 1TSUELDO EQU 4TEMPL EQU TNOMBRE+TDNI+TLETRA+TDEPTO+TSUELDONOMBRE EQU 0 Desplazamientos respecto de la dirección baseDNI EQU NOMBRE+TNOMBRE Valor del símbolo: 30LETRA EQU DNI+TDNI Valor del símbolo: 34DEPTO EQU LETRA+TLETRA Valor del símbolo: 35SUELDO EQU DEPTO+TDEPTO Valor del símbolo: 36* Definición de la tabla: reserva del espacio necesarioLTABLA EQU 100TABLA DS.B TEMPL*LTABLA

MC68000 y las estructuras de datos

99

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

MC68000 y las estructuras de datos

100

Acceso a un campo de un elemento concreto

CONST EQU *N EQU 100TABLA DS.B TEMPL*NS DS.L 1

...LEA TABLA,A0MOVE.L 25*TEMPL+SUELDO(A0),S

CONST N = 100;VAR tabla: ARRAY [0..N-1] OF

TipoEmpleado;s: LONGINT;BEGINs := empl[25].Sueldo;END.

#define N 100TipoEmpleado tabla[N];long sueldo;

s = empl[25].Sueldo;

MC68000 y las tablas: manipulación

MC68000 y las estructuras de datos

101

Acceso a un campo de un elemento genérico

CONST EQU *N EQU 100

...VAR EQU *TABLA DS.B TEMPL*NS DS.L 1I DS.W 1

...LEA TABLA,A0MOVE.W I,D0MULS #TEMPL,D0MOVE.L SUELDO(A0,D0.L),S

CONST N = 100;VAR tabla: ARRAY [0..N-1] OF

TipoEmpleado;s: LONGINT;i: INTEGER;BEGINs := empl[i].Sueldo;END.

#define N 100TipoEmpleado tabla[N];long sueldo;int i;

s = empl[i].Sueldo;

MC68000 y las tablas: manipulación

MC68000 y las estructuras de datos

102

Suma de un campo de los elementos de la tabla

CLR.L SUMAFOR EQU *

CLR.W IMOVE.W #N,D7SUBQ.W #1,D7CMP.W I,D7BLT FINBRA BLOQUE

INC ADDQ.W #1,IBLOQUE EQU *

LEA TABLA,A0MOVE.W I,D6MULS #TEMPL,D6MOVE.L SUELDO(A0,D6.L),D5ADDQ.L D5,SUMACMP.W I,D7BNE INC

FIN EQU *

CONST N = 100;VAR tabla: ARRAY [0..N-1] OF

TipoEmpleado;suma: LONGINT;i: INTEGER;BEGINsuma := 0;FOR i:= 0 TO N-1 DO

suma := suma+empl[i].Sueldo;END.

MC68000 y las tablas: manipulación

#define N 100TipoEmpleado tabla[N];long suma;int i;

suma = 0;for (i=0; i < N-1; i++)

suma = suma+empl[i].Sueldo;

MC68000 y las estructuras de datos

103

CLR.L SUMALEA TABLA,A4MOVEA.L A4,A5ADDA.L #N*TEMPL,A5

FOR EQU *BRA COND

BLOQUE EQU *MOVE.W SUELDO(A4),D7ADD.L D7,SUMA

INC ADDQ.L #TEMPL,A4COND CMPA.L A4,A5

BNE BLOQUEFIN EQU *

CONST EQU *N EQU 100SUELDO EQU 36TEMPL EQU 40VAR EQU *TABLA DS.B TEMPL*NSUMA DS.L 1* P1: registro A4* P2: registro A5

Optimización: control mediante aritmética de punteros.

#define N 100TipoEmpleado tabla[N];long suma;int i;TipoEmpleado *p1, *p2;

suma = 0; p1 = tabla; p2 = p1 + N;for ( ; p1 != p2; p1++)

suma = suma + p1->Sueldo;

MC68000 y las tablas: manipulaciónSuma de un campo de los elementos de la tabla

MC68000 y las estructuras de datos

104

Listas encadenadasUna 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; {Tamaño: t1 octetos}...CampoN: TipoN; {Tamaño: tN octetos}Siguiente: Puntero; {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;

MC68000 y las estructuras de datos

105

Listas encadenadasEstructura 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.

MC68000 y las estructuras de datos

106

MC68000 y las listas encadenadas: definición* Definición de una lista encadenada en PASCALTYPE Puntero = ^TipoEmpleado;

TipoEmpleado = RECORDNombre: ARRAY [0 .. 29] OF CHAR; {30 octetos}DNI: LONGINT; {4 octetos}Letra: CHAR; {1 octeto}Departamento: BYTE; {1 octeto}Sueldo: LONGINT; {4 octetos}Siguiente: Puntero; {4 octetos}END; {TOTAL: 44 octetos}

VAR Lista: Puntero;* Definición en ensambladorTNOMBRE EQU 30 Tamaños de los campos y tamaño totalTDNI EQU 4TLETRA EQU 1TDEPTO EQU 1TSUELDO EQU 4TSIG EQU 4TEMPL EQU TNOMBRE+TDNI+TLETRA+TDEPTO+TSUELDO+TSIGNOMBRE EQU 0 Desplazamientos respecto de la dirección baseDNI EQU NOMBRE+TNOMBRE Valor del símbolo: 30LETRA EQU DNI+TDNI Valor del símbolo: 34DEPTO EQU LETRA+TLETRA Valor del símbolo: 35SUELDO EQU DEPTO+TDEPTO Valor del símbolo: 36SIG EQU SUELDO+TSIG* Definición de la listaLISTA DS.L 1

MC68000 y las estructuras de datos

107

Suma de un campo de los elementos de la lista

SUELDO EQU 36SIG EQU 40LISTA DS.L 1P DS.L 1SUMA DS.L 1

...CLR.L SUMAMOVE.L LISTA,P

WHILE EQU *BRA COND

BLOQUE MOVEA.L P,A0MOVE.L SUELDO(A0),D0ADD.L D0,SUMAMOVE.L SIG(A0),P

COND TST.L PBNE BLOQUE

FIN EQU *

VAR lista, p: Puntero;suma: LONGINT;BEGINsuma := 0;p = lista;WHILE p.siguiente <> NIL DO

BEGINsuma := suma+p.Sueldo;p := p.Siguiente;

END.

MC68000 y las listas encadenadas: manipulación

Puntero lista, p;long suma;

suma = 0;for (p = lista; p != NULL;

p = p->Siguiente)suma = suma+p->Sueldo;

Programación en ensamblador del MC68000: conceptos avanzados

108

10. Traducción de programas

Objectfile

Sourcefile Assembler

LinkerAssembler

AssemblerProgramlibrary

Objectfile

Objectfile

Sourcefile

Sourcefile

Executablefile

Programación en ensamblador del MC68000: conceptos avanzados

109

11. Bibliotecas de subprogramasSon 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.

Programación en ensamblador del MC68000: conceptos avanzados

110

Tarea del montador si hay bibliotecas1. 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).

Programación en ensamblador del MC68000: conceptos avanzados

111

12. Código independiente de la posiciónSi 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 EQU *BEGIN 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.

Programación en ensamblador del MC68000: conceptos avanzados

112

13. Carga y ejecución de programasLa 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.

Programación en ensamblador del MC68000: conceptos avanzados

113

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).

Programación en ensamblador del MC68000: conceptos avanzados

114

15. Secciones en ensambladorLas 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).

Programación en ensamblador del MC68000: conceptos avanzados

115

16. Compilación de programasUn 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:

Selección de instrucciones, optimizaciones dependientes de la máquina. Puede ir seguido de un ensamblador, o generar directamente código máquina.

Generador de código

Independiente del lenguaje.Muy dependiente de la máquina.

Optimizaciones locales y globales, ubicación de variables en registros.

Optimizadorglobal

Poco dependiente del lenguaje.Poco dependiente de la máquina.

Transformaciones en bucles, integración de procedimientos en línea, etc.

Optimizador de alto nivel

Algo dependiente del lenguaje.Casi independiente de la máquina.

Transforma el lenguaje de alto nivel a una representación intermedia.Front-endDependiente del lenguaje.

Independiente de la máquina.

FunciónFaseDependencias

Un compilador debe ser conservador: debe proporcionar código que funcione tal como lo espera el programador.

Programación en ensamblador del MC68000: conceptos avanzados

116

Compilación de programasLa 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.

Programación en ensamblador del MC68000: conceptos avanzados

117

Ejemplo en C: while (save[i] == k) i+=1;

Equivalente en PASCAL WHILE save[i] = k DO i:=i+1;

Árbol sintáctico Representación intermedia

Compilación de programas

Programación en ensamblador del MC68000: conceptos avanzados

118

17. Optimización de código

O1

O1

O1

Dentro de un bloque secuencial de código

Eliminar repeticiones del mismo cálculo

Reemplazar apariciones de una variable a la que se ha asignado una constante por la propia constante

Reorganización de expresiones para minimizar los recursos necesarios para su evaluación

LOCAL

Eliminación de expresiones comunes

Propagación de constantes

Reducción del tamaño de la pila

O1

Indep.

O3

Nivel de código fuente, independiente del procesador

Modificaciones en los bucles para aumentar su velocidad de ejecución

Replicar el cuerpo del bucle varias veces para reducir el número de iteraciones y la sobrecarga en su control

Reemplazar llamada a procedimiento por el cuerpo del mismo

ALTO NIVEL

Transformaciones en bucles

Desenrollamiento de bucles

Integración de procedimientos

Nivel en gcc

ExplicaciónNombre

Programación en ensamblador del MC68000: conceptos avanzados

119

Optimización de código (cont.)

O2

O2

O2

O2

Abarca diferentes bloques secuenciales del código

Igual que la local, pero atravesando saltos.

Reemplazar apariciones de una variable a la que se ha asignado un valor por dicho valor

Sacar de un bucle un cálculo que siempre da el mismo valor y se repite en todas las iteraciones

Simplificar o eliminar cálculos de direcciones en vectores o matrices en bucles (a veces usando punteros que se incrementan o decrementan).

GLOBAL

Eliminación global de expresiones comunes

Propagación de copia

Movimiento de código

Eliminación de variables de inducción

O1

O1

O1

Depende del conocimiento del procesador

Cambiar operaciones complejas por otras más simples.

Reordenar instrucciones para mejorar las prestaciones de la segmentación

Elegir el desplazamiento más corto posible para acceder al destino en saltos.

DEPENDIENTE DEL PROCESADOR

Reducción de fuerza

Planificación de la segmentación

Optimización del desplazamiento en saltos

Nivel en gcc

ExplicaciónNombre

Programación en ensamblador del MC68000: conceptos avanzados

120

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).

Programación en ensamblador del MC68000: conceptos avanzados

121

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.

Programación en ensamblador del MC68000: conceptos avanzados

122

• 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.

19. Excepciones en el MC68000

Programación en ensamblador del MC68000: conceptos avanzados

123

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.

Programación en ensamblador del MC68000: conceptos avanzados

124

• 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.

Tratamiento de excepciones en el MC68000

Programación en ensamblador del MC68000: conceptos avanzados

125

• 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-regsRTE

Rutinas de tratamiento de excepciones

Programación en ensamblador del MC68000: conceptos avanzados

126

• Tipos de excepciones:

Tratamiento de excepciones en el MC68000

Programación en ensamblador del MC68000: conceptos avanzados

127

• 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).

Excepciones internas en el MC68000

Programación en ensamblador del MC68000: conceptos avanzados

128

• 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).

Excepciones internas en el MC68000

Programación en ensamblador del MC68000: conceptos avanzados

129

• Excepción de traza: se produce tras ejecutar cada instrucción si el bitT del CCR vale 1.

• Excepciones por instrucciones:

TRAPV: genera una excepción si el bit V del CCR vale 1.

CHK op_mem,DnSe 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 #nExcepción explícita.

Excepciones internas en el MC68000

Programación en ensamblador del MC68000: conceptos avanzados

130

• 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 0-15.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.

Excepción TRAP: llamada al S.O.

Programación en ensamblador del MC68000: conceptos avanzados

131

• 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.

Excepciones externas en el MC68000

Programación en ensamblador del MC68000: conceptos avanzados

132

• 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.

Excepción de arranque (reset) en el MC68000

Programación en ensamblador del MC68000: conceptos avanzados

133

• 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.

Excepción de arranque (reset) en el MC68000