Sei sulla pagina 1di 10

Macro Procesadores Universidad Autnoma Metropolitana o Azcapotzalco

Mar Paula Ortuo Snchez a n a November 30, 2005

Contents
1 Macroprocesadores 1.1 Funciones bsicas de un Macro Procesador . . . . . . . . . . . . . . . . . . . . . . . a 2 2 6

2 Algoritmo Macro Procesador y Estructura de Datos

List of Algorithms
1 2 3 4 5 Algorithm for a one-pass PROCESSLINE . . . . DEFINE . . . . . . . . . EXPAND . . . . . . . . GETLINE . . . . . . . . macro . . . . . . . . . . . . . . . . processor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 9 10 10

List of Figures
1 Contents of macro processor tables for the program in table 1:(a) entries in NAMTAB and DEFTAB dening macro RDBUFF, (b) entries in ARGTAB for invocation of RDBUFF on line 190 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

List of Tables
1 2 3 4 Use of macros in a SIC/XE program . . . . . . . . . . . . . . . . . Program with macros expanded . . . . . . . . . . . . . . . . . . . Example of the denition of macros within a macro body a) . . . Example of the denition of macros within a macro body b) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 5 7 7

Macroprocesadores

Una macro instruccin (a veces abreviada macro) es simplemente una notacin convencional para o o el programador. Una macro representa un grupo de instrucciones en el lenguaje de programacin o fuente. Los macro procesadores reemplazan cada macro instruccin con el correspondiente grupo de ino strucciones en el programa fuente. Esto es comnmente llamado expandir la macro. Estas macro u instrucciones permiten escribir al programador versiones cortas de un programa, y dejar que los detalles mecnicos sean manejados por el macro procesador. a Por ejemplo, supngase que se desea salvar los contenidos de todos los registros antes de llamar o a un programa. En SIC/XE esto requerir una secuencia de siete instrucciones (STA, STB, etc.). a Usando una macro instruccin, el programador simplemente escribe SAVEREGS, por ejemplo. o Esta macro instruccin ser expandida en siete instrucciones en lenguaje ensamblador necesarias o a para salvar los registros. Las funciones de un macro procesador esencialmente involucran la sustitucin de un grupo de o caracteres o l neas por otros. Excepto en algunos casos especializados, el macro procesador no realiza anlisis del texto que maneja. a El diseo y capacidades de un macro procesador pueden ser inuenciados por la forma de las n proposiciones del lenguaje de programacin involucrado. Sin embargo, el signicado y traduccin o o de estas instrucciones en lenguaje de maquina no conciernen durante la macro expansin. Esto o signica que el diseo de un macro procesador no esta relacionada con la arquitectura de la comn putadora en la cual corre. El uso mas comn de macro procesadores es en la programacin en lenguaje ensamblador. Usamos u o ejemplos en lenguaje ensamblador SIC para ilustrar los conceptos involucrados. Sin embargo, los macro procesadores tambin pueden ser usados con lenguajes de alto nivel, lenguajes de comandos e del sistema operativo, etc. Adems, hay macro procesadores de propsito general que no estan a o ligados con algn lenguaje en particular. u

1.1

Funciones bsicas de un Macro Procesador a

La tabla 1 muestra un ejemplo de un programa SIC/XE usando macro instrucciones. Este programa tiene la misma funcin y lgica que los programas ejemplos estudiados anteriormente, sin o o embargo, el esquema de numeracin del programa fuente ha sido cambiado. o Este programa dene y usa dos macro instrucciones, RDBUFF y WRBUFF. Las funciones y lgica o de la macro RDBUFF son similares a aquellas de la subrutina RDREC, tambin WRBUFF es e similar a la subrutina WRREC. Las deniciones de estas macro aparecen en el programa fuente enseguida de START. Dos nuevas directivas (MACRO y MEND) son usadas. La primera proposicin MACRO (l o nea 10) identica el principio de una macro denicin. El s o mbolo en la etiqueta RDBUFF es el nombre de la macro, y sus entradas en el campo operando, identican los parmetros de la macro. a

