?第 4章 程序设计方法
第 4章 程序设计方法
4.1 概述
4.2 顺序程序设计
4.3 分支程序设计
4.4 循环程序设计
4.5 子程序设计
4.6 模块化程序设计
4.7 高级汇编语言技术
开 始
?第 4章 程序设计方法
4.1 概述
4.1.1 汇编语言程序设计的一般步骤
4.1.2 流程图
返回本章首页
?第 4章 程序设计方法
4.1.1 汇编语言程序设计的一般步骤
汇编语言程序设计一般有以下几个步骤:
1.分析问题,确定算法
2.绘制流程图
3,根据流程图编制程序
4,调试程序
返回本节
?第 4章 程序设计方法
4.1.2 流程图
1,流程图的概念
流程图是由特定的几何图形, 指向线, 文字说明
来表示数据处理的步骤, 形象描述逻辑控制结构
以及数据流程的示意图 。 流程图具有简洁, 明了,
直观的特点 。
2.流程图符号表示
( 1)起止框:表示程序
的开始和结束。
?起止框
?第 4章 程序设计方法
( 2)判断框
( 3)处理框
( 4)调用框
?第 4章 程序设计方法
( 5)指向线
( 6)连接框
返回本节
?第 4章 程序设计方法
4.2 顺序程序设计
下面举例说明顺序程序的设计 。
【 例 4.1】 试编写一程序计算以下表达式的值 。
w =( v-( x *y +z -540)) /x
式中 x,y, z, v均为有符号字数据 。
设x, y, z, v的值存放在字变量X, Y, Z, V中,
结果存放在双字变量W之中, 程序的流程图如图 4.1
所示 。
返回本章首页
?第 4章 程序设计方法
?

4.
1









