reverseArgs macro arglist:VARARG
local txt,count
txt TEXTEQU <>
count = 0
for i, <arglist>
count = count + 1
txt TEXTEQU @CatStr(i, <!,> , <%txt> )
;如果arglist参数数组不为空,循环arglist中的每一个元素,取值放到i变量中,然后加上,分割,组成字串
;如果arglist是1,2,3则上一句每一步扩展为:
;1, ; 2,1, ; 3,2,1,
; <!,> 中可以省略!号即可以直接写为 <,>
endm
if count GT 0 ;如果count大于0,即参数不为空
txt SUBSTR txt,1,@SizeStr(%txt)-1
;截取字符串,从txt第一个字符开始截取,截取txt的长度减1,然后赋值回txt变量中
;因为3,2,1,最后多了一个,号,所以这里将最后一个,删掉。
endif
exitm txt ;返回字面值 3,2,1
endm
你可以这样使用reverseArgs宏:
invoke SortLowToHig,reverseArgs(1,2,3,4,5)
请教一个问题啊,为什么第一个for前面没 % ,而第二个for却加了 % ?我就这一处想不明白,查了好多资料也没查到,还请大家帮我想想,谢谢了!
%放在行首是展开操作符,他用来展开该行发现的所有文本宏和宏函数。
% for i,< reverseArgs( args ) >
这意味着如果args是一个文本宏,则展开后的值被reverseArgs操作!
这个你最好能查一下masm的帮助,里面都有讲到的。
for i,<arglist>
endm
这个就类似于高级语言比如perl中的foreach $i (@arglist),<arglist>就是像一个数组,然后每次循环就从这个<arglist>中取出一个元素给i,这么不断循环一直到取完为止。
然后这句:
txt TEXTEQU @CatStr(i,<!,>,<%txt>)
意思是把arglist中的每个元素用分号相连然后放到text中比如arglist原来是<a b c d>则经过那个for循环后,txt就变成了<d,c,b,a,>了。
然后后面的:
txt SUBSTR txt,1,@SizeStr(%txt)-1
就像高级语言中的取子串substr一样,将txt中的最后一个分号去掉。这样最后txt就成了<d,c,b,a>了。下一个函数就不用分析了吧。
其它一些具体的语法你还是查一下masm的帮助吧。
txt TEXTEQU <> 定义一个预处理文本变量
count = 0 这个用来保存参数个数
for i,<arglist> 循环遍历arglist,将每个参数的名字赋给i
count = count + 1 统计参数个数
txt TEXTEQU @CatStr(i,<!,>,<%txt>) 将每个参数倒过来练成一个文本字符串,最后的结果应该如同:参数2,参数1
endm
if count GT 0
txt SUBSTR txt,1,@SizeStr(%txt)-1 返回上面得到的参数文本字符串
endif
exitm txt
endm
回答人的补充 2011-04-11 14:35
我这样的解释可能不太明白,在这里一个字符串和数值变量可以互相转换,
比如txt是一个字符变量,但加上 <txt>后可以便是取它的值 %号也是取值的意思 !是转义的意思,
像txt TEXTEQU @CatStr(i, <!,>, <%txt>) 这句话,你就可以理解为txt = @CatStr(i, txt) 不过这样写会出错而已。