循環(huán)程序的設(shè)計(jì)_第1頁(yè)
循環(huán)程序的設(shè)計(jì)_第2頁(yè)
循環(huán)程序的設(shè)計(jì)_第3頁(yè)
已閱讀5頁(yè),還剩17頁(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)介

1、循環(huán)程序的設(shè)計(jì)循環(huán)程序可以有兩種結(jié)構(gòu)形式,如圖所示。一種是DO_WHILE結(jié)構(gòu)形式;另一種是DO_UNTIL結(jié)構(gòu)形式。例 51設(shè)內(nèi)存BUFF開始的單元中依次存放著30個(gè) 8 位無(wú)符號(hào)數(shù),求它們的和并放在SUM單元中,試編寫程序。分析:這是一個(gè)求累加的程序。程序如下:MOVSI, BUFF;設(shè)地址指針MOVCX,30;設(shè)計(jì)數(shù)初值XORAX ,AX;設(shè)累加器初值A(chǔ)GAIN : ADDAL , SIADCAH ,0INCSIDECCXJNZAGAIN;循環(huán)累加MOVSUM , AX例 5 2 在給定個(gè)數(shù)的 16 位數(shù)串中,找出大于零、等于零和小于零的個(gè)數(shù),并緊跟著原串存放。分析:這是一個(gè)統(tǒng)計(jì)問題,須

2、設(shè)定三個(gè)計(jì)數(shù)器分別統(tǒng)計(jì)三種情況下的結(jié)果。程序如下:DATASEGMENTBUFFDWX1 , X2 , X3 , XnCOUNTEQU$-BUFF;此時(shí), COUNT的值為 BUFF 所占的字節(jié)數(shù)PLUSEDB?ZERODB?MINUSDB?DATAENDSCODESEGMENTASSUMECS:CODE , DS: DATAASSUMEES:DATA, SS: STACKBEGIN:MOVAX, DATAMOVDS, AXMOVCX , COUNTSHRCX,1;相當(dāng)于除 2,正好為 BUFF 中的數(shù)據(jù)個(gè)數(shù)MOVDX ,0;設(shè)定計(jì)數(shù)器初值MOVAX ,0;設(shè)定計(jì)數(shù)器初值LEABX , BUF

3、FAGAIN:CMPWORDPTRBX, 0JAEPLU;大于等于0,則轉(zhuǎn)PIUINCAH;0,則統(tǒng)計(jì)JMPNEXTZER :INCDH; 0,則統(tǒng)計(jì)NEXT :INCBXINCBXLOOPAGAINMOVPLUS , DLMOVZERO, DHMOVMINUS , AHMOVAX , 4C00HINT21HCODEENDSENDBEGIN例 53在 ADDR 單元中存放著16 位數(shù) Y 的地址, 試編寫一程序,把Y 中 1 的個(gè)數(shù)存入 COUNT 單元中。分析:這是一個(gè)循環(huán)統(tǒng)計(jì)的工作。采用DO WHILE結(jié)構(gòu),做 16 次循環(huán),每次將最高位移入CF 中進(jìn)行測(cè)試,先判斷結(jié)果是否為0,若為0,則

4、結(jié)束;否則統(tǒng)計(jì)計(jì)數(shù)后循環(huán)重復(fù)。程序如下:DATASEGMENTADDRDWNUMBERNUMBERDWYCOUNTDW?DATAENDSPROGRAMSEGMENTMAINPROCFARASSUMECS:PROGRAM , DS: DATASTART :PUSHDSMOVAX ,0PUSHAXMOVAX , DATAMOVDS, AXMOVCX,0;計(jì)數(shù)器初值 0MOVBX , ADDRMOVAX , BX;取Y送AXREPEAT:TESTAX , 0FFFFH;檢測(cè)是否為全0JZEXITJNSSHIFTINCCXSHIFT :SHLJMPREPEATEXIT :MOVRET;是,則轉(zhuǎn)EXIT

