循環(huán)和分支程序設(shè)計(jì)書(shū)_第1頁(yè)
循環(huán)和分支程序設(shè)計(jì)書(shū)_第2頁(yè)
循環(huán)和分支程序設(shè)計(jì)書(shū)_第3頁(yè)
循環(huán)和分支程序設(shè)計(jì)書(shū)_第4頁(yè)
循環(huán)和分支程序設(shè)計(jì)書(shū)_第5頁(yè)
已閱讀5頁(yè),還剩99頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

循環(huán)和分支程序設(shè)計(jì)書(shū)第1頁(yè),共104頁(yè),2023年,2月20日,星期四5.1概述5.1.1匯編語(yǔ)言程序設(shè)計(jì)的一般步驟5.1.2流程圖返回本章首頁(yè)第2頁(yè),共104頁(yè),2023年,2月20日,星期四5.1.1匯編語(yǔ)言程序設(shè)計(jì)的一般步驟返回本節(jié)第3頁(yè),共104頁(yè),2023年,2月20日,星期四匯編語(yǔ)言程序設(shè)計(jì)一般有以下幾個(gè)步驟:(1)分析題意,確定算法;分析和理解題意,找出合理的算法及適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu);(2)根據(jù)算法畫(huà)出程序流程圖;(3)根據(jù)流程圖編制程序;(4)上機(jī)調(diào)試程序;

任何程序必須經(jīng)過(guò)調(diào)試才能檢查出你的設(shè)計(jì)思想是否正確,以及你的程序是否符合你的設(shè)計(jì)思想。調(diào)試時(shí)可用工具——DEBUG進(jìn)行調(diào)試。

程序結(jié)構(gòu)有:順序、循環(huán)、分支、和子程序四種數(shù)據(jù)結(jié)構(gòu)。(5)運(yùn)行程序;第4頁(yè),共104頁(yè),2023年,2月20日,星期四5.1.2流程圖1.流程圖的概念 流程圖是由特定的幾何圖形、指向線、文字說(shuō)明來(lái)表示數(shù)據(jù)處理的步驟,形象描述邏輯控制結(jié)構(gòu)以及數(shù)據(jù)流程的示意圖。流程圖具有簡(jiǎn)潔、明了、直觀的特點(diǎn)。2.流程圖符號(hào)表示(1)起止框:表示程序的開(kāi)始和結(jié)束。起止框第5頁(yè),共104頁(yè),2023年,2月20日,星期四(2)判斷框(3)處理框

(4)調(diào)用框

第6頁(yè),共104頁(yè),2023年,2月20日,星期四(5)指向線(6)連接框

返回本節(jié)第7頁(yè),共104頁(yè),2023年,2月20日,星期四

5.2順序程序設(shè)計(jì)下面舉例說(shuō)明順序程序的設(shè)計(jì)。例5.1數(shù)組中存放若干個(gè)字節(jié)元素。將兩個(gè)數(shù)組對(duì)應(yīng)元素相加,運(yùn)算結(jié)果存放在第三個(gè)數(shù)組相應(yīng)結(jié)果單元中。本例每個(gè)數(shù)組有1個(gè)元素,每個(gè)元素占1字節(jié)長(zhǎng)。(1)E:\MASM>EDITC100.ASMDATASEGMENTDATA1DB1;被加數(shù)

DATA2DB5;加數(shù)

DATA3DB0;和初值DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA第8頁(yè),共104頁(yè),2023年,2月20日,星期四START:MOVAX,DATAMOVDS,AXMOVSI,0CLC;清進(jìn)位標(biāo)志

MOVAL,DATA1[SI]ADCAL,DATA2[SI];字節(jié)相加

MOVDATA3[SI],AL

;---------------------輸出顯示部分------------------MOVBX,OFFSETDATA3MOVDL,[BX]ADDDL,30HMOVAH,2INT21H

;----------------------返回DOS------------------MOVAX,4C00HINT21HCODEENDSENDSTART第9頁(yè),共104頁(yè),2023年,2月20日,星期四(2)E:\MASM>MASMC100.ASM(3)E:\MASM>LINKC100(4)E:\MASM>C100<ENTER>6(5)E:\MASM>DEBUGC100.EXE第10頁(yè),共104頁(yè),2023年,2月20日,星期四5.2順序程序設(shè)計(jì)【例5.2】試編寫(xiě)一程序計(jì)算以下表達(dá)式的值。w=(v-(x*y+z-540))/x

式中x、y、z、v均為有符號(hào)字?jǐn)?shù)據(jù)。設(shè)x、y、z、v的值存放在字變量X、Y、Z、V中,結(jié)果存放在雙字變量W之中,程序的流程圖如圖5.1所示。返回本章首頁(yè)第11頁(yè),共104頁(yè),2023年,2月20日,星期四圖5.1順序運(yùn)算程序流程圖第12頁(yè),共104頁(yè),2023年,2月20日,星期四源程序如下:DATA SEGMENTX DW 200Y DW 100Z DW 3000V DW 10000W DW 2DUP(?)DATA ENDSSTACK SEGMENTSTACK DB200DUP(0)STACK ENDSCODE SEGMENT ASSUMEDS:DATA,CS:CODE,SS:STACK第13頁(yè),共104頁(yè),2023年,2月20日,星期四START: MOV AX,DATA MOV DS,AX ;DATA→AX MOV AX,X IMULY ;(X)*(Y)→DX:AX MOV CX,AX MOV BX,DX ;(DX:AX)→(BX:CX)

