ZHCU947E June 2015 – January 2023
宏语言支持递归和嵌套宏调用。即您可以在宏定义中调用其他宏。您最多可以嵌套 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 是直接值。结果置于 A1 寄存器。fact 宏实现这一目标的方式是调用 fact1,它会递归调用其自身。
.fcnolist
fact1 .macro n
.if n == 1
MVK globcnt, A1 ; Leave the answer in the A1 register.
.else
.eval 1, temp ; Compute the decrement of symbol n.
.eval globcnt*temp, globcnt ; Multiply to get a new result.
fact1 temp ; Recursive call.
.endif
.endm
fact .macro n
.if ! $iscons(n) ; Test that input is a constant.
.emsg "Parm not a constant"
.elseif n < 1 ; Type check input.
MVK 0, A1
.else
.var temp
.asg n, globcnt
fact1 n ; Perform recursive procedure
.endif
.endm