第五章 程序控制结构及其程序设计
1.教学目的:掌握微型汇编语言程序分析和设计方法
2.教学要求:
熟悉汇编语言程序设计的基本步骤。
掌握程序流程图的使用,会利用其分析问题。
掌握汇编语言的顺序、分支、循环程序的设计。
了解实模式下80386及其后继机型的汇编语言的程序设计
3.教学重点:
①利用流程图分析问题。
②顺序、分支、循环程序的设计。
4.掌握难点:
①分支程序设计
②循环程序设计
5.教学进程安排:P137~P168
6.教学方法:
课堂讲授
7.教学内容摘要:
5.1 汇编语言程序设计概述
5.1.1 汇编语言程序设计的基本步骤
1.分析问题,抽象出描述问题的数学模型
2.确定算法
3.绘制流程图
4.分配存储空间和工作单元
5.编写程序
6.静态检查
7.上机调试运行
5.1.2 程序流程图
1,用自然语言表示算法
2,流程图的组成
⑴执行框(矩形框)
⑵判别框(菱形框)
⑶开始框和终止框
⑷指向线
⑸连接点
3,三种基本结构和改进的流程图
⑴传统流程图的弊端
⑵三种基本结构
①顺序结构
②选择结构
③循环结构

图5.4 顺序结构图 图5.5 选择结构图
4,结构化程序设计的特点
⑴只有一个入口
⑵只有一个出口
⑶各功能框均可执行
⑷结构中无死循环
5.2 顺序程序设计顺序结构程序是最简单的程序,在顺序结构程序中,指令按照先后顺序一条条执行。
【例5-3】将—个字节压缩BCD码转换为两个ASCII码。
5.3 分支程序设计
5.3.1 分支程序的结构形式分支程序结构可以有两种形式,如图5.6所示。

(1) IF_THEN_ELSE结构 (2) CASE结构
5.3.2 分支程序设计方法程序的分支一般用条件转移指令来产生,利用转移指令不影响条件码的特性,连续地使用条件转移指令使程序产生了多个不同的分支,而对于数组中的每一个数,它只能是多个分支中的某一个。
【例5-5】在附加段中,有一个按从小到大顺序排列的无符号数数组,其首地址存放在DI寄存器中,数组中的第一个单元存放着数组长度,在AX中有一个无符号数,要求在数组中查找(AX),如找到,则使CF=0,并在SI中给出该元素在数组中的偏移地址;如未找到,则使CF=1。
【例5-6】折半查找算法程序
5.3.3 跳跃表法分支程序的两种结构形式都可以用上面所述的方法来实现。此外,在实现CASE结构时,还可以使用跳跃表法,使程序能根据不同的条件转移到多个程序分支中去,
【例5-7】试根据AL寄存器中哪一位为1(从低位到高位)把程序转移到8个不同的程序分支中去。
5.4 循环程序设计
5.4.1 循环程序结构循环程序结构可以总结为两种结构形式,如图5.8所示。
1,DO_WHILE结构
2,DO_UNTIL结构
⑴ DO WHILE结构 ⑵ DO UNTIL结构
图5.8 循环程序的结构形式构成循环程序的三部分:
1.设置循环的初始状态
2.循环体
3.循环控制部分
5.4.2 循环程序设计方法
【例5-9】试编制一个程序把BX寄存器内的二进制数用十六进制数的形式在屏幕上显示出来。
【例5-11】在附加段中,有一个首地址为LIST和未经排序的字数组。在数组的第一个字中,存放着该数组的长度,数组的首地址已存放在DI寄存器中,AX寄存器中存放着一个数。要求编制一程序:在数组中查找该数,如果找到此数,则把它从数组中删除。
5.4.3 多重循环程序设计循环可以有多重结构。多重循环程序设计的基本方法和单重循环程序设计是一致的,应分别考虑各重循环的控制条件及其程序实现,相互之间不能混淆。另外,应该注意在每次通过外层循环再次进入内层循环时,初始条件必须重新设置。下面举例加以说明。
【例5-15】有一个首地址为A的N字数组,编制程序使该数组中的数按照从大到小的次序排序,采用起泡排序算法完成。
5.4.4 串操作程序
【例5-16】位串插入程序。程序要求把一个小于32位的位串插入存储器内的一个大位串中的任意位置中去。欲插入的位串存放在BITSG中,它是一个右对齐的位串,可称其为子串,其长度用BITSG_LENGTH为符号名的=伪操作来说明。大位串存放在STRING中,并为要插入的子串准备了一个符号名为SG_END的双字单元。
5.5 在实模式下发挥80386及其后继机型的优势
5.5.1 充分利用高档机的32位字长特性
80X86系列从80386起就把机器字长从16位增加到32位。字长的增加除有利于提高运算精度外,也能提高编程效率。
【例5-17】如有两个4字长(64位)数分别存放在DATA1和DATA2中,请用8086指令编写一程序求出它们的和,并把结果存放于DATA3中。
5.5.2 通用寄存器可作为指针寄存器前面的讨论已经说明386及其后继机型除提供16位寻址外,还提供了32位寻址。在实模式下,这两种寻址方式可同时使用。并且列出了16位寻址和32位寻址所允许使用的寄存器情况。可以看出,在使用32位寻址时,32位通用寄存器可以作为基址或变址寄存器使用。也就是说,允许32位通用寄存器作指针寄存器用。在实模式下,段的大小被限制于64KB,这样段内的偏移地址范围应为0000~FFFFH,所以在把32位通用寄存器用作指针寄存器时,应该注意它们的高16位应为0。
应注意,32位通用寄存器可用作指针寄存器,但“16位通用寄存器中仍然只有BX,BP和SI,DI可用作指针寄存器。所以,下列指令是合法的:
MOV EAX,[BX]
MOV EAX,[EDX]
MOV AX,WORD PTR [ECX]
而下列指令是非法的:
MOV AX,[DX]
MOV EAX,[CX]
在386及其后继机型中,允许同一寄存器既用于基址寄存器,也用于变址寄存器。因此,下列指令也是合法的:
MOV AX,[EBX][EBX]
5.5.3 与比例因子有关的寻址方式
80386及其后继机型所提供的与比例因子有关的三种寻址方式:
1.比例变址寻址方式
2.基址比例变址寻址方式
3.相对基址比例变址寻址方式。这些寻址方式为表格处理和多维数组处理提供了有力的工具。
【例5-19】用比例变址寻址方式编写一程序,要求把5个双字相加并保存其结果。
8.参考资料:《IBM-PC汇编语言程序设计,沈美明
9.作业:P163 习题5
10.总结:
①理解程序的三大结构
②掌握三大结构的实现方法