MOV AX,Z CWD;(Z)符號(hào)擴(kuò)展

ADD CX,AX ADC BX,DX;(BX:CX)+(DX:AX)→(BX:CX)

SUB CX,540 SBB BX,0 ;(BX:CX)-540→(BX:CX)

MOV AX,V第14頁(yè),共104頁(yè),2023年,2月20日,星期四

CWD ;(V)符號(hào)擴(kuò)展

SUB AX,CXSBBDX,BX;(DX:AX)-(BX:CX)→(DX:AX) IDIV X ;(DX:AX)/X MOVW,AX ;商→W MOVW+2,DX ;余數(shù)DX→W+2 MOVAH,4CH INT 21HCODE ENDS ;退出DOS狀態(tài)

END START第15頁(yè),共104頁(yè),2023年,2月20日,星期四5.3分支程序設(shè)計(jì)5.3.1用條件轉(zhuǎn)移指令實(shí)現(xiàn)程序分支5.3.2用跳轉(zhuǎn)表實(shí)現(xiàn)多路分支返回本章首頁(yè)第16頁(yè),共104頁(yè),2023年,2月20日,星期四1、分支程序的結(jié)構(gòu)形式:

分支程序結(jié)構(gòu)可以有兩種形式:

一個(gè)是二路分支:IF—THEN—ELSE形式;

一個(gè)是多路分支:CASE形式;常用的語(yǔ)句:

5.3.1用條件轉(zhuǎn)移指令實(shí)現(xiàn)程序分支JZ結(jié)果為零JNZ結(jié)果不為零JS/結(jié)果為負(fù)JNS結(jié)果為正JL小于JLE小于等于JG大于JGE大于等于第17頁(yè),共104頁(yè),2023年,2月20日,星期四在某一種確定條件下,只能執(zhí)行多個(gè)分之中一個(gè)分支。

例5.3已知X=80,X值在數(shù)據(jù)段中定義,編寫(xiě)程序:若X>50則

Z=X+Y,否則Z=X-Y,結(jié)果存入Z。X,Y,Z均為字?jǐn)?shù)據(jù)。

DATA

SEGMENT

XDW80;數(shù)據(jù)段中DATA

ENDSCODE

SEGMENT

ASSUMEDS:DATA,SS:STACK,CS:CODESTART: MOV AX,DATA

MOV DS,AX

MOVAX,XCMPAX,50JGHIGHSUBAX,YJMPEXITHIGH:ADDAX,YEXIT:MOVZ,AX

MOV AH,4CH INT 21H

CODEENDS END START

第18頁(yè),共104頁(yè),2023年,2月20日,星期四【例5.4】編寫(xiě)計(jì)算下面函數(shù)值的程序:

1 X>0Y=0 X=0-1 X<0設(shè)輸入數(shù)據(jù)為X、輸出數(shù)據(jù)Y,且皆為字節(jié)變量。程序流程圖如圖5.2所示。第19頁(yè),共104頁(yè),2023年,2月20日,星期四流程圖如下:

圖5.2分支運(yùn)算程序流程圖第20頁(yè),共104頁(yè),2023年,2月20日,星期四【例5.4】編寫(xiě)計(jì)算函數(shù)值的程序:程序如下:DATA

SEGMENT

X

DB

-10

Y

DB?DATA

ENDSSTACK

SEGMENTSTACK

DB

200DUP(0)STACK

ENDSCODE

SEGMENT

ASSUMEDS:DATA,SS:STACK,CS:CODESTART: MOV AX,DATA第21頁(yè),共104頁(yè),2023年,2月20日,星期四

MOV DS,AX

MOVAL,X CMP AX,0 ;與0進(jìn)行比較

JGE A1 ;X≥0轉(zhuǎn)A1 MOV Y,-1 ;X<0時(shí),-1→Y JMP EXITA1:JG

A2 ;X>0轉(zhuǎn)A2 MOV Y,0 ;X=0時(shí),0→Y JMP EXITA2:MOV Y,1 ;X>0,1→YEXIT:MOV AH,4CH INT 21HCODEENDS END START第22頁(yè),共104頁(yè),2023年,2月20日,星期四【例5.5】求最值

【例5.5】試編一程序,求三個(gè)帶符號(hào)字?jǐn)?shù)據(jù)中的最大值,并將最大值存入MAX字單元中。 設(shè)三個(gè)帶符號(hào)數(shù)分別在三個(gè)字變量X、Y、Z中存儲(chǔ)。程序流程圖如圖5.5所示第23頁(yè),共104頁(yè),2023年,2月20日,星期四

例5.5程序流程圖

第24頁(yè),共104頁(yè),2023年,2月20日,星期四

MOV AX,XCMP AX,Y;X>Y?

JG L1MOVAX,Y ;Y>Z?

CMPAX,ZJG

EXITL2:MOV

AX,ZJMP EXITL1:CMPAX,Z ;X>Z?

JLE L2EXIT:MOV

MAX,AX

