第五章程序控制结构及其程序设计 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.流程图的组成 (1)执行框(矩形框) (2)判别框(菱形框) (3)开始框和终止框 (4)指向线 (5)连接点 3.三种基本结构和改进的流程图 (1)传统流程图的弊端 (2)三种基本结构 ①顺序结构 ②选择结构 ③循环结构
第五章 程序控制结构及其程序设计 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. 三种基本结构和改进的流程图 ⑴传统流程图的弊端 ⑵三种基本结构 ①顺序结构 ②选择结构 ③循环结构
不成立 不成立 B 图54顺序结构图 图55选择结构图 4.结构化程序设计的特点 (1)只有一个入口 (2)只有一个出口 (3)各功能框均可执行 (4)结构中无死循环 5.2顺序程序设计 顺序结构程序是最简单的程序,在顺序结构程序中,指令按照先后顺序一条条执行。 【例5-3】将一个字节压缩BCD码转换为两个ASCI码。 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跳跃表法
A B A B P A P 成立 不成立 成立 不成立 a b b b a a 图 5.4 顺序结构图 图 5.5 选择结构图 4. 结构化程序设计的特点 ⑴只有一个入口 ⑵只有一个出口 ⑶各功能框均可执行 ⑷结构中无死循环 5.2 顺序程序设计 顺序结构程序是最简单的程序,在顺序结构程序中,指令按照先后顺序一条条执行。 【例 5-3】将—个字节压缩 BCD 码转换为两个 ASCII 码。 5.3 分支程序设计 5.3.1 分支程序的结构形式 分支程序结构可以有两种形式,如图 5.6 所示。 判定条件 Y N 判定条件 … (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.D0 WHILE结构 2. DO UNTIL结构 循环初始状态 循环初始状态 循环控制条件 循环体 循环体 循环控制条件 (1) DO WHILE结构 (2) DO UNTIL结构 图5.8循环程序的结构形式 构成循环程序的三部分: 1.设置循环的初始状态 2.循环体 3.循环控制部分 5.4.2循环程序设计方法 【例5-9】试编制一个程序把B寄存器内的二进制数用十六进制数的形式在屏幕上显示出 【例5-11】在附加段中,有一个首地址为LIST和未经排序的字数组。在数组的第一个字 中,存放着该数组的长度,数组的首地址己存放在DI寄存器中,AX寄存器中存放着一个数。 要求编制一程序:在数组中查找该数,如果找到此数,则把它从数组中删除 5.4.3多重循环程序设计 循环可以有多重结构。多重循环程序设计的基本方法和单重循环程序设计是一致的,应分 别考虑各重循环的控制条件及其程序实现,相互之间不能混淆。另外,应该注意在每次通过外 层循环再次进入内层循环时,初始条件必须重新设置。下面举例加以说明。 【例5-15】有一个首地址为A的N字数组,编制程序使该数组中的数按照从大到小的次序 排序,采用起泡排序算法完成。 5.4.4串操作程序
分支程序的两种结构形式都可以用上面所述的方法来实现。此外,在实现 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 串操作程序 循环控制条件 循环体 循环初始状态 循环初始状态 循环体 循环控制条件
【例516】位串插入程序。程序要求把一个小于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~FFFH,所以在把32位通用寄存器用作指针寄存器时,应该注意 它们的高16位应为0。 应注意,32位通用寄存器可用作指针寄存器,但“16位通用寄存器中仍然只有BX,BP和 SI,DI可用作指针寄存器。所以,下列指令是合法的: EAX, [BX EAX, [EDX MOV AX, WORD PTR [ECX 而下列指令是非法的: AX, [DX] EAX, [CX 在386及其后继机型中,允许同一寄存器既用于基址寄存器,也用于变址寄存器。因此, 下列指令也是合法的 MOV AX, [EBX] [EBX] 5.53与比例因子有关的寻址方式 80386及其后继机型所提供的与比例因子有关的三种寻址方式 比例变址寻址方式 2.基址比例变址寻址方式 3.相对基址比例变址寻址方式。这些寻址方式为表格处理和多维数组处理提供了有力的工具。 【例5-19】用比例变址寻址方式编写一程序,要求把5个双字相加并保存其结果 8.参考资料:《IBM-PC汇编语言程序设计》沈美明 9.作业:P163习题5 10.总结 ①理解程序的三大结构 ②掌握三大结构的实现方法
【例 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.总结: ①理解程序的三大结构 ②掌握三大结构的实现方法