ID Number: Q72701
6.00 | 6.00
MS-DOS | OS/2
Summary:
Beginning with the Microsoft Macro Assembler (MASM) version 6.0, a
macro can be written that will return either a text or numeric value.
This is called a "Macro Function" and is implemented with the EXITM
directive.
In MASM versions earlier than 6.0, the EXITM directive was used to
exit a macro immediately. There were no arguments or parameters. With
versions 6.0 and later, the EXITM directive takes an optional argument
that specifies the return value. This argument must be either text, a
text equate name, or the result of another macro function. In
addition, the EXITM directive must be at the end of a macro block if
it is to be used to return a value.
More Information:
The two examples below illustrate a couple of ways to use a macro
function. In the first example, a macro function is used to
concatenate a text string to create unique labels for a procedure
definition. The example code is followed by an extract from the list
file showing the concatenated names for the procedures.
The second example illustrates how a numeric value may be returned by
using the expansion operator (%). This example is followed by a
preprocessor listing showing the resultant code.
Sample Code 1
-------------
; Assemble options needed: /c /Fl
.model small
prefix TEXTEQU <mycode_>
paste MACRO arg1,arg2 ;Macro function that concatenates
exitm <arg1&&arg2> ; strings arg1 and arg2
ENDM
n_proc MACRO new_name ;Macro that calls the paste
paste (%prefix,&new_name) PROC ; macro function.
paste (%prefix,&new_name) ENDP ; The % expansion operator
ENDM ; evaluates the expression
; associated with prefix.
.code
n_proc fun_1
n_proc fun_2
END
======== EXTRACT FROM LIST FILE ========
Macros:
N a m e Type
n_proc ............. Proc
paste ............. Func
Procedures, parameters and locals:
N a m e Type Value Attr
mycode_fun_1 .......... P Near 0000 _TEXT Length= 0000 Public
mycode_fun_2 .......... P Near 0000 _TEXT Length= 0000 Public
Sample Code 2
-------------
; Assemble options needed: /c /EP
.model small
get_rate MACRO val ; Macro Function that accepts a numeric
LOCAL thin ; value and returns the results of
thin TEXTEQU <val*300> ; an expression.
EXITM %thin
ENDM
baudrate MACRO
FOR b_rate, <1, 4, 8> ; Equivalent to IRP with MASM 5.1a.
BYTE b_rate
WORD get_rate(b_rate) ; Call to Macro Function.
ENDM
ENDM
.code
baudrate
END
======== PREPROCESSOR LISTING ========
.model small
.code
BYTE 1
??0000 TEXTEQU <1*300> ; An expression
WORD 300 ; Call to Macro Function
BYTE 4
??0001 TEXTEQU <4*300> ; An expression
WORD 1200 ; Call to Macro Function
BYTE 8
??0002 TEXTEQU <8*300> ; An expression
WORD 2400 ; Call to Macro Function
end