MOV

AH,4CH INT

21H第25頁(yè),共104頁(yè),2023年,2月20日,星期四程序如下:STACKSEGMENTSTACK DB200DUP(0)STACK ENDSDATA SEGMENT

X

DW

30

Y

DW

20

Z DW

10

MAX

DW?DATA ENDS第26頁(yè),共104頁(yè),2023年,2月20日,星期四CODE SEGMENT

ASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOV AX,DATA MOV DS,AX MOV AX,X CMP

AX,Y ;X>Y?

JG

L1 MOV

AX,Y ;Y>Z?

CMP

AX,Z JG

EXITL2:MOV

AX,Z JMP EXIT

第27頁(yè),共104頁(yè),2023年,2月20日,星期四L1: CMP

AX,Z ;X>Z?

JLE L2EXIT: MOV

MAX,AX

MOV

AH,4CH INT

21HCODE

ENDS END

START返回本節(jié)第28頁(yè),共104頁(yè),2023年,2月20日,星期四2、多路分支程序設(shè)計(jì)方法.

程序分支一般用條件轉(zhuǎn)移命令來(lái)產(chǎn)生,連續(xù)用條件轉(zhuǎn)移命令使程序產(chǎn)生多個(gè)分支。第29頁(yè),共104頁(yè),2023年,2月20日,星期四例5.6在DI寄存器中,數(shù)組中的第一個(gè)單元存放著數(shù)組長(zhǎng)度,在AX中有一個(gè)無(wú)符號(hào)數(shù),要求在數(shù)組中查找(AX),如找到則使CF=0,并在SI中給出該元素在數(shù)組中的偏移地址;如未找到則使CF=1.方法:順序折半法.

(1)折半查找法先取有序數(shù)組的中間元素與查找值比較,如相等則查找成功;(2)如查找值大于中間元素,則再取高半部的中間元素與查找值相比較;(3)如查找值小于中間元素,則再取低半部的中間元素與查找值比較;如此重復(fù),直到查找成功或最終未找到該數(shù)為止。

第30頁(yè),共104頁(yè),2023年,2月20日,星期四例5.6在附加段中,有一個(gè)按從小到大順序排列的無(wú)符號(hào)數(shù)組,其首地址存放在DI寄存器中,數(shù)組中的第一個(gè)單元存放著數(shù)組長(zhǎng)度,在AX中有一個(gè)無(wú)符號(hào)數(shù),要求在數(shù)組中查找(AX),如找到,則使CF=0,并在SI中給出該元素在數(shù)組中的偏移地址,如未找到,則使CF=1。在一個(gè)長(zhǎng)度為N的有序數(shù)據(jù)組R中,查找元素K的折半查找算法:⑴初始化被查找數(shù)組的首尾下標(biāo),low1,highn;⑵若low>high,則查找失敗,置CF=1,退出程序。

否則,計(jì)算中點(diǎn):mid(low+high)/2;⑶K與中點(diǎn)元素r[mid]比較,若k=r[mid],則查找成功,退出程序;若k<r[mid],則轉(zhuǎn)步驟(4);highmid-1,轉(zhuǎn)若k>r[mid],則轉(zhuǎn)步驟(5);lowmid+1,轉(zhuǎn)⑷低半部查找(lower),highmid-1,返回步驟(2),繼續(xù)查找⑸高半部查找(higher),lowmid+1,返回步驟(3),繼續(xù)查找第31頁(yè),共104頁(yè),2023年,2月20日,星期四流程圖如下:第32頁(yè),共104頁(yè),2023年,2月20日,星期四DsegsegmentLow_idxdw?;低地址元素的下標(biāo).High_idxdw?;高地址元素的下標(biāo).Dsegends.第33頁(yè),共104頁(yè),2023年,2月20日,星期四B_searchprocnearMovax,55;查找元素“55”(ax)Cmpax,es:[di+2];(ax)第一個(gè)元素,比較.Jachk_last;(ax)>第一個(gè)元素,則到chk_lastLeasi,es:[di+2];(ax)≤第一個(gè)元素,則第一個(gè)元素SJeexit;(ax)=第一個(gè)元素,則退出.Stc;(ax)≠第一個(gè)元素,則CF=1,未找Jmpexit;退出.Chk_last:Movsi,es:[di];元素個(gè)數(shù)S.Shlsi,1;長(zhǎng)度*2=到最后元素(下標(biāo))的字節(jié)數(shù)

Addsi,di;形成最后元素的地址

Cmpax,es:[si];比較,<最后元素,則轉(zhuǎn)searchJbsearch;(AX)=最后元素,則EXITJeexit;

Stc;

Jmpexit第34頁(yè),共104頁(yè),2023年,2月20日,星期四Search:(low_idx)Movlow_idx,1;最低元素下標(biāo)=1Movbx,es:[di];元素個(gè)數(shù)(bx)

Movhigh_idxbx;最高元素下標(biāo)(high_idx=元素個(gè)數(shù))Movbx,di;保存數(shù)組的起始地址(bx)mid:movcx,low_idxmovdx,high_idx;low>high_idxcmpcx,dx;若low>high,則轉(zhuǎn)no_match,置cjano_match:int[(low+high)/2]cx(中間)addcx,dx;

