汇编电子教案第4章程序设计方法
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
•第4章
程序设计方法
START: MOV
MOV
AX,DATA
DS,AX ┆
MOV DEL ADD MOV
AL,N AL AL,AL BM,AL
MOV
JMP
BH,0
TAB[BX]
•第4章
程序设计方法
P1: …… ┆ JMP EXIT P2: …… ┆ JMP EXIT P2: …… ┆
JMP EXIT
EXIT:
MOV MOV INT
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章
程序设计方法
• 图 4 7 程 序 流 程 图 .
•第4章
程序设计方法
2.条件控制
【例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章
程序设计方法
数
10
8
10 16 90
16
16 90 32
90
90 32 16
32
32 10 10 8 8 8
第一遍 第二遍 第三遍
程序流程图如图4.9所示。
•第4章
程序设计方法
•第4章
程序设计方法
程序如下: DATA BUF SEGMENT DW 3,-4,6,7,9,2,0,-8,-9,-10,20 N=($-BUF)/2 DATA STACK ENDS SEGNMENT STACK DB 200 DUP(0) STACK CODE ENDS SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK
ห้องสมุดไป่ตู้
•第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
程序设计方法
4.4 循环程序设计
4.4.1 循环程序的结构 4.4.2 单重循环程序设计 4.4.3 多重循环程序设计
返回本章首页
•第4章
程序设计方法
4.4.1 循环程序的结构
1.初始化部分 2.循环体部分 3.循环控制部分
•第4章
程序设计方法
循环程序的常见结构形式如图4.5(a)、(b)所示。
•第4章
程序设计方法
STACK SEGMENT STACK DB STACK ENDS DATA SEGMENT TAB DB 80,85,86,71,79,96 DB 83,56,32,66,78。84 NO DB 10 200 DUP(0)
ENGLIST
DATA ENDS
DB?
CODE SEGMENT
程序设计方法
L1:
CMP
AX,Z ;X>Z?
JLE L2 EXIT: MOV MAX,AX
MOV
INT 21H CODE ENDS
AH,4CH
END START
返回本节
•第4章
程序设计方法
4.3.2 用跳转表实现多路分支
【例 4.5】设某程序有 8 路分支,试根据给定的 N值(1~8),将程序的执行转移到其中的一 路分支。 程序流程如图4.4所示。
EXIT:
MOV
INT
AH,4CH
21H
CODE
ENDS END START
•第4章
程序设计方法
•图4.2 分支运算程序流程图
•第4章
程序设计方法
【例4.4】
【例 4.4】试编一程序,求三个带符号字数 据中的最大值,并将最大值存入MAX字单 元中。 设三个带符号数分别在三个字变量X、Y、 Z中存储。程序流程图如图4.3所示
•第4章
程序设计方法
MOV CMP JGE MOV JMP DS,AX X,0 A1 Y,-1 EXIT A2 ;X>0转A2 ;与0进行比较 ;X≥0转A1 ;X <0时,-1→Y
A1:
JG
MOV
JMP A2: MOV
Y,0
EXIT Y,1
;X=0时,0→Y
;X>0,1→Y
EXIT: MOV
INT CODE ENDS END
•第4章
程序设计方法
• 图 4 6 程 序 流 程 图 .
•第4章
程序设计方法
【例4.8】
【例4.8】试编写一程序,要求比较两个字符串 STR1和STR所含字符是否相同,若相同则显 示 ‘ MATCH ! ’ , 若 不 相 同 则 显 示 ‘ NO MATCH!’。(程序略) 其流程图如图4.7所示。
式中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
程序设计方法
4.1.1 汇编语言程序设计的一般步骤
汇编语言程序设计一般有以下几个步骤: 1.分析问题,确定算法 2.绘制流程图 3.根据流程图编制程序 4.调试程序
返回本节
•第4章
程序设计方法
4.1.2 流程图
1.流程图的概念
流程图是由特定的几何图形、指向线、文字说明 来表示数据处理的步骤,形象描述逻辑控制结构 以及数据流程的示意图。流程图具有简洁、明了、 直观的特点。
返回本节
•第4章
程序设计方法
4.4.2 单重循环程序设计
1.计数控制
2.条件控制
•第4章
程序设计方法
1.计数控制
【例4.7】已知有几个元素存放在以 BUF为首址 的字节存贮区中,试统计其中正元素的个数。
显然,每个元素为一个8位有符号二进制数, 统计其中正元素的个数可用循环程序实现。 其程序流程图如图4.6所示。
•第4章
程序设计方法
图4.3 [例4.4]程序流程图
•第4章
程序设计方法
程序如下: STAC SEGMENT STACK
DB 200 DUP(0)
STACK ENDS DATA SEGMENT
X
Y Z
DW 00ABH
DW –5 DW 200
MAX
DW ?
DATA ENDS CODE SEGMENT
•第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章
2.流程图符号表示
(1)起止框:表示程序 的开始和结束。
•起止框
•第4章
程序设计方法
(2)判断框
(3)处理框
(4)调用框
•第4章
程序设计方法
(5)指向线
(6)连接框
返回本节
•第4章
程序设计方法
4.2 顺序程序设计
下面举例说明顺序程序的设计。 【例4.1】试编写一程序计算以下表达式的值。
w=(v-(x*y+z-540))/x
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章
程序设计方法
MOV AX,DATA
START:
MOV DS,AX ;DATA→AX MOV AX,X IMUL Y MOV CX,AX MOV BX,DX ;(DX:AX)→(BX:CX) ;(X)*(Y)→DX:AX
•第4章
程序设计方法
DATA SEGMENT X Y DB -10 DB ?
DATA ENDS STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START: MOV AX,DATA
SUB AX,CX SBB DX,BX AX) IDIV X
;(DX:AX)/X
MOV
MOV MOV
W,AX ;商→W
W+2,DX AH,4CH ;余数DX→W+2
INT 21H
CODE ENDS ;退出DOS 状态 END START
•第4章
程序设计方法
【例4.2】
【例4.2】已知某班学生的英语成绩按学号(从 1开始)从小到大的顺序排列在TAB表中,要 查的学生的学号放在变量NO中,查表结果放 在变量ENGLISH中。编写程序如下:
•第4章
程序设计方法
ASSUME DS:DATA,SS:STACK,CS:CODE START: MOV AX,DATA
MOV DS,AX
MOV AX,X CMP AX,Y ;X>Y?
JG
MOV CMP JG L2:
L1
AX,Y ;Y>Z? AX,Z EXIT
MOV AX,Z JMP EXIT
•第4章
•第4章
程序设计方法
MOV AX,DATA
START:
MOV
MOV MOV
DS,AX
AX,BUF CL,0 ;计数器为0
COPA:
AND
JE SHL JNC INC JMP
AX,AX
EXIT AX,1 LOPA CL LOPA COUNT,CL AH,4CH 21H ;产生进位,(CL)+1→CL ;(AX)=0,结束循环 ;AX 左移一位
P3: …… ┆
•第4章
程序设计方法
JMP EXIT ┆
P8:
……
┆
EXIT: MOV
AH,4CH
INT 21H
CODE ENDS END START 上述程序中的无条件转移指令的转移地址采用的 是变址寻址。同理,转移地址也可以用寄存器间接寻 址或基址加变址寻址,读者可自行考虑。
返回本节
•第4章
其流程图如图4.8所示。
•第4章
程序设计方法
•第4章
程序设计方法
程序如下: STACK SEGMENT STACK DB 200 DUP(0) STACK EDNS DATA SEGMENT BUF DW 0011110010101011B
COUNT DB ?
DATA ENDS
CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK
•第4章
程序设计方法
•第4章
程序设计方法
程序如下: DATA SEGMENT TAB N DW P1,P2,P3,P4,P5,P6,P7,P8 DB 5
DATA ENDS STACK SEGMENT DB 200 DUP(0)
STACK ENDS
CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE
END BEGIN
•第4章
程序设计方法
4.3 分支程序设计
4.3.1 用条件转移指令实现程序分支 4.3.2 用跳转表实现多路分支
返回本章首页
•第4章
程序设计方法
4.3.1 用条件转移指令实现程序分支
【例4.3】编写计算下面函数值的程序: 1 X>0
Y=
0
-1
X=0
X
设输入数据为 X、输出数据 Y,且皆为字节变量。程序 流程图如图4.2所示。 程序如下:
MOV AX,Z
CWD ;(Z)符号扩展 ADD CX,AX
ADC BX,DX ;(BX:CX)+(DX:AX)→(BX:CX)
SUB CX,540 SBB BX,0 MOV AX,V ;(BX:CX)-540→(BX:CX)
•第4章
程序设计方法
CWD
;(V)符号扩展 ;( DX : AX ) - ( BX : CX ) → ( DX :
AH,4CH
21H
START
•第4章
程序设计方法
MOV CMP JGE MOV JMP DS,AX X,0 A1 Y,-1 EXIT A2 ;X>0转A2 ;与0进行比较 ;X≥0转A1 ;X <0时,-1→Y
A1:
JG
MOV
JMP A2: MOV
Y,0
EXIT Y,1
;X=0时,0→Y
;X>0,1→Y