汇编语言程序设计第五章 循环与分支程序设计

发布时间:2024-04-05 10:04:24浏览次数:14
汇编语言程序设计主 题: 第五章 循环与分支程序设计(第 4-6 节)内 容:第五章第 4-6 节 概述 这周我们学习第五章中的第 4-6 节,继续学习循环与分支程序,多重循环与分支程序的一些经典的程序举例,起泡算法排序,折半算法等等。循环和分支程序结构是汇编语言及其他一些高级语言常见的结构,因此我们要学习好这几种程序结构。第 4 节 多重循环程序设计1)循环可以有多重结构。多重与单重循环程序设计的基本设计方法是一致的,但是要分别考虑个重(层)循环的控制条件及程序实现,相互不能混淆。注意,每次通过外层循环再次进入内层循环时,初始条件必须重新设置。2)起泡算法:学习 C 语言我们也应该接触到了起泡算法,这里再做一简单说明:假如有 N 个数需要排序,那么我们只需要对这 N 个数比较(N-1)遍,第一遍比较(N-1)次,第二遍比较(N-2)次,一直到第(N-1)遍比较 1 次。可见比较的遍数与次数之和都为数量 N。这就是起泡算法排序问题。3)多重循环程序举例:有一个首地址为 A 的 N 字数组,编制程序使该数组中的数按照从大到小的次序整序。 分析:课件中是比较的 5 个数,我们这里将其扩展为更普遍的数 N。这就是计数器已知的数据,如果理解起泡算法,那么这里也就能看出多重循环设计的必要性,外层是比较的遍数,内层是比较的次数,只要每一遍的每一次都比较完毕后,这 N 个数据就算排序完成了,并且是从大到小的顺序。 循环部分程序段如下: MOV CX,N ;CX 作为循环计数器使用 DEC CX ;计数初始值为 N-1,作为外层循环遍数第 1 页 共 5 页 LOOP1: MOV DI,CX ;CX 寄存器值保存到 DI 寄存器中 MOV BX,0 ;BX 清零LOOP2: MOV AX,A[BX] ;数组第一个元素取出,置于 AX 寄存器 CMP AX,A[BX+2] ;比较数组中前两个元素 JGE CONTINUE ;第一元素大于等于第二元素则转 CONTINUE XCHG AX,A[BX+2] ;否则,交换两元素 MOV A[BX],AX ;将较小元素放于数组首地址单元中(第一遍第一次循环,后续的循环中,基址寄存器值一直变化)CONTINUE: ADD BX,2 ;基址寄存器加 2,以备下次比较用 LOOP LOOP2 ;内层循环继续,同一遍内的次数循环 MOV CX,DI ;CX 值置 N(第一遍的第一次循环) LOOP LOOP1 ; 外层循环 RET ;比较完成,则排序完成小结:这是一个多重循环程序设计的实例,具体是双重循环,实际问题中要遇到比这复杂的多的情况,但是阅读和分析程序的构成基本原理都是一致的,每一层循环都有自己的循环控制条件,并且外层条件受内层条件的影响。这样才能使不同层次的循环程序能有机的结合起来解决一个特定的问题。这一个起泡排序法还可以进一步的优化,因为有时候并不需要程序按规定把每一个步骤都执行一次,这就涉及到程序设计优化及效率问题,参考书有相关的介绍,大家可以继续学习一下。本程序主要使用的指令有,比较指令,循环控制指令,交换指令等等。 第 5 节 分支程序设计 1)分支程序设计的结构形式:有两种形式,如下图第 2 页 共 5 页 判定条件判定条件….IF_THEN_ELSE 结构YN CASE 结构 两种结构形式共同特点是,程序运行方向是向前的,在某一特定条件下,只能执行多个分支程序中的一个分支 2)分支程序设计方法:程序的分支一般用条件转移指令来产生3)分支程序举例:设有数组 X 和 Y。X 数组中有 X1,X2到 X10;Y 数组中有 Y1,YX到 Y10,编写程序计算: Z1=X1+Y1 Z2=XX+Y2 Z3=X3-Y3 Z4=X4-Y4 Z5=X5-Y4 Z6=X6+Y6 Z7=X7-Y7 Z8=X8-Y8 Z9=X9+Y9 Z10=X10+Y10 分析:对于这种问题,可以用循环程序设计,10 次循环即可完成题目要求,但是从两个数组中取出的数的运算要求是不同的,有时是加法有时是减法。这是我们可以采用设定逻辑尺的方法,所谓逻辑尺,就是存储单元中的存放的一个数,这个数据代表连续的标志位,本例标志位需要 10 位,逻辑尺如下 0000000011011100其中标志位为 0 代表加法,为 1 代表减法,这样从两数组中取出操作数后,再测试标志位的值,即可进行相应算术运算了。 本例主要是循环程序,但是其中也涉及到了分支结构中第一种形式,就是测试逻辑尺值的时候,具体程序段如下:第 3 页 共 5 页 SHR DX,1 :DX 已经指定为逻辑尺的首地址,逻辑右移一位 JC SUBTRACT ;CF=1,则做减法,跳转 SUBTRACT ………. SUBTRACT: ………… 小结:本程序需要注意的几个问题,了解什么是逻辑尺,学习如何使用条件转移指令产生分支程序,本程序具体是使用 JC 指令。 第 6 节 分支程序设计举例1)折半查找法:在一个已排好序的数组中查找一个给定的数码,我们可以采用循环程序依次查找即可,但是这里提出一种折半的方式查找这个给定的数码,经过理论比较,效率比依次查找高出许多倍。在一个长度 N 的有序数组 R 中,查找元素 K 的折半查找算法查找过程如下: (1)初始化被查找数组的首尾下标,low=1,high=n (2)若 low >high,则查找失败,置 CF=1 (题目要求),退出程序,否则,计算中 点:mid=(low+high)/2 (3)K 与中点元素 mid 比较,若 K=R,则查找成功,程序结束;若 K<R,则转步骤(4);若 K>R,则转步骤(5) (4)低半部分查找,high=mid-1,返回步骤(2),继续查找 (5)高半部分查找,low=mid+1,返回步骤(2),继续查找 2)折半查找法程序举例:在附加段中,有一个按从小到大顺序排序的无符号数数组,首地址存放 DI寄存器中,数组第一个单元中存放着数组长度。AX 中有一个无符号数,要求在数组中查找(AX),如果找到,则使 CF=0,如未找到则使 CF=1。 分析:操作数地址已经知道,数组长度也是已知的,需要查找的数据在 AX 寄存器中,下面要做的就是具体应该用折半查找法设计查找程序。具体程序可以参照课件及参考书。 小结:理解基础上掌握折半查找法,这些在课件上老师已经讲的很透彻了。本例程序依然使用了循环程序结构,实际上大部分程序都是各种程序结构的组合。第 4 页 共 5 页 本周要求掌握的内容如下:基本概念:分支结构程序设计、分支结构的两种结构特点循环控制部分、逻辑尺概念、起泡法概念、折半查找法概念基本理论:理解汇编程序的几种结构及特点,并能正确的识别和编写相应结构的汇编程序,了解分支结构的两种结构特点,会用条件转移指令产生分支程序,理解逻辑尺概念,理解起泡法和折半查找法,区分他们的循环结构部分和分支结构部分习题:1、分支程序结构的两种结构包括: (IF_THEN_ELSE,CASE )2、分支程序的分支产生指令是: (A) 条件转移指令 (B)比较指令 (C)数据传送指令 (A)第 5 页 共 5 页
文档格式: docx,价格: 5下载文档
返回顶部