shrcx,1;中間元素下標(biāo)(si)

movsi,cx;

shlsi,1;將下標(biāo)值*2形成元素偏移地址

compare:;數(shù)組基地址BX+元素偏移量元素地cmpax,es:[bx+si];址[bx+si].(ax)與中間元素[bx+si]比較jeexit;若相等則退出jahigher;若(ax)>(mid)則轉(zhuǎn)high第35頁(yè),共104頁(yè),2023年,2月20日,星期四ax<中間元素:;若(ax)<(mid),則deccx;1、中間元素下標(biāo)值:(cx)(cx)-movhigh_idx,cx;2、且(cx)high_idxjmpmid;3、轉(zhuǎn)mid,將中間元素變?yōu)楦叩刂穐igher:;若(ax)>(mid)inccx;1、中間元素下標(biāo)值:(cx)(cx)+movlow_idx,cx;2、low_idx(cx)將中間元素變?yōu)榈偷刂吩豭mpmid.;3、轉(zhuǎn)mid,計(jì)算中間元素No_match:Stc;未找到,置cf=1Exit:Popds;彈出dsRetB_searchendp

程序首先把查找值與數(shù)組的第一個(gè)元素和最后一個(gè)元素相比較,如果找到或該數(shù)小于第一個(gè)元素或大于最后一個(gè)元素,則結(jié)束查找,否則從SEARCH開(kāi)始折半查找。

第36頁(yè),共104頁(yè),2023年,2月20日,星期四

SEARCH①?gòu)腟EARCH開(kāi)始,首先把數(shù)組長(zhǎng)度作為數(shù)組中間元素下標(biāo),把它從數(shù)組的第一個(gè)單元中取出來(lái),并使它成為偶數(shù),然后再把下標(biāo)加到DI中以形成數(shù)組的中間元素的地址并開(kāi)始比較查找;②如果比較相等則轉(zhuǎn)至ALL_DONE結(jié)束查找;③否則要確定下一步的查找是在數(shù)組的低半部還是高半部中進(jìn)行。它們要做的工作是:①首先檢查下標(biāo)是否等于2,如果等于2則說(shuō)明整個(gè)查找失敗,應(yīng)把CF置1并轉(zhuǎn)至ALL_DONE結(jié)束查找;②其次,把下標(biāo)除以2,以便做進(jìn)一步的折半查找,然后使下標(biāo)形成偶數(shù)值;③如果要在低半部查找,則從當(dāng)前的地址(DI)中減去下標(biāo)值(si)以形成新的查找地址;④如果要在高半部查找,則把下標(biāo)值加到當(dāng)前地址值中。

以上過(guò)程重復(fù)進(jìn)行直到下標(biāo)值減到2或者查找值找到為止。

第37頁(yè),共104頁(yè),2023年,2月20日,星期四Dsegsegment定義數(shù)據(jù)段

Starteddw?存放數(shù)組的首地址DsegendsCsegsegment代碼段BsearchprocfarAssumecs:cseg,ds:dsegPushdsPushaxMovax,dsegMovds,axPopax;將已存入ax中的數(shù)彈出

Cmpax,es:[di+2];(ax)≤第一個(gè)元素嗎?

Jachklast;到CHKLAST開(kāi)始比較大于第38頁(yè),共104頁(yè),2023年,2月20日,星期四

取偏移地址leasi,es:[di+2];到≤時(shí),則取地址存入sijeexit;=退出,CF=0不置位

stc;<置CF=1,未找到轉(zhuǎn)EXITjmpexitchklast:movsi,es:[di];取第一單元中數(shù)組長(zhǎng)度

shlsi,1;長(zhǎng)度*2=最后元素下標(biāo)

addsi,d;形成最后元素地址

cmpax,es:[si];比較

jbsearch;<,則開(kāi)始查找

jeexit;=為最后一個(gè)元素,退出

stc;>最后元素,置CF=1,退出jmpexitsearch:movstarad,di;將起始地址存入startadmovsi,es:[di];取長(zhǎng)度(si)evenr:testsi,1;是偶數(shù)則第0位為1jzaddI;當(dāng)ZF=1時(shí)

則為全0,為偶數(shù)

第39頁(yè),共104頁(yè),2023年,2月20日,星期四incsi;為奇數(shù)+1形成偶數(shù)addiadddi,si;形成查找元素的地址compare:cmpax,es:[di];比較(ax)=?es:[di]jealldone:=則轉(zhuǎn)alldonejahigher;ax>則到高半部

cmpsi,2;si=2jneidxok;不為2則繼續(xù)查找nomatch:stc;CF=1,未找到

jealldoneidxok:shrsi,1;(si)/2=’si’邏輯右移0testsi,1;為偶數(shù)嗎?

jesubidx;是

incsi;否則加1subidx:subdi,si;再低半部,di-si形成

jmpshartcompare;元素地址higher:cmpsi,2;在高半部

第40頁(yè),共104頁(yè),2023年,2月20日,星期四

jenomatch;未找到,置CF=1shrsi,2;(si)/2(si)jmpshortevenisi;轉(zhuǎn)eveni,將di+s高半部alldone:movsi,dmovdi,startaddr元素的位置Sexit:popds偏移位置

