1
? 宏 汇编
? 重复汇编
? 条件汇编
第七章 高级汇编语言技术
2
1,宏汇编
宏,源程序中一段有独立功能的程序代码。
宏指令,用户自定义的指令。在编程时,将多次
使用的功能用一条宏指令来代替。
汇编语言程序
指令
伪指令 ( 伪操作 )
宏指令
3
宏展开,汇编程序把宏调用展开
宏定义,
macro_name MACRO [哑元表 ] ; 形参 /虚参
[LOCAL 标号表 ]
……
…… ; 宏定义体
ENDM
宏调用,(必须先定义后调用)
macro_name [实元表 ] ; 实参
4
例:保存寄存器
宏展开,
1 push ax
1 push bx
1 push cx
1 push dx
1 push si
1 push di
宏定义,
savereg MACRO
push ax
push bx
push cx
push dx
push si
push di
ENDM
宏调用,
savereg
5
例:两个字相乘
宏定义,
multiply MACRO opr1,opr2,result
push dx
push ax
mov ax,opr1
imul opr2
mov result,ax
pop ax
pop dx
ENDM
宏调用,
multiply cx,var,xyz[bx]
宏展开,
1 push dx
1 push ax
1 mov ax,cx
1 imul var
1 mov xyz[bx],ax
1 pop ax
1 pop dx
6
在 LST文件中看到的宏展开情况
7
例:求绝对值
宏定义,
absol MACRO oper
LOCAL next
cmp oper,0
jge next
neg oper
next,
ENDM
宏调用,
……
absol var
……
absol bx
……
宏展开,
……
1 cmp var,0
1 jge0000
1 neg var
10000,
……
……
1 cmp bx,0
1 jge0001
1 neg bx
10001,
……
8 带 local伪操作的宏展开情况
9
宏汇编操作符,& ;; %
符号 1 & 符号 2
宏展开时,合并前后两个符号形成一个符号 。
;; 注释
宏展开时,;;后面的注释不予展开。
% 表达式
汇编程序将 %后面的表达式转换为数字,并在展开期间
用这个数取代哑元。
10
leap macro cond,lab
j&cond lab
endm
宏定义,
宏调用,
leap z,there
……
leap nz,here
宏展开,
1 jz there
……
1 jnz here
11
宏定义,msg macro lab,num,xyz
lab&num db ‘HELLO MR.&xyz’
endm
宏调用,msg ary,1,wang ……
msg ary,2,zhang
宏展开,
1 ary1 db ‘HELLO MR.wang’
……
1 ary2 db ‘HELLO MR.zhang’
12
宏定义,msg macro count,string
msg&count db string
endm
errmsg macro text
cntr = cntr+1
msg %cntr,text
endm
宏调用,
cntr=0
……
errmsg ‘SYNTAX ERROR’
……
errmsg ‘INVALID OPERAND’
宏展开,
1 cntr = cntr+1
1 msg %cntr,‘SYNTAX ERROR’
2 msg1 db ‘SYNTAX ERROR’
……
1 cntr = cntr+1
1 msg %cntr,‘INVALID OPERAND’
2 msg2 db ‘INVALID OPERAND’
13
列表伪操作,
.LALL, 在 LST清单中列出宏展开后的全部语句 (包括注释 )。
.SALL, 在 LST清单中不列出任何宏展开后的语句 。
.XALL, 省略的列表方式, 只列出产生目标代码的语句 。
14
宏库的建立与调用,; MACRO.MAC macro1 MACRO [哑元表 ] ……
ENDM
macro2 MACRO [哑元表 ]
……
ENDM
……
macroN MACRO [哑元表 ]
……
ENDM; EXP.ASM include 路径 \MACRO.MAC
……
macro1 [实元表 ]
……
macro2 [实元表 ]
……
macroN [实元表 ]
……
purge macroN
15
宏调用与子程序调用的区别,
子程序:在程序执行期间被调用, 只占用自身大小的一段空间 。
宏调用:在汇编期间被展开, 每调用一次就把宏定义体展开一次 。
16
主程序
……
call sub1
……
call sub1
……
call sub1
……
子程序 sub1
……
……
……
ret
17
宏定义,
Q macro x,y
endm
宏调用,
……
Q a,b
……
Q c,d
……
Q e,f
……
宏展开,
……
……
……
……
18
子程序,
优点:模块化,节省内存,可被多次调用,编程效率高。
缺点:额外开销(保存返回地址,计算转向地址,传递参数等)
大,增加了执行时间。适于子功能代码较长、调用比较
频繁的情况。
宏调用,
优点:参数传送简单,执行效率高。
缺点:不节省空间,适于子功能代码较短、传参较多的情况。
19
重复伪操作 REPT
REPT 表达式
…… ;重复块
ENDM
2,重复汇编
用于连续产生完全相同或基本相同的一组代码。
不定 重复伪操作 IRP/IRPC
IRP 哑元, <自变量表 >
…… ;重复块
ENDM
IRPC 哑元,字符串
…… ;重复块
ENDM
20
例,把字符 ‘ A’到 ‘ Z’的 ASCII码填入数组
TABLE
CHAR = ‘A’
TABLE LABEL BYTE
REPT 26
DB CHAR
CHAR = CHAR+1
ENDM
1 DB 61H
1 DB 62H
1 DB 63H
……
1 DB 7AH
汇编后,
21
例,; 宏定义
PUSH_TAB MACRO K
PUSH TAB+k
ENDM; 宏调用
I=0
REP 5
PUSH_TAB %I
I=I+2
ENDM; 宏展开
2 PUSH TAB+0
2 PUSH TAB+2
2 PUSH TAB+4
2 PUSH TAB+6
2 PUSH TAB+8
22
例,
ARRAY LABEL WORD
REPT 7
DW $+2
ENDM
DW ARRAY
1 DW $+2
1 DW $+2
1 DW $+2
1 DW $+2
1 DW $+2
1 DW $+2
1 DW $+2
DW ARRAY
汇编后,
23
IRP REG,<AX,BX,CX,DX>
PUSH REG
ENDM
1 PUSH AX
1 PUSH BX
1 PUSH CX
1 PUSH DX
汇编后,例,
array label byte
IRPC K,12345
db ‘NO.&K’
ENDM
1 db ‘NO.1’
1 db ‘NO.2’
1 db ‘NO.3’
1 db ‘NO.4’
1 db ‘NO.5’
汇编后,
24
3,条件汇编
根据 条件 把一段源程序包括在汇编语言程序内或者排除在外。
IF?? 自变量 ; ??为条件
…… ; 自变量满足条件则汇编此块
[ELSE]
…… ; 自变量不满足条件则汇编此块
ENDIF
一般 格式,
25
IF 表达式
IFE 表达式
IF1
IF2
IFDEF 符号
IFNDEF 符号
IFB <自变量 >
IFNB <自变量 >
IFIDN <字符串 1>,<字符串 2>
IFDIF <字符串 1>,<字符串 2>
26
例:求最大值放入 AX
宏定义,
MAX MACRO K,A,B,C
LOCAL NEXT,OUT
MOV AX,A
IF K-1
IF K-2
CMP C,AX
JLE NEXT
MOV AX,C
ENDIF
NEXT,CMP B,AX
JLE OUT
MOV AX,B
ENDIF
OUT,
ENDM
1 MOV AX,P
10002,CMP Q,AX
1 JLE0003
1 MOV AX,Q
10003,
宏展开,
1 MOV AX,P
10001,
1 MOV AX,P
1 CMP R,AX
1 JLE0004
1 MOV AX,R
10004,CMP Q,AX
1 JLE0005
1 MOV AX,Q
10005,
宏调用,MAX 1,P
MAX 2,P,Q
MAX 3,P,Q,R
27; 宏展开
1 SAL AX,1
2 SAL AX,1
3 SAL AX,1
例:宏定义的递归调用; 宏定义
POWER MACRO X,N
SAL X,1
CNT=CNT+1
IF CNT-N
POWER X,N
ENDIF
ENDM
; 宏调用
CNT=0
POWER AX,3
28
mov ax,dividend
mov bx,divisor
sub cx,cx
comp,
cmp ax,bx
jb out
sub ax,bx
inc cx
jmp comp
out,
mov quotient,cx
endm
divide macro dividend,divisor,quotient
local comp,out
cnt=0
ifndef dividend
cnt=1
endif
ifndef divisor
cnt=1
endif
ifndef quotient
cnt=1
endif
if cnt
exitm
endif
例:除法;宏定义
29;宏调用;宏调用
30
movif macro tag
ifidn <&tag>,<b>
rep movsb
exitm
endif
ifidn <&tag>,<w>
rep movsw
exitm
endif
ifb <tag>
rep movsb
endif
endm
例,宏定义
movif b
movif w
movif
movif a
movif B
宏调用,
31
作业,
p278 7.1 7.3 7.5 7.7
7.9 7.14 7.16 7.17
? 宏 汇编
? 重复汇编
? 条件汇编
第七章 高级汇编语言技术
2
1,宏汇编
宏,源程序中一段有独立功能的程序代码。
宏指令,用户自定义的指令。在编程时,将多次
使用的功能用一条宏指令来代替。
汇编语言程序
指令
伪指令 ( 伪操作 )
宏指令
3
宏展开,汇编程序把宏调用展开
宏定义,
macro_name MACRO [哑元表 ] ; 形参 /虚参
[LOCAL 标号表 ]
……
…… ; 宏定义体
ENDM
宏调用,(必须先定义后调用)
macro_name [实元表 ] ; 实参
4
例:保存寄存器
宏展开,
1 push ax
1 push bx
1 push cx
1 push dx
1 push si
1 push di
宏定义,
savereg MACRO
push ax
push bx
push cx
push dx
push si
push di
ENDM
宏调用,
savereg
5
例:两个字相乘
宏定义,
multiply MACRO opr1,opr2,result
push dx
push ax
mov ax,opr1
imul opr2
mov result,ax
pop ax
pop dx
ENDM
宏调用,
multiply cx,var,xyz[bx]
宏展开,
1 push dx
1 push ax
1 mov ax,cx
1 imul var
1 mov xyz[bx],ax
1 pop ax
1 pop dx
6
在 LST文件中看到的宏展开情况
7
例:求绝对值
宏定义,
absol MACRO oper
LOCAL next
cmp oper,0
jge next
neg oper
next,
ENDM
宏调用,
……
absol var
……
absol bx
……
宏展开,
……
1 cmp var,0
1 jge0000
1 neg var
10000,
……
……
1 cmp bx,0
1 jge0001
1 neg bx
10001,
……
8 带 local伪操作的宏展开情况
9
宏汇编操作符,& ;; %
符号 1 & 符号 2
宏展开时,合并前后两个符号形成一个符号 。
;; 注释
宏展开时,;;后面的注释不予展开。
% 表达式
汇编程序将 %后面的表达式转换为数字,并在展开期间
用这个数取代哑元。
10
leap macro cond,lab
j&cond lab
endm
宏定义,
宏调用,
leap z,there
……
leap nz,here
宏展开,
1 jz there
……
1 jnz here
11
宏定义,msg macro lab,num,xyz
lab&num db ‘HELLO MR.&xyz’
endm
宏调用,msg ary,1,wang ……
msg ary,2,zhang
宏展开,
1 ary1 db ‘HELLO MR.wang’
……
1 ary2 db ‘HELLO MR.zhang’
12
宏定义,msg macro count,string
msg&count db string
endm
errmsg macro text
cntr = cntr+1
msg %cntr,text
endm
宏调用,
cntr=0
……
errmsg ‘SYNTAX ERROR’
……
errmsg ‘INVALID OPERAND’
宏展开,
1 cntr = cntr+1
1 msg %cntr,‘SYNTAX ERROR’
2 msg1 db ‘SYNTAX ERROR’
……
1 cntr = cntr+1
1 msg %cntr,‘INVALID OPERAND’
2 msg2 db ‘INVALID OPERAND’
13
列表伪操作,
.LALL, 在 LST清单中列出宏展开后的全部语句 (包括注释 )。
.SALL, 在 LST清单中不列出任何宏展开后的语句 。
.XALL, 省略的列表方式, 只列出产生目标代码的语句 。
14
宏库的建立与调用,; MACRO.MAC macro1 MACRO [哑元表 ] ……
ENDM
macro2 MACRO [哑元表 ]
……
ENDM
……
macroN MACRO [哑元表 ]
……
ENDM; EXP.ASM include 路径 \MACRO.MAC
……
macro1 [实元表 ]
……
macro2 [实元表 ]
……
macroN [实元表 ]
……
purge macroN
15
宏调用与子程序调用的区别,
子程序:在程序执行期间被调用, 只占用自身大小的一段空间 。
宏调用:在汇编期间被展开, 每调用一次就把宏定义体展开一次 。
16
主程序
……
call sub1
……
call sub1
……
call sub1
……
子程序 sub1
……
……
……
ret
17
宏定义,
Q macro x,y
endm
宏调用,
……
Q a,b
……
Q c,d
……
Q e,f
……
宏展开,
……
……
……
……
18
子程序,
优点:模块化,节省内存,可被多次调用,编程效率高。
缺点:额外开销(保存返回地址,计算转向地址,传递参数等)
大,增加了执行时间。适于子功能代码较长、调用比较
频繁的情况。
宏调用,
优点:参数传送简单,执行效率高。
缺点:不节省空间,适于子功能代码较短、传参较多的情况。
19
重复伪操作 REPT
REPT 表达式
…… ;重复块
ENDM
2,重复汇编
用于连续产生完全相同或基本相同的一组代码。
不定 重复伪操作 IRP/IRPC
IRP 哑元, <自变量表 >
…… ;重复块
ENDM
IRPC 哑元,字符串
…… ;重复块
ENDM
20
例,把字符 ‘ A’到 ‘ Z’的 ASCII码填入数组
TABLE
CHAR = ‘A’
TABLE LABEL BYTE
REPT 26
DB CHAR
CHAR = CHAR+1
ENDM
1 DB 61H
1 DB 62H
1 DB 63H
……
1 DB 7AH
汇编后,
21
例,; 宏定义
PUSH_TAB MACRO K
PUSH TAB+k
ENDM; 宏调用
I=0
REP 5
PUSH_TAB %I
I=I+2
ENDM; 宏展开
2 PUSH TAB+0
2 PUSH TAB+2
2 PUSH TAB+4
2 PUSH TAB+6
2 PUSH TAB+8
22
例,
ARRAY LABEL WORD
REPT 7
DW $+2
ENDM
DW ARRAY
1 DW $+2
1 DW $+2
1 DW $+2
1 DW $+2
1 DW $+2
1 DW $+2
1 DW $+2
DW ARRAY
汇编后,
23
IRP REG,<AX,BX,CX,DX>
PUSH REG
ENDM
1 PUSH AX
1 PUSH BX
1 PUSH CX
1 PUSH DX
汇编后,例,
array label byte
IRPC K,12345
db ‘NO.&K’
ENDM
1 db ‘NO.1’
1 db ‘NO.2’
1 db ‘NO.3’
1 db ‘NO.4’
1 db ‘NO.5’
汇编后,
24
3,条件汇编
根据 条件 把一段源程序包括在汇编语言程序内或者排除在外。
IF?? 自变量 ; ??为条件
…… ; 自变量满足条件则汇编此块
[ELSE]
…… ; 自变量不满足条件则汇编此块
ENDIF
一般 格式,
25
IF 表达式
IFE 表达式
IF1
IF2
IFDEF 符号
IFNDEF 符号
IFB <自变量 >
IFNB <自变量 >
IFIDN <字符串 1>,<字符串 2>
IFDIF <字符串 1>,<字符串 2>
26
例:求最大值放入 AX
宏定义,
MAX MACRO K,A,B,C
LOCAL NEXT,OUT
MOV AX,A
IF K-1
IF K-2
CMP C,AX
JLE NEXT
MOV AX,C
ENDIF
NEXT,CMP B,AX
JLE OUT
MOV AX,B
ENDIF
OUT,
ENDM
1 MOV AX,P
10002,CMP Q,AX
1 JLE0003
1 MOV AX,Q
10003,
宏展开,
1 MOV AX,P
10001,
1 MOV AX,P
1 CMP R,AX
1 JLE0004
1 MOV AX,R
10004,CMP Q,AX
1 JLE0005
1 MOV AX,Q
10005,
宏调用,MAX 1,P
MAX 2,P,Q
MAX 3,P,Q,R
27; 宏展开
1 SAL AX,1
2 SAL AX,1
3 SAL AX,1
例:宏定义的递归调用; 宏定义
POWER MACRO X,N
SAL X,1
CNT=CNT+1
IF CNT-N
POWER X,N
ENDIF
ENDM
; 宏调用
CNT=0
POWER AX,3
28
mov ax,dividend
mov bx,divisor
sub cx,cx
comp,
cmp ax,bx
jb out
sub ax,bx
inc cx
jmp comp
out,
mov quotient,cx
endm
divide macro dividend,divisor,quotient
local comp,out
cnt=0
ifndef dividend
cnt=1
endif
ifndef divisor
cnt=1
endif
ifndef quotient
cnt=1
endif
if cnt
exitm
endif
例:除法;宏定义
29;宏调用;宏调用
30
movif macro tag
ifidn <&tag>,<b>
rep movsb
exitm
endif
ifidn <&tag>,<w>
rep movsw
exitm
endif
ifb <tag>
rep movsb
endif
endm
例,宏定义
movif b
movif w
movif
movif a
movif B
宏调用,
31
作业,
p278 7.1 7.3 7.5 7.7
7.9 7.14 7.16 7.17