循環(huán)程序設(shè)計_第1頁
循環(huán)程序設(shè)計_第2頁
循環(huán)程序設(shè)計_第3頁
循環(huán)程序設(shè)計_第4頁
循環(huán)程序設(shè)計_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第5章循環(huán)程序設(shè)計5.1簡單循環(huán)程序5.2多重循環(huán)程序5.1簡單循環(huán)程序在匯編語言中,實(shí)現(xiàn)循環(huán)的指令有兩種,一種是LOOP指令,它適用于循環(huán)次數(shù)已知的情況,用CX寄存器保存循環(huán)次數(shù);另一種是JMP指令,它根據(jù)當(dāng)前的條件判斷可以跳轉(zhuǎn)到不同的地方繼續(xù)執(zhí)行程序,適用于根據(jù)循環(huán)條件執(zhí)行循環(huán)的情況。例5.1

判斷一個數(shù)是否為素數(shù)。在數(shù)據(jù)段中存有一個字?jǐn)?shù)據(jù)m,判斷m是否是素數(shù)并輸出判斷的結(jié)果。題目分析:判定數(shù)m是否為素數(shù),用m除以i,i從2到m-1,如果所有余數(shù)都不為0,則m為素數(shù),若任何一步中的余數(shù)為0,都可以立即中止循環(huán),而斷定m不是素數(shù)。datasegmentmdw4mess1db'Itisaprime!',13,10,'$'mess2db'Itisnotaprime!',13,10,'$'dataendsstacksegmentdw100hstackendscodesegmentmainprocfarassumecs:code,ds:data,ss:stackstart:pushdssubax,axpushaxmovax,datamovds,axmovax,stackmovss,axmovcx,2decd:leasi,mmovax,ds:[si]cwddivcxcmpdx,0jzbreakinccxcmpcx,[si]jldecdyes:leadx,mess1jmpdispbreak:leadx,mess2disp:movah,09int21hexit:movax,4c00hint21hmainendpcodeendsendstart在匯編程序中,要注意,各個指令的默認(rèn)條件。如本題中,指令divcx執(zhí)行之前,要先把數(shù)據(jù)m存入寄存器ax,因?yàn)镈IVcx指令的執(zhí)行為:(dx,ax)/(cx),商→(ax),余數(shù)→(dx),所以,div指令執(zhí)行之前先進(jìn)行符號擴(kuò)展。同時注意,div指令執(zhí)行之后,ax寄存器的內(nèi)容不再是m了,而變成了除法得到的商,所以,下一次的循環(huán)體執(zhí)行時,不僅讓除數(shù)cx增加1,還要注意恢復(fù)ax的值,重新存入m的值。因此,循環(huán)體從decd:leasi,mmovax,ds:[si]cwddivcx開始,而不是僅僅從cwddivcx開始。例5.2在未排序的數(shù)組中查找并刪除某數(shù)。在附加段中存放一個未排序的字?jǐn)?shù)組list,第一個字中存放數(shù)組長度。從鍵盤輸入一個數(shù)字,放在ax寄存器中,在數(shù)組list中查找是否存在該數(shù)字。如果存在,則把它從數(shù)組中刪除,否則,輸出未找到該數(shù)的信息題目分析:先從鍵盤輸入一個數(shù)字字符,轉(zhuǎn)化為數(shù)字存入ax中。然后,依次與數(shù)組list中的各個數(shù)字比較,查找是否存在該數(shù),如果存在,則把數(shù)組中后面的元素依次向左移動一個位置,實(shí)現(xiàn)刪除該數(shù)的目的,同時修改數(shù)組長度。若查找的數(shù)字正好位于數(shù)組末尾,則直接修改數(shù)組長度。查找的過程,利用比較指令即可;刪除的部分,利用循環(huán)指令把[di]←[di+2]。查找結(jié)束時di指針指向的就是要刪除的元素的位置,也即實(shí)現(xiàn)[di]←[di+2]的di初始值datasegmentlistdw10,2,34,0,1,56,90,32,-8,0,12dataendsstacksegmentdw100hstackendscodesegmentmainprocfarassumecs:code,es:data,ss:stackstart:pushdssubax,axpushaxmovax,datamoves,axmovds,axmovax,stackmovss,axmovah,01int21hsubal,30hcbwleadi,listcldpushdimovcx,es:[di]cmpdig:adddi,2cmpax,es:[di]jedeltloopcmpdigpopdijmpshortexitdelt:jcxzdec_cntnext:movbx,es:[di+2]moves:[di],bxadddi,2loopnextdec_cnt:popdidecwordptres:[di]exit:ret例5.3

在一個已經(jīng)排序的數(shù)組中插入一個數(shù)據(jù),使數(shù)組保持原有的排序順序。假定數(shù)組的首地址和末地址分別存放在arrhd和arrend中,數(shù)組元素均為正數(shù)。題目分析:數(shù)組的首末地址已知,所以可以確定數(shù)組的長度。本題要插入一個數(shù)據(jù)n,先確定插入位置si,然后把位于si右邊的數(shù)據(jù)向右移動一個位置,騰出插入位置,最后把n放置在si的位置即可關(guān)鍵是確定插入位置si,從數(shù)組的尾部向頭部查找,逐字取出元素值k與n比較,如果k>n,繼續(xù)向頭部查找,同時把si位置的元素向右移動一個位置,騰出位置等待插入數(shù)據(jù);否則,即k<=n,元素值k的下一個位置si+2就是插入位置,把數(shù)據(jù)n插入si+2位置就可以了。注意邊界情況。如果n大于所有元素,則直接插入arrend的下一個位置;如果n小于所有元素,則算法從尾部一直比較查找到首部,同時所有元素都向右移動了一個位置,所以把n插入arrhd的位置,關(guān)鍵是循環(huán)的結(jié)束條件,為了統(tǒng)一使用一個循環(huán)條件,可以在arrhd的左邊位置arrhd-2插入一個負(fù)數(shù)-1,這樣n一定大于-1,可以及時結(jié)束循環(huán)datasegmentarrhddw3,5,7,8,12,14,23,56arrenddw62ndw1dataendscodesegmentmainprocfarassumecs:code,ds:datastart:pushdssubax,axpushaxmovax,datamovds,axmovax,nmovarrhd-2,0ffffhmovsi,0compare:cmparrend[si],axjleinsertmovbx,arrend[si]movarrend[si+2],bx

