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 "®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汇编操作符,用于返回当前源码的行号