retbsearchendpcsegendsend如果數(shù)組如下:ListDw12、11、22、33、44、55、66、77、88、99、111、222、333.

要求查找的數(shù)為(ax)=55。數(shù)組長(zhǎng)度為12,第一次比較的是數(shù)組的第6個(gè)元素66;因55<66,所以第二次用低半部折半查找,比較的是第3個(gè)元素33;因55>33.所以第三次用高半部折半查找,比較的是第五個(gè)元素55.這樣經(jīng)過(guò)三次比較后,因查找成功而退出程序。如果要查找的數(shù)是(ax)=57.

第41頁(yè),共104頁(yè),2023年,2月20日,星期四則第二次比較的仍是第六個(gè)元素66;因57<66,第二次用低半部折半查找,比較的是第三個(gè)元素33;因57>33,所以第三次用低半部折半查找,比較的是第五個(gè)元素55;因55<57,第四次用高半部折半查找,比較的又是第六個(gè)元素66;因57<66,在轉(zhuǎn)低半部查找時(shí),因(si)=2而以查找失敗退出程序。這個(gè)例子用CMP或TEST指令以及條件轉(zhuǎn)移指令產(chǎn)生兩個(gè)或多個(gè)程序分支。

第42頁(yè),共104頁(yè),2023年,2月20日,星期四5.3.2用跳轉(zhuǎn)表實(shí)現(xiàn)多路分支在實(shí)現(xiàn)CASE結(jié)構(gòu)時(shí)還可以使用跳躍表法使程序能根據(jù)不同的條件轉(zhuǎn)移到多個(gè)程序分支去。【例5.7】設(shè)某程序有8路分支,試根據(jù)給定的N值(1~8),將程序的執(zhí)行轉(zhuǎn)移到其中的一路分支。 程序流程如圖5.7所示。第43頁(yè),共104頁(yè),2023年,2月20日,星期四第44頁(yè),共104頁(yè),2023年,2月20日,星期四程序如下:DATA SEGMENTTAB DW

P1,P2,P3,P4,P5,P6,P7,P8N DB

5S1DW?S2DW?S3DW?S4DW?S5DW?S6DW?S7DW?S8DW?DATA ENDSSTACK SEGMENT DB200DUP(0)STACK ENDSCODE SEGMENT

ASSUMEDS:DATA,SS:STACK,CS:CODE

第45頁(yè),共104頁(yè),2023年,2月20日,星期四START: MOV AX,DATA

MOV DS,AX

MOV AL,N DEL AL ADD AL,AL MOV BL,AL MOV BH,0

JMP TAB[BX]P1:MOVAX,1MOVS1,AX JMPEXITP2:MOVAX,2MOVS2,AXJMP EXITP3:MOVAX,3MOVS3,AXJMP EXITP4:MOVAX,4MOVS4,AX第46頁(yè),共104頁(yè),2023年,2月20日,星期四P5:MOVAX,5MOVS5,AXJMP EXITP6:MOVAX,6MOVS6,AXJMP EXITP7:MOVAX,7MOVS7,AXJMP EXITP8:MOVAX,8MOVS8,AX

EXIT:MOV AH,4CH INT 21HCODEENDS END START第47頁(yè),共104頁(yè),2023年,2月20日,星期四

上述程序中的無(wú)條件轉(zhuǎn)移指令的轉(zhuǎn)移地址采用的是變址尋址。同理,轉(zhuǎn)移地址也可以用寄存器間接尋址或基址加變址尋址,讀者可自行考慮。返回本節(jié)第48頁(yè),共104頁(yè),2023年,2月20日,星期四5.4循環(huán)程序設(shè)計(jì)5.4.1循環(huán)程序的結(jié)構(gòu)5.4.2單重循環(huán)程序設(shè)計(jì)5.4.3多重循環(huán)程序設(shè)計(jì)返回本章首頁(yè)第49頁(yè),共104頁(yè),2023年,2月20日,星期四5.4.1循環(huán)程序的結(jié)構(gòu)1、循環(huán)程序的常見(jiàn)結(jié)構(gòu)形式如圖5.5(a),(b)所示。

第50頁(yè),共104頁(yè),2023年,2月20日,星期四循環(huán)有兩種結(jié)構(gòu)形式.

一種是DO_WHILE形式;另一種是DO_UNTIL形式。當(dāng)條件為真時(shí)執(zhí)行循環(huán)體,為假時(shí)跳出循環(huán)體。

DO—WHILEDO—WHILE型把對(duì)循環(huán)條件的判斷放在循環(huán)的入口,先判斷條件,DO—UNTIL結(jié)構(gòu)則先執(zhí)行循環(huán)體,然后再判斷控制條件,不滿足則繼續(xù)執(zhí)行循環(huán)操作,一旦滿足循環(huán)條件則退出循環(huán)。第51頁(yè),共104頁(yè),2023年,2月20日,星期四區(qū)別:DO—WHILE型有可能一次也不執(zhí)行循環(huán)體;

DO—UNTIL型則至少執(zhí)行一次循環(huán)體;循環(huán)程序可由如下三部分組成:1.初始化部分2.循環(huán)體部分3.循環(huán)控制部分1)