?第 4章 程序设计方法
源程序如下:
DATA SEGMENT
X DW 200
Y DW 100
Z DW 3000
V DW 10000
W DW 2 DUP(? )
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP( 0)
STACK ENDS
CODE SEGMENT
ASSUME DS,DATA,CS,CODE,SS,STACK
?第 4章 程序设计方法
START,MOV AX,DATA
MOV DS,AX ; DATA→ AX
MOV AX,X
IMULY ; ( X) *( Y) → DX,AX
MOV CX,AX
MOV BX,DX ; ( DX,AX) → ( BX,CX)
MOV AX,Z
CWD; ( Z) 符号扩展
ADD CX,AX
ADC BX,DX ; ( BX,CX) +( DX,AX) → ( BX,CX)
SUB CX,540
SBB BX,0 ; ( BX,CX) -540→ ( BX,CX)
MOV AX,V
?第 4章 程序设计方法
CWD ; ( V) 符号扩展
SUBAX,CX
SBBDX,BX ; ( DX,AX) -( BX,CX) → ( DX:
AX)
IDIV X ; ( DX,AX) /X
MOV W,AX ;商 → W
MOV W+2,DX ;余数 DX→ W+2
MOV AH,4CH
INT 21H
CODE ENDS ;退出 DOS 状态
ENDSTART
?第 4章 程序设计方法
【 例 4.2】
【 例 4.2】 已知某班学生的英语成绩按学号 ( 从
1开始 ) 从小到大的顺序排列在 TAB表中, 要
查的学生的学号放在变量 NO中, 查表结果放
在变量 ENGLISH中 。 编写程序如下:
?第 4章 程序设计方法
STACKSEGMENT STACK
DB 200 DUP( 0)
STACKENDS
DATA SEGMENT
TAB DB 80,85,86,71,79,96
DB 83,56,32,66,78。 84
NO DB 10
ENGLIST DB?
DATA ENDS
CODE SEGMENT
?第 4章 程序设计方法
ASSUME DS,DATA,SS,STACK,CS,CODE
BEGIN,MOV AX,DATA
MOV DS, AX
LEA BX,TAB
MOV AL,NO
DEL AL
XLAT TAB
MOV ENGLISH,AL
MOV AH,4CH
INT 21H
CODE ENDS
END BEGIN
?第 4章 程序设计方法
4.3 分支程序设计
4.3.1 用条件转移指令实现程序分支
4.3.2 用跳转表实现多路分支
返回本章首页
?第 4章 程序设计方法
4.3.1 用条件转移指令实现程序分支
【 例 4.3】 编写计算下面函数值的程序:
1 X> 0
Y= 0 X=0
-1 X
设输入数据为 X,输出数据 Y,且皆为字节变量 。 程序
流程图如图 4.2所示 。
程序如下:
?第 4章 程序设计方法
DATA SEGMENT
X DB -10
Y DB?
DATA ENDS
STACKSEGMENT STACK
DB 200 DUP( 0)
STACKENDS
CODE SEGMENT
ASSUME DS,DATA,SS,STACK,CS,CODE
START,MOV AX,DATA
?第 4章 程序设计方法
MOV DS,AX
CMP X,0 ;与 0进行比较
JGE A1 ; X≥0转 A1
MOV Y,-1 ; X < 0时, -1→ Y
JMP EXIT
A1,JG A2 ; X> 0转 A2
MOV Y,0 ; X=0时, 0→ Y
JMP EXIT
A2,MOV Y,1 ; X> 0,1→ Y
EXIT,MOV AH,4CH
INT 21H
CODE ENDS
END START
?第 4章 程序设计方法
MOV DS,AX
CMP X,0 ;与 0进行比较
JGE A1 ; X≥0转 A1
MOV Y,-1 ; X < 0时, -1→ Y
JMP EXIT
A1,JG A2 ; X> 0转 A2
MOV Y,0 ; X=0时, 0→ Y
JMP EXIT
A2,MOV Y,1 ; X> 0,1→ Y
EXIT,MOV AH,4CH
INT 21H
CODE ENDS
END START
?第 4章 程序设计方法
?图 4.2 分支运算 程序流程图
?第 4章 程序设计方法
【 例 4.4】
【 例 4.4】 试编一程序, 求三个带符号字数
据中的最大值, 并将最大值存入 MAX字单
元中 。
设三个带符号数分别在三个字变量 X,Y、
Z中存储。程序流程图如图 4.3所示
?第 4章 程序设计方法
图 4.3 [例 4.4]程序流程图
?第 4章 程序设计方法
程序如下:
STAC SEGMENT STACK
DB 200 DUP( 0)
STACKENDS
DATA SEGMENT
X DW 00ABH
Y DW –5
Z DW 200
MAX DW?
DATA ENDS
CODE SEGMENT
?第 4章 程序设计方法
ASSUME DS,DATA,SS,STACK,CS,CODE
START,MOV AX,DATA
MOV DS,AX
MOV AX,X
CMP AX,Y ; X> Y?
JG L1
MOV AX,Y ; Y> Z?
CMP AX,Z
JG EXIT
L2,MOV AX,Z
JMP EXIT
?第 4章 程序设计方法
L1,CMP AX,Z ; X> Z?
JLE L2
EXIT,MOV MAX,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
返回本节
?第 4章 程序设计方法
4.3.2 用跳转表实现多路分支
【 例 4.5】 设某程序有 8路分支, 试根据给定的
N值 ( 1~8), 将程序的执行转移到其中的一
路分支 。
程序流程如图 4.4所示。
?第 4章 程序设计方法
?第 4章 程序设计方法
程序如下:
DATA SEGMENT
TAB DW P1,P2,P3,P4,P5,P6,P7,P8
N DB 5
DATA ENDS
STACKSEGMENT
DB 200 DUP( 0)
STACKENDS
CODE SEGMENT
ASSUME DS,DATA,SS,STACK,CS,CODE
?第 4章 程序设计方法
START,MOV AX,DATA
MOV DS,AX

MOV AL,N
DEL AL
ADD AL,AL
MOV BM,AL
MOV BH,0
JMP TAB[BX]
?第 4章 程序设计方法
P1,……

JMP EXIT
P2,……

JMP EXIT
P2,……

JMP EXIT
P3,……

?第 4章 程序设计方法
JMP EXIT

P8,……

EXIT,MOV AH,4CH
INT 21H
CODE ENDS
END START
上述程序中的无条件转移指令的转移地址采用的
是变址寻址 。 同理, 转移地址也可以用寄存器间接寻
址或基址加变址寻址, 读者可自行考虑 。
返回本节
?第 4章 程序设计方法
4.4 循环程序设计
4.4.1 循环程序的结构
4.4.2 单重循环程序设计
4.4.3 多重循环程序设计
返回本章首页
?第 4章 程序设计方法
4.4.1 循环程序的结构
1,初始化部分
2,循环体部分
3,循环控制部分
?第 4章 程序设计方法
循环程序的常见结构形式如图 4.5( a)、( b)所示。
返回本节
?第 4章 程序设计方法
4.4.2 单重循环程序设计
1,计数控制
2,条件控制
?第 4章 程序设计方法
1.计数控制
【 例 4.7】 已知有几个元素存放在以 BUF为首址
的字节存贮区中, 试统计其中正元素的个数 。
显然, 每个元素为一个 8位有符号二进制数,
统计其中正元素的个数可用循环程序实现 。
其程序流程图如图 4.6所示 。
?第 4章 程序设计方法
?