5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 105 110 115 120 125 130 135 140 145 150 155 160 165 170 175 180 190 195 200 205 210 215 220 225 230 235 240 245 250 255

COPY RDBUFF . . .

Table 1: Use of macros in a SIC/XE program START 0 COPY FILE FROM IN TO OUT MACRO &INDEV,&BUFADR,&RECLTH MACRO TO READ RECORD INTO BUFFER CLEAR CLEAR CLEAR +LDT TD JEQ RD COMPR JEQ STCH TIXR JLT STX MEND MACRO X A S #4096 =X&INDEV *-3 =X&INDEV A,S *+11 &BUFFER,X T *-19 &RECLTH CLEAR LOOP COUNTER

SET MAXIMUM RECORD LENGTH TEST INPUT DEVICE LOOP UNTIL READY READ CHAR INTO REGISTER A TEST FOR END OF RECORD (X00) EXIT LOOP IF EOR STORE CHAR IN BUFFER LOOP UNLESS MAX LENGTH HAS BEEN REACHED SAVE RECORD LENGTH

WRBUFF . . .

&OUTDEV,&BUFADR,&RECLTH

MACRO TO WRITE RECORD INTO BUFFER CLEAR LDT LDCH TD JEQ WD TIXR JLT MEND X &RECLTH &BUFFER,X =X&OUTDEV *-3 =X&OUTDEV T *-14 CLEAR LOOP COUNTER GET CHAR FROM BUFFER TEST OUTPUT DEVICE LOOP UNTIL READY WRITE CHAR LOOP UNTIL ALL CHARACTERS HAS BEEN WRITE

. . . FIRST CLOOP

MAIN PROGRAM STL RDBUFF LDA COMP JEQ WRBUFF J WRBUFF J BYTE WORD RESW RESW RESB END RETADR LENGTH #0 ENDFIL 05,BUFFER,LENGTH CLOOP 05,EOF,THREE @RETADR CEOF 3 1 1 3 4096 FIRST SAVE RETURN ADDRESS TEST FOR END OF FILE EXIT IF EOF FOUND WRITE OUTPUT RECORD LOOP INSERT EOF MARKER

ENDFIL EOF THREE RETADR LENGTH BUFFER

LENGTH OF RECORD 4096-BYTE AREA BUFFER

En nuestro macro lenguaje, cada parmetro empieza con el carcter & el cual facilita la sustitucin a a o de parmetros durante la macro expansin. El nombre de la macro y los parmetros denen el a o a modelo o prototipo para cada macro instruccin usada por el programador. o Siguiendo a la directiva MACRO aparecen las proposiciones que forman el cuerpo de la macro denicin (l o nea 15 - 90). Estas son las instrucciones que sern generadas por la expansin de a o la macro. La directiva MEND (l nea 95) marca el n de la macro. La denicin de la macro o WRBUFF (l nea 100 - 160) sigue un modelo similar. El programa principal empieza en la linea 180. La proposicion en la linea 190 es una macro invocacin que da el nombre de la macro instruccin y los argumentos a ser usados en la expansin o o o de la macro. El programa principal empieza en la l nea 180. La proposicin en la l o nea 190 es una macro invocacin que da el nombre de la macro instruccin y los argumentos a ser usados en la expansin o o o de la macro. El programa de la tabla 1 deber ser proporcionado como entrada a un macro procesador. La a tabla 2 muestra la salida que genera este programa. Las macro deniciones han sido borradas puesto que ya no se necesitan despus de que la macro se expande. e Cada macro invocacin ha sido expandida en las proposiciones que forman el cuerpo de la macro, o con los argumentos de la invocacin de la macro sustituidos por los parmetros en el prototipo o a de la macro. Los argumentos y parmetros son asociados uno con otro de acuerdo a sus posiciones. El primer a argumento en la macro invocacin corresponde al primer parmetro en el prototipo de la macro o a y as sucesivamente. Por ejemplo en la l nea 190 el argumento F1 es sustituido por el parmetro a &INDEV dondequiera que este ocurra. Similarmente, BUFFER es sustituido por &BUFADR, y LENGTH es sustituida por &RECLTH Las l neas 190a a 190m muestran la expansin completa de la macro invocacin en la l o o nea 190. Las l neas de comentarios dentro del cuerpo de la macro han sido borradas, pero comentarios individuales permanecen. La proposicin de la macro invocacin ha sido incluida como una comentario. o o La etiqueta en la macro invocacin (CLOOP) permanecen como etiqueta en la primera proposicin o o generada en la macro expansin. Esto permite el programador usar la macro instruccin en la o o misma forma que mnemnicos en lenguaje ensamblador. Las macro invocaciones en las l o neas 210 a 220 son expandidas en la misma manera. Note que las dos invocaciones de WRBUFF especican diferentes argumentos, tal que producen diferentes expansiones. Despus del macro procesamiento, el archivo expandido puede ser usado como entrada al ensame blador. Las sentencias de la macro invocacin sern tratadas exactamente igual que si hubieran o a sido escritas por el programador. Una comparacin del programa expandido en relacin al programa ejemplo, muestra las difereno o cias entre llamadas a subrutinas y macro invocacin. En la tabla las proposiciones del cuerpo o 4

