ZHCUAV7Z september 1995 – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , OMAP-L132 , OMAP-L137 , OMAP-L138 , SM470R1B1M-HT , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768
宏语言支持递归和嵌套宏调用。即您可以在宏定义中调用其他宏。您最多可以嵌套 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 是直接值。结果置于数据存储器地址位置。fact 宏实现这一目标的方式是调用 fact1,它会递归调用其自身。
fact .macro N, loc ; N is an integer constant.Register loc address = N!
.if N < 2 ; 0! = 1! = 1
MOV loc, #1
.else
MOV loc, #N ; N >= 2 so, store N in loc.
.eval -1, N ; Decrement N, and do the factorial of N - 1.
fact1 ; Call fact with current environment.
.endm
fact1 .macro
.if N > 1
MOV R0, #N ; N > 1 so, store N in R0.
MUL loc, R0, loc ; Multiply present factorial by present position.
.eval N - 1, N ; Decrement position.
fact1 ; Recursive call.
.endif
.endm