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

定义方法

宏格式:

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

区别

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

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

你可能感兴趣的:(汇编)