5 180 190 190a 190b 190c 190d 190e 190f 190g 190h 190i 190j 190k 190l 190m 195 200 205 210 210a 210b 210c 210d 210e 210f 210g 210h 215 220 220a 220b 220c 220d 220e 220f 220g 220h 225 230 235 240 245 250 255

COPY FIRST .CLOOP CLOOP

.ENDFIL ENDFIL

EOF THREE RETADR LENGTH BUFFER

Table START STL RDBUFF CLEAR CLEAR CLEAR +LDT TD JEQ RD COMPR JEQ STCH TIXR JLT STX LDA COMP JEQ WRBUFF CLEAR LDT LDCH TD JEQ WD TIXR JLT J WRBUFF CLEAR LDT LDCH TD JEQ WD TIXR JLT J BYTE WORD RESW RESW RESB END

2: Program with macros expanded 0 COPY FILE FROM IN TO OUT RETADR SAVE RETURN ADDRESS F1,BUFFER, LENGTH READ RECORD INTO BUFFER X CLEAR LOOP COUNTER A S #4096 SET MAXIMUM RECORD LENGTH =XF1 TEST INPUT DEVICE *-3 LOOP UNTIL READY =XF1 READ CHAR INTO REGISTER A A,S TEST FOR END OF RECORD (X00) *+11 EXIT LOOP IF EOR BUFFER,X STORE CHAR IN BUFFER T LOOP UNLESS MAX LENGTH *-19 HAS BEEN REACHED LENGTH SAVE RECORD LENGTH LENGTH TEST FOR END OF FILE #0 ENDFIL EXIT IF EOF FOUND 05,BUFFER,LENGTH WRITE OUTPUT RECORD X CLEAR LOOP COUNTER LENGTH BUFFER,X GET CHAR FROM BUFFER =X05 TEST OUTPUT DEVICE *-3 LOOP UNTIL READY =X05 WRITE CHAR T LOOP UNTIL ALL CHARACTERS *-14 HAS BEEN WRITE CLOOP LOOP 05,EOF,THREE INSERT EOF MARKER X CLEAR LOOP COUNTER THREE EOF,X GET CHAR FROM BUFFER =X05 TEST INPUT DEVICE *-3 LOOP UNTIL READY =X05 WRITE CHAR INTO REGISTER A T LOOP UNLESS MAX LENGTH *-14 HAS BEEN REACHED @RETADR CEOF 3 1 1 LENGTH OF RECORD 4096 4096-BYTE AREA BUFFER FIRST