設(shè)置循環(huán)的初始狀態(tài);設(shè)置循環(huán)次數(shù)的計(jì)數(shù)值,以及為循環(huán)體正常進(jìn)行工作而建立的初始狀態(tài)。2)

循環(huán)體這是工作的主體,它由循環(huán)的工作部分及修改部分組成。工作部分:完成程序功能。修改部分:保證每一次重復(fù)時(shí),參加執(zhí)行的信息能發(fā)生有規(guī)律的變化。3)

循環(huán)控制部分程序設(shè)計(jì)的關(guān)鍵,控制循環(huán)的運(yùn)行和結(jié)束。循環(huán)次數(shù)已知時(shí)作為結(jié)束的條件等……第52頁(yè),共104頁(yè),2023年,2月20日,星期四5.4.2單重循環(huán)程序設(shè)計(jì)1.計(jì)數(shù)控制2.條件控制第53頁(yè),共104頁(yè),2023年,2月20日,星期四例計(jì)算

sum=1+2+3datasegmentarydb1,2,3countdb3sumdb?dataends……leasi,arynmovcl,countmoval,0next:addal,[si]yaddsi,1loopnextmovsum,al數(shù)據(jù)段定義:arydb1,2,3si←Ary首地址cl←元素?cái)?shù),al←0和初值求和:al←al+[si],求下一元素地址si←si+1Cx-1且cx=0?存累加和:sum←al顯示累加和:sum結(jié)束第54頁(yè),共104頁(yè),2023年,2月20日,星期四例計(jì)算sum=1+2+3datasegmentarydb1,2,3countdb3sumdb?dataendsstacksegmentstackdw100dup(0)stackendscodesegmentmainprocfarassumecs:code,ds:data,ss:stackstart:movax,datamovds,ax第55頁(yè),共104頁(yè),2023年,2月20日,星期四

leasi,arymovcl,countmoval,0next:addal,[si]addsi,1loopnextmovsum,almoval,sum addal,30hmovdl,al movah,2 int21h

movah,4ch int21hmainendpcodeendsendstart第56頁(yè),共104頁(yè),2023年,2月20日,星期四1.計(jì)數(shù)控制【例5.7】已知有幾個(gè)元素存放在以BUF為首址的字節(jié)存貯區(qū)中,試統(tǒng)計(jì)其中正元素的個(gè)數(shù)。 顯然,每個(gè)元素為一個(gè)8位有符號(hào)二進(jìn)制數(shù),統(tǒng)計(jì)其中正元素的個(gè)數(shù)可用循環(huán)程序?qū)崿F(xiàn)。其程序流程圖如圖5.6所示。第57頁(yè),共104頁(yè),2023年,2月20日,星期四第58頁(yè),共104頁(yè),2023年,2月20日,星期四LEA BX,BUFMOVCX,N MOVAX,0L1:MOVDL,BYTEPTR[BX]CMPDL,0JLEL2 INCAX;正元素個(gè)數(shù)L2:INCBX;BX←元素地址+1

LOOPL1MOVNUM,AX

第59頁(yè),共104頁(yè),2023年,2月20日,星期四DATA SEGMENT

BUF DB1,3,5,,0,-1,-3,-5,-7N EQU$-BUFNUM DW?DATA ENDSSTACKSEGMENTSTACK DB200DUP(0)STACK ENDSCODE SEGMENT ASSUMEDS:DATA,CS:CODE,SS:STACK第60頁(yè),共104頁(yè),2023年,2月20日,星期四START: MOVAX,DATA MOV DS,AX

LEA BX,BUF;元素起始地址

MOV CX,N ;元素總個(gè)數(shù)

MOV AX,0;正元素個(gè)數(shù)初值=0L1: MOVDL,BYTEPTR[BX]CMP DL,0 JLE L2 INC AX;正元素個(gè)數(shù)L2:INC BX;BX←元素地址+1,指向下一個(gè)元素

LOOPL1;←DEC CX

;JNE L1 ; MOV NUM,AX

MOV AH,4CH INT 21HCODE ENDS END START第61頁(yè),共104頁(yè),2023年,2月20日,星期四【例5.8】字符串比較

【例5.8】試編寫(xiě)一程序,要求比較兩個(gè)字符串STR1和STR所含字符是否相同,若相同則顯示‘MATCH!’,若不相同則顯示‘NOMATCH!’。(程序略)

其流程圖如圖5.7所示。第62頁(yè),共104頁(yè),2023年,2月20日,星期四圖5.7程序流程圖第63頁(yè),共104頁(yè),2023年,2月20日,星期四datasegmentstring1DB'abcde'MATCHDB'MATCH$'NOMATCHdb'nomatch$'dataendsextrasegmentstring2db'abcde'numdb'ok'extraendsprognamesegmentmainprocfarassumecs:progname,ds:data,es:extra第64頁(yè),共104頁(yè),2023年,2月20日,星期四start:pushdsmovax,0pushaxmovax,datamovds,axmovax,extramoves,axmoval,match-string1;字符串1元素個(gè)數(shù)