subsi,2jmpshortcompareinsert:movarrend[si+2],ax

exit:movax,4c00hint21hmainendpcodeendsendstart例5.4

計算數(shù)據(jù)Y中1的個數(shù)并存入存儲單元中題目分析:先測試數(shù)據(jù)本身是否為0,若為0,直接結(jié)束;若不為0,則先判斷最高位是否為1,若為1(sf=1),在計數(shù)器加1,若不為1(sf=0),則準(zhǔn)備下一次測試:數(shù)據(jù)邏輯左移1位,把次高位左移到最高位,再判斷最高位是否為1datasegmentYdw1001011000110101Bcountdw?dataendscodesegmentmainprocfarassumecs:code,ds:datastart:pushdssubax,axpushaxmovax,datamovds,ax

movax,ymovcx,0repeat:testax,0ffffhjzexitjnsshiftinccxshift:shlax,1jmprepeat例5.5

求n!,并把運(yùn)算結(jié)果存入存儲單元

題目分析:n!=n*(n-1)*(n-2)**2*1。利用LOOP指令的特性,每執(zhí)行一次,計數(shù)器CX自動減少1,當(dāng)CX值為0時停止,所以,初始值(CX)←n,(AX)=1,執(zhí)行循環(huán)體(DX,AX)←(AX)*(CX)datasegmentndw5resultdw?dataendsstacksegmentdw100hstackendscodesegmentmainprocfarassumecs:code,ds:data,ss:stackstart:pushdssubax,axpushaxmovax,datamovds,axmovax,stackmovss,axmovcx,nmovax,1cwdL1:mulcxloopL1movresult,axmovresult+2,dxexit:ret例5.6數(shù)據(jù)段中有一個字?jǐn)?shù)組M,求數(shù)組中絕對值最大的元素,把絕對值最大的數(shù)存放在存儲單元max中,并把位置存入max+2存儲單元中。題目分析:由于絕對值都是非負(fù)數(shù),所以,先把最大值cx初始化為0。然后判斷各個元素的正負(fù),對于正數(shù),直接與cx進(jìn)行比較大小;對于負(fù)數(shù),先取相反數(shù),然后與cx進(jìn)行大小比較。求得最大值后,再把當(dāng)前的最大值的位置si-2存入存儲單元中datasegsegmentMdw0,2,-5,9,6,3,-18,-4,1,-7maxdw?,?datasegendsprognamsegmentmainprocfarassumecs:prognam,ds:datasegstart:pushdssubax,axpushaxmovax,datasegmovds,axmoval,11movcx,0leasi,Mnext:decaljzexitmovbl,[si]movbh,[si+1]testbh,80hjzBJnegbxBJ:addsi,2cmpcx,bxjnbnextxchgcx,bxpushsisubsi,2movdx,simov[max+2],dxpopsijmpnextexit:movmax,cxretmainendpprognamendsendstart5.2多重循環(huán)程序例5.7

冒泡法排序,把數(shù)組中的元素按照從小到大的順序排序。數(shù)組的長度存放在n單元中。題目分析:冒泡排序的思想,對相鄰的兩個數(shù)進(jìn)行比較,把較小的元素向左移動,較大的元素向右移動。經(jīng)過第一趟的n-1次比較,最大的元素排到了最右邊。第二趟的比較,從第一個比較到n-1個,共比較n-2次。共進(jìn)行n-1趟比較datasegmentadw2,34,0,1,56,90,0,-8,0,12ndw10dataendscodesegmentmainprocfarassumecs:code,ds:datastart:pushdssubax,axpushaxmovax,datamovds,ax

movcx,ndeccxloop1:movdi,cxmovbx,0loop2:movax,a[bx]cmpax,a[bx+2]jlecontinuexchgax,a[bx+2]mova[bx],axcontinue:addbx,2looploop2movcx,dilooploop1exit:movax,4c00hint21hmainendpcodeendsendstart例5.8已知數(shù)據(jù)段中有兩個長度為8的字?jǐn)?shù)組X和Y,其元素值分別為X1,X2,…,X10;Y1,Y2,…,Y10。變成實(shí)現(xiàn)如下計算并把結(jié)果存入數(shù)組ZZ1=X1+Y1Z2=X2+Y2Z3=X3-Y3Z4=X4-Y4Z5=X5-Y5Z6=X6+Y6Z7=X7-Y7Z8=X8-Y8Z9=X9+Y9Z10=X10+Y10題目分析:本題進(jìn)行10次計算,可以用循環(huán)次數(shù)已知的循環(huán)指令loop實(shí)現(xiàn)。但是每次執(zhí)行的循環(huán)體有加減兩種運(yùn)算,為了區(qū)別每次執(zhí)行加法還是減法運(yùn)算,可

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論