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

来源:互联网 发布:广西干部网络培训平台 编辑:程序博客网 时间:2024/06/07 22:47

定义方法

宏格式:

宏指令名    MACRO 形参        ·        ·        ·        (宏定义体)        ENDM

调用 宏名[形参]
作用:MASM.EXE会将调用到宏的地方用宏定义体完全替换。定义宏的地方不会生成机器码。
过程格式:

过程名 PROC [NEAR/FAR]        ·        ·        ·        RET        ·        ·        ·过程名     ENDP

调用:call 过程名
注:过程不能传递参数
作用:定义过程的地方会生成机器码。

来个实例

拿9号功能调用来做一个对比。

9号功能调用

作用>
输出一串字符
实例>
a.asm

;9号功能调用演示data    segment        str db "this is a string.$"data    endscode    segmentassume  cs:code,ds:datastart:    mov ax,data    mov ds,ax    lea dx,str    mov ah,9    int 21h    mov ah,4ch    int 21hcode    ends    end start

执行结果

a.EXEthis 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    endscode    segmentassume cs:code, ds:datastart:  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 21hprintf  proc    mov ah, 9    int 21h    retprintf  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    endscode    segmentassume cs:code, ds:datastart:  mov ax, data    mov ds, ax    printf str1    printf str2    printf str3    mov ah, 4ch    int 21hcode    ends    end start

区别

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

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

原创粉丝点击