




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
循环程序设计第一页,共八十九页,2022年,8月28日1、如何计算转移指令的目标地址?2、分支程序的结构特点和如何编写分支程序?第二页,共八十九页,2022年,8月28日第5章
循环程序设计第三页,共八十九页,2022年,8月28日本章学习目标循环程序的一般结构循环指令计数型循环与条件型循环单重循环程序设计方法多重循环程序设计方法通过本章学习,应掌握以下内容:第四页,共八十九页,2022年,8月28日5.1循环程序的一般结构5.2循环指令5.3循环程序设计方法第五页,共八十九页,2022年,8月28日5.1循环程序
的一般结构第六页,共八十九页,2022年,8月28日顺序程序是按指令的先后顺序依次执行,每条指令只执行一次;分支程序是根据判断条件的真假,选择其中的一个分支段程序执行;循环程序是根据需要重复执行一段程序多次。第七页,共八十九页,2022年,8月28日循环程序结构分计数型循环和条件型循环。循环程序由3部分组成:
(1)循环初始化:
为循环做准备工作(2)循环体:
重复执行部分(3)循环控制:
按循环结束条件判断是否继续循环
第八页,共八十九页,2022年,8月28日两种循环结构流程图:CX←循环次数循环体CX←循环次数-1(CX)=0NY退出循环图5-1计数型循环结构图5-2条件型循环结构循环初始化部分循环体(工作部分和修改循环条件)循环结束条件NY退出循环第九页,共八十九页,2022年,8月28日实际应用,可将循环控制部分放在循环体之前,形成“先判断、后循环”的结构,也可以将循环控制部分放在循环体之后,形成“先循环、后判断”的结构形式。下面分别举例说明计数型循环和条件型循环的控制方法。第十页,共八十九页,2022年,8月28日例5-1n个8位有符号数,存在BUF为首址的存储区中,试统计正数的个数。
分析:每个数均是8位有符号二进制数,应先分析数的正负,再使用符号数条件转移指令进行转移或正数的统计。共有n个元素,整个程序的结构要重复判断n次,故可选用计数型循环程序。第十一页,共八十九页,2022年,8月28日
存储单元及寄存器分配如下:BX:BUF存储区的地址指针,初值为BUF的偏移地址,每循环一次之后,其值加1。
CX:循环计数器,初值为BUF存储区中元素的个数n,每循环一次之后,其值减1。
AX:存放正数的个数,初值为零。
COUNT:最终存放正数的个数。
程序流程图如图5-3所示。第十二页,共八十九页,2022年,8月28日开始BX←BUF的偏移地址CX←BUF区中元素个数AX←0([BX])>0AX←(AX)+1BX←(BX)+1CX←(CX)-1(CX)=0COUNT←(AX)结束YYNN循环初始部分循环体部分循环控制部分图5-3统计正数个数程序流程图第十三页,共八十九页,2022年,8月28日源程序如下:STACKSEGMENTSTACKDB200DUP(0)STACKENDSDATASEGMENTBUFDB8,10,-5,100,-7,25,40N=$﹣BUF;BUF区中元素个数COUNTDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATA MOVDS,AX 第十四页,共八十九页,2022年,8月28日
LEABX,BUF
MOVCX,N
;循环初始部分
MOVAX,0AGAIN:CMPBYTEPTR[BX],0
JLENEXT
INCAX
;循环体部分NEXT:INCBX
DECCX JNZAGAIN
;循环控制部分
MOVCOUNT,AX
;正数个数送入COUNT
MOVAH,4CH INT21HCODEENDS ENDBEGIN
第十五页,共八十九页,2022年,8月28日该程序的循环体重复执行了n次,即当(CX)=n,n-1,…,1时循环执行,当(CX)=0时循环结束,将正数个数5送入字变量COUNT中。
对于计数型循环,在进入循环体前要先要确定循环次数,每循环一次就修改一次计数值,计数值为零时就结束循环。第十六页,共八十九页,2022年,8月28日
思考题:
(1)在循环初始部分,如果将负值送入循环计数器CX,即:“MOVCX,-n”,应该如何修改程序?(2)若将0送入循环计数器CX中,即:“MOVCX,0”,应该如何修改程序?(3)如果要分别统计出正数、零、负数的个数,应如何设计程序?第十七页,共八十九页,2022年,8月28日例5-2
统计寄存器BX中1码元的个数,将结果存放在COUNT单元中。分析:统计BX中1码元的个数,须进行逐位测试。先判断最高位是否为1,然后用移位方法,把各位逐次移到最高位进行判断。循环的结束条件可用计数值16来控制,即可以用计数型循环来设计。但是,这种方法的缺点是无论BX中有没有
1都必须循环16次。第十八页,共八十九页,2022年,8月28日若用条件控制法,即测试BX的值是否为0作为结束条件,可大大缩短循环次数。存储单元及寄存器分配如下:BX:要测试的寄存器
CX:存放1的个数,初始值为0COUNT:最终存放1的个数
程序流程图如图5-4所示第十九页,共八十九页,2022年,8月28日开始(BX)=0(CX)←0SF=0CX←(CX)+1(BX)左移一位COUNT←(CX)结束NYNY图5-4统计BX中1的个数程序流程第二十页,共八十九页,2022年,8月28日源程序如下:STACK SEGMENTSTACKDB200DUP(0)STACK ENDSDATA SEGMENTCOUNTDW?DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATA MOVDS,AX
第二十一页,共八十九页,2022年,8月28日 MOVCX,0;CX←0NEXT:ANDBX,BX
;BX相与运算
JZEXIT
;(BX)=0,结束循环
JNSNEXT1
;SF=0(结果的最高位)转NEXT1 INCCX;否则,CX←(CX)+1NEXT1:SHLBX,1 ;(BX)左移1位
JMPNEXT
;无条件转NEXT继续循环EXIT:MOVCOUNT,CX ;COUNT←1的个数 MOVAH,4CH INT21HCODE ENDS ENDBEGIN第二十二页,共八十九页,2022年,8月28日程序运行中,若BX的值全为0,则不必循环,直接转EXIT结束。若只有最高位为1,则执行“INCCX”后,左移一位,再转NEXT处判断,此时(BX)=0转EXIT,仅需执行一次循环。只有最低位为1时才需16次循环,统计出BX中的个数。显然,用条件控制循环效率最高。返回本章目录第二十三页,共八十九页,2022年,8月28日5.2循环指令第二十四页,共八十九页,2022年,8月28日为了简化循环程序的设计,8086/8088指令系统专门设置了一组循环程序指令:LOOP、LOOPZ/LOOPE和LOOPNZ/LOOPNE。这些循环指令在执行前,必须预先将循环次数存放在CX寄存器中。另外这些循环控制指令只能实现短转移。第二十五页,共八十九页,2022年,8月28日1.LOOP循环指令
格式:LOOP标号
功能:①CX←(CX)-1②判断CX的值,若(CX)≠0转移到标号处继续循环,否则退出循环。第二十六页,共八十九页,2022年,8月28日例5-3
计算1+2+3+…+100,
将结果存入字变量SUM中。
分析:
这是一个典型的计数型循环,用于求累加和。循环体执行次数为100。
存储单元及寄存器分配如下:AX:存累加求和,初值为0。
CX:存循环次数,初值100,每次减1。
SUM:存最终结果的字变量。第二十七页,共八十九页,2022年,8月28日开始AX←0CX←100AX←(AX)+(CX)CX←(CX)-1(CX)=0SUM←(AX)结束NY图5-5求累加和程序流程图第二十八页,共八十九页,2022年,8月28日源程序如下:STACK SEGMENTSTACKDB200DUP(0)STACK ENDSDATA SEGMENTSUM DW?DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATA MOVDS,AX第二十九页,共八十九页,2022年,8月28日
MOVAX,0 ;AX清零
MOVCX,100
;CX←循环次数100NEXT:ADDAX,CX
;求累加和
LOOPNEXT
MOVSUM,AX;将累加和送入SUM中
MOVAH,4CH INT21HCODE ENDSENDBEGIN
程序运行后,变量SUM中保存的值是5050。第三十页,共八十九页,2022年,8月28日思考:(1)程序中“LOOPNEXT”语句可以用哪两条语句来代替?(2)若要求从1开始连续50个奇数的和,应如何编程?第三十一页,共八十九页,2022年,8月28日2.LOOPZ/LOOPE为零或相等时循
环指令
格式:LOOPZ/LOOPE标号
功能:①CX←(CX)-1②判断CX和ZF的值,若(CX)≠0且ZF=1转移到标号处继续循环,若(CX)=0或ZF=0则退出循环。第三十二页,共八十九页,2022年,8月28日3.LOOPNZ/LOOPNE不为零或不相
等时循环指令
格式:LOOPNZ/LOOPNE标号
功能:①CX←(CX)-1②判CX和ZF的值,若(CX)≠0且ZF=0转移到标号处继续循环,若(CX)=0或ZF=1则退出循环。
LOOPZ/LOOPE和LOOPNZ/LOOPNE指令提供了提前结束循环的可能性。第三十三页,共八十九页,2022年,8月28日例5-4
以BUF为首址的存储区中存放有N个字符。在字符串中查找第1次出现“E”的字符。若找到将其偏移位置存入FOUND;否则显示“NOFIND!”。分析:
在字符串中查找某字符,查找的方法有多种,这里采用顺序查找法。若找到将其偏移位置保存起来,并结束程序;否则显示“NOFIND!”。第三十四页,共八十九页,2022年,8月28日存储单元与寄存器分配如下:BUF:存放字符串的存储区SI:BUF存储区中字符的偏移位置,初值为﹣1,每次递增1。AL:保存要查找的字符CX:存放循环次数,初值为字符串长度,每次减1。FOUND:存查找成功时字符的偏移值第三十五页,共八十九页,2022年,8月28日源程序如下:STACKSEGMENTSTACKDB200DUP(0)STACKENDSDATASEGMENTBUFDB“HELLO,MYFRIEND!”N=$-BUFFOUNDDW?NOFINDDB0DH,0AH,“NOFIND!$”DATAENDSCODESEGMENTASSUMECS:CODE,SS:STACK,DS:DATABEGIN:MOVAX,DATA MOVDS,AX
第三十六页,共八十九页,2022年,8月28日
MOVCX,N;CX←字符串长度NMOVSI,-1;给BUF偏移量的初值
MOVAL,45H;AL←“E”的ASCII码NEXT:INCSICMPAL,BUF[SI];判断要查找的字符
LOOPNENEXT
;ZF=0且(CX)≠0转NEXT循环
JNZNO_FIND
;ZF=0转NO_FINDMOVFOUND,SI;ZF=1,偏移量送FOUND
JMPEXITNO_FIND:MOVDX,OFFSETNOFINDMOVAH,9;显示“NOFIND!”
INT21HEXIT:MOVAH,4CH;程序结束
INT21H CODE ENDSENDBEGIN第三十七页,共八十九页,2022年,8月28日
程序执行过程中,有两种可能性:(1)成功找到字符“E”,ZF=1,提前退出循环。执行JNZ指令时,因不满足测试条件而执行下一条指令“MOVFOUND,SI”。(2)一直查找到字符串结束而未发现字符“E”,则因(CX)=0而结束循环。在执行JNZ指令时,因ZF=0而转NO_FIND。返回本章目录第三十八页,共八十九页,2022年,8月28日5.3循环程序设计方法第三十九页,共八十九页,2022年,8月28日循环程序,按结构可分单重循环程序和多重循环程序。5.3.1单重循环程序设计单重循环是其循环体内不再包含循环结构的程序。第四十页,共八十九页,2022年,8月28日
例5-5
BUF为首址的存储区中存放一串字符,把最大的字符存入MAX中。
分析:
在一串字符中寻找最大值,可将第1个字符存入AL单元中。然后,从第2个字符开始依次与AL比较,若某个字符比AL还大,则将其赋给AL,如此比较,最后AL中保存的定是最大字符。第四十一页,共八十九页,2022年,8月28日存储单元与寄存器分配如下:CX:循环次数控制变量,初值为字符串的长度减1,每次减1。BX:BUF存储区地址指针,初值指向BUF,每次加1。AL:保持某个时刻的最大字符值。MAX:保存最终结果的字节单元。
程序流程图如图5-6所示。第四十二页,共八十九页,2022年,8月28日Y开始BX←BUF存储区首地址AL←字符串中第一个字符CX←字符串长度减1BX←(BX)+1(AL)≥[BX]CX←(CX)-1AL←(BX)(CX)=0MAX←(AL)结束NYN图5-6求最大字符的流程图第四十三页,共八十九页,2022年,8月28日STACK SEGMENTSTACKDB200DUP(0)STACK ENDSDATA SEGMENTBUFDB‘ABCD5678bdcaMN’N =$-BUFMAXDB?DATAENDCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATA MOVDS,AX
源程序如下:第四十四页,共八十九页,2022年,8月28日
MOVBX,OFFSETBUF;BX指向字符串首
MOVAL,[BX];取第1个字符
MOVCX,N-1
;循环次数送CXNEXT1:INCBX
;BX指向下1字符
CMPAL,[BX];比较大小
JNCNEXT2;JAENEXT2(替代)
MOVAL,[BX] ;较大数送ALNEXT2:LOOPNEXT1
;(CX)≠0继续循环
MOVMAX,AL;MAX←最大数
MOVAH,4CH INT21H CODEENDS ENDBEGIN
程序运行后,MAX单元中保存的字符是“d”。第四十五页,共八十九页,2022年,8月28日
例5-6
编程把字变量NUM中的二进制数,用十六进制数显示。
分析:把NUM中的二进制数从左到右每4位分为1组,用循环移位把要处理的4位二进制数移到最右边,再将数值转换到字符。若是数值0~9,加30H转换成字符“0”
~“9”;若是值A~F,除将其值加30H外,还应加上7H才能转换成“A”~“F”。第四十六页,共八十九页,2022年,8月28日DI:指向存转换结果的单元,每次加1BX:待转换的二进制数的工作单元CH:循环计数器,初值为4,每次减1CL:循环移位次数,每次移4位AL:转换中用到的工作单元
程序流程图如图5-7所示存储单元及寄存器分配如下:第四十七页,共八十九页,2022年,8月28日图5-7二进制转换成十六进制的程序流程图开始初始化工作将BX循环左移四位是否大于“9”Y将转换结果送存储区保存加07调整循环计数器为0显示转换结果结束NYN取BX低四位转换成ASCII码第四十八页,共八十九页,2022年,8月28日
源程序如下:DATA SEGMENTNUMDW0010110100111001BBUF DB0AH,0DH,‘(NUM)=’BUF0 DB6DUP(?)DATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDSCODE SEGMENT
ASSUMECS:CODE,SS:STACK,DS:DATABEGIN:MOVAX,DATA MOVDS,AX第四十九页,共八十九页,2022年,8月28日
MOVBX,NUM
;待转换的二进制数送BX
LEADI,BUF0
;存储单元首址送DI
MOVCH,4
;CH←循环次数NEXT:
MOVCL,4
;CL←循环移位次数
ROLBX,CL
;4位二进制数移到最低位
MOVAL,BL
;取BX的低字节送AL
ANDAL,0FH
;取出最低4位
ORAL,30H
;转换成十六进制
CMPAL,3AH
JLDONE
;≤‘9’
时转移
ADDAL,07H
;若大于‘9’加07HDONE:MOV[DI],AL
;转换的十六进制数送BUF0
INCDI
;指向下一存储单元
DECCH
;CH←(CH)﹣1
JNZNEXT
;(CH)≠0转NEXT继续转换第五十页,共八十九页,2022年,8月28日
MOVBYTEPTR[DI],“H”
;十六进制数后加‘H’ INCDI MOVBYTEPTR[DI],“$” LEADX,BUF0;显示十六进制数
MOVAH,9INT21H MOVAH,4CH INT21HCODEENDSENDBEGIN
程序运行后,屏幕显示:(NUM)=2D39H第五十一页,共八十九页,2022年,8月28日5.3.2多重循环程序设计多重循环指循环体内又嵌套有循环的程序。
多重循环程序设计的基本思想和单重循环程序设计是一致的,但应分别考虑各重循环的控制条件及其程序实现,内外层循环必须是嵌套的,不能出现交叉。第五十二页,共八十九页,2022年,8月28日
例5-9BUF为首址的字节存储区存放有n
个无符号数x1,x2,…,xn,试编程将它们由大到小排列在BUF中。
分析:
本例是对n个数据排序,排序的方法有很多种,如选择、冒泡、插入、shell排序等。这里仅介绍较简单的选择排序。第五十三页,共八十九页,2022年,8月28日
选择排序算法:
一组数放入n个存储单元,先将第1个存储单元中的数与其后n-1个存储单元中的数依次比较,将两数中的大数放在第1个存储单元,经过n-1次比较后,n个数中的最大者定存入第1个存储单元中,n-1次比较可以用一个计数型循环来控制;接着进行第2轮比较,将第2个存储单元中的数与其后的n-2个存储单元中的数依次比较,n个数中的第2大者就存入第2个存储单元,如此重复,直到第n-1轮比较后,将n个数中的第n-1大者存入第n-1个存储单元,第n个存储单元中的数据定是n个数中的最小者。从第1轮到第n-1轮的控制又可以用1个计数型循环。第五十四页,共八十九页,2022年,8月28日例如,4个数据:60279643
将它们从大到小的重新排列。
4个数的排序需要经过3轮比较才能完成。第1轮:
将第1个存储单元的数据60,依次与后面的数据比较,经3次比较得第1个单元的最大值96。第1次:6027 96 4360>27不需交换第2次:9627 60 4360<96进行交换 第3次:9627 60 4396>43不需交换
第2轮:
求第2个位置上的最大值,需经两次比较。第1次:9660 27 4327<60进行交换 第2次:9660 27 4360>43不需交换 第3轮:
求第3个位置上的最大值,只需经1次比较。第1次:9660 43 2727<43进行交换 第五十五页,共八十九页,2022年,8月28日
存储单元和寄存器分配如下:BUF:存放要排序数据的存储单元N:存放要排序数据的个数SI:控制外循环的循环计数器,初值为
1,终值为N﹣1,每次递增1。DI:控制内循环的循环计数器,初值为(SI)+1,终值为N,每次递增1。AL:存放比较数据的寄存器第五十六页,共八十九页,2022年,8月28日开始SI←1DI←(SI)+1AL←(BUF+(SI)-1)(AL)≥(BUF+(DI)-1)AL与(BUF+(DI)-1)互换(BUF+(SI)-1)←(AL)DI←(DI)+1(DI)≤NSI←(SI)+1(SI)≤N-1结束YYYNNN图5-11选择排序算法流程第五十七页,共八十九页,2022年,8月28日源程序如下:STACKSEGMENTSTACKDB200DUP(0)STACKENDSDATASEGMENTBUFDB0AH,8,15H,36H,6,20H,12HN=$-BUF;N为要排序数据的个数DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATA MOVDS,AX MOVSI,1;外循环计数赋初值1NEXT1:MOVDI,SI
;内循环计数初值(DI)=(SI)+1INCDIMOVAL,[BUF+SI-1];AL←(BUF+(SI)﹣1)第五十八页,共八十九页,2022年,8月28日NEXT2:CMPAL,[BUF+DI-1]
;满足降序转NEXT3
JAENEXT3
XCHGAL,[BUF+DI-1];两数交换 MOV[BUF+SI-1],ALNEXT3:INCDI;(DI)←(DI)+1 CMPDI,N;(DI)≤
N转NEXT2
JBENEXT2
;进入下一轮循环 INCSI;(SI)←(SI)+1 CMPSI,N-1;比较(SI)与N﹣1
JBENEXT1
;若(SI)≤N-1转NEXT1MOVAH,4CH
INT21HCODE ENDS ENDBEGIN第五十九页,共八十九页,2022年,8月28日
程序运行后,BUF中的内容如下:
36H,20H,15H,12H,0AH,8,6思考:①本例题是对存储单元中的N个无符号数进行比较排序,若要对N个有符号数排序应如何实现?②若要对数据进行升序排列应如何实现?第六十页,共八十九页,2022年,8月28日本章小结通过本章的学习,应掌握循环程序的一般结构和循环指令,并深刻理解计数型循环与条件型循环的区别。熟练掌握单重循环和多重循环程序的设计。第六十一页,共八十九页,2022年,8月28日习题Ⅴ返回本章首页P130:5-1、5-2、5-3、
5-4第六十二页,共八十九页,2022年,8月28日例5-7BUF为首址的存储区存放着1个以‘$’作为结束标志的字符串,试编写程序完成下列功能:①统计其中小写字母的个数并存入COUNT。②屏幕上显示该字符串并要求小写字母要以大写字母显示出来。第六十三页,共八十九页,2022年,8月28日分析:本题没有给出字符串的长度,但给出了字符串的结束标志。可以选用条件控制循环程序的执行。每当从BUF中取出一个字符,若是“$”则结束循环。否则,若是小写字母,先累加统计,再将小写字母转换成大写字母(ASCII码值减去20H)并显示,若不是小写字母,则直接显示。第六十四页,共八十九页,2022年,8月28日
存储单元和寄存器分配如下:BX:指向BUF首地址,每次加1AX:保存小写字母个数
DL:存放要显示字符
COUNT:保存小写字母个数
程序流程图如图5-8所示。第六十五页,共八十九页,2022年,8月28日开始AX←0BX←BUF的偏移地址DL←([BX])(DL)=‘$’(DL)为小写字母小写字母转换成大写字母AX←(AX)+1显示DL中字符BX←(BX)+1COUNT←(AX)结束YNYN图5-8小写字母统计及字符串显示第六十六页,共八十九页,2022年,8月28日STACKSEGMENTSTACKDB200DUP(0)STACKENDSDATASEGMENTBUFDB‘ThisisaAssemblyProgram.$’COUNTDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AX MOVAX,0 ;AX清0 LEABX,BUF;BX←BUF的偏移地址源程序如下:第六十七页,共八十九页,2022年,8月28日NEXT:MOVDL,[BX]
;存储区中取1个字符送入DL CMPDL,‘$’
;为‘$’,则转EXIT
JEEXIT CMPDL,‘a’
JBDONE
;不是小写字母,则转DONE
CMPDL,‘z’
JA DONE SUBDL,20H;小写字母转换成大写字母
INCAX;统计小写字母DONE:MOVAH,2;显示大写字母 INT21H
INCBX;指向下1个字符,继续循环
JMPNEXTEXIT:MOVCOUNT,AX;小写字母数写入COUNT
MOVAH,4CH INT21HCODEENDSENDBEGIN第六十八页,共八十九页,2022年,8月28日程序运行后,COUNT中的内容为19(=13H)。
屏幕上显示:THISISAASSEMBLYPROGRAM.第六十九页,共八十九页,2022年,8月28日例5-8假设TAB为首址的字节存储区中,存放n个学生汇编语言的考试成绩。若学号顺序是随机的,现需在表中查找某个学号相对应的汇编语言成绩,若查找成功则将该学号的偏移地址送SI,对应的成绩送DH,并将FLAG置1;否则将FLAG清0,查询失败。第七十页,共八十九页,2022年,8月28日分析:在一批数据中查找满足条件的值,最简单的方法就是从第1个数据开始逐一比较。如找到满足条件的值就跳出循环,取出相应信息送入指定寄存器,否则顺序向下查找,如果查找遍所有n个数据仍未找到,则结束循环,查找失败。实现时可在数据区中构建一个表,表中每一项占若干字节,本例每个学生只有学号和成绩,因此每项可用2个字节,n个学生共占2n个字节。第七十一页,共八十九页,2022年,8月28日
存储单元和寄存器分配如下:N:存放TAB表的总项数CX:循环计数器,初值为N,每次减1BX:指向TAB的地址,每次增加2AL:存放要查找的学号SI:保存查找成功时学号的偏移地址DH:保存查找成功时相对应成绩FLAG:1表查找成功,0表示失败NUM:存放要查找的学号第七十二页,共八十九页,2022年,8月28日BX←TAB的偏移地址CX←NAL←要查找的学号(AL)=([BX])BX←(BX)+2CX←(CX)-1(CX)=0FLAG←0结束SI←(BX)DH←([BX]+1)FLAG←1NNYY开始图5-10顺序查找流程图第七十三页,共八十九页,2022年,8月28日STACKSEGMENTSTACKDB200DUP(0)STACKENDSDATASEGMENTTABDB5,90,8,75,2,80,6,78,15DB84,3,95,12,86,20,92N=($-TAB)/2;TAB中的总项数NUMDB6 ;查找6号学生的成绩FLAGDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AX 源程序如下:第七十四页,共八十九页,2022年,8月28日
LEABX,TAB;BX←TAB的偏移地址
MOVCX,N;CX←N
MOVAL,NUM;AL←待查找的学号NEXT:CMPAL,[BX] JEDONE;查找成功转DONE ADDBX,2;BX增加2 DECCX ;CX←(CX)﹣1
JNE NEXT
;(CX)≠0,继续查找
MOVFLAG,0;FLAG←0,查找失败
JMPEXITDONE:MOVSI,BX;SI←学号的偏移值
MOVDH,[BX+1];DH←相对应的成绩
MOVFLAG,1;FLAG←1,查找成功EXIT:MOVAH,4CHINT21HCODEENDS ENDBEGIN第七十五页,共八十九页,2022年,8月28日
本程序运行后有:
(SI)=6,(DH)=4EH,(FLAG)=1
几个可思考问题:①若TAB表中除汇编成绩外,还有英语、数学2个成绩,每个数据项应分配几个字节?②若要查找的学号不是在数据段中直接给出,而是需要在程序运行时通过键盘输入,应如何实现?③若查找成功时,要求把学号和成绩直接显示出来,应如何实现?第七十六页,共八十九页,2022年,8月28日以上几例介绍了单循环程序的设计方法,若循环次数已知,可用计数型循环来实现,若循环次数未知,可用条件型循环来实现。第七十七页,共八十九页,2022年,8月28日冒泡排序(升序)的基本算法:冒泡排序的实现是从第一个元素开始,依次对N个元素中相邻的两个元素相比较,若顺序不满足则交换,这样经过第1轮比较后,最大的元素就排到了最后;然后进行第2轮,仍从第1个元素开始,依次对除最后1个元素外的N-1个元素中相邻的两个元素相比较,若顺序不满足则进行交换,经过第2轮比较后第2大元素就排在了倒数第2个位置,如此重复,直到所有的元素排序完毕。第七十八页,共八十九页,2022年,8月28日例如:
对以下数据进行升序排列
49 35 289776 1327
第1轮:
35492897761327第1次比较35与49,交换。35284997761327第2次比较49与28,交换。35284997761327第3次比较49与97,不交换。35284976971327第4次比较97与76,交换。35284976139727第5次比较97与13,交换。35284976132797
第6次比较97与27,交换。经过第1轮比较后,最大值97就“冒”到了最后1个位置。
第2轮:28 3549 13 277697
次大值76就出现在倒数第2个位置。
第3轮:28 3513 27 49 7697
第4轮后:28 1327 35 49 7697
第5轮后:13 2728 35 49 7697
第6轮后:13 27
2835 49 7697
经过6轮比较后,所有数据已按升序排列。第七十九页,共八十九页,2022年,8月28日排序和查找是程序设计中较典型的算法。我们曾介绍一种顺序查找算法,下面介绍一种在已排好序的数组中查找某个数值的算法:折半查找法或叫二分查找法。第八十页,共八十九页,2022年,8月28日
例5-10
以BUF为首址的字节存储区中,存放着一个由小到大排列的无符号数组,要求在数组中查找X,如找到则将该元素在数组中的偏移位置存入Y,并显示“OK!”,否则显示“NO!”。第八十一页,共八十九页,2022年,8月28日二分查找算法的基本思想: 二分查找算法是先取有序数组的中间元素(设为Mid),将其与要查找的值X相比较,若相等则查找成功。若不相等则判断X是在前半部分还是后半部分,如果X>Mid,则在后半部分查找,再取后半部分的中间元素与X比较;如果X小于中间元素,则在前半部分查找,取前半部分的中间元素与X相比较。如此重复,直到查找成功或未找到该数为止。
第八十二页,共八十九页,2022年,8月28日存储单元及寄存器分配如下:SI:存放BUF存储区中最小元素的偏移地址DI:存放BUF存储区中最大元素的偏移地址CX:存放数组的长度AL:存放要查找的数据XBL:存放BUF存储区中的中间元素Y:存放查找成功时元素的偏移位置
程序流程图如图5-12所示第八十三页,共八十九页,2022年,8月28日开始SI←0,CX←N,AL←X,DI←N-1(AL)<(BUF+(SI))(AL)﹥(BUF+(DI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年环冷机橡胶密封板项目投资价值分析报告
- 2025至2030年滩羊皮项目投资价值分析报告
- 2025至2030年水牛皮鞋垫项目投资价值分析报告
- 2025至2030年楼顶装饰塔行业深度研究报告
- PLC基本编程指令-三相异步电动机连续运行控制系统设计
- 2025至2030年塑料混炼造粒机项目投资价值分析报告
- 胫骨平台骨折的临床护理
- 2025至2030年中国安座螺丝项目投资可行性研究报告
- 2025至2030年中国天然石墨行业竞争策略研究及未来前景展望报告
- 药物外渗的预防及护理
- 施工现场安全围挡
- 拐杖及助行器的使用方法课件
- 中央环保督察迎战培训课件
- 风湿免疫科学教学设计案例
- 妊娠合并梅毒护理查房课件
- 燃气管网新建及改造冬雨季施工措施
- 2023小米年度报告
- 修大坝施工方案
- 筋伤-腕部筋伤(中医骨伤科学十三五教材)
- 职工食堂餐饮服务投标方案(技术方案)
- 黄山杯评审材料验收资料
评论
0/150
提交评论