MACRO
指令标记一个宏定义的开始。 宏扩展在 MEND
指令处终止。
有两个指令用于定义一个宏。 其语法是:
MACRO{$label
}
macroname
{$
cond
} {$
parameter
{,$
parameter
}...} ; code MEND
其中:
-
是由调用宏时提供的符号替换的参数。 该符号通常是一个标签。
-
是宏的名称。 它不能以指令或命令名开始。
-
是专用于包含条件代码的特殊参数。 允许有效条件代码以外的值。
-
是调用宏时被替换的一个参数。 可用以下格式设置参数的缺省值:
$parameter="default value"
如果缺省值内或两端有空格,则必须使用双引号。
$label
macroname
$cond
$parameter
如果在一个宏内开始任何 WHILE...WEND
循环或 IF...ENDIF
条件,则必须在到达 MEND
指令之前结束它们。
在宏体内,可以像其他变量一样使用类似于 $
、label
$
或 parameter
$
等参数。 每次调用宏时,都会为它们指定新值。参数必须以 cond
$
开始,以区别于常规符号。 可以使用任意数目的参数。
是可选的。如果宏定义了内部标签,则它很有用。 它被当作宏的一个参数。 它不一定代表宏扩展中的第一个指令。 宏定义任何标签的位置。$label
使用 |
作为自变量来使用参数的缺省值。 如果省略该自变量,则使用一个空字符串。
在使用多个内部标签的宏内,将每个内部标签定义为带有不同后缀的基址标签会很有用。
如果在扩展中不需要空格,则在参数与后面的文本或参数之间使用一个圆点。 不得在参数与前面的文本之间使用圆点。
您可对条件代码使用 $
参数。使用一元运算符 cond
:REVERSE_CC:
可得到条件代码的取反代码,使用 :CC_ENCODING:
可得到条件代码的 4 位编码。
宏可定义局部变量的范围。
宏可以嵌套。
示例; macro definition MACRO ; start macro definition$label xmac $p1,$p2 ; code$label.loop1 ; code ; code BGE $label.loop1$label.loop2 ; code BL $p1 BGT $label.loop2 ; code ADR $p2 ; code MEND ; end macro definition ; macro invocationabc xmac subr1,de ; invoke macro ; code ; this is what isabcloop1 ; code ; is produced when ; code ; the xmac macro is BGE abcloop1 ; expandedabcloop2 ; code BL subr1 BGT abcloop2 ; code ADR de ; code使用宏来生成汇编时的诊断信息:
MACRO ; Macro definition diagnose $param1="default" ; This macro produces INFO 0,"$param1" ; assembly-time diagnostics MEND ; (on second assembly pass) ; macro expansion diagnose ; Prints blank line at assembly-time diagnose "hello" ; Prints "hello" at assembly-time diagnose | ; Prints "default" at assembly-time条件宏示例AREA codx, CODE, READONLY; macro definition MACRO Return$cond [ {ARCHITECTURE} <> "4" BX$cond lr | MOV$cond pc,lr ] MEND; macro invocationfun PROC CMP r0,#0 MOVEQ r0,#1 ReturnEQ MOV r0,#0 Return ENDP END网上有一篇关于macro mend的文章写得很好, 其地址是: http://blog.csdn.net/BelindaBen/archive/2009/01/06/3721589.aspx