cmpal,num-string2jnedispnoleasi,string1leadi,string2movcx,match-string1第65頁(yè),共104頁(yè),2023年,2月20日,星期四rota:moval,[si]cmpal,[di]jnedispnoincsiincdilooprotadispma:movdx,offsetmatchmovah,9int21hjmpexitdispno:movdx,offsetnomatchmovah,9int21hexit:ret第66頁(yè),共104頁(yè),2023年,2月20日,星期四mainendpprognameendsendstart第67頁(yè),共104頁(yè),2023年,2月20日,星期四例5.11、在ADDR單元中存放著數(shù)Y的地址,試編制一程序,把Y中1的個(gè)數(shù)存入COUNT單元中。要測(cè)出Y中1的個(gè)數(shù),就應(yīng)逐位測(cè)試,一個(gè)比較簡(jiǎn)單的辦法是可根據(jù)最高有效位是否為1來(lái)計(jì)數(shù),然后用移位的方法把各位數(shù)逐次移到最高位去。循環(huán)的結(jié)束可以用計(jì)數(shù)值為16來(lái)控制,但更好的辦法是結(jié)合上述方法可以用測(cè)試數(shù)是否為0來(lái)作為結(jié)束條件,這樣可以在很多情況下縮短程序的執(zhí)行時(shí)間。2.條件控制

第68頁(yè),共104頁(yè),2023年,2月20日,星期四第69頁(yè),共104頁(yè),2023年,2月20日,星期四例5.11、在ADDR單元中存放著數(shù)Y的地址,試編制一程序,把Y中1的個(gè)數(shù)存入COUNT單元中。要測(cè)出Y中1的個(gè)數(shù),就應(yīng)逐位測(cè)試,一個(gè)比較簡(jiǎn)單的辦法是可根據(jù)最高有效位是否為1來(lái)計(jì)數(shù),然后用移位的方法把各位數(shù)逐次移到最高位去。循環(huán)的結(jié)束可以用計(jì)數(shù)值為16來(lái)控制,但更好的辦法是結(jié)合上述方法可以用測(cè)試數(shù)是否為0來(lái)作為結(jié)束條件,這樣可以在很多情況下縮短程序的執(zhí)行時(shí)間。第70頁(yè),共104頁(yè),2023年,2月20日,星期四第71頁(yè),共104頁(yè),2023年,2月20日,星期四例5.11、在ADDR單元中存放著數(shù)Y的地址,試編制一程序,把Y中1的個(gè)數(shù)存入COUNT單元中。DatasegmentAddrdwnumberNumberdw1100110011110000BCountdw?DataendsPrognamsegmentMainprocfarAssamecs:progname,ds:data第72頁(yè),共104頁(yè),2023年,2月20日,星期四Start:Movax,dataMovds,axMovcx,0;Movbx,addrMovax,[bx]Repeat:testax,offfffh;ax=offffjzexit;為零則exit,ZF=1

jnsshift;ax正數(shù)則轉(zhuǎn)移(非負(fù))

inccxshift:shlax,1;邏輯左移,最右添0jmprepeatexit:count,cx

movdl,clmovah,2movah,4chint21hmainendp||

Prognamends||endstart

第73頁(yè),共104頁(yè),2023年,2月20日,星期四

這個(gè)例子說(shuō)明算法和循環(huán)控制條件的選擇對(duì)程序的工作效率影響很大。在編程時(shí),應(yīng)據(jù)具體情況來(lái)確定循環(huán)控制條件。

第74頁(yè),共104頁(yè),2023年,2月20日,星期四第二種解法:【例5.11】試編一個(gè)程序?qū)⒆謫卧狟UF中所含1的個(gè)數(shù)存入COUNT單元中。要測(cè)出BUF字單元所含1的個(gè)數(shù),首先將BUF中的數(shù)送給寄存器AX,然后將AX寄存器邏輯左移一次,如果CF=1,則表明AX中的最高位為1,則計(jì)數(shù)器CL計(jì)數(shù)1次,如果CF=0,表明AX最高位為0,這樣依次將最高位移入CF中去測(cè)試。移位之后,判斷AX的值是否為0,如果為0則結(jié)束循環(huán),不為0,則繼續(xù)循環(huán)。其流程圖如圖5.8所示。第75頁(yè),共104頁(yè),2023年,2月20日,星期四第76頁(yè),共104頁(yè),2023年,2月20日,星期四程序如下:STACK SEGMENTSTACK DB200DUP(0)STACK EDNSDATA SEGMENT

BUF DW0011110010101011B

COUNT

DB?DATA ENDSCODE SEGMENTASSUMEDS:DATA,CS:CODE,SS:STACK第77頁(yè),共104頁(yè),2023年,2月20日,星期四START: MOV AX,DATA MOV DS,AX MOV AX,BUF MOV CL,0 ;計(jì)數(shù)器為0LOPA:CMP AX,0 JE EXIT ;(AX)=0,結(jié)束循環(huán)

SHL AX,1 ;AX左移一位