5、;最高位是 0,則轉(zhuǎn) SHIFT;最高位是1,則統(tǒng)計(jì)計(jì)數(shù)AX , 1;處理下一位COUNT , CXMAINENDPPROGRAMENDSENDSTART在實(shí)際應(yīng)用中,有些問題較復(fù)雜,一重循環(huán)不夠,必須使用多重循環(huán)實(shí)現(xiàn),這些循環(huán)是一層套一層的,通常稱為循環(huán)嵌套。例 54在DS所決定的數(shù)據(jù)段,從偏移地址BUFFER開始順序存放100 個(gè)無(wú)符號(hào)16 位數(shù),現(xiàn)要編寫程序?qū)⑦@100個(gè)字?jǐn)?shù)據(jù)從大到小排序。分析:排序的方法有很多,在這里,我們采用冒泡法。程序如下:LEADI ,BUFFER;DI 作為指針,指向要排序的數(shù)據(jù)MOVBL ,99;循環(huán)控制初值NEXT0 : MOVSI, DIMOVCL,BLN

6、EXT3 : MOVAX , SI;取一個(gè)數(shù)ADDSI,2CMPAX , SI;與下一個(gè)數(shù)進(jìn)行比較JNCNEXT5;大于等于時(shí)轉(zhuǎn)移MOVDX , SI;否則,兩數(shù)交換MOVSI-2 , DXMOVSI, AXNEXT5:DECCL;控制進(jìn)行交換的次數(shù)JNZNEXT3DECJNZBLNEXT0;修改交換的次數(shù)HLT例 55 試編制一個(gè)程序,把 BX 寄存器中的二進(jìn)制數(shù)以十六進(jìn)制的形式顯示在屏幕上。解析:根據(jù)題目要求應(yīng)將BX 中的內(nèi)容從左到右每4 位一組顯示出來(lái),共顯示4 個(gè)十六進(jìn)制數(shù)位。如果顯示的數(shù)位是 09,則把 4 位二進(jìn)制數(shù)加上30H,轉(zhuǎn)換成相應(yīng)的ASCII碼 30H39H ;如果是 AF

7、 ,則應(yīng)加上 37H ( 30H+7 ),轉(zhuǎn)換成 ASCII 碼 41H46H 。顯示字符可以使用DOS 功能調(diào)用來(lái)實(shí)現(xiàn)。下圖是程序框圖。以 binihex asm 為文件名,建立源程序如下:; binihex Asmprognamsegment;定義代碼段mainprocfarassumecs:prognamstart:;程序從此處開始執(zhí)行; 為正常返回 DOS 而設(shè)置堆棧pushdssubax,axpushax; 下面是程序的主要部分movch,4;4 組二進(jìn)制數(shù)rotate:movcl,4;每組 4 個(gè)二進(jìn)制位rolbx,cl;把 bx 循環(huán)左移4 位moval,bl;暫存 bl 到 a

8、l 中andal,0fh;僅保留 al 的低 4位addal,30h;轉(zhuǎn)換成 ASCII 碼cmpal,3ah;要顯示的數(shù)大于9?jlprintit;如果數(shù)在0 9之間則顯示addal,7h;數(shù)在 A F 之間則調(diào)整printit:movdl,al;把要顯示字符的 ASCII 碼送 dlmovah,2; 功能號(hào) 2 送 ahint21h;DOS 功能調(diào)用decch; (ch)-1jnzrotate;4 組都處理完?否,循環(huán)處理下一組ret;返回 DOSmainendp;主程序 main 結(jié)束prognamends;代碼段結(jié)束endstart;結(jié)束匯編例 5 6 從鍵盤接收十進(jìn)制數(shù)并存入 BX

9、prognam segmentmain proc farassume cs:prognamstart:pushdssubax,axpushaxmovbx,0newchar:movah,1;鍵盤輸入int21hsubal,30hjlexit;9 退出cbw例 5 7從鍵盤接收十六進(jìn)制數(shù)并存入BXcodeassumesegmentcs:code,ds:datastart:movax,4c00hint21h;返回DOScodeendendsstart例 5 8將正數(shù)N 插入一個(gè)已整序的字?jǐn)?shù)組的正確位置。該數(shù)組的首地址和末地址分別為ARRAY_HEAD和ARRAY_END ,其中所有數(shù)均為正數(shù)且已按遞

10、增的次序排列。; 定義數(shù)據(jù)段datareasegmentxdw?array_headdw23,37,49,52,65,78,99array_enddw105ndw32datareaends; 定義代碼段prognamsegmentmainprocfar;主 程 序 部 分assumecs:prognam,ds:datareastart:;程序從此處開始執(zhí)行pushdssubax,axpushaxmovax,datareamovds,ax; 程序的主要部分movax,nmovarray_head-2,0ffffh;-1送array_head-2單元movsi,0compare:cmparray_

