`
zzc1684
  • 浏览: 1229329 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

reverseArgs macro arglist:VARARG

阅读更多
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) 不过这样写会出错而已。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics