0%

第五章_高级汇编程序设计

宏汇编

宏定义

1
2
3
宏名	macro [形参表]
宏定义体
endm

宏调用

1
宏名	[实参表]

宏展开

宏展开——在汇编时,用宏定义体的代码序列替代宏指令的过程。


举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
;宏定义
shlext macro shloprand,shlnum
push cx
mov cl,shlnum
shl shloprand,cl
pop cx
endm
;宏指令
shlext ax,6
;宏展开
1 push cx
1 mov cl,06
1 shl ax,cl
1 pop cx

宏操作符

连接操作符&

含义

宏展开时,对应形参的实参就与它前后的符号连接在一起


举例:

1
2
3
4
5
6
7
8
【例1】连接符&的使用:
SHIFT_VAR MARCO R_M,DIRECT,COUNT
MOV CL,COUNT
S&DIRECT R_M,CL
ENDM
SHIFT_VAR AX,HL,2的宏展开为:
+ MOV CL,2
+ SHL AX,CL

表达式操作符%

含义

告诉宏汇编程序获取表达式的值,而不是获取表达式文本本身

注意:这个操作符一般是出现在宏调用中,不允许出现在形参的前面。


举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
;宏定义
SHIF0 MACRO CNT
MOV CL,CNT
ENDM
SHIF1 MACRO REG,DIRECT,NUM
COUNT=NUM
SHIF0 %COUNT
S&DIRECT REG,CL
ENDM
;宏调用
SHIF1 AX,HL,2
SHIF1 BL,AR,3
;宏展开
SHIF1 AX,HL,2
+ MOV CL,2
+ SHL AX,CL
SHIF1 BL,AR,3
+ MOV CL,3
+ SAR BL,CL

文本操作符<>

含义

把一个完整的实参括起来,作为一个单一的实参

注意:文本操作符还可以用来处理某些特殊字符:如“;”和“&”。

例:<;>就表示一个分号“;”的实参,而不是注释符。


举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
例3
; 宏定义
EXCHANGE MACRO ADR1,ADR2,AL
MOV AL,ADR1
XCHG AL,ADR2
MOV ADR2,AL
ENDM
; 宏调用
EXCHANGE <BYTE PTR DA_WORD1>,<BYTE PTR DA_WORD2>,AL
;宏展开时,替换的三条指令是:
MOV AL,BYTE PTR DA_WORD1
XCHG AL,BYTE PTR DA_WORD2
MOV BYTE PTR WORD1,AL

字符操作符!

含义

相当于C语言中转义字符

宏注解符;;

含义

说明后面文字是注解,仅出现在宏定义中

LOCAL伪指令(重要)

含义

在宏定义中使用变量名和标号,为了避免在宏展开时产生多个相同的变量名或标号。

宏展开时,LOCAL伪指令指定的变量、标号自动生成格式为“??ⅩⅩⅩⅩ”的符号,其中后四位顺序使用0000~FFFF的十六进制数字。


举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
【例5】用连续相加的办法实现无符号数乘法运算,编制宏定义MULTIP
MULTIP MACRO MULT1,MULT2,MULT3
LOCAL LOP,EXIT0
MOV DX,MULT1 ;乘数1
MOV CX,MULT2 ;乘数2
XOR BX,BX
XOR AX,AX
JCXZ EXIT0
LOP:ADD BX,DX
ADC AX,0
LOOP LOP
EXIT0:MOV MULT3,BX
MOV MULT3+2,AX
ENDM
设某数据段有如下定义的变量:
DA1 DW 1234H,5678H
DA2 DW 120H,210H
DA3 DW 4 DUP(?)
在代码段中:如有两次宏调用,则两次的宏展开如下:

MULTIP DA1,DA2,DA3
+ MOV DX,DA1
+ MOV CX,DA2
+ XOR BX,BX
+ XOR AX,AX
+ JCXZ ?? 0001
+??0000:ADD BX,DX
+ ADC AX,0
+ LOOP ??0000
+??0001:MOV DA3,BX
+ MOV DA3+2,AX


MULTIP DA1+2,DA2+2,DA3+4

+ MOV DX,DA1+2
+ MOV CX,DA2+2
+ XOR BX,BX
+ XOR AX,AX
+ JCXA ??0003
+??0002:ADD BX,DX
ADC AX,0
LOOP ??0002
+??0003:MOV DA3+4,BX
+ MOV DA3+6,AX


重复汇编

定义

  1. 重复汇编常用在宏定义体中,也可以在一般汇编语句中使用

  2. 重复汇编伪指令有三个:

    REPEAT——按参数值重复

    FOR——按参数个数重复

    FORC——按参数的字符个数重复

  3. 最后,用ENDM结束

按参数值重复

定义

1
2
3
REPEAT  重复次数
重复体
ENDM

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
; 宏定义
char = 'A'
REPEAT 26
db char
char = char +1
ENDM
; 宏展开
1 db char ;等效于db 'A'
1 char = char +1
1 db char ;等效于db 'B'
1 char = char +1
...
1 db char ;等效于db 'Z'
1 char = char +1

按参数个数重复

定义

1
2
3
FOR  形参,〈实参表〉
重复体
ENDM

举例:

1
2
3
4
5
6
7
8
9
10
; 宏定义
FOR regad, <ax,bx,cx,dx>
push regad
ENDM
; 宏展开
1 push ax
1 push bx
1 push cx
1 push dx


按参数字符个数重复

定义

1
2
3
FORC  形参, 字符串
重复体
ENDM

举例:

1
2
3
4
5
6
7
8
9
; 宏定义
FORC regad,dcba
pop &regad&x
ENDM
; 宏展开
1 pop dx
1 pop cx
1 pop bx
1 pop ax

条件汇编

定义

1
2
3
4
5
IFxx 表达式	;满足,汇编分支语句体1
分支语句体1
ELSE ;不满足,汇编分支语句体2
分支语句体2
ENDIF ;条件汇编结束

举例:

1
2
3
4
5
6
7
8
9
pdata	macro	num
IF num lt 100 ;;如果num < 100,则汇编如下语句
db num dup (?)
ELSE ;;否则,汇编如下语句
db 100 dup (?)
ENDIF
endm
pdata 12 ;宏调用①
pdata 102 ;宏调用②