ZHCU947E June 2015 – January 2023
可在程序中的任何位置定义宏,但必须先定义宏,然后才能使用宏。宏可以在源文件的开头定义,或在 .copy/.include 文件(请参阅复制源文件)中定义;也可以在宏库中定义。有关宏库的更多信息,请参阅GUID-FA873DFC-6F7E-4059-9549-391C613E6799.html#GUID-FA873DFC-6F7E-4059-9549-391C613E6799。
宏定义可以被嵌套,也可以调用其他宏,但宏的所有元素必须在同一个文件中定义。GUID-1637A395-3CA9-4E40-9F8A-188CF79085B2.html#GUID-1637A395-3CA9-4E40-9F8A-188CF79085B2中讨论了嵌套宏。
宏定义是一系列采用以下格式的源语句:
macname | .macro [parameter1] [, ...,parametern ] |
model statements or macro directives | |
[.mexit] | |
.endm |
macname | 指定宏的名称。必须将名称放在源语句的标签字段中。只有宏名称的前 128 个字符有意义。汇编器会将宏名称放在内部操作码表中,并会替换同名的任何指令或先前的宏定义。 |
.macro | 是将源语句标识为宏定义第一行的指令。必须将 .macro 放在操作码字段中。 |
parameter1, parametern |
是作为 .macro 指令操作数出现的可选替代符号。GUID-1808F072-E1A1-4D7F-B03F-64C9B4059504.html#GUID-1808F072-E1A1-4D7F-B03F-64C9B4059504中讨论了参数。 |
model statements | 是每次调用宏时执行的指令或汇编器指令。 |
macro directives | 用于控制宏扩展。 |
.mexit | 是一个用作 goto .endm 的指令。当错误测试确认宏扩展失败并且不需要完成宏的其余部分时,.mexit 指令会很有用。 |
.endm | 是终止宏定义的指令。 |
如果要在宏定义中添加注释但不希望 这些注释显示在宏扩展中,请在注释前使用感叹号。如果希望 注释显示在宏扩展中,请使用星号或分号。有关宏注释的更多信息,请参阅GUID-FD0E870C-91FB-40A7-9652-F55159E0CCEB.html#GUID-FD0E870C-91FB-40A7-9652-F55159E0CCEB。
以下示例展示了宏的定义、调用和扩展。
宏定义:以下代码使用四个参数定义了一个宏 sadd4:
1 sadd4 .macro r1,r2,r3,r4
2 !
3 ! sadd4 r1, r2 ,r3, r4
4 ! r1 = r1 + r2 + r3 + r4 (saturated)
5 !
6 SADD r1,r2,r1
7 SADD r1,r3,r1
8 SADD r1,r4,r1
9 .endm
宏调用:以下代码使用四个参数调用宏 sadd4:
10
11 00000000 sadd4 A0,A1,A2,A3
宏扩展:以下代码展示了替换针对宏调用的宏定义。汇编器将 sadd4 的 r1、r2、r3 和 r4 参数替换为 A0、A1、A2 和 A3。
1 00000000 00040278 SADD A0,A1,A0
1 00000004 00080278 SADD A0,A2,A0
1 00000008 000C0278 SADD A0,A3,A0