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
;到这里已经完了。宏用的到基本都在上面使用过了。请认真看注解
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法