宏指令,用户自定义的指令。编程序时候,将多次使用的功能用一条宏指令来代替。
汇编包括指令 ,伪指令,宏指令。前两个都是规定的,最后一个是你自己设计的。
好处是用起来方便,::))定义就是为了使用,但是要先定义,后调用。
(这一点和子程序可是不一样啊)
例如,宏定义,两个字相乘
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
1 mov xyz[bx], ax
1 pop ax
1 pop dx
(就是带进去,看明白了吧,注意一点,必须保证展看后有效)
例如,求绝对值
宏定义,
absol MACRO oper
LOCAL next
cmp oper, 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
.....
.......
(想用多少用多少)
调用,
方式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
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>