首页
社区
课程
招聘
[原创]汇编中"宏"的使用小结! 希望对需要了解这方面的知识的人有些帮助
发表于: 2007-11-21 23:34 4455

[原创]汇编中"宏"的使用小结! 希望对需要了解这方面的知识的人有些帮助

2007-11-21 23:34
4455
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
   ifidni <maxCount>,<edx>   ;;ifidni不区分大小写参数相同则编译.参数用<>括住
      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 "®s=",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 这样也会提示这个参数据被定义了

main ENDP
;到这里已经完了。宏用的到基本都在上面使用过了。请认真看注解

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
2
谢谢,正需要了
2007-11-22 00:10
0
雪    币: 191
活跃值: (55)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
谢谢了 呵呵!
2007-12-4 13:14
0
游客
登录 | 注册 方可回帖
返回
//