版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
循環(huán)程序設計第一頁,共八十九頁,2022年,8月28日1、如何計算轉移指令的目標地址?2、分支程序的結構特點和如何編寫分支程序?第二頁,共八十九頁,2022年,8月28日第5章
循環(huán)程序設計第三頁,共八十九頁,2022年,8月28日本章學習目標循環(huán)程序的一般結構循環(huán)指令計數型循環(huán)與條件型循環(huán)單重循環(huán)程序設計方法多重循環(huán)程序設計方法通過本章學習,應掌握以下內容:第四頁,共八十九頁,2022年,8月28日5.1循環(huán)程序的一般結構5.2循環(huán)指令5.3循環(huán)程序設計方法第五頁,共八十九頁,2022年,8月28日5.1循環(huán)程序
的一般結構第六頁,共八十九頁,2022年,8月28日順序程序是按指令的先后順序依次執(zhí)行,每條指令只執(zhí)行一次;分支程序是根據判斷條件的真假,選擇其中的一個分支段程序執(zhí)行;循環(huán)程序是根據需要重復執(zhí)行一段程序多次。第七頁,共八十九頁,2022年,8月28日循環(huán)程序結構分計數型循環(huán)和條件型循環(huán)。循環(huán)程序由3部分組成:
(1)循環(huán)初始化:
為循環(huán)做準備工作(2)循環(huán)體:
重復執(zhí)行部分(3)循環(huán)控制:
按循環(huán)結束條件判斷是否繼續(xù)循環(huán)
第八頁,共八十九頁,2022年,8月28日兩種循環(huán)結構流程圖:CX←循環(huán)次數循環(huán)體CX←循環(huán)次數-1(CX)=0NY退出循環(huán)圖5-1計數型循環(huán)結構圖5-2條件型循環(huán)結構循環(huán)初始化部分循環(huán)體(工作部分和修改循環(huán)條件)循環(huán)結束條件NY退出循環(huán)第九頁,共八十九頁,2022年,8月28日實際應用,可將循環(huán)控制部分放在循環(huán)體之前,形成“先判斷、后循環(huán)”的結構,也可以將循環(huán)控制部分放在循環(huán)體之后,形成“先循環(huán)、后判斷”的結構形式。下面分別舉例說明計數型循環(huán)和條件型循環(huán)的控制方法。第十頁,共八十九頁,2022年,8月28日例5-1n個8位有符號數,存在BUF為首址的存儲區(qū)中,試統(tǒng)計正數的個數。
分析:每個數均是8位有符號二進制數,應先分析數的正負,再使用符號數條件轉移指令進行轉移或正數的統(tǒng)計。共有n個元素,整個程序的結構要重復判斷n次,故可選用計數型循環(huán)程序。第十一頁,共八十九頁,2022年,8月28日
存儲單元及寄存器分配如下:BX:BUF存儲區(qū)的地址指針,初值為BUF的偏移地址,每循環(huán)一次之后,其值加1。
CX:循環(huán)計數器,初值為BUF存儲區(qū)中元素的個數n,每循環(huán)一次之后,其值減1。
AX:存放正數的個數,初值為零。
COUNT:最終存放正數的個數。
程序流程圖如圖5-3所示。第十二頁,共八十九頁,2022年,8月28日開始BX←BUF的偏移地址CX←BUF區(qū)中元素個數AX←0([BX])>0AX←(AX)+1BX←(BX)+1CX←(CX)-1(CX)=0COUNT←(AX)結束YYNN循環(huán)初始部分循環(huán)體部分循環(huán)控制部分圖5-3統(tǒng)計正數個數程序流程圖第十三頁,共八十九頁,2022年,8月28日源程序如下:STACKSEGMENTSTACKDB200DUP(0)STACKENDSDATASEGMENTBUFDB8,10,-5,100,-7,25,40N=$﹣BUF;BUF區(qū)中元素個數COUNTDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATA MOVDS,AX 第十四頁,共八十九頁,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
;正數個數送入COUNT
MOVAH,4CH INT21HCODEENDS ENDBEGIN
第十五頁,共八十九頁,2022年,8月28日該程序的循環(huán)體重復執(zhí)行了n次,即當(CX)=n,n-1,…,1時循環(huán)執(zhí)行,當(CX)=0時循環(huán)結束,將正數個數5送入字變量COUNT中。
對于計數型循環(huán),在進入循環(huán)體前要先要確定循環(huán)次數,每循環(huán)一次就修改一次計數值,計數值為零時就結束循環(huán)。第十六頁,共八十九頁,2022年,8月28日
思考題:
(1)在循環(huán)初始部分,如果將負值送入循環(huán)計數器CX,即:“MOVCX,-n”,應該如何修改程序?(2)若將0送入循環(huán)計數器CX中,即:“MOVCX,0”,應該如何修改程序?(3)如果要分別統(tǒng)計出正數、零、負數的個數,應如何設計程序?第十七頁,共八十九頁,2022年,8月28日例5-2
統(tǒng)計寄存器BX中1碼元的個數,將結果存放在COUNT單元中。分析:統(tǒng)計BX中1碼元的個數,須進行逐位測試。先判斷最高位是否為1,然后用移位方法,把各位逐次移到最高位進行判斷。循環(huán)的結束條件可用計數值16來控制,即可以用計數型循環(huán)來設計。但是,這種方法的缺點是無論BX中有沒有
1都必須循環(huán)16次。第十八頁,共八十九頁,2022年,8月28日若用條件控制法,即測試BX的值是否為0作為結束條件,可大大縮短循環(huán)次數。存儲單元及寄存器分配如下:BX:要測試的寄存器
CX:存放1的個數,初始值為0COUNT:最終存放1的個數
程序流程圖如圖5-4所示第十九頁,共八十九頁,2022年,8月28日開始(BX)=0(CX)←0SF=0CX←(CX)+1(BX)左移一位COUNT←(CX)結束NYNY圖5-4統(tǒng)計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,結束循環(huán)
JNSNEXT1
;SF=0(結果的最高位)轉NEXT1 INCCX;否則,CX←(CX)+1NEXT1:SHLBX,1 ;(BX)左移1位
JMPNEXT
;無條件轉NEXT繼續(xù)循環(huán)EXIT:MOVCOUNT,CX ;COUNT←1的個數 MOVAH,4CH INT21HCODE ENDS ENDBEGIN第二十二頁,共八十九頁,2022年,8月28日程序運行中,若BX的值全為0,則不必循環(huán),直接轉EXIT結束。若只有最高位為1,則執(zhí)行“INCCX”后,左移一位,再轉NEXT處判斷,此時(BX)=0轉EXIT,僅需執(zhí)行一次循環(huán)。只有最低位為1時才需16次循環(huán),統(tǒng)計出BX中的個數。顯然,用條件控制循環(huán)效率最高。返回本章目錄第二十三頁,共八十九頁,2022年,8月28日5.2循環(huán)指令第二十四頁,共八十九頁,2022年,8月28日為了簡化循環(huán)程序的設計,8086/8088指令系統(tǒng)專門設置了一組循環(huán)程序指令:LOOP、LOOPZ/LOOPE和LOOPNZ/LOOPNE。這些循環(huán)指令在執(zhí)行前,必須預先將循環(huán)次數存放在CX寄存器中。另外這些循環(huán)控制指令只能實現短轉移。第二十五頁,共八十九頁,2022年,8月28日1.LOOP循環(huán)指令
格式:LOOP標號
功能:①CX←(CX)-1②判斷CX的值,若(CX)≠0轉移到標號處繼續(xù)循環(huán),否則退出循環(huán)。第二十六頁,共八十九頁,2022年,8月28日例5-3
計算1+2+3+…+100,
將結果存入字變量SUM中。
分析:
這是一個典型的計數型循環(huán),用于求累加和。循環(huán)體執(zhí)行次數為100。
存儲單元及寄存器分配如下:AX:存累加求和,初值為0。
CX:存循環(huán)次數,初值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←循環(huán)次數100NEXT:ADDAX,CX
;求累加和
LOOPNEXT
MOVSUM,AX;將累加和送入SUM中
MOVAH,4CH INT21HCODE ENDSENDBEGIN
程序運行后,變量SUM中保存的值是5050。第三十頁,共八十九頁,2022年,8月28日思考:(1)程序中“LOOPNEXT”語句可以用哪兩條語句來代替?(2)若要求從1開始連續(xù)50個奇數的和,應如何編程?第三十一頁,共八十九頁,2022年,8月28日2.LOOPZ/LOOPE為零或相等時循
環(huán)指令
格式:LOOPZ/LOOPE標號
功能:①CX←(CX)-1②判斷CX和ZF的值,若(CX)≠0且ZF=1轉移到標號處繼續(xù)循環(huán),若(CX)=0或ZF=0則退出循環(huán)。第三十二頁,共八十九頁,2022年,8月28日3.LOOPNZ/LOOPNE不為零或不相
等時循環(huán)指令
格式:LOOPNZ/LOOPNE標號
功能:①CX←(CX)-1②判CX和ZF的值,若(CX)≠0且ZF=0轉移到標號處繼續(xù)循環(huán),若(CX)=0或ZF=1則退出循環(huán)。
LOOPZ/LOOPE和LOOPNZ/LOOPNE指令提供了提前結束循環(huán)的可能性。第三十三頁,共八十九頁,2022年,8月28日例5-4
以BUF為首址的存儲區(qū)中存放有N個字符。在字符串中查找第1次出現“E”的字符。若找到將其偏移位置存入FOUND;否則顯示“NOFIND!”。分析:
在字符串中查找某字符,查找的方法有多種,這里采用順序查找法。若找到將其偏移位置保存起來,并結束程序;否則顯示“NOFIND!”。第三十四頁,共八十九頁,2022年,8月28日存儲單元與寄存器分配如下:BUF:存放字符串的存儲區(qū)SI:BUF存儲區(qū)中字符的偏移位置,初值為﹣1,每次遞增1。AL:保存要查找的字符CX:存放循環(huán)次數,初值為字符串長度,每次減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循環(huán)
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日
程序執(zhí)行過程中,有兩種可能性:(1)成功找到字符“E”,ZF=1,提前退出循環(huán)。執(zhí)行JNZ指令時,因不滿足測試條件而執(zhí)行下一條指令“MOVFOUND,SI”。(2)一直查找到字符串結束而未發(fā)現字符“E”,則因(CX)=0而結束循環(huán)。在執(zhí)行JNZ指令時,因ZF=0而轉NO_FIND。返回本章目錄第三十八頁,共八十九頁,2022年,8月28日5.3循環(huán)程序設計方法第三十九頁,共八十九頁,2022年,8月28日循環(huán)程序,按結構可分單重循環(huán)程序和多重循環(huán)程序。5.3.1單重循環(huán)程序設計單重循環(huán)是其循環(huán)體內不再包含循環(huán)結構的程序。第四十頁,共八十九頁,2022年,8月28日
例5-5
BUF為首址的存儲區(qū)中存放一串字符,把最大的字符存入MAX中。
分析:
在一串字符中尋找最大值,可將第1個字符存入AL單元中。然后,從第2個字符開始依次與AL比較,若某個字符比AL還大,則將其賦給AL,如此比較,最后AL中保存的定是最大字符。第四十一頁,共八十九頁,2022年,8月28日存儲單元與寄存器分配如下:CX:循環(huán)次數控制變量,初值為字符串的長度減1,每次減1。BX:BUF存儲區(qū)地址指針,初值指向BUF,每次加1。AL:保持某個時刻的最大字符值。MAX:保存最終結果的字節(jié)單元。
程序流程圖如圖5-6所示。第四十二頁,共八十九頁,2022年,8月28日Y開始BX←BUF存儲區(qū)首地址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
;循環(huán)次數送CXNEXT1:INCBX
;BX指向下1字符
CMPAL,[BX];比較大小
JNCNEXT2;JAENEXT2(替代)
MOVAL,[BX] ;較大數送ALNEXT2:LOOPNEXT1
;(CX)≠0繼續(xù)循環(huán)
MOVMAX,AL;MAX←最大數
MOVAH,4CH INT21H CODEENDS ENDBEGIN
程序運行后,MAX單元中保存的字符是“d”。第四十五頁,共八十九頁,2022年,8月28日
例5-6
編程把字變量NUM中的二進制數,用十六進制數顯示。
分析:把NUM中的二進制數從左到右每4位分為1組,用循環(huán)移位把要處理的4位二進制數移到最右邊,再將數值轉換到字符。若是數值0~9,加30H轉換成字符“0”
~“9”;若是值A~F,除將其值加30H外,還應加上7H才能轉換成“A”~“F”。第四十六頁,共八十九頁,2022年,8月28日DI:指向存轉換結果的單元,每次加1BX:待轉換的二進制數的工作單元CH:循環(huán)計數器,初值為4,每次減1CL:循環(huán)移位次數,每次移4位AL:轉換中用到的工作單元
程序流程圖如圖5-7所示存儲單元及寄存器分配如下:第四十七頁,共八十九頁,2022年,8月28日圖5-7二進制轉換成十六進制的程序流程圖開始初始化工作將BX循環(huán)左移四位是否大于“9”Y將轉換結果送存儲區(qū)保存加07調整循環(huán)計數器為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←循環(huán)次數NEXT:
MOVCL,4
;CL←循環(huán)移位次數
ROLBX,CL
;4位二進制數移到最低位
MOVAL,BL
;取BX的低字節(jié)送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繼續(xù)轉換第五十頁,共八十九頁,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多重循環(huán)程序設計多重循環(huán)指循環(huán)體內又嵌套有循環(huán)的程序。
多重循環(huán)程序設計的基本思想和單重循環(huán)程序設計是一致的,但應分別考慮各重循環(huán)的控制條件及其程序實現,內外層循環(huán)必須是嵌套的,不能出現交叉。第五十二頁,共八十九頁,2022年,8月28日
例5-9BUF為首址的字節(jié)存儲區(qū)存放有n
個無符號數x1,x2,…,xn,試編程將它們由大到小排列在BUF中。
分析:
本例是對n個數據排序,排序的方法有很多種,如選擇、冒泡、插入、shell排序等。這里僅介紹較簡單的選擇排序。第五十三頁,共八十九頁,2022年,8月28日
選擇排序算法:
一組數放入n個存儲單元,先將第1個存儲單元中的數與其后n-1個存儲單元中的數依次比較,將兩數中的大數放在第1個存儲單元,經過n-1次比較后,n個數中的最大者定存入第1個存儲單元中,n-1次比較可以用一個計數型循環(huán)來控制;接著進行第2輪比較,將第2個存儲單元中的數與其后的n-2個存儲單元中的數依次比較,n個數中的第2大者就存入第2個存儲單元,如此重復,直到第n-1輪比較后,將n個數中的第n-1大者存入第n-1個存儲單元,第n個存儲單元中的數據定是n個數中的最小者。從第1輪到第n-1輪的控制又可以用1個計數型循環(huán)。第五十四頁,共八十九頁,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:控制外循環(huán)的循環(huán)計數器,初值為
1,終值為N﹣1,每次遞增1。DI:控制內循環(huán)的循環(huán)計數器,初值為(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;外循環(huán)計數賦初值1NEXT1:MOVDI,SI
;內循環(huán)計數初值(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
;進入下一輪循環(huán) 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日本章小結通過本章的學習,應掌握循環(huán)程序的一般結構和循環(huán)指令,并深刻理解計數型循環(huán)與條件型循環(huán)的區(qū)別。熟練掌握單重循環(huán)和多重循環(huán)程序的設計。第六十一頁,共八十九頁,2022年,8月28日習題Ⅴ返回本章首頁P130:5-1、5-2、5-3、
5-4第六十二頁,共八十九頁,2022年,8月28日例5-7BUF為首址的存儲區(qū)存放著1個以‘$’作為結束標志的字符串,試編寫程序完成下列功能:①統(tǒng)計其中小寫字母的個數并存入COUNT。②屏幕上顯示該字符串并要求小寫字母要以大寫字母顯示出來。第六十三頁,共八十九頁,2022年,8月28日分析:本題沒有給出字符串的長度,但給出了字符串的結束標志。可以選用條件控制循環(huán)程序的執(zhí)行。每當從BUF中取出一個字符,若是“$”則結束循環(huán)。否則,若是小寫字母,先累加統(tǒng)計,再將小寫字母轉換成大寫字母(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小寫字母統(tǒng)計及字符串顯示第六十六頁,共八十九頁,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]
;存儲區(qū)中取1個字符送入DL CMPDL,‘$’
;為‘$’,則轉EXIT
JEEXIT CMPDL,‘a’
JBDONE
;不是小寫字母,則轉DONE
CMPDL,‘z’
JA DONE SUBDL,20H;小寫字母轉換成大寫字母
INCAX;統(tǒng)計小寫字母DONE:MOVAH,2;顯示大寫字母 INT21H
INCBX;指向下1個字符,繼續(xù)循環(huán)
JMPNEXTEXIT:MOVCOUNT,AX;小寫字母數寫入COUNT
MOVAH,4CH INT21HCODEENDSENDBEGIN第六十八頁,共八十九頁,2022年,8月28日程序運行后,COUNT中的內容為19(=13H)。
屏幕上顯示:THISISAASSEMBLYPROGRAM.第六十九頁,共八十九頁,2022年,8月28日例5-8假設TAB為首址的字節(jié)存儲區(qū)中,存放n個學生匯編語言的考試成績。若學號順序是隨機的,現需在表中查找某個學號相對應的匯編語言成績,若查找成功則將該學號的偏移地址送SI,對應的成績送DH,并將FLAG置1;否則將FLAG清0,查詢失敗。第七十頁,共八十九頁,2022年,8月28日分析:在一批數據中查找滿足條件的值,最簡單的方法就是從第1個數據開始逐一比較。如找到滿足條件的值就跳出循環(huán),取出相應信息送入指定寄存器,否則順序向下查找,如果查找遍所有n個數據仍未找到,則結束循環(huán),查找失敗。實現時可在數據區(qū)中構建一個表,表中每一項占若干字節(jié),本例每個學生只有學號和成績,因此每項可用2個字節(jié),n個學生共占2n個字節(jié)。第七十一頁,共八十九頁,2022年,8月28日
存儲單元和寄存器分配如下:N:存放TAB表的總項數CX:循環(huán)計數器,初值為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,繼續(xù)查找
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個成績,每個數據項應分配幾個字節(jié)?②若要查找的學號不是在數據段中直接給出,而是需要在程序運行時通過鍵盤輸入,應如何實現?③若查找成功時,要求把學號和成績直接顯示出來,應如何實現?第七十六頁,共八十九頁,2022年,8月28日以上幾例介紹了單循環(huán)程序的設計方法,若循環(huán)次數已知,可用計數型循環(huán)來實現,若循環(huán)次數未知,可用條件型循環(huán)來實現。第七十七頁,共八十九頁,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為首址的字節(jié)存儲區(qū)中,存放著一個由小到大排列的無符號數組,要求在數組中查找X,如找到則將該元素在數組中的偏移位置存入Y,并顯示“OK!”,否則顯示“NO!”。第八十一頁,共八十九頁,2022年,8月28日二分查找算法的基本思想: 二分查找算法是先取有序數組的中間元素(設為Mid),將其與要查找的值X相比較,若相等則查找成功。若不相等則判斷X是在前半部分還是后半部分,如果X>Mid,則在后半部分查找,再取后半部分的中間元素與X比較;如果X小于中間元素,則在前半部分查找,取前半部分的中間元素與X相比較。如此重復,直到查找成功或未找到該數為止。
第八十二頁,共八十九頁,2022年,8月28日存儲單元及寄存器分配如下:SI:存放BUF存儲區(qū)中最小元素的偏移地址DI:存放BUF存儲區(qū)中最大元素的偏移地址CX:存放數組的長度AL:存放要查找的數據XBL:存放BUF存儲區(qū)中的中間元素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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《紅木知識》課件
- 七年級下《普查和抽樣調查》(蘇科版)-課件
- 2024年甘肅財貿職業(yè)學院單招職業(yè)技能測試題庫標準卷
- 通關05 中國近現代史材料分析題專練(解析版)
- 陰莖持續(xù)勃起(Priapism)診治
- 乳腺癌新輔助化療
- 2025借款合同擔保范文
- 2025船舶融資租賃合同范本
- 蒸汽冷凝法制備納米微粒 實驗報告
- 2024年度四川省公共營養(yǎng)師之四級營養(yǎng)師提升訓練試卷A卷附答案
- DB31T 1238-2020 分布式光伏發(fā)電系統(tǒng)運行維護管理規(guī)范
- 化妝品不良反應監(jiān)測培訓課件
- 分包計劃范文
- 個人住房質押擔保借款合同書范本(3篇)
- 亞馬遜品牌授權書(英文模板)
- DB52∕T 046-2018 貴州省建筑巖土工程技術規(guī)范
- 醫(yī)療電子票據管理系統(tǒng)建設方案
- 火箭發(fā)動機課件-
- 人教版小學六年級數學上冊教學反思(46篇)
- atv61變頻器中文手冊
- 農業(yè)機械維修業(yè)開業(yè)技術條件
評論
0/150
提交評論