masm汇编之——过程与宏的区别

时间:2022-11-02 19:24:08

定义方法

宏格式:

宏指令名    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

区别

汇编代码
很明显,使用宏要比使用过程简洁的多。
但实际上:
生成的可执行文件:宏>过程
由于宏在每次使用时先替换,再生成机器码。
而过程生成一次机器码,每次使用只是进行跳转
程序运行速度:宏>过程
因为没有跳转,所以宏运行的快。

所以说,宏是一种以空间换时间的做法。