ZHCU875Z August 2001 – October 2023 SM320F28335-EP
宏语言支持递归和嵌套宏调用。即您可以在宏定义中调用其他宏。您最多可以嵌套 32 层宏。使用递归宏时,您可从它自有的定义中调用一个宏(宏调用其自身)。
您在创建递归宏或嵌套宏时,应密切关注传递到宏参数的参数,因为汇编器会使用参数的动态范围。这意味着调用的宏会使用它所调用宏的环境。
使用嵌套宏展示了嵌套宏。in_block 宏中的 y 将 out_block 宏中的 y 隐藏起来。但 in_block 宏可以访问 out_block 宏中的 x 和 z。
in_block .macro y,a
. ; visible parameters are y,a and x,z from the calling macro
.endm
out_block .macrox,y,z
. ; visible parameters are x,y,z
.
in_block x,y ; macro call with x and y as arguments
.
.
.endm
out_block ; macro call
使用递归宏展示了递归宏和 fact 宏。fact 宏生成计算 n 的阶乘时必须用到的汇编代码,其中 n 是直接值。结果置于 A 寄存器。fact 宏实现这一目标的方式是调用 fact1,它会递归调用其自身。
1 .fcnolist
2
3 fact .macro N, LOC
4
5 .if N < 2
6 MOV @LOC, #1
7 .else
8 MOV @LOC, #N
9
10
11 .eval N-1, N
12 fact1
13
14 .endif
15 .endm
16
17 fact1 .macro
18 .if N > 1
19 MOV @T, @LOC
20 MPYB @P, @T, #N
21 MOV @LOC, @P
22 MOV ACC, @LOC
23 .eval N - 1, N
24 fact1
25
26 .endif
27 .endm