JNC LOPA INC CL ;產(chǎn)生進(jìn)位,(CL)+1→CL JMP LOPAEXIT: MOV COUNT,CL MOV AH,4CH INT 21HCODE ENDS END START第78頁(yè),共104頁(yè),2023年,2月20日,星期四3、循環(huán)條件設(shè)計(jì)方法綜合舉例例5.10、試編制一個(gè)程序把BX寄存器內(nèi)的二進(jìn)制數(shù)用十六進(jìn)制數(shù)的形式在屏幕上顯示出來(lái)。把BX的內(nèi)容從左到右每4位為一組在屏幕上顯示出來(lái),顯然這可以用循環(huán)結(jié)構(gòu)來(lái)完成,每次循環(huán)顯示一個(gè)十六進(jìn)制數(shù)位,因而循環(huán)次數(shù)是已知的,BX中存放十六個(gè)二進(jìn)制數(shù)位,故計(jì)數(shù)值為4。

第79頁(yè),共104頁(yè),2023年,2月20日,星期四

(1)程序中用CH寄存器存放循環(huán)計(jì)數(shù)值:CH=4,而用DEC及JNZ兩條指令完成循環(huán)計(jì)數(shù)功能;(2)因?yàn)檠h(huán)移位要用CL寄存器,而LOOP指令也要使用CX,故循環(huán)不用LOOP語(yǔ)句。BX0011,0110,0011,0111顯示為3637HBX0110,0011,0111,0011BL0111,0011,左移4次

andal,ofH;0000,1111al0111,0011

0000,0011al0000,0011addal,30H0011,0000

0011,0011al00110011=33H

顯示為3637H中的3第80頁(yè),共104頁(yè),2023年,2月20日,星期四例1將BX寄存器中的內(nèi)容以十六進(jìn)制形式顯示出來(lái)。BX是一個(gè)16位寄存器二進(jìn)制1010100100111110

用十六進(jìn)顯示時(shí),每4位用一個(gè)字符顯示,共4個(gè)其中:0000

→’0’30H,1010→’A’41H0001→’1’31H,1011

→’B’42H、、、、1001→’9’39H,1111→’F’46H?十六進(jìn)制A93E屏幕上的顯示‘A’‘9’‘3’‘E’對(duì)應(yīng)的ASCII41H39H33H45H第81頁(yè),共104頁(yè),2023年,2月20日,星期四(1)對(duì)于0000~1001(0~9),先擴(kuò)展成一個(gè)字節(jié),高4位清0,加上30H后,即可得字符’0’~’9’對(duì)應(yīng)的ASCII碼。00000001B+30H=31H00001001B+30H=39H

0001B‘1’1001B‘9’(2)對(duì)于1010~1111(A~F),先擴(kuò)展成一個(gè)字節(jié),高4位清0,

加上30H后,還要再加上07H,才能得到’A’~’F’對(duì)應(yīng)的ASCII碼00001010B+30H+07H=41H00001111B+30H+07H=46H

1010B‘A’1111B‘F’算法:取出要顯示的某4位,轉(zhuǎn)換為對(duì)應(yīng)的ASCII碼,再調(diào)用DOS系統(tǒng)功能進(jìn)行顯示。第82頁(yè),共104頁(yè),2023年,2月20日,星期四這里采用了循環(huán)移位的方法,把所有顯示的四位二進(jìn)制數(shù)移到最右面,以便作數(shù)字到字符的轉(zhuǎn)換工作。另外由于數(shù)字0~9的ASCII為30~39H,而字母A~F的ASCII為41~46H,所以在把四位二進(jìn)制數(shù)加上30H后還需做一次判斷,如果為字符A~F,則還應(yīng)加上7才能顯示出正確的十六進(jìn)制數(shù)二進(jìn)制到十六進(jìn)制轉(zhuǎn)換第83頁(yè),共104頁(yè),2023年,2月20日,星期四C顯示字符個(gè)數(shù)CH=4循環(huán)移位次數(shù)CL=4BX循環(huán)左移4位,將要顯示的值移至低4位,保存在DL中清DL的高4位,只保留要顯示位的值DL←DL+30H完成數(shù)值0~9的ASCII碼轉(zhuǎn)換YNDL←DL+07H完成數(shù)值A(chǔ)~F的ASCII碼轉(zhuǎn)換用02功能顯示DL中的字符YNRET返回DL超出39H?CH←CH-1轉(zhuǎn)換結(jié)束?list_bxPROC

MOVCH,4MOVCL,4

next:

ROLBX,CL

MOVDL,BL

ANDDL,0FH

ADDDL,30H

CMPDL,39H

JLEprint

ADDDL,07H

print:MOVAH,2HINT21HDECCHJNZnext

RET

;子程返回

list_bxENDP

codeENDS

ENDstart第84頁(yè),共104頁(yè),2023年,2月20日,星期四例5.10、試編制一個(gè)程序把BX寄存器內(nèi)的二進(jìn)制數(shù)用十六進(jìn)制數(shù)的形式在屏幕上顯示出來(lái)。datasegmrntcountdw3637HdataendsprognamsegmentMainprocfarassumecs:prognam,ds:data

start:pushdssubax,axpushax

movbx,countmovch,4;共顯示4位數(shù).第85頁(yè),共104頁(yè),2023年,2月20日,星期四next:movcl,4;計(jì)數(shù)為4.rolbx,cl;左移4次.movdl,bl;得到8位ALanddl,ofh;取低4位.adddl,30h;變?yōu)锳SCII碼

cmpdl,3ah;>9?.jlprint;小于34h……adddl,07h

Print:Movah,2;Asciidl,調(diào)中斷顯示dl.Int21h;

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論