定义方法
宏格式:
宏指令名 MACRO 形参
·
·
·
(宏定义体)
ENDM
调用 宏名[形参]
作用:MASM.EXE会将调用到宏的地方用宏定义体完全替换。定义宏的地方不会生成机器码。
过程格式:
过程名 PROC [NEAR/FAR]
·
·
·
RET
·
·
·
过程名 ENDP
调用:call 过程名
注:过程不能传递参数
作用:定义过程的地方会生成机器码。
来个实例
拿9号功能调用来做一个对比。
9号功能调用
作用>
输出一串字符
实例>
a.asm
;9号功能调用演示
data segment
str db "this is a string.$"
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
lea dx,str
mov ah,9
int 21h
mov ah,4ch
int 21h
code ends
end start
执行结果
a.EXE
this is a string.
定义一个打印字符的过程
;函数
data segment
str1 db "this is str1$"
str2 db 0ah, 0dh, "this is str2$"
str3 db 0ah, 0dh, "this is str3$"
data ends
code segment
assume cs:code, ds:data
start: mov ax, data
mov ds, ax
lea dx, str1
call printf
lea dx, str2
call printf
lea dx, str3
call printf
mov ah, 4ch
int 21h
printf proc
mov ah, 9
int 21h
ret
printf endp
code ends
end start
定义一个打印的宏
;宏
printf macro x
lea dx, x
mov ah, 9
int 21h
endm
data segment
str1 db "this is str1$"
str2 db 0ah, 0dh, "this is str2$"
str3 db 0ah, 0dh, "this is str3$"
data ends
code segment
assume cs:code, ds:data
start: mov ax, data
mov ds, ax
printf str1
printf str2
printf str3
mov ah, 4ch
int 21h
code ends
end start
区别
汇编代码
很明显,使用宏要比使用过程简洁的多。
但实际上:
生成的可执行文件:宏>过程
由于宏在每次使用时先替换,再生成机器码。
而过程生成一次机器码,每次使用只是进行跳转
程序运行速度:宏>过程
因为没有跳转,所以宏运行的快。
所以说,宏是一种以空间换时间的做法。