4.
6





?第 4章 程序设计方法
【 例 4.8】
【 例 4.8】 试编写一程序, 要求比较两个字符串
STR1和 STR所含字符是否相同, 若相同则显
示 ‘ MATCH! ’, 若不相同则显示 ‘ NO
MATCH! ’ 。 (程序略 )
其流程图如图 4.7所示。
?第 4章 程序设计方法
?

4.
7





?第 4章 程序设计方法
【 例 4.9】 试编一个程序将字单元 BUF中所含 1的
个数存入 COUNT单元中 。 要测出 BUF字单元所
含 1的个数, 首先将 BUF中的数送给寄存器 AX,
然后将 AX寄存器逻辑左移一次, 如果 CF=1,
则表明 AX中的最高位为 1,则计数器 CL计数 1
次, 如果 CF=0,表明 AX最高位为 0,这样依次
将最高位移入 CF中去测试 。 移位之后, 判断
AX的值是否为 0,如果为 0则结束循环, 不为 0,
则继续循环 。
其流程图如图 4.8所示 。
2.条件控制
?第 4章 程序设计方法
?第 4章 程序设计方法
程序如下:
STACKSEGMENT STACK
DB 200 DUP( 0)
STACKEDNS
DATA SEGMENT
BUF DW 0011110010101011B
COUNTDB?
DATA ENDS
CODE SEGMENT
ASSUME DS,DATA,CS,CODE,SS,STACK
?第 4章 程序设计方法
START,MOV AX,DATA
MOV DS,AX
MOV AX,BUF
MOV CL,0 ;计数器为 0
COPA,AND AX,AX
JE EXIT ; ( AX) =0,结束循环
SHL AX,1 ; AX 左移一位
JNC LOPA
INC CL ;产生进位, ( CL) +1→ CL
JMP LOPA
EXIT,MOV COUNT,CL
MOV AH,4CH
INT 21H
CODE ENDS
END START 返回本节
?第 4章 程序设计方法
4.4.3 多重循环程序设计
【 例 4.10】 在以 BUF为首址的字存储区中存放有 N个有符
号数, 现需将它们按大到小的顺序排列在 BUF存储区
中, 试编写其程序 。
我们采用冒泡排序算法从第一个数开始依次对相邻
两个数进行比较, 如次序对, 则不交换两数位置;
如次序不对则使这两个数交换位置 。 可以看出, 第
一遍需比较 ( N-1) 次, 此时, 最小的数已经放到了
最后;第二遍比较只需考虑剩下的 ( N-1) 个数, 即
只需比较 ( N-2) 次;第三遍只需比较 ( N-3)
次, …… 整个排序过程最多需 ( N-1) 遍 。 如下面的
4个数即是采用冒泡排序比较的例子 。
?第 4章 程序设计方法
数 10 8 16 90 32
第一遍 10 16 90 32 8
第二遍 16 90 32 10 8
第三遍 90 32 16 10 8
程序流程图如图 4.9所示 。
?第 4章 程序设计方法
?第 4章 程序设计方法
程序如下:
DATA SEGMENT
BUF DW 3,-4,6,7,9,2,0,-8,-9,-10,20
N=( $ -BUF) /2
DATA ENDS
STACK SEGNMENT STACK
DB 200 DUP( 0)
STACK ENDS
CODE SEGMENT
ASSUME CS,CODE,DS,DATA,SS,STACK
?第 4章 程序设计方法
START,MOV AX,DATA
MOV DS,AX
MOV CX,N
DEC CX
LOOP1,MOV DX,CX
MOV BX,0
LOOP2,MOV AX,BUF[BX]
CMP AX,BUF[BX+2]
JGE L
XCHG AX,BUF[BX+2]
MOV BUF[BX],AX
?第 4章 程序设计方法
L,ADD BX,2
DEC CX
JNE LOOP2
MOV CX,DX
LOOP LOOP1
MOV AH,4CH
INT 21H
CODE ENDS
END START
?第 4章 程序设计方法
程序运行后, BUF区中的内容如下:
20,9,7,6,3,2,0,-4,-8,-9,-10
若要对 N个无符号数按由大到小的顺序排列,
只需将指令,JGE L”改为,JAE L”即可。
返回本节
?第 4章 程序设计方法
4.5 子程序设计
4.5.1 子程序的概念
4.5.2 子程序的定义
4.5.3 子程序设计方法
4.5.4 子程序应用举例
4.5.5 子程序的嵌套与递归调用
返回本章首页
?第 4章 程序设计方法
4.5.1 子程序的概念
在程序设计中, 我们会发现一些多次无规律
重复的程序段或语句序列 。 解决此类问题一
个行之有效的方法就是将它们设计成可供反
复调用的独立的子程序结构, 以便在需要时
调用 。 在汇编语言中, 子程序又称过程 。
调用子程序的程序称为主调程序或主程序。
返回本节
?第 4章 程序设计方法
4.5.2 子程序的定义
子程序的定义是由过程定义伪指令 PROC和 ENDP来完成的 。
其格式如下:
过程名 PROC [NEAR/FAR]

