那么前面说过的第二种用法:name TEXTEQU textvar就很好理解了。就是让把一个文本变量赋给另一个文本变量。比如:
talent TEXTEQU <genius>
taowen TEXTEQU talent
第一行定义了一个名字为talent的汇编期文本变量,第二行把talent的值赋给了名为 taowen的变量。从结果上看这个和:
talent TEXTEQU <genius>
taowen TEXTEQU <talent>
是一样的,但是第二种做法是先因为文本宏替换的作用把talent变成了genius。实际的效果是这样的:
taowen TEXTEQU <genius>
显示文本变量的内容
在C中经常用printf,在运行期显示一些变量的内容来进行调试。而在MASM中则用echo来在汇编期显示文本变量的内容。
china TEXTEQU <great country>
%echo china
这样会在汇编时的命令行中出现great country。如果你把%号去掉,则显示的是china。你应该可以推测出%是干什么的了,就是对一个变量进行求值。
定义汇编期数值变量
常量有两种那么变量也应该有两种。这里就介绍汇编期数值变量的用法。
name = expression
expression是一个数值表达式,比如:
val = 3+4
此时val就是一个数值变量,其值为7。你也可以这么写:
valexp TEXTEQU <3+4>
val = valexp
看上去好像式把一个文本变量赋给了数值变量,进行了类型转换(呵呵,效果是一样的)。其实实际上是把3+4写到了valexp处,因为文本宏进行了文本替换。
把数值变量赋给文本变量
前面我们看到了如何“把文本变量赋给数值变量”,那么反过来呢?
val = 3+4
valexp TEXTEQU val
结果是提示错误:STest.asm(15) : error A2051: text item required。汇编器说需要文本项,那么我们加上<>就好了。
val = 3+4
valexp TEXTEQU
用%echo valexp检查一下你就会发现,并不是如你所愿的显示的是7,而是val。这个是因为<>使得汇编器认为val是一个字符串,由于数值变量不是文本替换的宏,并不会把val替换为7,所以当然显示的是val。正确的做法是:
val = 3+4
valexp TEXTEQU %val
%号和前面的用法一样,是用作求值。回忆一开始介绍的文本宏的用法中的第三条就是: name TEXTEQU %numvar。这个用法就是让一个数值变量的值赋给文本变量,经常用作显示一个数值变量的值。调试的时候这么写。
pi = 3.1415926
temp TEXTEQU %pi
%echo temp
这个是一个很重要的调试技巧。
前面从简单的文本宏引出汇编期的常量与变量。如果仅仅是用在宏外的代码中,一个文本宏作一些简单的替换就足够了。它们更多的是用在复杂的宏中,这些宏可以看作过程和函数。同汇编期的变量一样,它们是用在汇编期的。
下面将不再把text macro视为宏,而把它视为文本变量。宏直接指宏过程或者宏函数。宏过程是不带返回值的宏,而宏函数是带返回值的宏。它们都可以带参数,也都可以有局部变量。其实可以统一的成为宏函数,或者汇编期函数
用如下的格式创建一个简单的宏
name MACRO
statements
ENDM
statements中可以进行判断或者循环,可以说是非常的全功能。但是汇编期的函数和执行期的函数是很不一样的,一个是发生在汇编期的预处理,另一个是把执行期的执行位置改变,执行一段代码之后返回。
clear_eax_m MACRO
xor eax, eax
ENDM
clear_eax_p Proc
xor eax, eax
ret
clear_eax_p Endp
关于这个两者的区别,我假定你已经理解了,如果不理解可以参考任何一本汇编教科书,上面有完整的汇编代码说