mis. lizbeth alejandra hernández gonzález programación de ... · macros es en la programación...

45
Procesadores de Macros MIS. Lizbeth Alejandra Hernández González Programación de Sistemas

Upload: nguyenhanh

Post on 13-Oct-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

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 ensambladorcon macros.

• Este programa define y usa dosinstrucciones a macros: RDBUFF yWRBUFF.

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

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

Dos nuevas instrucciones para el ensamblador:

• MACRO identifica el inicio de la definición demacros,

• MEND (línea 95) marca el final de la definiciónde macros,

• este lenguaje de macros, cada parámetrocomienza con el carácter &, que facilita lasustitución de los parámetros durante laexpansión de macros.

• Una proposición de invocación a macros sesuele denominar una macrollamada. Para evitarconfusiones con la proposición de llamadautilizada en los procedimientos y subrutinas, espreferible usar el término invocación

• El programa de la figura 4.1 podríaproporcionarse como entrada a un procesadorde macros; la figura 4.2 muestra la salida quese 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

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

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 lasproposiciones que constituyen el cuerpo de lamacro.

2. TABNOM, para cada macroinstruccióndefinida, contiene apuntadores al inicio y alfinal de la definición en TABDEF. Sirve deíndice para TABDEF.

3. (TABARG) que se utiliza durante la expansiónde las invocaciones a macros.

FIGURA 4.4 Contenido de las tablasdel procesador de macros para elprograma de la figura 4.1: (a)entradas de TABNOM y TABDEF quedefinen la macro RDBUFF, (b)entradas de TABARG para lainvocación de RDBUFF en la línea190.

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 pasoFIGURA 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 DEFINEcomienzaintroduce el nombre de la macro en TABNOMintroduce el prototipo de la macro en TABDEFNIVEL := 1mientras NIVEL > 0 haz

comienzaTOMA-LINEAsi no es una línea de comentario entonces

comienzasustituye la notación posicional por parámetrosintroduce la línea en TABDEF

si CODOP = 'MACRO' entoncesNIVEL := NIVEL + 1

de otro modo si CODOP = 'MEND' entoncesNIVEL := 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 lainvocación a macros en TABARG escribe la invocación a macros en el archivo expandido como comentariomientras 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 deTABARG por notación posicional

termina {si}

de otro modo

lee la siguiente línea del archivo de entrada termina {TOMA-LINEA)

termina {TOMA-LINEA}

• DEFINE, se llama al reconocer el inicio de unadefinición de macros, hace las entradas apropiadasen TABDEF y TABNOM.

• EXPANDE coloca los valores de los argumentos enTABARG y expande la proposición de invocación amacros.

• TOMA-LINEA, se llama en varios puntos delalgoritmo, toma la siguiente línea que se va aprocesar, y que puede proceder de TABDEF

• DEFINE tiene un contador llamado NIVEL, cuyovalor se incrementa en uno cada vez que se lee unaproposición MACRO, y disminuye en uno su valorcada 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íaespecificar las series de variables con que seoperará (A, B, etc.).

• El procesador de macros utilizaría esteparámetro para construir los símbolosrequeridos 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ípicode proposiciones de expansión de macroscondicional.

• Figura 4.8. &E0R, especifica un código decaracter hexadecimal que marca el final de unregistro, y &MAXLTH, que especifica la longitudmáxima de registro que se puede leer.

• (Como se verá más adelante, es posible omitircualquiera de los dos parámetros en unainvocació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 macrosRDBUFF F3,BUF,RECL,04,2048

30 CLEAR X LIMPIA EL CONTADOR DE CICL035 CLEAR A40 LDCH =X'04' ASIGNA EL CARACTER DE FIN DE REGISTRO42 RMO A,S47 +LDT #2048 ASIGNA LA LONGITUD MAXIMA DEL REGISTRO50 $AALOOP TD =X'F3' PRUEBA EL DISPOSITIVO DE ENTRADA55 JEQ $AAL00P REPITE EL CICLO HASTA QUE ESTE LISTO60 RD =X'F3' LEE EL CARACTER EN EL REGISTRO A65 COMPR A,S EXAMINA SI HAY FIN DE REGISTRO70 JEQ $AAEXIT SALE DEL CICLO SI ES FIN DE REGISTRO75 STCH $BUF,X ALMACENA EL CARACTER EN EL BUFFER80 TIXR T REPITE EL CICLO A MENOS QUE SE HAYA85 JLT $AAL00P ALCANZADO LA LONGITUD MAXIMA90 $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 macros25 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.