宏汇编程序-MASM 汇编( Assemble )就是把用汇编语言编写的源程序翻译(汇编)成机器语言的目标程序。其基本工具是汇编程序。可使用小汇编程序( ASM ), 也可以使用微软公司产品宏汇编程序(MASM )。实验推荐使用宏汇编程序,因为它不但可以代替 ASM ,而且可以汇编具有宏定义的汇编程序。
宏意思是源程序中的一段有独立功能的程序代码
宏指令,用户自定义的指令。编程序时候,将多次使用的功能用一条宏指令来代替。
汇编包括指令 ,伪指令,宏指令。前两个都是规定的,最后一个是你自己设计的。
好处是用起来方便,::))定义就是为了使用,但是要先定义,后调用。
(这一点和子程序可是不一样啊)
例如,宏定义,两个字相乘
multiply MACRO opr1, opr2, result
push dx
push ax
mov ax,opr1
imul opr2
mov result, ax
pop ax
pop dx
ENDM
调用这个宏,
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,好处是节省内存,效率高,
但是因为要保存返回地址,转向地址,时间长,适合长代码,
频繁调用的)
宏调用,在汇编期间被展开,调用一次展开一次。
注:可能有失误之处,请大家指出,另外这是学习的记录
文章引用自: