显示的结果是Hello,这样就在一个宏过程(函数)的外部访问了局部变量。
MASM内置了两套文本操作功能,一个是宏函数,另一个是Directive。功能是一样的,但是提供了表达上的灵活性。
name CATSTR [[textitem1 [[, textitem2]] ]]
name INSTR [[position,]] textitem1, textitem2
name SIZESTR textitem
name SUBSTR textitem, position [[, length]]
这一套是Directive,作用分别是:连接文本,查找子文本,获得文本长度,取子文本。
@CatStr( string1 [[, string2]] )
@InStr( [[position]], string1, string2 )
@SizeStr( string )
@SubStr( string, position [[, length]] )
这一套是宏函数。用一个例子显示两套其实是一样的:
taowen TEXTEQU @CatStr(<He is >, <genius>)
%echo taowen
taowen CATSTR <He is >, <genius>
%echo taowen
可以看到两个例子输出的都是He is genius。有两点需要注意:1、@CatStr这样的宏函数可以作为左值,被用来赋值。2、@CatStr这样的宏函数对于参数并不自动求值,当行为和你想的不一样的时候,加上%。
对于具体的使用不是很难,试验一下就可以知道了。一点就是第一个字符的索引是1,而不是C中的0。
%可能是最难使用的语法了。一般就是行为和你想的不一样的时候,加上%试验一下。%与 <>与!等,构成了一团糟。
一般情况下,你不用%号。用%可以把数值变量转变为文本变量。可以用%号强制取出文本的值。比如:
Index = 0
NameT CATSTR <Person>, %Index
%NameT TEXTEQU <taowen>
%echo Person0
先对Index用%就是把数值变成文本,第二个%就是把NameT变成Person0。这里也演示了一个产生变量名的很重要的技巧,只要把Index进行一些递增,就能够构建一个变量的数组了。
<>可以一定程度上放置被求值,不过大部分情况下由于文本宏的替换不受影响,所以仍然取到的是替换后的值。!用来取消符号原有的意思。比如:
Symbol CATSTR <Go >, <!,>, <Go>
%echo Symbol
输出的结果是Go, Go。如果不加!则,号会导致错误。有趣的是如果你在第二个Go后面加上 !本来应该是Go, Go!。结果确实一个缺少右尖括号的错误,原来是!把>的原有意思变化了,不再表示结束了。如果你这样:
Symbol CATSTR <Go >, <!,>, <Go!>>
%echo Symbol
得出的就是Go, Go>。看出来是怎么回事了吧。要产生!,就这么写:
Symbol CATSTR <Go >, <!,>, <Go!!>
%echo Symbol
关于什么时候用<>什么时候不用,我的看法是最好能用<>就用<>。具体为什么,是因为能够加大适用范围。
循环有四种:WHILE,REPEAT,FOR,FORC。语法如下:
WHILE expression
statements
ENDM
REPEAT expression
statements
ENDM
FOR parameter [[:REQ | :=default]] , <argument [[, argument]]>
statements
ENDM
FORC parameter, <string>
statements
ENDM
WHILE与REPEAT从用法到效果是一样的,至少我认为是一样的。expression要求值为一个数值,可以用EQ(等于),LT(小于)这些判断Operator来比较数值。
I = 0
WHILE I LT 10
Temp TEXTEQU %I
%echo Temp
I = I + 1
ENDM
输出的结果就是0一直到9。
FOR与FORC是专门用途的循环,一个是用于取得一个参数列表中的各个参数,另一个是逐个取出一个字符串中的每个字符。各举两个例子就可以明白:
TestMacro MACRO params:VARARG
FOR param, <params>
%echo param
ENDM
ENDM
TestMacro arg1, arg2, arg3
显示的结果是arg1然后是