Software de base
Notas de clase basadas en el libro
Software de Sistemas, Beck, Addison Wesley
1 Introducción
2 Ensambladores
Dr. Francisco Javier Zaragoza Martı́nez 3 Cargadores y ligadores
franz@correo.azc.uam.mx
4 Macroprocesadores
UAM Azcapotzalco
Departamento de Sistemas
Francisco Zaragoza (UAM Azcapotzalco) Trimestre 09P 1 / 248 Francisco Zaragoza (UAM Azcapotzalco) Trimestre 09P 2 / 248
Evaluación Exámenes
Francisco Zaragoza (UAM Azcapotzalco) Trimestre 09P 3 / 248 Francisco Zaragoza (UAM Azcapotzalco) Trimestre 09P 4 / 248
Contenido
Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 5 / 248 Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 6 / 248
Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 7 / 248 Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 8 / 248
Software de base Contenido
Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 9 / 248 Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 10 / 248
Ejemplos
Ensambladores. Los ensambladores traducen instrucciones nemónicas a código
Cargadores. máquina.
Ligadores. La dependencia se debe a que los formatos de instrucciones, modos
de direccionamiento, códigos de operación, etc., dependen por
Macroprocesadores.
completo del procesador de la máquina.
Compiladores.
A pesar de las diferencias, existen también muchas caracterı́sticas del
Sistemas operativos. diseño de estos programas que no dependen del procesador empleado.
En este curso exploraremos ambos lados de la moneda.
En este curso estudiaremos los primeros cuatro y después llevarán un
curso de compiladores y dos cursos de sistemas operativos.
Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 11 / 248 Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 12 / 248
1 Software de aplicación y software de base El SIC y el SIC/XE son dos máquinas imaginarias que tienen
caracterı́sticas comunes con la mayorı́a de las máquinas reales.
2 Estructura de las máquinas SIC y SIC/XE Esto incluye la existencia de más de un modelo de la misma máquina
Estructura de la máquina SIC con cierta compatibilidad entre sı́.
Estructura de la máquina SIC/XE
Tenga en cuenta que los detalles de cada máquina son distintos y que
esto afecta el diseño del software de base correspondiente.
Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 13 / 248 Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 14 / 248
Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 15 / 248 Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 16 / 248
Registros del SIC Registros PC, L y SW
Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 17 / 248 Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 18 / 248
Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 19 / 248 Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 20 / 248
Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 21 / 248 Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 22 / 248
El SIC proporciona un conjunto básico de instrucciones que contiene 1 Software de aplicación y software de base
los siguientes tipos:
1 Carga y almacenamiento. 2 Estructura de las máquinas SIC y SIC/XE
2 Operaciones aritméticas.
Estructura de la máquina SIC
3 Comparación.
4 Saltos condicionales. Estructura de la máquina SIC/XE
5 Subrutinas.
6 Entrada y salida.
Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 23 / 248 Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 24 / 248
Estructura de la máquina SIC/XE Tipos de datos del SIC/XE
Esta máquina puede direccionar hasta 220 bytes, lo que provoca un Además de los tipos de datos del SIC, el SIC/XE proporciona un tipo
cambio en los modos de direccionamiento (SIC: 215 bytes). de datos de punto flotante de 48 bits en el siguiente formato:
Además, tiene cuatro registros adicionales: 1 bit 11 bits 36 bits
Registro Número Uso signo s exponente e fracción f
B 3 Registro base La fracción f es un número entre 0 y 1; el punto binario está justo
S 4 Sin uso especial antes del primer bit.
T 5 Sin uso especial Normalmente el primer bit después del punto binario será 1, pero no
F 6 Punto flotante (48 bits) es necesario.
Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 25 / 248 Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 26 / 248
Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 27 / 248 Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 28 / 248
El formato de 3 bytes es compatible con el SIC: En el formato de 2 bytes los campos Registro 1 y Registro 2
6 bits 1 1 1 1 1 1 12 bits corresponden con los números de registro fuente y destino.
Cód. de operación n i x b p e Dir. D En los formatos de 3 y 4 bytes los códigos de operación son de 6 bits,
El formato de 4 bytes es para direcciones de 20 bits: obtenidos al eliminar los 2 bits más bajos de los códigos del SIC.
6 bits 1 1 1 1 1 1 20 bits Los bits n, i, x, b, p, e son banderas que (como antes) seleccionan el
Cód. de operación n i x b p e Dir. D modo de direccionamiento de la instrucción.
Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 29 / 248 Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 30 / 248
Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 31 / 248 Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 32 / 248
Direccionamiento relativo a PC Observaciones sobre b y p
Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 33 / 248 Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 34 / 248
Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 35 / 248 Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 36 / 248
Los modos de direccionamiento inmediato e indirecto no admiten El SIC/XE posee todas las instrucciones del SIC, además de otras
indexación, es decir, x = 0. nuevas de los siguientes tipos:
1 Manejo de los registros nuevos.
Si i = n entonces T es simplemente la dirección objetivo. En este 2 Operaciones aritméticas de punto flotante.
caso i = n = 1 en el SIC/XE, i = n = 0 en el SIC. 3 Operaciones entre registros.
Si se hace i = n = 0 en el SIC/XE entonces b, p y e se consideran 4 Generación de interrupciones de software.
parte del campo de dirección de la instrucción, lo que hace que el También puede usar canales de entrada y salida mientras se ejecutan
formato de 3 bytes sea compatible con el SIC. otras instrucciones (DMA).
Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 37 / 248 Francisco Zaragoza (UAM Azcapotzalco) Introducción Trimestre 09P 38 / 248
Contenido
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 39 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 40 / 248
Ensambladores y traductores Directivas
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 41 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 42 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 43 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 44 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 45 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 46 / 248
Es por eso que la mayorı́a de los ensambladores hacen dos pasos o Primer paso: Definición de sı́mbolos
lecturas por el código fuente.
Asignar direcciones a todas las proposiciones del programa.
En el primero se asignan valores a todas las etiquetas y en el segundo
Guardar los valores asignados a todas las etiquetas.
se realizan la mayorı́a de las funciones antes descritas.
Procesar (entre otras) las directivas que afecten la asignación de
Además, el ensamblador debe de procesar las directivas, las cuales no
direcciones.
se traducen en instrucciones, pero pueden influir en el código objeto.
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 47 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 48 / 248
Descripción general de funciones del segundo paso Código objeto
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 49 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 50 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 51 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 52 / 248
Ejemplo
5 Caracterı́sticas independientes de la máquina
E001000
6 Opciones de diseño del ensamblador
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 53 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 54 / 248
Un ensamblador simple maneja dos tablas internas: El valor inicial de CONTLOC se toma del indicado por la directiva
La tabla de códigos de operación TABOP se usa para examinar los START.
nemónicos y traducirlos a lenguaje máquina. Después de procesar cada lı́nea del código fuente se le suma a
La tabla de sı́mbolos TABSIM se usa para almacenar valores asignados CONTLOC la longitud de la instrucción o datos generados.
a etiquetas. Cuando se encuentra una etiqueta en el código fuente, el valor de
Además se necesita un contador de localidades CONTLOC que se utiliza CONTLOC proporciona su valor.
para llevar la cuenta de las direcciones. No se confunda a CONTLOC con PC.
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 55 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 56 / 248
La tabla de códigos de operación Uso de TABOP durante el ensamblado
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 57 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 58 / 248
TABOP se suele organizar como una tabla de dispersión cuya clave es La tabla de sı́mbolos TABSIM incluye el nombre y el valor de cada
el nemónico. etiqueta del código fuente.
Esta estructura es adecuada porque proporciona una recuperación También contiene banderas que indican condiciones de error (por
rápida de datos con un mı́nimo de búsqueda. ejemplo: etiqueta definida en dos lugares).
Aunque esta tabla es en principio estática, se suele utilizar un método Esta tabla puede contener información adicional.
general de dispersión.
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 59 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 60 / 248
Durante el primer paso se introducen las etiquetas en TABSIM a TABSIM también suele estar organizada como una tabla de dispersión
medida que se encuentran en el programa fuente junto con sus y, en principio, podrı́a ser la misma que TABOP.
direcciones asignadas.
En este caso, una buena función de dispersión serı́a considerar a la
Durante el segundo paso se buscan en la tabla los sı́mbolos empleados etiqueta como si estuviera representando a un número entero que se
como operandos para obtener las direcciones necesarias para calcuları́a módulo P, un número primo igual a la longitud de la tabla.
ensamblar las instrucciones.
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 61 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 62 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 63 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 64 / 248
Variables del ensamblador Algoritmo del ensamblador I
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 65 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 66 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 67 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 68 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 71 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 72 / 248
Direccionamiento inmediato Direccionamiento por registros
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 73 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 74 / 248
Dos modos:
Durante la ejecución de una instrucción del SIC el contador de
1 Relativo al contador de programa (PC).
2 Relativo al registro base (B).
programa avanza justo después de obtener la instrucción y justo antes
de ejecutarla, por lo que el registro PC ya contiene la dirección de la
Calcular el desplazamiento correcto. siguiente instrucción.
Se debe verificar que el desplazamiento calculado se encuentra en el Formato 3: (op[6]) (11) (x010) (desp[12]).
rango adecuado (0 a 4095 para B y -2048 a 2047 para PC).
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 75 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 76 / 248
Ejemplo Ejemplo
Si FIRST vale 0x000 y RETADR vale 0x030 entonces la instrucción Si CLOOP vale 0x006 entonces
(000101)(11)(0010)(000000101101) (001111)(11)(0010)(111111101100)
y el desplazamiento es y el desplazamiento es
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 77 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 78 / 248
Ejemplo
Si BUFFER vale 0x036 y LENGTH vale 0x033 entonces la segunda
Ahora la resta se hace con respecto a B. instrucción en
El ensamblador debe saber el valor de B.
BASE LENGTH
Esto se hace con la directiva BASE. STCH BUFFER, X
La directiva NOBASE indica que B no se usa como registro base.
se ensambla a 57 C0 03 ya que
El programador es responsable del uso de B.
Formato 3: (op[6]) (11) (x100) (desp[12]). (010101)(11)(1100)(000000000011)
y el desplazamiento es
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 79 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 80 / 248
Direccionamiento relativo a B (3) Otros modos de direccionamiento
Ejemplo
En el mismo caso, la instrucción
y el desplazamiento es
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 81 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 82 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 83 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 84 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 85 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 86 / 248
A partir de 0x0000
0x0000 ...
0x0006 4B 10 10 36 (+JSUB RDREC)
Para poder cargar y ejecutar un programa en una dirección distinta a 0x1036 B4 10 (RDREC)
la de ensamblado se necesitará cambiar a veces el campo de dirección
de una instrucción. A partir de 0x5000
Otras veces no será necesario cambiar nada. 0x5000 ...
El ensamblador no conoce la dirección de carga y no puede hacer 0x5006 4B 10 60 36 (+JSUB RDREC)
estos cambios, pero puede escribir la información necesaria en el 0x6036 B4 10 (RDREC)
código objeto para que el cargador los haga.
A partir de 0x7420
0x7420 ...
0x7426 4B 10 84 56 (+JSUB RDREC)
0x8456 B4 10 (RDREC)
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 87 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 88 / 248
Direccionamiento directo y relocalización Registros de modificación (1)
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 89 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 90 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 91 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 92 / 248
Observe que sólo se necesitan modificar las instrucciones con 4 Caracterı́sticas dependientes de la máquina
direccionamiento directo.
En los direccionamientos por registro e inmediato no hay campo de 5 Caracterı́sticas independientes de la máquina
dirección. Literales
En el direccionamiento relativo los desplazamientos no cambian. Definición de sı́mbolos
Por eso, cuando hay opción, se prefiere ensamblar con Expresiones
direccionamiento relativo en lugar de con direccionamiento directo. Bloques de programa
Secciones de control y ligado
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 93 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 94 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 95 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 96 / 248
Operandos literales e inmediatos Ejemplo de uso de literales
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 97 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 98 / 248
Los literales se suelen almacenar en depósitos de literales en el código Los literales repetidos se pueden reconocer para no reservar más de
objeto. un espacio de memoria para la misma constante. ¿Cómo?
La directiva LTORG instruye al ensamblador a crear un depósito que Comparando las cadenas que los definen.
incluya a todos los literales no almacenados hasta el momento.
Se ahorra más espacio (pero se pierde tiempo) si además se revisa si
Si no hay ninguna directiva LTORG entonces los literales se colocan al cadenas distintas definen el mismo literal.
final del programa.
Se debe tener cuidado con los literales que cambian de valor a lo
La directiva LTORG permite que los literales estén cerca del lugar largo del programa (el literal =* se refiere al contador de programa).
donde se usan y se pueda usar el direccionamiento relativo.
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 99 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 100 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 101 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 102 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 103 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 104 / 248
Definición de sı́mbolos Ejemplos de uso de EQU y ORG
Las definiciones del lado izquierdo tienen el mismo efecto que las del
Muchos ensambladores tienen una directiva para definir sı́mbolos y lado derecho.
especificar su valor: Pero las del lado derecho son más fáciles de interpretar que las del
sı́mbolo EQU valor (equate) lado izquierdo.
Estos sı́mbolos tienen dos usos comunes:
Mejorar la legibilidad de un programa.
Definición de nemónicos para registros.
Con EQU Con ORG
TABS RESB 1100 TABS RESB 1100
La directiva ORG instruye al ensamblador que cambie el valor del
SIMBOLO EQU TABS ORG TABS
contador de localidades:
VALOR EQU TABS+6 SIMBOLO RESB 6
ORG valor (origen) BANDERAS EQU TABS+9 VALOR RESW 1
BANDERAS RESB 2
ORG TABS+1100
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 105 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 106 / 248
Una restricción importante para las directivas EQU y ORG es que todos 3 Funciones básicas de un ensamblador
los sı́mbolos usados del lado derecho tienen que haber sido definidos
con anterioridad. 4 Caracterı́sticas dependientes de la máquina
Esto se debe a que estamos usando un ensamblador de dos pasos.
5 Caracterı́sticas independientes de la máquina
Ejemplo de buen uso Literales
ALFA RESW 1 Definición de sı́mbolos
BETA EQU ALFA Expresiones
Bloques de programa
Ejemplo de mal uso Secciones de control y ligado
BETA EQU ALFA
ALFA RESW 1 6 Opciones de diseño del ensamblador
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 107 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 108 / 248
Los ensambladores suelen permitir el uso de operaciones simples para Existen dos tipos de operandos.
obtener operandos: Absolutos: aquellos cuyo valor no depende de donde comience el
Operaciones aritméticas (+, -, *). programa.
Operaciones lógicas (AND, OR, ...). Relativos: aquellos cuyo valor sı́ depende de donde comience el
Operaciones de bits (AND, OR, ...). programa.
Los operandos también deben ser simples: Y también dos tipos de expresiones.
Constantes. Absolutas: aquellas cuyo valor no depende de donde comience el
Sı́mbolos. programa.
Etiquetas. Relativas: aquellas cuyo valor sı́ depende de donde comience el
Especiales (como * para CONTLOC). programa.
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 109 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 110 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 111 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 112 / 248
Contenido Bloques de programa
4 Caracterı́sticas dependientes de la máquina Los ensambladores analizados hasta ahora generan su código objeto
en el mismo orden en el que aparece el código fuente.
5 Caracterı́sticas independientes de la máquina Algunos ensambladores permiten separar el código fuente en bloques
Literales de programa que luego serán reordenados.
Definición de sı́mbolos
Por ejemplo, podrı́a haber bloques de código, de datos, de literales,
Expresiones
de tablas, etc.
Bloques de programa
Secciones de control y ligado
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 113 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 114 / 248
COPY START 0
... (bloque sin nombre (1) 0x0000 a 0x0026)
USE CDATA
... (bloque CDATA (1) 0x0000 a 0x0005)
El parámetro de la directiva USE le indica al ensamblador qué USE CBLKS
porciones del código fuente pertenecen a qué bloque. ... (bloque CBLKS (1) 0x0000 a 0x1000)
Normalmente existe un bloque sin nombre. Una porción del código USE
fuente pertenece a este bloque si no está precedida por una directiva ... (bloque sin nombre (2) 0x0027 a 0x004C)
USE o si la directiva USE correspondiente no tiene parámetro. USE CDATA
... (bloque CDATA (2) 0x0006 a 0x0006)
USE
... (bloque sin nombre (3) 0x004D a 0x0065)
USE CDATA
... (bloque CDATA (3) 0x0007 a 0x000A)
END
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 115 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 116 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 117 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 118 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 119 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 120 / 248
Bloques y segundo paso de ensamblado Observaciones sobre bloques
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 121 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 122 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 123 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 124 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 125 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 126 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 127 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 128 / 248
Instrucciones con referencias externas TABSIM y sı́mbolos externos
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 129 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 130 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 131 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 132 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 133 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 134 / 248
M00000705+COPY
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 135 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 136 / 248
Nuevas expresiones válidas Contenido
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 137 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 138 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 139 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 140 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 141 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 142 / 248
Cuando se encuentra la definición de un sı́mbolo se revisa su lista de Los ensambladores de un paso que generan código objeto se necesitan
referencias y se inserta su valor en los lugares indicados. cuando no se tiene un dispositivo externo para almacenar el código
Al llegar al final del código fuente, cualquier entrada de TABSIM que intermedio.
no esté definida se debe señalar como error. Cuando se descubre una referencia hacia adelante se almacena en una
Si no hubo errores, el ensamblador brinca a la primera instrucción del lista.
programa. Cuando se encuentra la definición de un sı́mbolo puede ser que ya no
Nota: Se debe conocer la dirección de inicio del programa antes del se tengan disponibles las instrucciones que hacı́an referencia a este
ensamblado. sı́mbolo (por ejemplo, si ya se escribió el registro de texto).
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 143 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 144 / 248
Código objeto en un paso (2) Contenido
En este caso, el ensamblador debe generar otro registro de texto con 4 Caracterı́sticas dependientes de la máquina
la dirección y valor correcto del operando.
De esta forma el cargador inserta el valor correcto en la dirección 5 Caracterı́sticas independientes de la máquina
adecuada.
Esto implica que los registros de texto deben cargarse en el mismo 6 Opciones de diseño del ensamblador
orden en el que se generan. ¿Porqué? Ensambladores con superposición
Ensambladores de un paso
Ensambladores de varios pasos
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 145 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 146 / 248
Recordemos que se pidió que los lados derechos de las directivas EQU
y ORG estuvieran definidas previamente. Una posibilidad es hacer tantos pasos por el código fuente como sean
necesarios para resolver todas las referencias.
Una lista de definiciones que no se puede resolver con un ensamblador
de dos pasos: Sin embargo, basta que se hagan varios pasos sólo sobre las partes
involucradas (que se identifican en el primer paso) y que se resuelven
ALFA EQU BETA+1 antes del segundo paso.
BETA EQU DELTA+1 Una forma de hacerlo es almacenando en TABSIM las definiciones que
DELTA RESW 1 usen referencias hacia adelante y las dependencias de valor entre
sı́mbolos.
¿Cómo podemos permitir estas definiciones?
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 147 / 248 Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 148 / 248
Francisco Zaragoza (UAM Azcapotzalco) Ensambladores Trimestre 09P 149 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 150 / 248
7 Cargadores y ligadores
Cargadores, ligadores y traductores Un cargador es un programa de sistema que realiza la función de
Algoritmo para un cargador básico llevar un programa objeto a la memoria para su ejecución.
Un ligador es un programa de sistema que combina dos o más
8 Dependencia de la máquina programas objeto y proporciona la información necesaria para resolver
las referencias entre ellos.
9 Independencia de la máquina Casi todos los traductores del mismo sistema generan código objeto
en el mismo formato, ası́ se usa el mismo cargador y ligador
10 Opciones de diseño del cargador independientemente del lenguaje original.
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 151 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 152 / 248
Contenido Algoritmo para un cargador básico
7 Cargadores y ligadores
Cargadores, ligadores y traductores Un cargador básico puede cargar programas objeto en direcciones
Algoritmo para un cargador básico absolutas.
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 153 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 154 / 248
7 Cargadores y ligadores
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 155 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 156 / 248
El cargador absoluto tiene la desventaja de que la dirección real de Un cargador que permite la relocalización de programas es un
carga debe ser especificada en el código fuente. cargador relocalizador, también conocido como cargador relativo.
Esto no es un gran problema en una máquina con poca memoria, Hay dos métodos comunes para representar la relocalización del
pero es completamente inadecuado en los demás casos. código objeto.
Además, se dificulta el uso de subrutinas de biblioteca ya que no se El primero es el ya estudiado, basado en registros de modificación.
podrı́an relocalizar.
Este método es útil cuando la mayorı́a de las instrucciones usan
Ahora estudiaremos el diseño de un cargador que también haga direccionamiento relativo o inmediato. ¿Porqué?
relocalización y ligado.
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 157 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 158 / 248
7 Cargadores y ligadores
8 Dependencia de la máquina
Sin embargo, cuando la mayorı́a de las instrucciones usan
Relocalización
direccionamiento directo se necesitarı́an casi tantos registros de
Máscaras de bits
modificación como instrucciones.
Ligado de programas
En este caso se requiere otro mecanismo más eficiente en el uso de Tablas y lógica de un cargador ligador
espacio en el código objeto para especificar la relocalización.
9 Independencia de la máquina
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 159 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 160 / 248
Máscaras de bits Ejemplo de máscara de bits
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 161 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 162 / 248
7 Cargadores y ligadores
8 Dependencia de la máquina Cuando un programa tiene más de una sección de control, éstas se
Relocalización pueden ensamblar juntas o por separado.
Máscaras de bits Las secciones de control aparecerán como segmentos separados de
Ligado de programas código objeto.
Tablas y lógica de un cargador ligador
El cargador no puede (ni necesita) saber cuáles secciones de control
se ensamblaron al mismo tiempo.
9 Independencia de la máquina
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 163 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 164 / 248
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 165 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 166 / 248
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 167 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 168 / 248
Ejemplo de ligado y relocalización (3) Explicación de cálculos (3)
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 169 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 170 / 248
7 Cargadores y ligadores
Si PROGA se carga a partir de la dirección 0x4000 entonces PROGB se
carga a partir de la dirección 0x4063 y PROGC se carga a partir de la 8 Dependencia de la máquina
dirección 0x40E2. Relocalización
Para terminar de calcular el operando de REF4 en PROGA se deben de Máscaras de bits
sumar: Ligado de programas
el valor 0x14 ya precalculado, Tablas y lógica de un cargador ligador
el valor 0x30 de LISTC relativo a PROGC y
la dirección de inicio 0x40E2 de PROGC
9 Independencia de la máquina
para obtener al final el valor 0x4126.
10 Opciones de diseño del cargador
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 171 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 172 / 248
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 173 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 174 / 248
Paso uno del cargador ligador Paso dos del cargador ligador
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 175 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 176 / 248
Contenido Búsqueda automática en biblioteca
7 Cargadores y ligadores
Los cargadores suelen poder incluir de forma automática rutinas de
8 Dependencia de la máquina bibliotecas (estándares o especificadas por el usuario).
Los programadores las pueden usar como si fueran parte del lenguaje
9 Independencia de la máquina de programación.
Búsqueda automática en biblioteca Las rutinas usadas se leen automáticamente de la biblioteca, se ligan
Opciones del cargador y se cargan.
Programas con superposiciones El programador sólo necesita mencionar el nombre de las rutinas. A
esto se le llama búsqueda automática en biblioteca.
10 Opciones de diseño del cargador
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 177 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 178 / 248
Durante el primer paso, los sı́mbolos externos referenciados en las Este proceso se repite con cualquier referencia externa que se
bibliotecas se tratan igual que antes. encuentre en las bibliotecas. Si al final de este proceso aún quedan
Al final del primer paso, los sı́mbolos que aún estén sin definir se referencias sin resolver, éstas deben señalarse como errores.
buscan primero en las bibliotecas especificadas y luego en las Esto permite al programador usar sus propias versiones de algunas
bibliotecas estándares. rutinas cuyos nombres aparezcan en las bibliotecas, pues al final de la
Se continúa procesando las subrutinas encontradas como si fueran primera etapa del primer paso los sı́mbolos correspondientes ya
parte de la entrada. estarán definidos.
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 179 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 180 / 248
7 Cargadores y ligadores
Las bibliotecas suelen estar en un archivo de código objeto. Para
buscar una rutina se podrı́a examinar todo el código objeto, pero esto 8 Dependencia de la máquina
es muy ineficiente.
El sistema podrı́a tener un directorio de subrutinas que contiene sus 9 Independencia de la máquina
nombres y una referencia a su posición en el código objeto. Búsqueda automática en biblioteca
Opciones del cargador
La búsqueda en la biblioteca es entonces una búsqueda en este
Programas con superposiciones
directorio seguida de la lectura de la parte indicada del código objeto.
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 181 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 182 / 248
INCLUDE nombre
Esta opción le indica al cargador que lea el programa objeto llamado
Muchos cargadores permiten especificar opciones que modifican el nombre (posiblemente una biblioteca) y que lo trate como parte de la
comportamiento estándar del cargador. entrada.
Esas opciones se pueden pasar a través de un lenguaje especial, ya sea DELETE nombre
en un archivo independiente o como parte del flujo de entrada
Esta opción le indica al cargador que elimine la sección de control llamada
(incluso como parte del código fuente en ensamblador).
nombre del conjunto de programas que se están cargando.
A continuación describimos cinco opciones comunes.
CHANGE fuente destino
Esta opción le indica al cargador que cambie el sı́mbolo fuente por el
sı́mbolo destino cada vez que aparezca en el código objeto.
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 183 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 184 / 248
Opciones LIBRARY y NOCALL Contenido
7 Cargadores y ligadores
LIBRARY nombre
Esta opción le indica al cargador que use la biblioteca no estándar llamada 8 Dependencia de la máquina
nombre para resolver las referencias externas en lugar de la biblioteca
estándar. 9 Independencia de la máquina
Búsqueda automática en biblioteca
NOCALL nombre Opciones del cargador
Esta opción le indica al cargador que la rutina llamada nombre no se usará Programas con superposiciones
en esta ejecución del programa, por lo que no es necesario cargarla.
10 Opciones de diseño del cargador
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 185 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 186 / 248
Sección y longitud
A A 1000
El método de superposiciones sirve para reducir la cantidad de B 1800
memoria requerida durante la ejecución de un programa. C 4000
Muchos sistemas de administración de superposiciones requieren que D 2800
éstas tengan una estructura de árbol. E 800
B C D/E F 1000
Cada nodo del árbol se llama segmento.
G 400
Cada segmento puede constar de una o más secciones de control.
H 800
I 1000
J 800
F/G H I J K
K 2000
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 187 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 188 / 248
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 189 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 190 / 248
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 191 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 192 / 248
Ejemplo de definición de segmentos Dirección inicial de segmentos
Como el cargador puede asignar las direcciones iniciales de todas las Se realiza la relocalización y el ligado pero en lugar de colocar el
secciones de control entonces se puede relocalizar y ligar de la forma resultado en la memoria se guarda en un archivo ARCHSEG.
usual con una excepción: El segmento raı́z siempre estará en la memoria. Se le agrega de forma
Se debe permitir la posibilidad de que al llamar a un segmento éste automática una sección de control especial llamada manejador de
no se encuentre en la memoria. superposiciones (MANSUP).
Esto se puede hacer de formas distintas. Sólo veremos una forma MANSUP debe tener información sobre la estructura de superposiciones
sencilla. del programa.
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 195 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 196 / 248
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 197 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 198 / 248
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 199 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 200 / 248
Contenido Editores de ligado
7 Cargadores y ligadores
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 201 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 202 / 248
7 Cargadores y ligadores
Una ventaja es que si un programa se va a ejecutar muchas veces sólo 8 Dependencia de la máquina
se resuelven una vez las referencias externas, reduciendo
considerablemente el tiempo de carga. 9 Independencia de la máquina
Otra ventaja es que si ya se conoce de antemano la dirección de
carga, entonces se puede generar código objeto que no requiera de 10 Opciones de diseño del cargador
relocalización durante la carga.
Editores de ligado
Ligado dinámico
Cargadores de arranque
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 203 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 204 / 248
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 205 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 206 / 248
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 207 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 208 / 248
Contenido Cargador de arranque (1)
7 Cargadores y ligadores
¿Y cómo se carga el cargador?
8 Dependencia de la máquina La respuesta a esta pregunta no es sencilla.
Se requiere que otro programa (el cargador de arranque) cargue en la
9 Independencia de la máquina memoria al cargador o al sistema operativo.
¿Y cómo se carga el cargador de arranque?
10 Opciones de diseño del cargador
¿Con un cargador del cargador de arranque?
Editores de ligado
Ligado dinámico ¿Qué fué primero, el huevo o la gallina?
Cargadores de arranque
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 209 / 248 Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 210 / 248
Francisco Zaragoza (UAM Azcapotzalco) Cargadores y ligadores Trimestre 09P 211 / 248 Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 212 / 248
Contenido Macroinstrucciones
Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 213 / 248 Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 214 / 248
Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 215 / 248 Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 216 / 248
Invocaciones a macros Ejemplo de expansión de macro
Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 217 / 248 Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 218 / 248
Las definiciones de macros desaparecen. La etiqueta de la macrollamada se coloca como etiqueta de la primera
lı́nea de la macroexpansión, lo que permite usar a las macros como si
Las invocaciones se vuelven comentarios y se agrega el cuerpo de la
fueran nemónicos.
macro correspondiente.
Observe que el cuerpo de la macro no tiene etiquetas, en su lugar hay
Los argumentos han reemplazado a los parámetros, según la posición
referencias al contador de localidades.
en la que se hayan listado.
Esto evita que las etiquetas aparezcan múltiples veces generando
Se eliminan las lı́neas de comentarios, pero se conservaron los campos
errores de redefinición. Sin embargo, obliga a obtener a mano las
de comentarios.
referencias a CONTLOC.
Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 219 / 248 Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 220 / 248
Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 221 / 248 Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 222 / 248
Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 223 / 248 Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 224 / 248
Algoritmo del macroprocesador (1) Algoritmo del macroprocesador (2)
Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 225 / 248 Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 226 / 248
Procedimiento EXPANDE
Procedimiento DEFINE
1 Haz EXPANSION = VERDADERO.
1 Introduce el nombre en TABNOM y el prototipo en TABDEF.
2 Toma el prototipo de TABDEF.
2 Haz NIVEL = 1. Mientras NIVEL > 0:
1 TOMA-LINEA.
3 Copia los argumentos a TABARG.
2 Si no es una lı́nea de comentario: 4 Escribe la invocación como comentario.
1 Sustituye parámetros por posicional. 5 Mientras no termine la definición de macro:
2 Introduce la lı́nea en TABDEF.
3 Si CODOP es MACRO, incrementa NIVEL.
1 TOMA-LINEA.
4 Si CODOP es MEND, decrementa NIVEL. 2 PROCESA-LINEA.
6 Haz EXPANSION = FALSO.
Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 227 / 248 Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 228 / 248
Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 229 / 248 Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 230 / 248
Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 231 / 248 Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 232 / 248
Generación de etiquetas únicas (1) Generación de etiquetas únicas (2)
Anteriormente habı́amos prohibido el uso de etiquetas dentro de una Un mecanismo simple para lograr esto es agregar un caracter especial
macrodefinición. (uno que no pueda aparecer en una etiqueta normal) y un contador a
Esto es poco conveniente pues produce código propenso a errores y cada etiqueta que se genere durante la macroexpansión.
difı́cil de leer. Este contador se incrementa cada vez que se haga una
Una forma de permitir etiquetas dentro de una macro es la de macroexpansión.
asegurar durante la macroexpansión que estas etiquetas se El contador puede ser numérico (si las etiquetas permiten números) o
reemplazarán por otras etiquetas únicas, es decir, por etiquetas que alfabético (en caso de que sólo se permitan letras en las etiquetas).
no puedan aparecer en otra parte.
Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 233 / 248 Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 234 / 248
Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 235 / 248 Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 236 / 248
Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 237 / 248 Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 238 / 248
Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 239 / 248 Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 240 / 248
Expansión de macros recursiva (2) Contenido
Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 241 / 248 Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 242 / 248
Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 243 / 248 Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 244 / 248
Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 245 / 248 Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 246 / 248
Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 247 / 248 Francisco Zaragoza (UAM Azcapotzalco) Macroprocesadores Trimestre 09P 248 / 248