de la macro WRBUFF son generadas dos veces: l neas 210a a 210h y l neas 220a a 220h. En el programa ejemplo, las correspondientes instrucciones aparecen solo una vez: en la subrutina WRREC (l neas 210 a 240), En general, las proposiciones que forman la expansin de una macro o son generadas (y ensambladas) cada vez que la macro es invocada. Las proposiciones en una subrutina aparecen una sola vez, no importa cuantas veces sean llamadas. Note tambin que las macro instrucciones han sido escritas sin etiquetas. En la tabla 2 , l e nea 140 contiene la proposicin JEQ * -13 y la l o nea 155 contiene JLT *-14. Las proposiciones correspondientes en la subrutina WRREC son JEQ WLOOP y JLT WLOOP, donde WLOOP es una etiqueta en la instruccin TD que prueba el dispositivo de salida. Si tal etiqueta apareciera o en la l nea 135 de la macro, esta generara un error -s mbolo duplicado-, cuando el programa es ensamblado. Para evitar s mbolos duplicados, se han eliminado etiquetas del cuerpo de la macro denicin. o

Algoritmo Macro Procesador y Estructura de Datos

Es fcil disear un macro procesador de dos pasadas en el cual todas las macro deniciones son a n procesadas durante el primer paso, y todas las macro invocaciones son expandidas durante el segundo paso. Sin embargo, tal macro procesador de dos pasadas no permitir que el cuerpo de a una macro instruccin contenga deniciones de otras macros (porque todas las macros debern o a ser denidas durante el primer paso antes de expandir cualquier macro invocacin). o Deniciones de macros por otras macros pueden ser usuales en ciertos casos. Considere por ejemplo las dos deniciones de las macro instrucciones de la tabla 3. El cuerpo de la primera macro (MACROS) contiene proposiciones que denen RDBUFF, WRBUFF, y otras macro instrucciones para un sistema SIC. El cuerpo de la segunda macro instruccin (MACROX) dene estas mismas o macros para un sistema SIC/XE. Un programa que va a correr un sistema SIC podr invocar a MACROS para denir las otras macro instrucciones de utiler a. Un programa que va a correr un sistema SIC/XE podr invocar MACROX para denir estas a mismas macro instrucciones en su versin XE. De esta manera, el mismo programa podr correr o a ya sea una versin estndar o una versin extendida. El unico cambio requerido ser la invocacin o a o a o de MACROS o MACROX. Es importante entender que denir MACROS o MACROX no dene RDBUFF y las otras macro instrucciones. Estas deniciones son procesadas solo cuando una invocacin de MACROS o MACROX es expandida. o Un macro procesador que puede alternar entre macro denicin y macro expansin es capaz de o o manejar macros como los de la tabla 3. Se presenta un algoritmo y un conjunto de estructuras de datos para tal macroprocesador. Debido a la estructura de una pasada la denicin de una o macro debe aparecer antes de la proposicin que la invoca. o Hay tres estructuras de datos involucradas en el macro procesador. DEFTAB, las macro deniciones mismas son almacenadas en una tabla, la cual contiene los macro prototipos y las proposiciones que forman el cuerpo de la macro (con algunas modicaciones)

1 2

3 4

Table 3: Example of the denition of macros within a macro body a) MACROS MACRO {Denes sic standar version macros} RDBUFF MACRO &INDEV, &BUFADR, &RECLTH . . {SIC standar version} . MEND {End of RDBUFF} WRBUFF MACRO &OUTDEV, &BUFADR, &RECLTH . . {SIC standar version} . MEND {End of WRBUFF} . . . MEND {End of MACROS}

1 2

3 4

Table 4: Example of the denition of macros within a macro body b) MACROX MACRO {Denes SIC/XE macros} RDBUFF MACRO &INDEV, &BUFADR, &RECLTH . . {SIC/XE version} . MEND {End of RDBUFF} WRBUFF MACRO &OUTDEV, &BUFADR, &RECLTH . . {SIC/XE version} . MEND {End of WRBUFF} . . . MEND {End of MACROX}

