Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
59
Добавлен:
14.04.2015
Размер:
2.03 Mб
Скачать

188

Chapter 6. Macro Processing Language

 

 

Advanced Macro Processing

The MPL definition function associates an identifier with a functional string. The macro may or may not have an associated pattern consisting of parameters and/or delimiters. Optionally present are local symbols.

The syntax for a macro definition is:

%DEFINE (macro_id define_pattern) [LOCAL id_list] (balanced_text)

The define_pattern is a balanced string which is further analyzed by the MPL processor as follows:

define_pattern = { [parm_id] [delimiter_specifier] }

Delimiter_specifier is one of the following:

A string that contains no non-literal id-continuation, logical blank, or at character (‘@’).

@delimiter_id

 

The macro call must have a call pattern which corresponds to the macro define

 

pattern. Regardless of the type of delimiter used to define a macro, once it has

 

been defined, only delimiters used in the definition can be used in the macro call.

 

Macros defined with parentheses and commas require parentheses and commas

6

in the macro call. Macros defined with spaces or any other delimiter require that

delimiter when called.

The define pattern may have three kinds of delimiters: implied blank delimiters,

identifier delimiters and literal delimiters.

Keil Software — A51/AX51/A251 Macro Assembler and Utilities

189

 

 

Literal Delimiters

The delimiters used in user-defined macros (parentheses and commas) are literal delimiters. A literal delimiter can be any character except the metacharacter.

When you define a macro using a literal delimiter, you must use exactly that delimiter when you call the macro. If the specified delimiter is not used as it appears in the definition, a macro error occurs.

When defining a macro, the delimiter string must be literalized, if the delimiter meets any of the following conditions:

more than one character,

a macro identifier character (A-Z, 0-9, _, or ?),

a commercial at (@), a space, tab, carriage return, or linefeed.

Use the escape function (%n) or the bracket function (%()) to literalize the delimiter string.

This is the simple form shown earlier:

Before Macro Expansion

After Macro Expansion

%*DEFINE(MAC(A,B))(%A %B)

null string

%MAC(4,5)

4 5

In the following example brackets are used instead of parentheses. The

6

commercial at symbol separates parameters:

 

 

%*DEFINE (MOV[A%(@)B]) (MOV %A,%B)

null string

 

%MOV[P0@P1]

 

MOV P0,P1

 

In the next two examples, delimiters that could be id delimiters have been

 

defined as literal delimiter (the differences are noted):

 

 

 

 

 

 

%*DEFINE(ADD (R10 AND B)) (ADD R10,%B)

 

null string

 

%ADD (R10 AND #27H)

 

ADD R10,#27H

 

Spaces around AND are considered as part of the argument string.

190

Chapter 6. Macro Processing Language

 

 

Blank Delimiters

Blank delimiters are the easiest to use. Blank delimiter is one or more spaces, tabs or new lines (a carriage-return/linefeed pair) in any order. To define a macro that uses the blank delimiter, simply place one or more spaces, tabs, or new lines surrounding the parameter list.

When the macro defined with the blank delimiter is called, each delimiter will match a series of spaces, tabs, or new lines. Each parameter in the call begins with the first non-blank character, and ends when a blank character is found.

Source text

%*DEFINE (X1 X2 X3) (P2=%X2, P3=%X3) %X1 assembler A251

Output text

P2=assembler, P3=A251

6

Keil Software — A51/AX51/A251 Macro Assembler and Utilities

191

 

 

Identifier Delimiters

Identifier delimiters are legal macro identifiers designated as delimiters. To define a macro that uses an identifier delimiter, you must prefix the delimiter with the @ symbol. You must separate the identifier delimiter from the macro identifiers (formal parameters or macro name) by a blank character.

When calling a macro defined with identifier delimiters, a blank delimiter is required to precede the identifier delimiter, but none is required to follow the identifier delimiter.

Source text

%*DEFINE (ADD X1 @TO X2 @STORE X3)(

MOV

R1,%X1

MOV

R2,%X2

ADD

R1,R2

MOV

%X3,R1

)

 

%ADD VAR1 TO VAR2 STORE VAR3

Output text

MOV R1,VAR1

MOV R2,VAR2

ADD R1,R2

MOV VAR3,R1

6

Соседние файлы в папке HLP