![循環(huán)程序設(shè)計(jì)_第1頁(yè)](http://file4.renrendoc.com/view/729d713a31c453884bdee4d5218cb273/729d713a31c453884bdee4d5218cb2731.gif)
![循環(huán)程序設(shè)計(jì)_第2頁(yè)](http://file4.renrendoc.com/view/729d713a31c453884bdee4d5218cb273/729d713a31c453884bdee4d5218cb2732.gif)
![循環(huán)程序設(shè)計(jì)_第3頁(yè)](http://file4.renrendoc.com/view/729d713a31c453884bdee4d5218cb273/729d713a31c453884bdee4d5218cb2733.gif)
![循環(huán)程序設(shè)計(jì)_第4頁(yè)](http://file4.renrendoc.com/view/729d713a31c453884bdee4d5218cb273/729d713a31c453884bdee4d5218cb2734.gif)
![循環(huán)程序設(shè)計(jì)_第5頁(yè)](http://file4.renrendoc.com/view/729d713a31c453884bdee4d5218cb273/729d713a31c453884bdee4d5218cb2735.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
循環(huán)程序設(shè)計(jì)第一頁(yè),共八十九頁(yè),2022年,8月28日1、如何計(jì)算轉(zhuǎn)移指令的目標(biāo)地址?2、分支程序的結(jié)構(gòu)特點(diǎn)和如何編寫分支程序?第二頁(yè),共八十九頁(yè),2022年,8月28日第5章
循環(huán)程序設(shè)計(jì)第三頁(yè),共八十九頁(yè),2022年,8月28日本章學(xué)習(xí)目標(biāo)循環(huán)程序的一般結(jié)構(gòu)循環(huán)指令計(jì)數(shù)型循環(huán)與條件型循環(huán)單重循環(huán)程序設(shè)計(jì)方法多重循環(huán)程序設(shè)計(jì)方法通過本章學(xué)習(xí),應(yīng)掌握以下內(nèi)容:第四頁(yè),共八十九頁(yè),2022年,8月28日5.1循環(huán)程序的一般結(jié)構(gòu)5.2循環(huán)指令5.3循環(huán)程序設(shè)計(jì)方法第五頁(yè),共八十九頁(yè),2022年,8月28日5.1循環(huán)程序
的一般結(jié)構(gòu)第六頁(yè),共八十九頁(yè),2022年,8月28日順序程序是按指令的先后順序依次執(zhí)行,每條指令只執(zhí)行一次;分支程序是根據(jù)判斷條件的真假,選擇其中的一個(gè)分支段程序執(zhí)行;循環(huán)程序是根據(jù)需要重復(fù)執(zhí)行一段程序多次。第七頁(yè),共八十九頁(yè),2022年,8月28日循環(huán)程序結(jié)構(gòu)分計(jì)數(shù)型循環(huán)和條件型循環(huán)。循環(huán)程序由3部分組成:
(1)循環(huán)初始化:
為循環(huán)做準(zhǔn)備工作(2)循環(huán)體:
重復(fù)執(zhí)行部分(3)循環(huán)控制:
按循環(huán)結(jié)束條件判斷是否繼續(xù)循環(huán)
第八頁(yè),共八十九頁(yè),2022年,8月28日兩種循環(huán)結(jié)構(gòu)流程圖:CX←循環(huán)次數(shù)循環(huán)體CX←循環(huán)次數(shù)-1(CX)=0NY退出循環(huán)圖5-1計(jì)數(shù)型循環(huán)結(jié)構(gòu)圖5-2條件型循環(huán)結(jié)構(gòu)循環(huán)初始化部分循環(huán)體(工作部分和修改循環(huán)條件)循環(huán)結(jié)束條件NY退出循環(huán)第九頁(yè),共八十九頁(yè),2022年,8月28日實(shí)際應(yīng)用,可將循環(huán)控制部分放在循環(huán)體之前,形成“先判斷、后循環(huán)”的結(jié)構(gòu),也可以將循環(huán)控制部分放在循環(huán)體之后,形成“先循環(huán)、后判斷”的結(jié)構(gòu)形式。下面分別舉例說明計(jì)數(shù)型循環(huán)和條件型循環(huán)的控制方法。第十頁(yè),共八十九頁(yè),2022年,8月28日例5-1n個(gè)8位有符號(hào)數(shù),存在BUF為首址的存儲(chǔ)區(qū)中,試統(tǒng)計(jì)正數(shù)的個(gè)數(shù)。
分析:每個(gè)數(shù)均是8位有符號(hào)二進(jìn)制數(shù),應(yīng)先分析數(shù)的正負(fù),再使用符號(hào)數(shù)條件轉(zhuǎn)移指令進(jìn)行轉(zhuǎn)移或正數(shù)的統(tǒng)計(jì)。共有n個(gè)元素,整個(gè)程序的結(jié)構(gòu)要重復(fù)判斷n次,故可選用計(jì)數(shù)型循環(huán)程序。第十一頁(yè),共八十九頁(yè),2022年,8月28日
存儲(chǔ)單元及寄存器分配如下:BX:BUF存儲(chǔ)區(qū)的地址指針,初值為BUF的偏移地址,每循環(huán)一次之后,其值加1。
CX:循環(huán)計(jì)數(shù)器,初值為BUF存儲(chǔ)區(qū)中元素的個(gè)數(shù)n,每循環(huán)一次之后,其值減1。
AX:存放正數(shù)的個(gè)數(shù),初值為零。
COUNT:最終存放正數(shù)的個(gè)數(shù)。
程序流程圖如圖5-3所示。第十二頁(yè),共八十九頁(yè),2022年,8月28日開始BX←BUF的偏移地址CX←BUF區(qū)中元素個(gè)數(shù)AX←0([BX])>0AX←(AX)+1BX←(BX)+1CX←(CX)-1(CX)=0COUNT←(AX)結(jié)束YYNN循環(huán)初始部分循環(huán)體部分循環(huán)控制部分圖5-3統(tǒng)計(jì)正數(shù)個(gè)數(shù)程序流程圖第十三頁(yè),共八十九頁(yè),2022年,8月28日源程序如下:STACKSEGMENTSTACKDB200DUP(0)STACKENDSDATASEGMENTBUFDB8,10,-5,100,-7,25,40N=$﹣BUF;BUF區(qū)中元素個(gè)數(shù)COUNTDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATA MOVDS,AX 第十四頁(yè),共八十九頁(yè),2022年,8月28日
LEABX,BUF
MOVCX,N
;循環(huán)初始部分
MOVAX,0AGAIN:CMPBYTEPTR[BX],0
JLENEXT
INCAX
;循環(huán)體部分NEXT:INCBX
DECCX JNZAGAIN
;循環(huán)控制部分
MOVCOUNT,AX
;正數(shù)個(gè)數(shù)送入COUNT
MOVAH,4CH INT21HCODEENDS ENDBEGIN
第十五頁(yè),共八十九頁(yè),2022年,8月28日該程序的循環(huán)體重復(fù)執(zhí)行了n次,即當(dāng)(CX)=n,n-1,…,1時(shí)循環(huán)執(zhí)行,當(dāng)(CX)=0時(shí)循環(huán)結(jié)束,將正數(shù)個(gè)數(shù)5送入字變量COUNT中。
對(duì)于計(jì)數(shù)型循環(huán),在進(jìn)入循環(huán)體前要先要確定循環(huán)次數(shù),每循環(huán)一次就修改一次計(jì)數(shù)值,計(jì)數(shù)值為零時(shí)就結(jié)束循環(huán)。第十六頁(yè),共八十九頁(yè),2022年,8月28日
思考題:
(1)在循環(huán)初始部分,如果將負(fù)值送入循環(huán)計(jì)數(shù)器CX,即:“MOVCX,-n”,應(yīng)該如何修改程序?(2)若將0送入循環(huán)計(jì)數(shù)器CX中,即:“MOVCX,0”,應(yīng)該如何修改程序?(3)如果要分別統(tǒng)計(jì)出正數(shù)、零、負(fù)數(shù)的個(gè)數(shù),應(yīng)如何設(shè)計(jì)程序?第十七頁(yè),共八十九頁(yè),2022年,8月28日例5-2
統(tǒng)計(jì)寄存器BX中1碼元的個(gè)數(shù),將結(jié)果存放在COUNT單元中。分析:統(tǒng)計(jì)BX中1碼元的個(gè)數(shù),須進(jìn)行逐位測(cè)試。先判斷最高位是否為1,然后用移位方法,把各位逐次移到最高位進(jìn)行判斷。循環(huán)的結(jié)束條件可用計(jì)數(shù)值16來控制,即可以用計(jì)數(shù)型循環(huán)來設(shè)計(jì)。但是,這種方法的缺點(diǎn)是無論BX中有沒有
1都必須循環(huán)16次。第十八頁(yè),共八十九頁(yè),2022年,8月28日若用條件控制法,即測(cè)試BX的值是否為0作為結(jié)束條件,可大大縮短循環(huán)次數(shù)。存儲(chǔ)單元及寄存器分配如下:BX:要測(cè)試的寄存器
CX:存放1的個(gè)數(shù),初始值為0COUNT:最終存放1的個(gè)數(shù)
程序流程圖如圖5-4所示第十九頁(yè),共八十九頁(yè),2022年,8月28日開始(BX)=0(CX)←0SF=0CX←(CX)+1(BX)左移一位COUNT←(CX)結(jié)束NYNY圖5-4統(tǒng)計(jì)BX中1的個(gè)數(shù)程序流程第二十頁(yè),共八十九頁(yè),2022年,8月28日源程序如下:STACK SEGMENTSTACKDB200DUP(0)STACK ENDSDATA SEGMENTCOUNTDW?DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATA MOVDS,AX
第二十一頁(yè),共八十九頁(yè),2022年,8月28日 MOVCX,0;CX←0NEXT:ANDBX,BX
;BX相與運(yùn)算
JZEXIT
;(BX)=0,結(jié)束循環(huán)
JNSNEXT1
;SF=0(結(jié)果的最高位)轉(zhuǎn)NEXT1 INCCX;否則,CX←(CX)+1NEXT1:SHLBX,1 ;(BX)左移1位
JMPNEXT
;無條件轉(zhuǎn)NEXT繼續(xù)循環(huán)EXIT:MOVCOUNT,CX ;COUNT←1的個(gè)數(shù) MOVAH,4CH INT21HCODE ENDS ENDBEGIN第二十二頁(yè),共八十九頁(yè),2022年,8月28日程序運(yùn)行中,若BX的值全為0,則不必循環(huán),直接轉(zhuǎn)EXIT結(jié)束。若只有最高位為1,則執(zhí)行“INCCX”后,左移一位,再轉(zhuǎn)NEXT處判斷,此時(shí)(BX)=0轉(zhuǎn)EXIT,僅需執(zhí)行一次循環(huán)。只有最低位為1時(shí)才需16次循環(huán),統(tǒng)計(jì)出BX中的個(gè)數(shù)。顯然,用條件控制循環(huán)效率最高。返回本章目錄第二十三頁(yè),共八十九頁(yè),2022年,8月28日5.2循環(huán)指令第二十四頁(yè),共八十九頁(yè),2022年,8月28日為了簡(jiǎn)化循環(huán)程序的設(shè)計(jì),8086/8088指令系統(tǒng)專門設(shè)置了一組循環(huán)程序指令:LOOP、LOOPZ/LOOPE和LOOPNZ/LOOPNE。這些循環(huán)指令在執(zhí)行前,必須預(yù)先將循環(huán)次數(shù)存放在CX寄存器中。另外這些循環(huán)控制指令只能實(shí)現(xiàn)短轉(zhuǎn)移。第二十五頁(yè),共八十九頁(yè),2022年,8月28日1.LOOP循環(huán)指令
格式:LOOP標(biāo)號(hào)
功能:①CX←(CX)-1②判斷CX的值,若(CX)≠0轉(zhuǎn)移到標(biāo)號(hào)處繼續(xù)循環(huán),否則退出循環(huán)。第二十六頁(yè),共八十九頁(yè),2022年,8月28日例5-3
計(jì)算1+2+3+…+100,
將結(jié)果存入字變量SUM中。
分析:
這是一個(gè)典型的計(jì)數(shù)型循環(huán),用于求累加和。循環(huán)體執(zhí)行次數(shù)為100。
存儲(chǔ)單元及寄存器分配如下:AX:存累加求和,初值為0。
CX:存循環(huán)次數(shù),初值100,每次減1。
SUM:存最終結(jié)果的字變量。第二十七頁(yè),共八十九頁(yè),2022年,8月28日開始AX←0CX←100AX←(AX)+(CX)CX←(CX)-1(CX)=0SUM←(AX)結(jié)束NY圖5-5求累加和程序流程圖第二十八頁(yè),共八十九頁(yè),2022年,8月28日源程序如下:STACK SEGMENTSTACKDB200DUP(0)STACK ENDSDATA SEGMENTSUM DW?DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATA MOVDS,AX第二十九頁(yè),共八十九頁(yè),2022年,8月28日
MOVAX,0 ;AX清零
MOVCX,100
;CX←循環(huán)次數(shù)100NEXT:ADDAX,CX
;求累加和
LOOPNEXT
MOVSUM,AX;將累加和送入SUM中
MOVAH,4CH INT21HCODE ENDSENDBEGIN
程序運(yùn)行后,變量SUM中保存的值是5050。第三十頁(yè),共八十九頁(yè),2022年,8月28日思考:(1)程序中“LOOPNEXT”語(yǔ)句可以用哪兩條語(yǔ)句來代替?(2)若要求從1開始連續(xù)50個(gè)奇數(shù)的和,應(yīng)如何編程?第三十一頁(yè),共八十九頁(yè),2022年,8月28日2.LOOPZ/LOOPE為零或相等時(shí)循
環(huán)指令
格式:LOOPZ/LOOPE標(biāo)號(hào)
功能:①CX←(CX)-1②判斷CX和ZF的值,若(CX)≠0且ZF=1轉(zhuǎn)移到標(biāo)號(hào)處繼續(xù)循環(huán),若(CX)=0或ZF=0則退出循環(huán)。第三十二頁(yè),共八十九頁(yè),2022年,8月28日3.LOOPNZ/LOOPNE不為零或不相
等時(shí)循環(huán)指令
格式:LOOPNZ/LOOPNE標(biāo)號(hào)
功能:①CX←(CX)-1②判CX和ZF的值,若(CX)≠0且ZF=0轉(zhuǎn)移到標(biāo)號(hào)處繼續(xù)循環(huán),若(CX)=0或ZF=1則退出循環(huán)。
LOOPZ/LOOPE和LOOPNZ/LOOPNE指令提供了提前結(jié)束循環(huán)的可能性。第三十三頁(yè),共八十九頁(yè),2022年,8月28日例5-4
以BUF為首址的存儲(chǔ)區(qū)中存放有N個(gè)字符。在字符串中查找第1次出現(xiàn)“E”的字符。若找到將其偏移位置存入FOUND;否則顯示“NOFIND!”。分析:
在字符串中查找某字符,查找的方法有多種,這里采用順序查找法。若找到將其偏移位置保存起來,并結(jié)束程序;否則顯示“NOFIND!”。第三十四頁(yè),共八十九頁(yè),2022年,8月28日存儲(chǔ)單元與寄存器分配如下:BUF:存放字符串的存儲(chǔ)區(qū)SI:BUF存儲(chǔ)區(qū)中字符的偏移位置,初值為﹣1,每次遞增1。AL:保存要查找的字符CX:存放循環(huán)次數(shù),初值為字符串長(zhǎng)度,每次減1。FOUND:存查找成功時(shí)字符的偏移值第三十五頁(yè),共八十九頁(yè),2022年,8月28日源程序如下:STACKSEGMENTSTACKDB200DUP(0)STACKENDSDATASEGMENTBUFDB“HELLO,MYFRIEND!”N=$-BUFFOUNDDW?NOFINDDB0DH,0AH,“NOFIND!$”DATAENDSCODESEGMENTASSUMECS:CODE,SS:STACK,DS:DATABEGIN:MOVAX,DATA MOVDS,AX
第三十六頁(yè),共八十九頁(yè),2022年,8月28日
MOVCX,N;CX←字符串長(zhǎng)度NMOVSI,-1;給BUF偏移量的初值
MOVAL,45H;AL←“E”的ASCII碼NEXT:INCSICMPAL,BUF[SI];判斷要查找的字符
LOOPNENEXT
;ZF=0且(CX)≠0轉(zhuǎn)NEXT循環(huán)
JNZNO_FIND
;ZF=0轉(zhuǎn)NO_FINDMOVFOUND,SI;ZF=1,偏移量送FOUND
JMPEXITNO_FIND:MOVDX,OFFSETNOFINDMOVAH,9;顯示“NOFIND!”
INT21HEXIT:MOVAH,4CH;程序結(jié)束
INT21H CODE ENDSENDBEGIN第三十七頁(yè),共八十九頁(yè),2022年,8月28日
程序執(zhí)行過程中,有兩種可能性:(1)成功找到字符“E”,ZF=1,提前退出循環(huán)。執(zhí)行JNZ指令時(shí),因不滿足測(cè)試條件而執(zhí)行下一條指令“MOVFOUND,SI”。(2)一直查找到字符串結(jié)束而未發(fā)現(xiàn)字符“E”,則因(CX)=0而結(jié)束循環(huán)。在執(zhí)行JNZ指令時(shí),因ZF=0而轉(zhuǎn)NO_FIND。返回本章目錄第三十八頁(yè),共八十九頁(yè),2022年,8月28日5.3循環(huán)程序設(shè)計(jì)方法第三十九頁(yè),共八十九頁(yè),2022年,8月28日循環(huán)程序,按結(jié)構(gòu)可分單重循環(huán)程序和多重循環(huán)程序。5.3.1單重循環(huán)程序設(shè)計(jì)單重循環(huán)是其循環(huán)體內(nèi)不再包含循環(huán)結(jié)構(gòu)的程序。第四十頁(yè),共八十九頁(yè),2022年,8月28日
例5-5
BUF為首址的存儲(chǔ)區(qū)中存放一串字符,把最大的字符存入MAX中。
分析:
在一串字符中尋找最大值,可將第1個(gè)字符存入AL單元中。然后,從第2個(gè)字符開始依次與AL比較,若某個(gè)字符比AL還大,則將其賦給AL,如此比較,最后AL中保存的定是最大字符。第四十一頁(yè),共八十九頁(yè),2022年,8月28日存儲(chǔ)單元與寄存器分配如下:CX:循環(huán)次數(shù)控制變量,初值為字符串的長(zhǎng)度減1,每次減1。BX:BUF存儲(chǔ)區(qū)地址指針,初值指向BUF,每次加1。AL:保持某個(gè)時(shí)刻的最大字符值。MAX:保存最終結(jié)果的字節(jié)單元。
程序流程圖如圖5-6所示。第四十二頁(yè),共八十九頁(yè),2022年,8月28日Y開始BX←BUF存儲(chǔ)區(qū)首地址AL←字符串中第一個(gè)字符CX←字符串長(zhǎng)度減1BX←(BX)+1(AL)≥[BX]CX←(CX)-1AL←(BX)(CX)=0MAX←(AL)結(jié)束NYN圖5-6求最大字符的流程圖第四十三頁(yè),共八十九頁(yè),2022年,8月28日STACK SEGMENTSTACKDB200DUP(0)STACK ENDSDATA SEGMENTBUFDB‘ABCD5678bdcaMN’N =$-BUFMAXDB?DATAENDCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATA MOVDS,AX
源程序如下:第四十四頁(yè),共八十九頁(yè),2022年,8月28日
MOVBX,OFFSETBUF;BX指向字符串首
MOVAL,[BX];取第1個(gè)字符
MOVCX,N-1
;循環(huán)次數(shù)送CXNEXT1:INCBX
;BX指向下1字符
CMPAL,[BX];比較大小
JNCNEXT2;JAENEXT2(替代)
MOVAL,[BX] ;較大數(shù)送ALNEXT2:LOOPNEXT1
;(CX)≠0繼續(xù)循環(huán)
MOVMAX,AL;MAX←最大數(shù)
MOVAH,4CH INT21H CODEENDS ENDBEGIN
程序運(yùn)行后,MAX單元中保存的字符是“d”。第四十五頁(yè),共八十九頁(yè),2022年,8月28日
例5-6
編程把字變量NUM中的二進(jìn)制數(shù),用十六進(jìn)制數(shù)顯示。
分析:把NUM中的二進(jìn)制數(shù)從左到右每4位分為1組,用循環(huán)移位把要處理的4位二進(jìn)制數(shù)移到最右邊,再將數(shù)值轉(zhuǎn)換到字符。若是數(shù)值0~9,加30H轉(zhuǎn)換成字符“0”
~“9”;若是值A(chǔ)~F,除將其值加30H外,還應(yīng)加上7H才能轉(zhuǎn)換成“A”~“F”。第四十六頁(yè),共八十九頁(yè),2022年,8月28日DI:指向存轉(zhuǎn)換結(jié)果的單元,每次加1BX:待轉(zhuǎn)換的二進(jìn)制數(shù)的工作單元CH:循環(huán)計(jì)數(shù)器,初值為4,每次減1CL:循環(huán)移位次數(shù),每次移4位AL:轉(zhuǎn)換中用到的工作單元
程序流程圖如圖5-7所示存儲(chǔ)單元及寄存器分配如下:第四十七頁(yè),共八十九頁(yè),2022年,8月28日?qǐng)D5-7二進(jìn)制轉(zhuǎn)換成十六進(jìn)制的程序流程圖開始初始化工作將BX循環(huán)左移四位是否大于“9”Y將轉(zhuǎn)換結(jié)果送存儲(chǔ)區(qū)保存加07調(diào)整循環(huán)計(jì)數(shù)器為0顯示轉(zhuǎn)換結(jié)果結(jié)束NYN取BX低四位轉(zhuǎn)換成ASCII碼第四十八頁(yè),共八十九頁(yè),2022年,8月28日
源程序如下:DATA SEGMENTNUMDW0010110100111001BBUF DB0AH,0DH,‘(NUM)=’BUF0 DB6DUP(?)DATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDSCODE SEGMENT
ASSUMECS:CODE,SS:STACK,DS:DATABEGIN:MOVAX,DATA MOVDS,AX第四十九頁(yè),共八十九頁(yè),2022年,8月28日
MOVBX,NUM
;待轉(zhuǎn)換的二進(jìn)制數(shù)送BX
LEADI,BUF0
;存儲(chǔ)單元首址送DI
MOVCH,4
;CH←循環(huán)次數(shù)NEXT:
MOVCL,4
;CL←循環(huán)移位次數(shù)
ROLBX,CL
;4位二進(jìn)制數(shù)移到最低位
MOVAL,BL
;取BX的低字節(jié)送AL
ANDAL,0FH
;取出最低4位
ORAL,30H
;轉(zhuǎn)換成十六進(jìn)制
CMPAL,3AH
JLDONE
;≤‘9’
時(shí)轉(zhuǎn)移
ADDAL,07H
;若大于‘9’加07HDONE:MOV[DI],AL
;轉(zhuǎn)換的十六進(jìn)制數(shù)送BUF0
INCDI
;指向下一存儲(chǔ)單元
DECCH
;CH←(CH)﹣1
JNZNEXT
;(CH)≠0轉(zhuǎn)NEXT繼續(xù)轉(zhuǎn)換第五十頁(yè),共八十九頁(yè),2022年,8月28日
MOVBYTEPTR[DI],“H”
;十六進(jìn)制數(shù)后加‘H’ INCDI MOVBYTEPTR[DI],“$” LEADX,BUF0;顯示十六進(jìn)制數(shù)
MOVAH,9INT21H MOVAH,4CH INT21HCODEENDSENDBEGIN
程序運(yùn)行后,屏幕顯示:(NUM)=2D39H第五十一頁(yè),共八十九頁(yè),2022年,8月28日5.3.2多重循環(huán)程序設(shè)計(jì)多重循環(huán)指循環(huán)體內(nèi)又嵌套有循環(huán)的程序。
多重循環(huán)程序設(shè)計(jì)的基本思想和單重循環(huán)程序設(shè)計(jì)是一致的,但應(yīng)分別考慮各重循環(huán)的控制條件及其程序?qū)崿F(xiàn),內(nèi)外層循環(huán)必須是嵌套的,不能出現(xiàn)交叉。第五十二頁(yè),共八十九頁(yè),2022年,8月28日
例5-9BUF為首址的字節(jié)存儲(chǔ)區(qū)存放有n
個(gè)無符號(hào)數(shù)x1,x2,…,xn,試編程將它們由大到小排列在BUF中。
分析:
本例是對(duì)n個(gè)數(shù)據(jù)排序,排序的方法有很多種,如選擇、冒泡、插入、shell排序等。這里僅介紹較簡(jiǎn)單的選擇排序。第五十三頁(yè),共八十九頁(yè),2022年,8月28日
選擇排序算法:
一組數(shù)放入n個(gè)存儲(chǔ)單元,先將第1個(gè)存儲(chǔ)單元中的數(shù)與其后n-1個(gè)存儲(chǔ)單元中的數(shù)依次比較,將兩數(shù)中的大數(shù)放在第1個(gè)存儲(chǔ)單元,經(jīng)過n-1次比較后,n個(gè)數(shù)中的最大者定存入第1個(gè)存儲(chǔ)單元中,n-1次比較可以用一個(gè)計(jì)數(shù)型循環(huán)來控制;接著進(jìn)行第2輪比較,將第2個(gè)存儲(chǔ)單元中的數(shù)與其后的n-2個(gè)存儲(chǔ)單元中的數(shù)依次比較,n個(gè)數(shù)中的第2大者就存入第2個(gè)存儲(chǔ)單元,如此重復(fù),直到第n-1輪比較后,將n個(gè)數(shù)中的第n-1大者存入第n-1個(gè)存儲(chǔ)單元,第n個(gè)存儲(chǔ)單元中的數(shù)據(jù)定是n個(gè)數(shù)中的最小者。從第1輪到第n-1輪的控制又可以用1個(gè)計(jì)數(shù)型循環(huán)。第五十四頁(yè),共八十九頁(yè),2022年,8月28日例如,4個(gè)數(shù)據(jù):60279643
將它們從大到小的重新排列。
4個(gè)數(shù)的排序需要經(jīng)過3輪比較才能完成。第1輪:
將第1個(gè)存儲(chǔ)單元的數(shù)據(jù)60,依次與后面的數(shù)據(jù)比較,經(jīng)3次比較得第1個(gè)單元的最大值96。第1次:6027 96 4360>27不需交換第2次:9627 60 4360<96進(jìn)行交換 第3次:9627 60 4396>43不需交換
第2輪:
求第2個(gè)位置上的最大值,需經(jīng)兩次比較。第1次:9660 27 4327<60進(jìn)行交換 第2次:9660 27 4360>43不需交換 第3輪:
求第3個(gè)位置上的最大值,只需經(jīng)1次比較。第1次:9660 43 2727<43進(jìn)行交換 第五十五頁(yè),共八十九頁(yè),2022年,8月28日
存儲(chǔ)單元和寄存器分配如下:BUF:存放要排序數(shù)據(jù)的存儲(chǔ)單元N:存放要排序數(shù)據(jù)的個(gè)數(shù)SI:控制外循環(huán)的循環(huán)計(jì)數(shù)器,初值為
1,終值為N﹣1,每次遞增1。DI:控制內(nèi)循環(huán)的循環(huán)計(jì)數(shù)器,初值為(SI)+1,終值為N,每次遞增1。AL:存放比較數(shù)據(jù)的寄存器第五十六頁(yè),共八十九頁(yè),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結(jié)束YYYNNN圖5-11選擇排序算法流程第五十七頁(yè),共八十九頁(yè),2022年,8月28日源程序如下:STACKSEGMENTSTACKDB200DUP(0)STACKENDSDATASEGMENTBUFDB0AH,8,15H,36H,6,20H,12HN=$-BUF;N為要排序數(shù)據(jù)的個(gè)數(shù)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATA MOVDS,AX MOVSI,1;外循環(huán)計(jì)數(shù)賦初值1NEXT1:MOVDI,SI
;內(nèi)循環(huán)計(jì)數(shù)初值(DI)=(SI)+1INCDIMOVAL,[BUF+SI-1];AL←(BUF+(SI)﹣1)第五十八頁(yè),共八十九頁(yè),2022年,8月28日NEXT2:CMPAL,[BUF+DI-1]
;滿足降序轉(zhuǎn)NEXT3
JAENEXT3
XCHGAL,[BUF+DI-1];兩數(shù)交換 MOV[BUF+SI-1],ALNEXT3:INCDI;(DI)←(DI)+1 CMPDI,N;(DI)≤
N轉(zhuǎn)NEXT2
JBENEXT2
;進(jìn)入下一輪循環(huán) INCSI;(SI)←(SI)+1 CMPSI,N-1;比較(SI)與N﹣1
JBENEXT1
;若(SI)≤N-1轉(zhuǎn)NEXT1MOVAH,4CH
INT21HCODE ENDS ENDBEGIN第五十九頁(yè),共八十九頁(yè),2022年,8月28日
程序運(yùn)行后,BUF中的內(nèi)容如下:
36H,20H,15H,12H,0AH,8,6思考:①本例題是對(duì)存儲(chǔ)單元中的N個(gè)無符號(hào)數(shù)進(jìn)行比較排序,若要對(duì)N個(gè)有符號(hào)數(shù)排序應(yīng)如何實(shí)現(xiàn)?②若要對(duì)數(shù)據(jù)進(jìn)行升序排列應(yīng)如何實(shí)現(xiàn)?第六十頁(yè),共八十九頁(yè),2022年,8月28日本章小結(jié)通過本章的學(xué)習(xí),應(yīng)掌握循環(huán)程序的一般結(jié)構(gòu)和循環(huán)指令,并深刻理解計(jì)數(shù)型循環(huán)與條件型循環(huán)的區(qū)別。熟練掌握單重循環(huán)和多重循環(huán)程序的設(shè)計(jì)。第六十一頁(yè),共八十九頁(yè),2022年,8月28日習(xí)題Ⅴ返回本章首頁(yè)P(yáng)130:5-1、5-2、5-3、
5-4第六十二頁(yè),共八十九頁(yè),2022年,8月28日例5-7BUF為首址的存儲(chǔ)區(qū)存放著1個(gè)以‘$’作為結(jié)束標(biāo)志的字符串,試編寫程序完成下列功能:①統(tǒng)計(jì)其中小寫字母的個(gè)數(shù)并存入COUNT。②屏幕上顯示該字符串并要求小寫字母要以大寫字母顯示出來。第六十三頁(yè),共八十九頁(yè),2022年,8月28日分析:本題沒有給出字符串的長(zhǎng)度,但給出了字符串的結(jié)束標(biāo)志??梢赃x用條件控制循環(huán)程序的執(zhí)行。每當(dāng)從BUF中取出一個(gè)字符,若是“$”則結(jié)束循環(huán)。否則,若是小寫字母,先累加統(tǒng)計(jì),再將小寫字母轉(zhuǎn)換成大寫字母(ASCII碼值減去20H)并顯示,若不是小寫字母,則直接顯示。第六十四頁(yè),共八十九頁(yè),2022年,8月28日
存儲(chǔ)單元和寄存器分配如下:BX:指向BUF首地址,每次加1AX:保存小寫字母?jìng)€(gè)數(shù)
DL:存放要顯示字符
COUNT:保存小寫字母?jìng)€(gè)數(shù)
程序流程圖如圖5-8所示。第六十五頁(yè),共八十九頁(yè),2022年,8月28日開始AX←0BX←BUF的偏移地址DL←([BX])(DL)=‘$’(DL)為小寫字母小寫字母轉(zhuǎn)換成大寫字母AX←(AX)+1顯示DL中字符BX←(BX)+1COUNT←(AX)結(jié)束YNYN圖5-8小寫字母統(tǒng)計(jì)及字符串顯示第六十六頁(yè),共八十九頁(yè),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的偏移地址源程序如下:第六十七頁(yè),共八十九頁(yè),2022年,8月28日NEXT:MOVDL,[BX]
;存儲(chǔ)區(qū)中取1個(gè)字符送入DL CMPDL,‘$’
;為‘$’,則轉(zhuǎn)EXIT
JEEXIT CMPDL,‘a(chǎn)’
JBDONE
;不是小寫字母,則轉(zhuǎn)DONE
CMPDL,‘z’
JA DONE SUBDL,20H;小寫字母轉(zhuǎn)換成大寫字母
INCAX;統(tǒng)計(jì)小寫字母DONE:MOVAH,2;顯示大寫字母 INT21H
INCBX;指向下1個(gè)字符,繼續(xù)循環(huán)
JMPNEXTEXIT:MOVCOUNT,AX;小寫字母數(shù)寫入COUNT
MOVAH,4CH INT21HCODEENDSENDBEGIN第六十八頁(yè),共八十九頁(yè),2022年,8月28日程序運(yùn)行后,COUNT中的內(nèi)容為19(=13H)。
屏幕上顯示:THISISAASSEMBLYPROGRAM.第六十九頁(yè),共八十九頁(yè),2022年,8月28日例5-8假設(shè)TAB為首址的字節(jié)存儲(chǔ)區(qū)中,存放n個(gè)學(xué)生匯編語(yǔ)言的考試成績(jī)。若學(xué)號(hào)順序是隨機(jī)的,現(xiàn)需在表中查找某個(gè)學(xué)號(hào)相對(duì)應(yīng)的匯編語(yǔ)言成績(jī),若查找成功則將該學(xué)號(hào)的偏移地址送SI,對(duì)應(yīng)的成績(jī)送DH,并將FLAG置1;否則將FLAG清0,查詢失敗。第七十頁(yè),共八十九頁(yè),2022年,8月28日分析:在一批數(shù)據(jù)中查找滿足條件的值,最簡(jiǎn)單的方法就是從第1個(gè)數(shù)據(jù)開始逐一比較。如找到滿足條件的值就跳出循環(huán),取出相應(yīng)信息送入指定寄存器,否則順序向下查找,如果查找遍所有n個(gè)數(shù)據(jù)仍未找到,則結(jié)束循環(huán),查找失敗。實(shí)現(xiàn)時(shí)可在數(shù)據(jù)區(qū)中構(gòu)建一個(gè)表,表中每一項(xiàng)占若干字節(jié),本例每個(gè)學(xué)生只有學(xué)號(hào)和成績(jī),因此每項(xiàng)可用2個(gè)字節(jié),n個(gè)學(xué)生共占2n個(gè)字節(jié)。第七十一頁(yè),共八十九頁(yè),2022年,8月28日
存儲(chǔ)單元和寄存器分配如下:N:存放TAB表的總項(xiàng)數(shù)CX:循環(huán)計(jì)數(shù)器,初值為N,每次減1BX:指向TAB的地址,每次增加2AL:存放要查找的學(xué)號(hào)SI:保存查找成功時(shí)學(xué)號(hào)的偏移地址DH:保存查找成功時(shí)相對(duì)應(yīng)成績(jī)FLAG:1表查找成功,0表示失敗NUM:存放要查找的學(xué)號(hào)第七十二頁(yè),共八十九頁(yè),2022年,8月28日BX←TAB的偏移地址CX←NAL←要查找的學(xué)號(hào)(AL)=([BX])BX←(BX)+2CX←(CX)-1(CX)=0FLAG←0結(jié)束SI←(BX)DH←([BX]+1)FLAG←1NNYY開始圖5-10順序查找流程圖第七十三頁(yè),共八十九頁(yè),2022年,8月28日STACKSEGMENTSTACKDB200DUP(0)STACKENDSDATASEGMENTTABDB5,90,8,75,2,80,6,78,15DB84,3,95,12,86,20,92N=($-TAB)/2;TAB中的總項(xiàng)數(shù)NUMDB6 ;查找6號(hào)學(xué)生的成績(jī)FLAGDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AX 源程序如下:第七十四頁(yè),共八十九頁(yè),2022年,8月28日
LEABX,TAB;BX←TAB的偏移地址
MOVCX,N;CX←N
MOVAL,NUM;AL←待查找的學(xué)號(hào)NEXT:CMPAL,[BX] JEDONE;查找成功轉(zhuǎn)DONE ADDBX,2;BX增加2 DECCX ;CX←(CX)﹣1
JNE NEXT
;(CX)≠0,繼續(xù)查找
MOVFLAG,0;FLAG←0,查找失敗
JMPEXITDONE:MOVSI,BX;SI←學(xué)號(hào)的偏移值
MOVDH,[BX+1];DH←相對(duì)應(yīng)的成績(jī)
MOVFLAG,1;FLAG←1,查找成功EXIT:MOVAH,4CHINT21HCODEENDS ENDBEGIN第七十五頁(yè),共八十九頁(yè),2022年,8月28日
本程序運(yùn)行后有:
(SI)=6,(DH)=4EH,(FLAG)=1
幾個(gè)可思考問題:①若TAB表中除匯編成績(jī)外,還有英語(yǔ)、數(shù)學(xué)2個(gè)成績(jī),每個(gè)數(shù)據(jù)項(xiàng)應(yīng)分配幾個(gè)字節(jié)?②若要查找的學(xué)號(hào)不是在數(shù)據(jù)段中直接給出,而是需要在程序運(yùn)行時(shí)通過鍵盤輸入,應(yīng)如何實(shí)現(xiàn)?③若查找成功時(shí),要求把學(xué)號(hào)和成績(jī)直接顯示出來,應(yīng)如何實(shí)現(xiàn)?第七十六頁(yè),共八十九頁(yè),2022年,8月28日以上幾例介紹了單循環(huán)程序的設(shè)計(jì)方法,若循環(huán)次數(shù)已知,可用計(jì)數(shù)型循環(huán)來實(shí)現(xiàn),若循環(huán)次數(shù)未知,可用條件型循環(huán)來實(shí)現(xiàn)。第七十七頁(yè),共八十九頁(yè),2022年,8月28日冒泡排序(升序)的基本算法:冒泡排序的實(shí)現(xiàn)是從第一個(gè)元素開始,依次對(duì)N個(gè)元素中相鄰的兩個(gè)元素相比較,若順序不滿足則交換,這樣經(jīng)過第1輪比較后,最大的元素就排到了最后;然后進(jìn)行第2輪,仍從第1個(gè)元素開始,依次對(duì)除最后1個(gè)元素外的N-1個(gè)元素中相鄰的兩個(gè)元素相比較,若順序不滿足則進(jìn)行交換,經(jīng)過第2輪比較后第2大元素就排在了倒數(shù)第2個(gè)位置,如此重復(fù),直到所有的元素排序完畢。第七十八頁(yè),共八十九頁(yè),2022年,8月28日例如:
對(duì)以下數(shù)據(jù)進(jìn)行升序排列
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,交換。經(jīng)過第1輪比較后,最大值97就“冒”到了最后1個(gè)位置。
第2輪:28 3549 13 277697
次大值76就出現(xiàn)在倒數(shù)第2個(gè)位置。
第3輪:28 3513 27 49 7697
第4輪后:28 1327 35 49 7697
第5輪后:13 2728 35 49 7697
第6輪后:13 27
2835 49 7697
經(jīng)過6輪比較后,所有數(shù)據(jù)已按升序排列。第七十九頁(yè),共八十九頁(yè),2022年,8月28日排序和查找是程序設(shè)計(jì)中較典型的算法。我們?cè)榻B一種順序查找算法,下面介紹一種在已排好序的數(shù)組中查找某個(gè)數(shù)值的算法:折半查找法或叫二分查找法。第八十頁(yè),共八十九頁(yè),2022年,8月28日
例5-10
以BUF為首址的字節(jié)存儲(chǔ)區(qū)中,存放著一個(gè)由小到大排列的無符號(hào)數(shù)組,要求在數(shù)組中查找X,如找到則將該元素在數(shù)組中的偏移位置存入Y,并顯示“OK!”,否則顯示“NO!”。第八十一頁(yè),共八十九頁(yè),2022年,8月28日二分查找算法的基本思想: 二分查找算法是先取有序數(shù)組的中間元素(設(shè)為Mid),將其與要查找的值X相比較,若相等則查找成功。若不相等則判斷X是在前半部分還是后半部分,如果X>Mid,則在后半部分查找,再取后半部分的中間元素與X比較;如果X小于中間元素,則在前半部分查找,取前半部分的中間元素與X相比較。如此重復(fù),直到查找成功或未找到該數(shù)為止。
第八十二頁(yè),共八十九頁(yè),2022年,8月28日存儲(chǔ)單元及寄存器分配如下:SI:存放BUF存儲(chǔ)區(qū)中最小元素的偏移地址DI:存放BUF存儲(chǔ)區(qū)中最大元素的偏移地址CX:存放數(shù)組的長(zhǎng)度AL:存放要查找的數(shù)據(jù)XBL:存放BUF存儲(chǔ)區(qū)中的中間元素Y:存放查找成功時(shí)元素的偏移位置
程序流程圖如圖5-12所示第八十三頁(yè),共八十九頁(yè),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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育培訓(xùn)機(jī)構(gòu)評(píng)估居間合同
- 紡織品交易居間合同協(xié)議書
- 2025年度辦公室日常保潔與節(jié)能照明設(shè)備供應(yīng)服務(wù)合同
- 廣告投放數(shù)據(jù)分析合同
- 產(chǎn)品包裝設(shè)計(jì)技術(shù)指南
- 安全生產(chǎn)托管協(xié)議合同
- 工礦企業(yè)產(chǎn)品購(gòu)銷合同
- 廚房承包協(xié)議集錦
- 農(nóng)業(yè)質(zhì)量標(biāo)準(zhǔn)制定指南
- 能源行業(yè)能源供應(yīng)鏈優(yōu)化與智能倉(cāng)儲(chǔ)管理
- 吲哚菁綠血管造影檢查知情同意書
- 最新婚姻家庭心理講座主題講座課件
- 無損檢測(cè)超聲波探傷檢測(cè)方案
- 浙江省溫州市地圖矢量PPT模板(圖文)
- DB32∕T 2948-2016 水利工程卷?yè)P(yáng)式啟閉機(jī)檢修技術(shù)規(guī)程
- 建筑施工圖設(shè)計(jì)教程
- 高中化學(xué)必修一復(fù)習(xí)提綱
- 工程款支付報(bào)審表
- 同位角內(nèi)錯(cuò)角同旁內(nèi)角專項(xiàng)練習(xí)題有答案
- 管理信息系統(tǒng)數(shù)據(jù)流程圖和業(yè)務(wù)流程圖經(jīng)典作品
- 常用抗凝藥物的應(yīng)用及護(hù)理PPT課件
評(píng)論
0/150
提交評(píng)論