过程名 ENDP
其中 PROC表示过程定义开始, ENDP表示过程定义结束 。
过程名是过程入口地址的符号表示 。
一般过程名同标号一样,具有三种属性,即段属性、偏
移地址属性以及类型属性。
返回本节
?第 4章 程序设计方法
4.5.3 子程序设计方法
1,信息的保护与恢复
2,主程序与子程序参数传递方式
?第 4章 程序设计方法
1.信息的保护与恢复
例如:若子程序 PROG中改变了寄存器 AX,BX,CX,
DX的值, 则可采用如下方法保护和恢复
现场 。
PROG PROC
PUSH AX
PUSH BX
PUSH CX ;保护现场
PUSH DX

?第 4章 程序设计方法

POP DX
POP CX
POP BX ;恢复现场
POP AX
RET ;返回断点处
PROC ENDP
?第 4章 程序设计方法
2.主程序与子程序参数传递方式
( 1) 寄存器法
( 2) 约定单元法
( 3) 堆栈法
返回本节
?第 4章 程序设计方法
4.5.4 子程序应用举例
【 例 4.12】 将一个给定的二进制数按位转换成
相应的 ASCII码字符串, 送到指定的存储单
元并显示 。 如二进制数 10010011转换成字符
串为 ‘ 10010011’。 要求将转换过程写成子
程序, 且子程序应具有较好的通用性, 而必
须能实现对 8倍和 16倍二进制数的转换 。
?第 4章 程序设计方法
入口参数,DX存放待转换的二进制数
CX存放待转换数的位数 ( 8位或 16位 )
DI存放 ASCII码首地址
出口参数:转换后的字符串存放在以 DI作指针的字节存贮区中
程序如下:
DATA SEGMENT
NUM8 DB 93H
NUM16 DW 0ABCDH
ASCBUF DB 20 DUP( 0)
DATA ENDS
?第 4章 程序设计方法
CODE SEGMENT
ASSUME DS,DATA,CS,CODE,SS,STACK
START,MOV AX,DATA
MOV DS,AX
MOV DX,0
MOV DL,NUM8 ;转换二进制数送 DX
MOV CX,8 ;置位数 8
LEA DI,ASCBUF ;字符串首址 → DI
CALL BTASC ;调用子程序 BTASC
MOV [DI],BYTE PTR 0DH
MOV [DI+1],BYTE PTR 0AH
?第 4章 程序设计方法
MOV[DI+2],BYTE PTR ‘$’
LEA DX,ASCBUF
MOV AH,9
INT 21H
MOV DX,NUM16
MOV CX,16 ;置位数 16
LEA DI,ASCBUF
CALL BTASC
MOV [DL],BYTE PTR 0DH
MOV [DL+1],BYTE PTR 0AH
MOV [DL+2],BYTE PTR ‘$ ’ ; 显示转换后的字符串
LEA DX,ASCBUF
MOV AH,9
INT 21H
?第 4章 程序设计方法
BTASC PROC
PUSH AX ;保存 AX
MOV AL,0
CMP CX,8 ;比较 8位数
JNE L1 ;直接转换 16位数
MOV DH,DL ; 8位数转换送 DH
L1,ROL DX,,1 ; DX最高位移入 CF
RCL AL,1 ; CF移入 AL最低位
ADD AL,30H
MOV [DI],AL
?第 4章 程序设计方法
INC DI
LOOP L1
POP AX
RET
BTASC ENDP
CODE ENDS
END START
返回本节
?第 4章 程序设计方法
4.5.5 子程序的嵌套与递归调用
1,子程序的嵌套
子程序不但可以被主程序调用, 而且也可以被其他子
程序调用 。 我们把一个子程序调用另一个子程序称
为子程序的嵌套调用 。
2,子程序的递归调用
子程序的递归调用是指一个子程序直接或间接地调用
自己 。 递归子程序一般对应于数学上对函数的递归
定义, 它往往能设计出效率较高的程序, 完成相当
复杂的计算, 因而是很有用的 。
?第 4章 程序设计方法
【 例 4.15】
【 例 4.15】 试编制计算 N! ( N≥0) 的程序 。 N!=N*( N-
1) *( N-2) *…… *1
其递归定义如下:
0!=1
N!=N*( N-1) ! ( N> 1)
计算 N! 的子程序 FACT的流程图如图 4.10所示 。
?第 4章 程序设计方法
?第 4章 程序设计方法
【 例 4.16】 计算 5! 的程序示例, RESULT是保存阶乘的存储单元 。
程序如下:
STACK SEGMENT STACK
DB 200 DUP( 0)
STACK ENDS
DATA SEGMENT
N DW 5
RESULT DW?
DATA ENDS
CODE SEGMENT
ASSUME CS,CODE,SS,STACK,DS,DATA
?第 4章 程序设计方法
START,MOV AX,DATA
MOV DS,AX
MOV AX,N
CALL FACT
MOV AX,RESULT
MOV AH,4CH
INT 21H
FACT PROC
CMP AX,0
JNE L1
?第 4章 程序设计方法
MOV RESULT,1
JMP EXIT
L1,PUSH AX
DEC AX
CALL FACT
POP AX
MOV RESULT
MOV RESNLT,AX
EXIT,RET
FACT ENDP
CODE ENDS
END START
返回本节
?第 4章 程序设计方法
4.6 模块化程序设计
1,PUBLIC伪指令
格式,PUBLIC 符号 [,符号 ]
功能:说明其后的符号是全局符号 。 全局符号能被其他
模块引用 。
2,EXTRN伪指令
格式,EXTRN 符号:类型 [,符号:类型 ]
功能:说明在本模块中需要引用的, 由其他模块定义的
符号, 即外部符号 。
返回本章首页
?第 4章 程序设计方法
【 例 4.17】
【 例 4.17】 用模块化程序设计方法建立两个模块 MOD1 ASM和 MOD2
ASM的数据通讯 。
NAME MOD1
EXTRN DISP,FAR
PUBLIC STR1,N, BUF
DATA1 SEGMENT
STR1 DB‘HOW DO YOU DO?’
N =$-STR1
BUF DB‘THIS IS AN EXAMPLE OF MODULES
PROGRAM $ ′
DATA ENDS
?第 4章 程序设计方法
STACK SEGMENT STACK
DB 200 DUP( 0)
STACK ENDS
CODE1 SEGMENT
ASSUME CS,CODE1,DS,DATA1,SS,STACK
START,MOV AX,DATA
MOV DS,AX
CALL DISP
MOV AH,4CH
INT 21H
CODE1 ENDS
?第 4章 程序设计方法
END START
NAME MOD2
EXTRN STR1,BYTE,STR2,BYTE,N,ABS
PUBCIC DISP
DATA2 SEGMENT
STR2 DB 81 DUP( 0)
DATA2 ENDS
CODE2 SEGMENT
ASSUME CS,CODE2,ES,DATA2
DISP PROC FAR
MOV AX,DATA2
MOV ES,AX
?第 4章 程序设计方法
LEA BX,STR1
MOV CX,N
LEA SI,STR2
NEXT,MOV AL,[BX]
MOV ES,[SI],AL
INC BX
INC SI
LOOP NEXT
LEA DX,BUF
MOV AH,9
INT 21H
RET
DISP ENDP
CODE2 ENDS
END
?第 4章 程序设计方法
4.7 高级汇编语言技术
4.7.1 宏指令
4.7.2 宏指令的使用过程
4.7.3 宏操作符
4.7.4 局部符号伪指令 LOCAL
4.7.5 宏库的使用
4.7.6 重复汇编
4.7.7 条件汇编 返回本章首页
?第 4章 程序设计方法
4.7.1 宏指令
在汇编语言程序设计过程中,可以将具有一
定功能,需多次重复使用,且比较短的程序
段定义成一条宏指令。
使用宏指令语句可以减少程序书写错误,缩
短源程序长度,使源程序编写像高级语言一
样清晰、简洁。特别是使用宏库后,可以提
高编程效率。
返回本节
?第 4章 程序设计方法
4.7.2 宏指令的使用过程
1,宏定义
2,宏调用
3,宏扩展
?第 4章 程序设计方法
1.宏定义
( 1) 带参宏定义
宏指令名 MACRO 形参 1,形参 2,……
宏体
ENDM
( 2) 无参宏定义
宏指令 MACRO
宏体
ENDM
?第 4章 程序设计方法
2.宏调用
格式:
宏指令名 [实参 1,实参 2,…… ]
例如,对上面的宏定义的三种调用形式为:

