Logo Studenta

Procesadores-de-Macros_parte1

¡Este material tiene más páginas!

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.

Continuar navegando