第7节 高级汇编语言技术
推荐给好友
打印
加入收藏
更新于2009-06-01 11:02:55

7.1 宏指令

在汇编语言程序设计过程中,可以将具有一定功能,需多次重复使用,且比较短的程序段定义成一条宏指令。
使用宏指令语句可以减少程序书写错误,缩短源程序长度,使源程序编写像高级语言一样清晰、简洁。特别是使用宏库后,可以提高编程效率。

7.2 宏指令的使用过程

1.宏定义
(1)带参宏定义
宏指令名 MACRO 形参1,形参2,……
 宏体
 ENDM
(2)无参宏定义
宏指令 MACRO
宏体
ENDM

2.宏调用
格式:
宏指令名 [实参1,实参2,……]
例如:对上面的宏定义的三种调用形式为:

PRINT BUF1

PRINT BUF2

PRINT BUF3


3.宏扩展
例如:上面三次宏调用,其展开的形式为:

+ LEA DX,BUF1
+ MOV AH,9
+ INT 21H

+ LEA DX,BUF2
+ MOV AH,9
+ INT 21H

+ LEA DX,BUF3
+ MOV AH,9
+ INT 21H


7.3 宏操作符

1.文本操作符
【例4.19】在程序中定义大小及初值不同的堆栈段。
可用如下宏定义:
DSTACK  MACRO A
STACK     SEGMENT STACK
                  DB A
STACK     ENDS 
                  ENDM

【例4.20】表达符操作%示例。
DATA1 MACRO A, B, C, D
             DW A, B, C
             DB D DUP(0)
             ENDM
如果宏调用为:
X=10
Y=20
DATA1       %X+2, 5,%X+Y, %Y-5
DATA1        X+2, 5, X+Y, Y-5
则相应的宏扩展为:
+ DW 12, 5, 30
+ DB 15 DUP(0)
+ DW X+2, 5, X+Y
+ DB Y-5 DUP (0)

7.4 局部符号伪指令LOCAL

【例4.21】局部符号伪指令LOCAL应用。
SUM    MACRO X,Y 
             LOCAL L
            MOV CX,X
            MOV BX,Y
            MOV AX,0
L:      ADD AX,BX
             INC BX 
             LOOP L
             ENDM
如果两次调用宏指令如下:

SUM 100,1

SUM 50,1

则宏扩展形式为:

MOV CX,100
MOV BX,1
MOV AX,0
??0000: ADD AX,BX
                        INC BX 
                        LOOP ??0000
                       ┆
                       MOV CX,50
                       MOV BX,10 
                       MOV AX,0
??0001: ADD AX,BX 
                       INC BX
                       LOOP ??0001
                       ┆

7.5 宏库的使用

语句格式:INCLUDE 库文件名
假设已建立一名为MACRO.LIB的宏库,其内容如下:
INPUT     MACRO A 
                 LEA DX,A 
                 MOV AH,10 ;10号系统功能调用 
                 INT 21H 
                 ENDM
PRINT      MACRO A 
                 LEA DX,A 
                 MOV AH,9 ;9号系统功能调用 
                 INT 21H 
                 ENDM
RETURN MACRO 
                 MOV AH,2 
                 MOV DL,0AH 
                 INT 21H 
                 MOV DL,0DH ;回车换行 
                 INT 21H 
                 ENDM
OUT2      MACRO A 
                 MOV DL,A 
                 MOV AH,2 ;2号系统功能调用 
                 INT 21H 
                 ENDM
STACK0  MACRO A
STACK     SEGMENT STACK 
                 DB    A
STACK    ENDS
ENDM

现要从键盘输入一串字符到系统缓冲区,然后将字符按相反顺序打印,采用调用宏库的办法,其程序如下:
INCLUDE    MACRO.LIB
STACK0     〈200 DUP (0) 〉 ;定义堆栈段
DATA             SEGMENT
INF01            DB ‘INPUT STRING:$’
INF02            DB ‘OUTPUT STRING:$’
BUFA             DB 81
                       DB ?
                       DB 80 DUP(0)
BUFB            DB 81 DUP(0)
                       DATA ENDS
CODE SEGMENT
                        ASSUME DS:DATA,SS:STACK,CS:CODE
START:      MOV AX,DATA
                       MOV DS,AX 
                       RETURN ;输出回车换行 
                       PRINT INFO1 ;输出字符变量INFO1 代表的字符串 
                       INPUT BUFA ;键盘输入字符中到缓冲区; 
                       LEA SI,BUFA+1 
                       MOV CH,0 
                       MOV CL,[SI] 
                       ADD SI,CX 
                       LEA DI,BUFB
NEXT: MOV AL,[SI] 
                       MOV [DI],AL 
                       DEC SI 
                       INC DI 
                       LOOP NEXT 
                       MOV BYTE PTR [DI],‘$’
RETURN ;输出回车换行 
                       PRINT INF02 ;输出的字符串变量INF02代表 
                       PRINT BUFB ;反向输出输入字符串 
                       MOV AH,4CH 
                       INT 21H 
                       CODE ENDS
END START

7.6 重复汇编

1.给定次数的重复汇编伪指令
语句格式:REPT 表达式
重复块
ENDM
功能:宏汇编程序将重复块连续地汇编表达式给定的次数。
2.不定次数的重复汇编伪指令,有IRP和IRPC两种伪指令。

【例4.22】某一源程序需要多次将AX,BX,CX,DX寄存器的内容压入堆栈,则可定义如下宏指令。
PUSHR MACRO
               IRP REG,〈AX,BX,CX,DX〉
               PUSH REG
               ENDM
               ENDM
调用上述宏定义后,将展开成下列语句:
+ PUSH AX
+ PUSH BX
+ PUSH CX
+ PUSH DX
又如:
IR PW,〈1122H,3344H,5566H,7788H〉
DW W
ENDM
汇编程序在汇编时将产生语句:
+ DW 1122H,3344H,5566H,7788H。
(2)IRPC
语句格式:IRPC 形参,字符串
重复块
ENDM

7.7 条件汇编

条件汇编指在汇编期间,宏汇编程序根据条件是否成立决定具体汇编哪一程序段。条件汇编用条件汇编伪指令来定义。如表4.1所示。
语句格式:IF ×× 表达式
条件块1
[ELSE
条件块2]
ENDIF


【例4.25】试用条件汇编编写一宏定义,能完成多种DOS系统功能调用。
源程序如下:
DOSYS MACRO N,BUF
               IFE N 
               EXITM 
               ENDIF 
               IFDEF BUF 
               LEA DX,BUF 
               MOV AH,N 
               INT 21H 
               ELSE 
MOV       AH,N 
               INT 21H 
               ENDIF 
               ENDM 
               ;…………………………
DATA      SEGMENT 
MSG        DB ‘INPUT STRING:$’ 
BUF         DB 81,0,80 DUP(0)
DATA       ENDS
STACK    SEGMENT STACK
DB            200 DUP(0)
STACK     ENDS
CODE      SEGMENT
                  ASSUME DS:DATA,CS:CODE,SS:STACK
BEGIN: MOV AX,DATA
                  MOV DS,AX 
                  DOSYS 9,MSG 
                  DOSYS 10 ,BUF 
                  DOSYS 4CH 
                  CODE ENDS
END START

则以上三条宏指令展开后的语句为:

+ LEA DX,MSG
+ MOV AH,9
+ INT 21H
+ LEA DX,BUF
+ MOV AH,10
+ INT 21H
+ MOV AH,4CH
+ INT 21H

 

上一节                    下一节

相关链接


 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.