当前位置: 网学 > 编程文档 > 汇编语言 > 正文

MASM宏使用总结

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/18
下载{$ArticleTitle}原创论文样式
TEXTEQU <Hello>
TestMacro MACRO
LOCAL LocalVar
%echo LocalVar
ENDM
TestMacro

显示的结果是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然后是

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号