PRINT BUF1

PRINT BUF2

PRINT BUF3

?第 4章 程序设计方法
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

?例如:上面三次宏调用,其展开的形式为:
返回本节
?第 4章 程序设计方法
4.7.3 宏操作符
1,文本操作符
【 例 4.19】 在程序中定义大小及初值不同的堆栈段 。
可用如下宏定义:
DSTACK MACRO A
STACK SEGMENT STACK
DB A
STACK ENDS
ENDM
?第 4章 程序设计方法
【 例 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
?第 4章 程序设计方法
则相应的宏扩展为:
+ DW 12,5,30
+ DB 15 DUP( 0)
+ DW X+2,5,X+Y
+ DB Y-5 DUP ( 0)
返回本节
?第 4章 程序设计方法
4.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
?第 4章 程序设计方法
如果两次调用宏指令如下:

SUM 100,1

SUM 50,1

则宏扩展形式为:

MOV CX,100
MOV BX,1
MOV AX,0
?第 4章 程序设计方法
?? 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

返回本节
?第 4章 程序设计方法
4.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
?第 4章 程序设计方法
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
?第 4章 程序设计方法
STACK0 MACROA
STACK SEGMENT STACK
DB A
STACK ENDS
ENDM
现要从键盘输入一串字符到系统缓冲区, 然后
将字符按相反顺序打印, 采用调用
宏库的办法, 其程序如下:
?第 4章 程序设计方法
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)
?第 4章 程序设计方法
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
?第 4章 程序设计方法
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
返回本节
?第 4章 程序设计方法
4.7.6 重复汇编
1,给定次数的重复汇编伪指令
语句格式,REPT 表达式
重复块
ENDM
功能:宏汇编程序将重复块连续地汇编表达式给定的次
数 。
2.不定次数的重复汇编伪指令,有 IRP和 IRPC两种伪
指令。
?第 4章 程序设计方法
【 例 4.22】
某一源程序需要多次将 AX,BX,CX,DX寄存器的内容压入堆栈,
则可定义如下宏指令 。
PUSHR MACRO
IRP REG,〈 AX,BX,CX,DX〉
PUSH REG
ENDM
ENDM
调用上述宏定义后, 将展开成下列语句:
+ PUSH AX
+ PUSH BX
?第 4章 程序设计方法
+ PUSH CX
+ PUSH DX
又如:
IR PW,〈 1122H,3344H,5566H,7788H〉
DW W
ENDM
汇编程序在汇编时将产生语句:
+ DW 1122H,3344H,5566H,7788H。
( 2) IRPC
语句格式,IRPC 形参, 字符串
重复块
ENDM
返回本节
?第 4章 程序设计方法
4.7.7 条件汇编
条件汇编指在汇编期间, 宏汇编程序根据条件是否成立
决定具体汇编哪一程序段 。 条件汇编用条件汇编伪
指令来定义 。 如表 4.1所示 。
语句格式,IF ×× 表达式
条件块 1
[ELSE
条件块 2]
ENDIF
?第 4章 程序设计方法
?表 4.1 条件汇编伪指令
?第 4章 程序设计方法
【 例 4.25】 试用条件汇编编写一宏定义, 能完成多种 DOS系统
功能调用 。
源程序如下:
DOSYS MACRO N,BUF
IFE N
EXITM
ENDIF
IFDEF BUF
LEA DX,BUF
MOV AH,N
INT 21H
ELSE
?第 4章 程序设计方法
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)
?第 4章 程序设计方法
STACK ENDS
CODE SEGMENT
ASSUME DS,DATA,CS,CODE,SS:
STACK
BEGIN,MOV AX,DATA
MOV DS,AX
DOSYS9,MSG
DOSYS10, BUF
DOSYS4CH
CODE ENDS
END START
?第 4章 程序设计方法
则以上三条宏指令展开后的语句为:

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

返回本节