Figure 1: Contents of macro processor tables for the program in table 1:(a) entries in NAMTAB and DEFTAB dening macro RDBUFF, (b) entries in ARGTAB for invocation of RDBUFF on line 190 NAMTAB, tabla que almacena los macro nombres, la cual sirve como un ndice a DEFTAB. Cada macro instruccin denida, tiene un apuntador al inicio y n de la denicin en o o DEFTAB. ARGTAB la cual es usada durante la expansin en la invocacin de la macro. Cuando una o o invocacin a una macro es reconocida, los argumentos almacenados en ARGTAB de acuerdo o a su posicin en la lista de argumentos. Cuando la macro es expandida, los argumentos de o ARGTAB son sustituidos por los correspondientes parmetros en el cuerpo de la macro. a La gura 1 muestra porciones de los contenidos de estas tablas durante el procesamiento del programa en la tabla 1. La gura 1a) muestra la denicin de RDBUFF almacenada en DEFTAB, o con una entrada en NAMTAB identicando el principio y n de la denicin. Note que la noo tacin posicional ha sido usada para los parmetros: el parmetro &INDEV ha sido convertido o a a a ?1 (indicando el primer parmetro en el prototipo), &BUFADR ha sido convertido a ?2, y as a sucesivamente. Cuando la notacin ?n aparece en una l o nea en DEFTAB, un operacin simple de o indexamiento proporciona el argumento adecuado desde ARGTAB. El algoritmo completo del macro procesador se presenta en los algoritmos 1 a 5. El procedure DEFINE, el cual es llamado cuando el principio de una macro denicin es reconocido, hace las o apropiadas entradas en DEFTAB y NAMTAB. EXPAND es llamado para poner los argumentos en ARGTAB y expandir una proposicin de macro invocacin. o o El procedure GETLINE el cual es llamado en algunos puntos en el algoritmo, obtiene la siguiente l nea a ser procesada. Esta l nea puede venir de DEFTAB (la siguiente l nea de una macro siendo expandida), o desde el archivo de entrada, dependiendo si la bandera EXPANDING es puesta a TRUE o FALSE.

Un aspecto de este algoritmo que requiere comentar es el manejo de macro deniciones dentro de macros (como se ilustr en la tabla 3 y 4. Cuando una macro denicin es colocada en o o DEFTAB, el acercamiento normal ser continuar hasta encontrar una directiva MEND. Esto a podr no trabajar para el ejemplo de la tabla 3 y 4, sin embargo, la l a nea 3 MEND (marca el n de la denicin de RDBUFF) podr ser tomada como el n de la denicin de MACROS. Para o a o resolver este problema el procedure DEFINE mantiene un contador LEVEL, cada vez que una MACRO directiva se lee, el valor de LEVEL es incrementado por 1, cada vez que una MEND directiva se lee, el valor de LEVEL es decrementado por 1. Cuando LEVEL alcanza 0, MEND que corresponde a la directiva original MACRO ha sido encontrada. Este proceso es muy parecido al chequeo de parntesis izquierdos y derechos cuando se revisa una expresin aritmtica. e o e Algorithm 1 Algorithm for a one-pass macro processor EXPANDING FALSE while OPCODE =END do GETLINE PROCESSLINE end while

Procedure 2 PROCESSLINE search NAMTAB for OPCODE if found then EXPAND else if OPCODE = MACRO then DEFINE else write source line to expanded le end if

Procedure 3 DEFINE enter macro name into NAMTAB enter macro prototype into DEFTAB LEVEL 1 while LEVEL >0 do GETLINE if this is not a comment line then substitute positional notation for parameters enter line into DEFTAB if OPCODE = MACRO then LEVEL LEVEL + 1 else if OPCODE = MEND then LEVEL LEVEL - 1 end if end if end while store in NAMTAB pointers to beginning and end of denition

Procedure 4 EXPAND EXPANDING TRUE get rst line of macro denition {prototype} from DEFTAB set up arguments from macro invocation in ARGTAB write macro invocation to expanded le as a comment while not end of macro denition do GETLINE PROCESSLINE end while EXPANDING FALSE

Procedure 5 GETLINE if EXPANDING then get next line of macro denition from DEFTAB substitute arguments from ARGTAB for positional notation else read next line from input le end if

10

Potrebbero piacerti anche