什么是宏指令?
宏指令在汇编阶段展开,不是运行时调用。它相当于代码模板替换。
基本语法
1
2
3
4
5
6
7
8
|
PRINTSTR MACRO msg
MOV DX, OFFSET msg
MOV AH, 09h
INT 21h
ENDM
; 使用
PRINTSTR HELLO_MSG
|
展开后等价于:
1
2
3
|
MOV DX, OFFSET HELLO_MSG
MOV AH, 09h
INT 21h
|
带参数宏
1
2
3
4
5
6
7
|
ADD2 MACRO dest, src1, src2
MOV dest, src1
ADD dest, src2
ENDM
; 使用
ADD2 AX, BX, CX
|
局部标号
1
2
3
4
5
6
7
|
MYMACRO MACRO
LOCAL skip
CMP AX, 0
JE skip
; do something
skip:
ENDM
|
LOCAL 确保宏多次展开时标号不冲突。
条件汇编
1
2
3
4
5
6
7
8
9
|
DEBUG EQU 1
IF DEBUG
PRINTSTR "Debug mode ON
$"
ELSE
PRINTSTR "Release mode
$"
ENDIF
|
循环展开
1
2
3
4
5
6
7
8
|
UNROLL_LOOP MACRO count, label
LOCAL i
i = 0
REPEAT count
CALL label
i = i + 1
ENDM
ENDM
|
宏 vs 子程序
| 特性 |
宏 |
子程序 |
| 展开时机 |
汇编时 |
运行时 |
| 代码体积 |
每次展开复制代码 |
只有一份代码 |
| 执行速度 |
快(无调用开销) |
稍慢(CALL/RET) |
| 适用场景 |
短小频繁的代码 |
复杂逻辑 |
总结
宏指令让汇编也能实现"代码生成"。合理运用宏和条件汇编,你的代码会简洁数倍。
下一篇:《DOS 中断调用实战:INT 21h 文件/键盘/显示操作》