Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Procesadores de Macros MIS. Lizbeth Alejandra Hernández González Programación de Sistemas Procesadores de Macros • Una macroinstrucción no es más que una conveniencia notacional para el programador (versión abreviada). • Cada vez que se llama una macro en un programa, el ensamblador, en lugar de la llamada a la macro, copia y pega el código real de la misma (MACROEXPANSIÓN). • Las funciones de un procesador de macros implican la sustitución de un grupo de caracteres o líneas por otras. • El diseño de un procesador de macros no está directamente relacionado con la estructura del computador en el que se va a ejecutar. • El uso más común de los procesadores de macros es en la programación en lenguaje ensamblador, • también se pueden utilizar procesadores de macros con lenguajes de programación de alto nivel, • hay procesadores de macros de aplicación general que no están ligados a ningún lenguaje en particular. Funciones básicas del procesador de macros • Definición, • invocación y • expansión de macros • Ejemplo: programa en ensamblador con macros. • Este programa define y usa dos instrucciones a macros: RDBUFF y WRBUFF. 5 COPY START 0 COPIA EL ARCHIVO DE LA ENTRADA A LA SALIDA 10 ROBUFF MACRO &INDEV,&BUFADR,&RECLTH 15 . 20 . MACRO QUE LEE UN REGISTRO EN EL BUFFER 25 . 30 CLEAR X LIMPIA EL CONTADOR DE CICLO 35 CLEAR A 40 CLEAR S 45 +LDT #4096 ASIGNA LA LONGITUD MAXIMA DEL REGISTRO 50 TD =X’&INDEV’ PRUEBA EL DISPOSITIVO DE ENTRADA 55 JEQ *-3 REPITE EL CICLO HASTA QUE ESTE LISTO 60 RD =X’&INDEV’ LEE EL CARÁCTER EN EL REGISTRO A 65 COMPR A,S EXAMINA SI HAY FIN DE REGISTRO 70 JEQ *+11 SALE DEL CICLO SI ES FIN DE REGISTRO 75 STCH $BUFADR,X ALMACENA EL CARÁCTER EN EL BUFFER 80 TIXT T REPITE EL CICLO A MENOS QUE SE HAYA 85 JLT *-19 ALCANZADO LA LONGITUD DEL REGISTRO 90 STX &RECLTH GUARDA LA LONGITUD DEL REGISTRO 95 MEND 100 WRBUFF MACRO &OUTDEV,&BUFADR,&RECLTH 105 . 110 . MACRO QUE ESCRIBE EL REGISTRO DEL BUFFER 115 . 120 CLEAR X LIMPIA EL CONTADOR DE CICLO 125 LDT &RECLTH 130 LDCH &BUFADR,X TOMA EL CARACTER DEL BUFFER 135 TD =X’&OUTDEV’ PRUEBA DEL DISPOSITIVO DE SALIDA 140 JEQ *-3 REPITE EL CICLO HASTA QUE ESTE LISTO 145 WD =X’&OUTDEV’ ESCRIBE EL CARACTER 150 TIXR T REPITE EL CICLO HASTA QUE SE HAYAN 155 JLT *-14 ESCRITO TODOS LOS CARACTERES 160 MEND 165 . 170 . PROGRAMA PRINCIPAL 175 . 180 FIRST STL RETADR GUARDA LA DIRECCIÓN DE RETORNO 190 CLOPP RDBUFF F1,BUFFER,LENGTH LEE EL REGISTRO DE ENTRADA EN EL BUFFER 195 LDA LENGTH VERIFICA SI ES FIN DE ARCHIVO 200 COMP #0 205 JEQ ENDFIL SALE SI ENCONTRO EL FIN DE ARCHIVO 210 WRBUFF 05,BUFFER,LENGTH ESCRIBE EL REGISTRO EN LA SALIDA 215 J CLOOP CICLO 220 ENDFIL WRBUFF 05,EOF,THREE INSERTA MARCA DE FIN DE ARCHIVO 225 J @RETADR 230 EOF BYTE C’EOF’ 235 THREE WORD 3 240 RETADR RESW 1 245 LENGTH RESW 1 LONGITUD DEL REGISTRO 250 BUFFER RESB 4096 AREA DE BUFFER DE 4096 BYTES 255 END FIRST FIGURA 4.1 Uso de macros en un programa figura4_1_Macros.pdf 5 COPY START 0 COPIA EL ARCHIVO DE LA ENTRADA EN LA SALIDA 180 FIRST STL RETADR GUARDA LA DIRECCION DE RETORNO 190 .CL00P RDBUFF FI,BUFFER,LENGTH LEE EL REGISTRO DE ENTRADA EN EL BUFFER 190a CL00P CLEAR X LIMPIA EL CONTADOR DE CICLO 190b CLEAR A 190c CLEAR S 190d + LDT #4096 ASIGNA LA LONGITUD MAXIMA DEL REGISTRO 190d TD =X'F1' PRUEBA EL DISPOSITIVO DE ENTRADA 190e JEQ *-3 REPITE EL CICLO HASTA QUE ESTE LISTO 190f RD =X' F1' LEE EL CARACTER EN EL REGISTRO A 190g C0MPR A,S EXAMINA SI HAY FIN DE REGISTRO 190h JEQ *+11 SALE DEL CICLO SI ES FIN DE REGISTRO 190 i STCH BUFFER,X ALMACENA EL CARACTER EN EL BUFFER 190j TIXR T REPITE EL CICLO A MENOS QUE SE HAYA 190k JLT *-19 ALCANZADO LA LONGITUD MAXIMA 1901 STX LENGTH GUARDA LA LONGITUD DEL REGISTRO 195 LDA LENGTH VERIFICA SI ES FIN DE ARCHIVO 200 C0MP #0 205 JEQ ENDFIL SALE SI ENCONTRO EL FIN DE ARCHIVO 210 WRBUFF 05,BUFFER,LENGTH ESCRIBE EL REGISTRO EN LA SALIDA 210a CLEAR X LIMPIA EL CONTADOR DE CICLO 210b LDT LENGTH 210c LDCH BUFFER,X TOMA EL CARACTER DEL BUFFER 210d TD =X'05' PRUEBA EL DISPOSITIVO DE SALIDA 210e JEQ *-3 REPITE EL CICLO HASTA QUE ESTE LISTO 210f WD =X'05' ESCRIBE EL CARÁCTER 210g TIXR T REPITE EL CICLO HASTA QUE SE HAYAN 210h JLT *-14 ESCRITO TODOS LOS CARACTERES 215 J CL00P CICLO 220 .ENDFIL WRBUFF 05,EOF,THREE INSERTA MARCA DE FIN DE ARCHIVO 220a ENDFIL CLEAR X LIMPIA EL CONTADOR DE CICLO 220b LDT THREEE 220c LDCH E0F,X TOMA EL CARACTER DEL BUFFER 220d TD =X '05' PRUEBA EL DISPOSITIVO DE SALIDA 220e JEQ *-3 REPITE EL CICLO HASTA QUE ESTE LISTO 220f WD =X '05' ESCRIBE EL CARÁCTER 220g TIXR T REPITE EL CICLO HASTA QUE SE HAYAN 220h JLT *-14 ESCRITO TODOS LOS CARACTERES 225 J @RETADR 230 EOF BYTE C'EOF' 235 THREE WORD 3 240 RETADR RESW 1 245 LENGTH RESW 1 LONGITUD DEL REGISTRO 250 BUFFER RESB 4096 AREA DE BUFFER DE 4096 BYTES 255 END FIRST FIGURA 4.2 Programa de figura 4.1 con macros expandidas figura4_2_MacrosExpandidas.pdf Dos nuevas instrucciones para el ensamblador: • MACRO identifica el inicio de la definición de macros, • MEND (línea 95) marca el final de la definición de macros, • este lenguaje de macros, cada parámetro comienza con el carácter &, que facilita la sustitución de los parámetros durante la expansión de macros. • Una proposición de invocación a macros se suele denominar una macrollamada. Para evitar confusiones con la proposición de llamada utilizada en los procedimientos y subrutinas, es preferible usar el término invocación • El programa de la figura 4.1 podría proporcionarse como entrada a un procesador de macros; la figura 4.2 muestra la salida que se generaría. Entrada (4.1) Salida (4.2) • Los argumentos y los parámetros se asocian entre sí, de acuerdo con sus posiciones. • Las dos invocaciones de WRBUFF especifican argumentos distintos, por lo que producen expansiones distintas. • Las proposiciones de invocación a macros se tratarán como comentarios, y las instrucciones generadas de las expansiones de macros se ensamblarán igual que si el programador las hubiera escrito directamente. • Las macroinstrucciones se han escrito para que el cuerpo de la macro no contenga etiquetas. • Para evitar la duplicación de símbolos se han eliminado las etiquetas del cuerpo de definición de estas macros. • "JLT *-14" práctica de programación pobre. Tablas y lógica del procesador de macros Procesador de macros de dos pasos: 1. Procesar las definiciones de macros 2. Las proposiciones de invocación a macros se expanden durante el segundo paso. • No permite que el cuerpo de una macroinstrucción contenga definiciones de otras macros 1 MACROS MACRO {Define las macros para la versión estándar de SIC} 2 RDUFF MACRO &INDEV,&BUFADR,&RECLTH . . {Versión estándar de SIC} . 3 MEND {Fin de RDBUFF} 4 WRBUFF MACRO &OUTDEV, &BUFADR, &RECLTH . . {Versión estándar de SIC} . 5 MEND {Fin de WRBUFF} . . . 6 MEND {Fin de MACROS} (a) 1 MACROX MACRO {Define las macros para SIC/XE} 2 RDUFF MACRO &INDEV,&BUFADR,&RECLTH . . {Versión SIC/XE} . 3 MEND {Fin de RDBUFF} 4 WRBUFF MACRO &OUTDEV,&BUFADR,&RECLTH . . {Versión SIC/XE} . 5 MEND {Fin de WRBUFF} . . . 6 MEND {Fin de MACROX} (b) FIGURA 4.3 Ejemplo de la definición de macros en el cuerpo de un macro. figura4_3_MacrosDefiniendoMacros.pdf Pueden ser útiles: • La primera macro (MACROS) contiene proposiciones que definen RDBUFF, WRBUFF para SIC estándar • (MACROX) define esas mismas macros para el sistema SIC/XE. • El mismo programa puede ejecutarse sobre una máquina SIC estándar o una SIC/XE. SIC estándar Programa 4.3 SIC / XE MACROS MACROX *La definición de MACROS o de MACROX no define RDBUFF ni las otras macroinstrucciones. • Un procesador de macros de un paso que pueda alternar entre la definición y la expansión de macros puede manejar macros como las de la figura 4.3 • la definición de una macro debe aparecer en el programa fuente antes de cualquier proposición que invoque a la macro.Estructuras de datos básicas implicadas en este procesador de macros. 1. TABDEF (tabla de definiciones ), se almacenan las definiciones de macros y las proposiciones que constituyen el cuerpo de la macro. 2. TABNOM, para cada macroinstrucción definida, contiene apuntadores al inicio y al final de la definición en TABDEF. Sirve de índice para TABDEF. 3. (TABARG) que se utiliza durante la expansión de las invocaciones a macros. FIGURA 4.4 Contenido de las tablas del procesador de macros para el programa de la figura 4.1: (a) entradas de TABNOM y TABDEF que definen la macro RDBUFF, (b) entradas de TABARG para la invocación de RDBUFF en la línea 190. Sustitución de los argumentos • Para los parámetros se ha utilizado la notación posicional: el parámetro &INDEV se ha convertido en ?1 (que indica el primer parámetro del prototipo), &BUFAJDR se ha convertido en ?2, y así sucesivamente. • Cuando se reconoce la notación ?n, en una línea de TABDEF, una simple operación de indización proporciona el argumento apropiado de TABARG Algoritmo de un procesador de macros de un paso FIGURA 4.5 comienza {procesador de macros} EXPANSION := FALSO mientras CODOP < > 'END' haz comienza TOMA-LINEA PROCESA-LINEA termina {mientras} termina {procesador de macros} procedimiento PROCESA-LINEA comienza busca CODOP en TABNOM si lo encuentra entonces EXPANDE de otro modo si CODOP = 'MACRO' entonces DEFINE de otro modo describe la línea fuente en el archivo expandido termina {PROCESA-LINEA} procedimiento DEFINE comienza introduce el nombre de la macro en TABNOM introduce el prototipo de la macro en TABDEF NIVEL := 1 mientras NIVEL > 0 haz comienza TOMA-LINEA si no es una línea de comentario entonces comienza sustituye la notación posicional por parámetros introduce la línea en TABDEF si CODOP = 'MACRO' entonces NIVEL := NIVEL + 1 de otro modo si CODOP = 'MEND' entonces NIVEL := NIVEL - 1 termina {si no es comentario} termina {mientras} guarda en TABNOM apuntadores al principio y al final de la definición termina {DEFINE} procedimiento EXPANDE comienza EXPANSION := VERDADERO toma la primera línea de la definición de macros {prototipo} de TABDEF asigna los argumentos de la invocación a macros en TABARG escribe la invocación a macros en el archivo expandido como comentario mientras no se termine la definición de macros haz comienza TOMA-LINEA PROCESA-LINEA termina {mientras) EXPANSION := FALSO termina {EXPANDE) procedimiento TOMA-LINEA comienza si EXPANSION entonces comienza toma la siguiente línea de la definición de macros en TABDEF sustituye los argumentos de TABARG por notación posicional termina {si} de otro modo lee la siguiente línea del archivo de entrada termina {TOMA-LINEA) termina {TOMA-LINEA} figura4_5_algoritmo.pdf • DEFINE, se llama al reconocer el inicio de una definición de macros, hace las entradas apropiadas en TABDEF y TABNOM. • EXPANDE coloca los valores de los argumentos en TABARG y expande la proposición de invocación a macros. • TOMA-LINEA, se llama en varios puntos del algoritmo, toma la siguiente línea que se va a procesar, y que puede proceder de TABDEF • DEFINE tiene un contador llamado NIVEL, cuyo valor se incrementa en uno cada vez que se lee una proposición MACRO, y disminuye en uno su valor cada vez que se lee una proposición MEND como (para compaginar MACRO-END). Por el ej. 4.3 • La mayoría de los procesadores de macros admiten la presencia de las definiciones de macros más usadas en la biblioteca estándar del sistema. Características del procesador de macros independientes de la máquina • Las características extendidas no están directamente relacionadas con la arquitectura del computador. 1. Concatenación de parámetros 2. Generación de etiquetas únicas 3. Expansión de macros condicional Concatenación de parámetros • Suponga series de variables: ▫ XA1, XA2, XA3, ..., otra serie por XB1, XB2, XB3, ... • El parámetro de la macroinstrucción podría especificar las series de variables con que se operará (A, B, etc.). • El procesador de macros utilizaría este parámetro para construir los símbolos requeridos en la expansión de macros (XA1, XB1, etc.). • LDA X&ID1 ¿Cómo reconocer hasta dónde termina el parámetro? • LDA X&ID—»1 Generación de etiquetas únicas • En general el cuerpo de una macroinstrucción no puede tener etiquetas del tipo usual. • Por ejemplo, WRBUFF de la figura 4.1. Si se colocara una etiqueta en la instrucción TD de la línea 135, esta etiqueta se definiría dos veces. • Muchos procesadores de macros evitan esos problemas mediante la creación de tipos especiales de etiqueta dentro de las macroinstrucciones. Propuesta • Las etiquetas utilizadas en el cuerpo de la macro comienzan con el carácter especial $ • En la figura 4.7 (b) cada símbolo que empieza con $ se ha modificado reemplazándolo por $AA ($XX siendo XX alfanumérico) • Se tienen hasta 1296 (36^2) expansiones de macros en un sólo programa. generación de etiquetas únicas 25 RDBUFF MACRO &INDEV,&BUFADR,&RECLTH 30 CLEAR X LIMPIA EL CONTADOR DE CICLO 35 CLEAR A 40 CLEAR S 45 +LDT #4096 ASIGNA LA LONGITUD MAXIMA DEL REGISTRO 50 $LOOP TD =X'&INDEV' PRUEBA EL DISPOSITIVO DE ENTRADA 55 JEQ $L00P REPITE EL CICLO HASTA QUE ESTE LISTO 60 RD -X'&INDEV" LEE EL CARACTER EN EL REGISTRO A 65 C0MPR A,S EXAMINA SI HAY FIN DE REGISTRO 70 JEQ $EXIT SALE DEL CICLO SI ES FIN DE REGISTRO 75 STCH &BUFADR,X ALMACENA EL CARACTER EN EL BUFFER 80 TIXR T REPITE EL CICLO A MENOS QUE SE HAYA 85 JLT $L00P ALCANZADO LA LONGITUD MAXIMA 90 $EXIT STX &RECLTH GUARDA LA LONGITUD DEL REGISTRO 95 MEND (a) RDBUFF FL,BUFFER,LENGTH 30 CLEAR X LIMPIA EL CONTADOR DE CICLO 35 CLEAR A 40 CLEAR S 45 +LDT #4096 ASIGNA LA LONGITUD MAXIMA DEL REGISTRO 50 $AAL00P TD =X'F1' PRUEBA EL DISPOSITIVO DE ENTRADA 55 JEQ $AAL00P REPITE EL CICLO HASTA QUE ESTE LISTO 60 RD =X'FL' LEE EL CARACTER EN EL REGISTRO A 65 COMPRN A,S EXAMINA SI HAY FIN DE REGISTRO 70 JEQ $AAEXIT SALE DEL CICLO SI ES FIN DE REGISTRO 75 STCH &BUFFER,X ALMACENA EL CARACTER EN EL BUFFER 80 TIXR T REPITE EL CICLO A MENOS QUE SE HAYA. 85 JLT $AAL00P ALCANZADO LA LONGITUD MAXIMA 90 $AAEXIT STX LENGTH GUARDA LA LONGITUD DEL REGISTRO 95 MEND (b) FIGURA 4.7 Generación de etiquetas únicas en la expansión de macros. Expansión de macros condicional • En esta sección se presenta un conjunto típico de proposiciones de expansión de macros condicional. • Figura 4.8. &E0R, especifica un código de caracter hexadecimal que marca el final de un registro, y &MAXLTH, que especifica la longitud máxima de registro que se puede leer. • (Como se verá más adelante, es posible omitir cualquiera de los dos parámetros en una invocación de REDBUFF.) • Las proposiciones de las líneas 44 a 48 de esta definición ilustran una estructura condicional (IF) • La figura 4.8(b-d) muestra la expansión de tres diferentes proposiciones de invocación a macros que ilustran la operación de las proposiciones IF de la figura 4.8(a). 25 RDBUFF MACRO &INDEV,&BUFADR,&RECLTH,&EOR,&MAXLTH 26 IF (&E0R NE ") 27 $E0RCK SET 1 28 ENDIF 30 CLEAR X LIMPIA EL CONTADOR DEL CICLO 35 CLEAR A 38 IF (&EOR EQ 1) 40 LDCH =X'&E0R' ASIGNA EL CARACTER DE FIN DE REGISTRO 42 RMO A,S 43 ENDIF 44 IF (&MAXLTH EQ ") 45 +LDT #4096 HACE LA LONGITUD MAXIMA = 4096 46 ELSE 47 +LDT # &MAXLTH ASIGNA LA LONGITUD MAXIMA DEL REGISTRO 48 ENDIF 50 $LOOP TD =X'&INDEV' PRUEBA EL DISPOSITIVO DE ENTRADA 55 JEQ $L00P REPITE EL CICLO HASTA QUE ESTE LISTO 60 RD -X'&INDEV' LEE EL CARACTER EN EL REGISTRO A 63 IF (&E0R EQ 1) 65 COMPR A,S EXAMINA SI HAY FIN DE REGISTRO 70 JEQ $EXIT SALE DEL CICLO SI ES FIN DE REGISTRO 73 ENDIF 75 STCH &BUFADR,X ALMACENA EL CARACTER EN EL BUFFER 80 TIXR T REPITE EL CICLO A MENOS QUE SE HAYA 85 JLT $LOOP ALCANZADO LA LONGITUD MAXIMA 90 $EXIT STX &RECLTH GUARDA LA LONGITUD DEL REGISTRO 95 MEND (a) Uso de proposiciones condicionales en el procesamiento de macros RDBUFF F3,BUF,RECL,04,204830 CLEAR X LIMPIA EL CONTADOR DE CICL0 35 CLEAR A 40 LDCH =X'04' ASIGNA EL CARACTER DE FIN DE REGISTRO 42 RMO A,S 47 +LDT #2048 ASIGNA LA LONGITUD MAXIMA DEL REGISTRO 50 $AALOOP TD =X'F3' PRUEBA EL DISPOSITIVO DE ENTRADA 55 JEQ $AAL00P REPITE EL CICLO HASTA QUE ESTE LISTO 60 RD =X'F3' LEE EL CARACTER EN EL REGISTRO A 65 COMPR A,S EXAMINA SI HAY FIN DE REGISTRO 70 JEQ $AAEXIT SALE DEL CICLO SI ES FIN DE REGISTRO 75 STCH $BUF,X ALMACENA EL CARACTER EN EL BUFFER 80 TIXR T REPITE EL CICLO A MENOS QUE SE HAYA 85 JLT $AAL00P ALCANZADO LA LONGITUD MAXIMA 90 $AAEXIT STX RECL GUARDA LA LONGITUD DEL REGISTRO (b) (c) RDBUFF 0E,BUFFER,LENGTH ,,80 30 CLEAR X LIMPIA EL CONTADOR DE CICLO 35 CLEAR A 47 +LDT #80 ASIGNA LA LONGITUD MAXIMA DEL REGISTRO 50 $ABL00P TD =X'0E' PRUEBA EL DISPOSITIVO DE ENTRADA 55 JEQ $ABL00P REPITE EL CICLO HASTA QUE ESTE LISTO 60 RD =X'0E' LEE EL CARACTER EN EL REGISTRO A 75 STCH BUFFER,X ALMACENA EL CARACTER EN EL BUFFER 80 TIXR T REPITE EL CICLO A MENOS QUE SE HAYA 87 JLT $ABL00P ALCANZADO LA LONGITUD MAXIMA 90 $ABEXIT STX LENGTH GUARDA LA LONGITUD DEL REGISTRO (c) (d) RDBUFF F1,BUFF,RLENG ,04 30 CLEAR X LIMPIA EL CONTADOR DE CICLO 35 CLEAR A ' 40 LDCH =X'04' ASIGNA EL CARACTER DE FIN DE REGISTRO 42 RM0 A,S 45 +LDT #4096 ASIGNA LA LONGITUD MAXIMA DEL REGISTRO = 4096 50 $ACL00P TD =X/F1 ' PRUEBA EL DISPOSITIVO DE ENTRADA 55 JEQ $ACL00P REPITE EL CICLO HASTA QUE ESTE LISTO 60 RD =X'F1' LEE EL CARACTER EN EL REGISTRO A 65 C0MPR A,S EXAMINA SI HAY FIN DE REGISTRO 70 JEQ $ACEXIT SALE DEL CICLO SI ES FIN DE REGISTRO 75 STCH &BUFF,X ALMACENA EL CARACTER EN EL BUFFER 80 TIXR T REPITE EL CICLO A MENOS QUE SE HAYA 85 JLT $ACL00P ALCANZADO LA LONGITUD MAXIMA 90 $ACEXIT STX RLENG GUARDA LA LONGITUD DEL REGISTRO (d) • El procesador de macros debe mantener una tabla de símbolos que contenga los valores de todas las variables utilizadas en el momento del procesamiento. • La prueba de expresiones booleanas en las proposiciones IF se produce en el momento en que se expanden las macros. Uso de proposiciones de ciclo en el momento del procesamiento de macros 25 RDBUFF MACRO &INDEV,8tBUFADR,&RECLTH,&E0R 27 $E0RCT SET %NITEMS(&EOR) 30 CLEAR X LIMPIA EL CONTADOR DE CICLO 35 CLEAR A 45 +LDT #4096 HACE LA LONGITUD MAXIMA = 4096 50 $LOOP TD -X'&INDEV' PRUEBA EL DISPOSITIVO DE ENTRADA 55 JEQ $L00P REPITE EL CICLO HASTA QUE ESTE LISTO 60 RD =X'&INDEV' LEE EL CARACTER EN EL REGISTRO A 63 &CTR SET 1 64 WHILE (&CTR LE &E0R) 65 COMP =X'0000&E0R[&CTR]' 70 JEQ $EXIT 71 &CTR SET &CTR+1 73 ENDW 75 STCH &BUFADR,X ALMACENA EL CARACTER EN EL BUFFER 80 TIXR T REPITE EL CICLO A MENOS QUE SE HAYA 85 JLT $LOOP ALCANZADO LA LONGITUD MAXIMA 90 $EXIT STX &RECLTH GUARDA LA LONGITUD DEL REGISTRO 100 MEND (a) ( b ) RDBUFF F2,BUFFER,LENGTH,(00,03,04) 30 CLEAR X LIMPIA EL CONTADOR DE CICLO 35 CLEAR A 45 +LDT #4096 HACE LA LONGITUD MAXIMA = 4096 50 $AALOOP TD =X'F2' PRUEBA EL DISPOSITIVO DE ENTRADA 55 JEQ $AALOOP REPITE EL CICLO HASTA QUE ESTE LISTO 60 RD =X'F2' LEE EL CARACTER EN EL REGISTRO A 65 COMP =X'000000' 70 JEQ $SAAEXIT 65 COMP =X'000003' 70 JEQ $AAEXIT 65 COMP =X'000004' 70 JEQ $AAEXIT 75 STCH BUFFER,X ALMACENA EL CARACTER EN EL BUFFER 80 TIXR T REPITE EL CJCLO A MENOS QUE SE HAYA 85 JLT $AALOOP ALCANZADO LA LONGITUD MAXIMA 90 $AAEXIT STX LENGTH GUARDA LA LONGITUD DEL REGISTRO • con esta definición el programador puede especificar una lista de caracteres de fin de registro. • P.e., en la proposición de invocación a macros de la figura 4.9(b), hay una lista (00,03,04) correspondiente al parámetro &EOR Parámetros de macros de palabras clave • Con los parámetros posicionales, el programador ha de procurar especificar los argumentos en el orden apropiado. • Si se va a omitir un argumento, la invocación debe contener un argumento nulo (ver figura 4.8.c) ▫ GENERA ,,DIRECT,,,,,,3. • parámetros de palabras clave, el valor de los argumentos se escribe con una palabra clave. ▫ GENERA TYPE=DIRECT,CHANNEL=3. • En el prototipo de macro, cada nombre de parámetro va seguido de un signo “=“ que identifica un parámetro de palabra clave. • Después del signo igual, se especifica un valor por omisión para algunos parámetros. • El parámetro tiene este valor por omisión si su nombre no aparece en la proposición de invocación a macros. Valores por omisión • Para el parámetro &INDEV es F1. Para el parámetro & BUFADR no hay valor por omisión. • Aquí los argumentos pueden aparecer en cualquier orden.
Compartir