11、endsi,axjleinsertmovbx,array_endsimovarray_endsi+2,bxsubsi,2jmpshort compareinsert:movarray_endsi+2,axretmainendp; 主程序 main 結(jié)束prognam endsendstart例 5.9設(shè)有數(shù)組 X (, ,) 和Y ( , ,),編程計(jì)算數(shù)組Z ( , ,),其中:; 定義數(shù)據(jù)段datareasegmentxdwx1,x2,x3,x4,x5,x6 x7,x8,x9,x10ydwy1,y2,y3,y4,y5,y6,y7,y8,y9,y10zdwz1,z2,z3,z4,z5,z6,

12、z7,z8,z9,z10logic_ruledw00dchdatareaends; 定義代碼段prognamsegmentmainprocfarassumecs:prognam,ds:datareastart:pushdssubax,axpushaxmovax,datareamovds,axmovbx,0movcx,10movdx,logic_rulenext:movax,xbxshrdx, 1jcsubtractaddax,ybxjmpshortresultsubtract:subax,ybxresult:movzbx, axaddbx,2loopnextretmainendpprognam

13、endsendstart這種設(shè)置邏輯尺的方法是很常用的。例如,在矩陣運(yùn)算中,為了跳過(guò)操作數(shù)為0 的計(jì)算, 經(jīng)常采用這種方法。又如,把一組數(shù)據(jù)存入存儲(chǔ)器時(shí),如果其中數(shù)值為 0 的元素很多,也可用這種方法設(shè)立一個(gè)每位表示一個(gè)下標(biāo)的邏輯尺(這樣的邏輯尺可能占有幾個(gè)字,由數(shù)組的長(zhǎng)度確定。 ), 0 元素就可不占有存儲(chǔ)單元了。每個(gè)標(biāo)志只占一位,如果要表示的特征數(shù)更多,則每個(gè)標(biāo)志可占有幾位,而在處理方法上是完全相同的。設(shè)立標(biāo)志位的方法除了如邏輯尺那樣可靜態(tài)地預(yù)置外,還可以在程序中動(dòng)態(tài)地修改標(biāo)志位的值,以達(dá)到控制的目的,下例將說(shuō)明這種方法。例 5 10 試編制一程序:從鍵盤輸入一行字符,要求第一個(gè)鍵入的字符

14、必須是空格符,如不是,則退出程序;如是,則開始接收鍵入的字符并順序存放在首地址為BUFFER的緩沖區(qū)中(空格符不存入) ,直到接收到第二個(gè)空格符時(shí)退出程序。這一程序要求接收的字符從空格符開始又以空格符結(jié)束,因此程序中必須區(qū)分所接收的字符是否是第一個(gè)字符。為此,設(shè)立作為標(biāo)志的存儲(chǔ)單元FLAG 。一開始將其置為0,接收第一個(gè)字符后可將其置1。整個(gè)程序的框圖如圖所示。;定義數(shù)據(jù)段datareasegmentbufferdb80dup(?)flagdb?datareaends;定義代碼段prognamsegmentmainprocfarassumecs:prognam,ds:datareastart:

15、pushdssubax,axpushaxmovax,datareamovds,axleabx,buffermovflag,0next:movah,01int21htestflag,01hjnz/jnefollowcmpal,20hjnz/jneexitmovflag,1jmpnextfollow:cmpal,20hjz/jeexitmovbx,alincbxjmpnextexit:retmainendpprognamendsendstart例 511 有一個(gè)首地址為 A 的 N 字?jǐn)?shù)組,請(qǐng)編制程序使該數(shù)組中的數(shù)按照從小到大的次序整序。解析:這里采用起泡排序算法實(shí)現(xiàn)數(shù)組整序。從第一個(gè)數(shù)開始依次對(duì)相鄰兩個(gè)數(shù) Ki 和 Ki+1 進(jìn)行比較,若 Ki Ki+1,Ki的位置不動(dòng),Ki+1繼續(xù)和Ki+2比較;若Ki Ki+1,則兩者交換位置,Ki+1(交換前的Ki )繼續(xù)和Ki+2比較。(氣泡算法,多重循環(huán))32,85,16,15,8; 定義數(shù)據(jù)段dsegsegmentnequ5;數(shù)組中數(shù)的個(gè)數(shù)adwndup(?)dsegends; 定義代碼段csegsegmentmainprocfarassumecs:cseg,ds:dsegstart:movax,dsegmovds,axmovcx,ndeccx;設(shè)置 co

溫馨提示

  • 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ù)覽,若沒有圖紙預(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論