关闭

宏汇编有专门的介绍书本,这里介绍宏的通用特性,(宏的高级特性总结)

253人阅读 评论(0) 收藏 举报
 TITLE  宏汇编有专门的介绍书本,这里介绍宏的通用特性,(宏的高级特性总结)
INCLUDE irvine32.inc
mWrite  macro text
   ifb <text>               ;;如果参数为空则进入里面;ifb宏编译条件语句的参数要放在<>里面
     echo 错误,您的参数为空
     exitm                  ;;结束展开下面的宏
   endif
   push edx
   mov edx,offset text
   call writestring
   pop edx
endm
mGoto macro x:req,y:req
   local error              ;;在这里定义一个标号常量.注意它的用法
   error=0                  ;;注意error的用法
   if (x lt 0) or (x gt 25 );;这里注意if语句不需要使用<>来括住.注意它的用法 x不在在0~25之间,则
      echo 错误,x不在0~25之间;;在这里显示的x会自动被替换成调用x的值.
      error=1               ;;注意error的用法
   endif
   if (y lt 0) or (y gt 25)
      echo 错误,y不在0~25之间;;在这里显示的y会自动被替换成调用y的值.
      error=error+1         ;;注意error的用法
   endif
   if (error gt 0)          ;;注意error的用法
      exitm
   endif
   push edx
   mov dh,y
   mov dl,x
   call Gotoxy
   pop edx
endm
mReadString macro buff:req,maxCount:req
   ifidn <maxCount>,<edx>   ;;ifidn不区分大小写参数相同则编译.参数用<>括住
      echo 错误,maxCount这个参数不能是edx
      exitm
   endif
   push edx
   push ecx
   mov edx,buff
   mov ecx,maxCount
   call ReadString
   pop ecx
   pop edx
endm
mWriteReg macro regs
   local string
   .data
   string byte "&regs=",0   ;;这里就是使用&   符号&将宏的内部对宏参数的引用替换为调用时的实际值.编译器就不会把它当作字符来处理掉
   .code
   push edx
   push eax
   mov edx,offset string
   call writestring
   mov eax,regs             ;;这里注意用法,因为regs传进来的是一个寄存器
   call writeHex
   pop eax
   pop edx
endm
mWriteText macro text
   ifnb<text>
      Leng textequ %(sizeof text)    ;;%对表达式求值.首先计算出text的值
      Line textequ %(@Line)          ;;@Line汇编操作符,用于返回当前源码的行号
      %echo 字符长度是Leng  行号是Line;;%在行首,表示展开该行所有文本宏或宏函数
   endif
endm
mReadLar macro text
   local string
   .data
   string byte text                ;;这里在定义的时候没有插入空字符
   .code
   push edx
   mov edx,offset string
   call writestring
   pop edx
endm
mAllF macro message
   mReadLar "&message"             ;;注意这里的用法.接收进来的参数再&替换给mReadLar调用
endm
mFunc macro system                ;;宏函数和普通的宏一样,区别是宏函数要返回一个值
   ifdef system
      exitm<-1>                  ;;返回-1
   else
      exitm<0>
   endif
endm
mFunction macro system
   if mFunc(system)               ;;为0为真.在这里调用宏函数的方法是:宏名字 (参数) 宏函数再返回值给if比较
     echo 0 system已经定义了
   else
     echo -1 system未定义
   endif
endm
.data
   var1 byte "abcdeee",13,10,0
   var2 byte 10 dup(0)
.code
main PROC
   mWrite                   ;;这里在编译时会提示错误参数为空,而宏相应的也不会展开下面的操作
   mGoto 11,11              ;;这里则是正常的把光标定位于11.11
   mGoto 33,55              ;;这里调用时会使上面的echo相应的x和y变成其值
   mReadString offset var1,lengthof var2
   mWriteReg eax
   mWriteText var1          ;;在编译的时候注意看值是多少
   mReadLar <"显示字符" , 0dh , 0ah>;;这里的<>符号是将多个字符当作一组字符传送,不然编译器会把期当作3个参数
   Shar Textequ <warning: y-coord if !> 24>  ;;注意前面的!用法.在汇编里面>是转义字符!强制它作为字符符号
   mAllF %Shar                               ;;这里也要使用%展开操作.
   mAllF Shar                                ;;这里没有用%展开也就直接在屏幕上打印2个Shar
   system=1              
   mFunction system  ;调用宏函数,如果上面的system=1去掉,则在编译时宏函数会返回为system未定义
                     ;还有一点可以去掉system=1在编译的时候用ml -c -d system=1 1.asm 这样也会提示这个参数据被定义了
   exit
main ENDP
END main
;到这里已经完了。宏用的到基本都在上面使用过了。请认真看注解
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:509次
    • 积分:18
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档