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

MASM宏使用总结

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/18
下载{$ArticleTitle}原创论文样式
本宏之后,你可以把那个宏名看作汇编期文本变量的名字,被宏名替换的文本内容作为变量的文本值。

那么前面说过的第二种用法: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

    关于这个两者的区别,我假定你已经理解了,如果不理解可以参考任何一本汇编教科书,上面有完整的汇编代码说

    网学推荐

    免费论文

    原创论文

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