宏意思是源程序中的一段有独立功能的程序代码 宏指令,用户自定义的指令。编程序时候,将多次使用的功能用一条宏指令来代替。 汇编包括指令 ,伪指令,宏指令。前两个都是规定的,最后一个是你自己设计的。 好处是用起来方便,::))定义就是为了使用,但是要先定义,后调用。 (这一点和子程序可是不一样啊) 例如,宏定义,两个字相乘 multiply MACRO opr1, opr2, result push dx push ax mov ax,opr1 imul opr2 mov result, ax pop ax pop dx ENOM 调用这个宏, multiply cx, var, xyz[bx] 宏展开 1 push dx 1 push ax 1 mov ax, cx 1 imul var (var不能使立即数) 1 mov xyz[bx], ax 1 pop ax 1 pop dx (就是带进去,看明白了吧,注意一点,必须保证展看后有效) 例如,求绝对值 宏定义, absol MACRO oper LOCAL next cmp oper, 0 (和0比较) jge next neg oper (求补,就是求绝对值了) next: (防止多次存入一个地址) ENDM 宏调用, ......... absol var ....... absol bx 宏展开, 1 cmp var,0 1 jge ??0000 1 neg var 1 ??0000: .......... 1 cmp bx, 0 1 jge ??0001 1 neg bx 1??0001: (很清楚把,就像是你做好了一个公式,然后带入就是了, 汇编学到这里才觉得有趣:)) &使用 例如宏定义, leap macro cond, lab j&cond lab endm 宏调用 leap z, there ......... leap nz, here 宏展开, 1 jz there ......... 1 jnz here (明白了吧,就是and,合起来的意思,没有什么好讲的,) 在举一个例子 msg macro lab, num, xyz lab&num db 'WELCOEME YOU STUDY WITH JINZHOU MR,&xyz' endm 宏调用 msg ary, 1, wang (这个地方不用注释吧,就是调用两次:) ...... msg ary, 2, zhang 宏展开 1 ary1 db 'WELCOEME YOU STUDY WITH JINZHOU MR wang' ....... 1 ary2 db 'WELCOEME YOU STUDY WITH JINZHOU MR zhang' (特别简单吧,很好玩吧,) %用法 例如, 宏定义, msg macro count, string msg&count db string endm errmsg macro text cntr = cntr + 1 msg %cntr, text endm 宏调用 entr=0 .... errmsg 'SYNTAX ERROR' ....... errmsg 'INVALID OPERAND' 宏展开 1 cntr = cntr + 1 1 msg %cntr, 'SYNTAX ERROR' 2 msg1 db 'SYNTAX ERROR' ........... 1 cntr = cntr + 1 1 msg %cntr, 'INVALID OPERAND' 2 msg1 db 'INVALID OPERAND' (看出来了吧,就是代替,一般只能看到2所显示的,为了清楚理解, 把1也写出来了) 宏库的建立与调用,(一般以mac后缀) 建立宏库,很简单,遍上号码,变成一个程序就是了 入 MACRO.MAC macro1 MACRO ........ ENDM ..... macro2 MACRO ......... ENDM ....... (想用多少用多少) 调用, 方式include加上 路径 不举例子了,很简单。 简单说一下宏调用和子程序的区别: 子程序在程序执行期间调用,只占用自身大小的一段空间。 (必须到子程序的IP,好处是节省内存,效率高, 但是因为要保存返回地址,转向地址,时间长,适合长代码, 频繁调用的)
宏调用,在汇编期间被展开,调用一次展开一次。
以下是一个invoke功能的宏
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming 2nd Edition> ; by 罗云彬, http://asm.yeah.net ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 将参数列表的顺序翻转 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> reverseArgs macro arglist:VARARG local txt,count txt TEXTEQU <> count = 0 for i,<arglist> count = count + 1 txt TEXTEQU @CatStr(i,<!,>,<%txt>) endm if count GT 0 txt SUBSTR txt,1,@SizeStr(%txt)-1 endif exitm txt endm ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 建立一个类似于 invoke 的 Macro ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> _invoke macro _Proc,args:VARARG local count count = 0 % for i,< reverseArgs( args ) > count = count + 1 push i endm call dword ptr _Proc endm ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>