宏意思是源程序中的一段有独立功能的程序代码
宏指令,用户自定义的指令。编程序时候,将多次使用的功能用一条宏指令来代替。

汇编包括指令 ,伪指令,宏指令。前两个都是规定的,最后一个是你自己设计的。

好处是用起来方便,::))定义就是为了使用,但是要先定义,后调用。
(这一点和子程序可是不一样啊)

例如,宏定义,两个字相乘
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
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>