版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第5章循環(huán)程序設(shè)計(jì)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
判斷一個(gè)數(shù)是否為素?cái)?shù)。在數(shù)據(jù)段中存有一個(gè)字?jǐn)?shù)據(jù)m,判斷m是否是素?cái)?shù)并輸出判斷的結(jié)果。題目分析:判定數(shù)m是否為素?cái)?shù),用m除以i,i從2到m-1,如果所有余數(shù)都不為0,則m為素?cái)?shù),若任何一步中的余數(shù)為0,都可以立即中止循環(huán),而斷定m不是素?cái)?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在匯編程序中,要注意,各個(gè)指令的默認(rèn)條件。如本題中,指令divcx執(zhí)行之前,要先把數(shù)據(jù)m存入寄存器ax,因?yàn)镈IVcx指令的執(zhí)行為:(dx,ax)/(cx),商→(ax),余數(shù)→(dx),所以,div指令執(zhí)行之前先進(jìn)行符號(hào)擴(kuò)展。同時(shí)注意,div指令執(zhí)行之后,ax寄存器的內(nèi)容不再是m了,而變成了除法得到的商,所以,下一次的循環(huán)體執(zhí)行時(shí),不僅讓除數(shù)cx增加1,還要注意恢復(fù)ax的值,重新存入m的值。因此,循環(huán)體從decd:leasi,mmovax,ds:[si]cwddivcx開始,而不是僅僅從cwddivcx開始。例5.2在未排序的數(shù)組中查找并刪除某數(shù)。在附加段中存放一個(gè)未排序的字?jǐn)?shù)組list,第一個(gè)字中存放數(shù)組長度。從鍵盤輸入一個(gè)數(shù)字,放在ax寄存器中,在數(shù)組list中查找是否存在該數(shù)字。如果存在,則把它從數(shù)組中刪除,否則,輸出未找到該數(shù)的信息題目分析:先從鍵盤輸入一個(gè)數(shù)字字符,轉(zhuǎn)化為數(shù)字存入ax中。然后,依次與數(shù)組list中的各個(gè)數(shù)字比較,查找是否存在該數(shù),如果存在,則把數(shù)組中后面的元素依次向左移動(dòng)一個(gè)位置,實(shí)現(xiàn)刪除該數(shù)的目的,同時(shí)修改數(shù)組長度。若查找的數(shù)字正好位于數(shù)組末尾,則直接修改數(shù)組長度。查找的過程,利用比較指令即可;刪除的部分,利用循環(huán)指令把[di]←[di+2]。查找結(jié)束時(shí)di指針指向的就是要?jiǎng)h除的元素的位置,也即實(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
在一個(gè)已經(jīng)排序的數(shù)組中插入一個(gè)數(shù)據(jù),使數(shù)組保持原有的排序順序。假定數(shù)組的首地址和末地址分別存放在arrhd和arrend中,數(shù)組元素均為正數(shù)。題目分析:數(shù)組的首末地址已知,所以可以確定數(shù)組的長度。本題要插入一個(gè)數(shù)據(jù)n,先確定插入位置si,然后把位于si右邊的數(shù)據(jù)向右移動(dòng)一個(gè)位置,騰出插入位置,最后把n放置在si的位置即可關(guān)鍵是確定插入位置si,從數(shù)組的尾部向頭部查找,逐字取出元素值k與n比較,如果k>n,繼續(xù)向頭部查找,同時(shí)把si位置的元素向右移動(dòng)一個(gè)位置,騰出位置等待插入數(shù)據(jù);否則,即k<=n,元素值k的下一個(gè)位置si+2就是插入位置,把數(shù)據(jù)n插入si+2位置就可以了。注意邊界情況。如果n大于所有元素,則直接插入arrend的下一個(gè)位置;如果n小于所有元素,則算法從尾部一直比較查找到首部,同時(shí)所有元素都向右移動(dòng)了一個(gè)位置,所以把n插入arrhd的位置,關(guān)鍵是循環(huán)的結(jié)束條件,為了統(tǒng)一使用一個(gè)循環(huán)條件,可以在arrhd的左邊位置arrhd-2插入一個(gè)負(fù)數(shù)-1,這樣n一定大于-1,可以及時(shí)結(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
計(jì)算數(shù)據(jù)Y中1的個(gè)數(shù)并存入存儲(chǔ)單元中題目分析:先測(cè)試數(shù)據(jù)本身是否為0,若為0,直接結(jié)束;若不為0,則先判斷最高位是否為1,若為1(sf=1),在計(jì)數(shù)器加1,若不為1(sf=0),則準(zhǔn)備下一次測(cè)試:數(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é)果存入存儲(chǔ)單元
題目分析:n!=n*(n-1)*(n-2)**2*1。利用LOOP指令的特性,每執(zhí)行一次,計(jì)數(shù)器CX自動(dòng)減少1,當(dāng)CX值為0時(shí)停止,所以,初始值(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ù)段中有一個(gè)字?jǐn)?shù)組M,求數(shù)組中絕對(duì)值最大的元素,把絕對(duì)值最大的數(shù)存放在存儲(chǔ)單元max中,并把位置存入max+2存儲(chǔ)單元中。題目分析:由于絕對(duì)值都是非負(fù)數(shù),所以,先把最大值cx初始化為0。然后判斷各個(gè)元素的正負(fù),對(duì)于正數(shù),直接與cx進(jìn)行比較大?。粚?duì)于負(fù)數(shù),先取相反數(shù),然后與cx進(jìn)行大小比較。求得最大值后,再把當(dāng)前的最大值的位置si-2存入存儲(chǔ)單元中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單元中。題目分析:冒泡排序的思想,對(duì)相鄰的兩個(gè)數(shù)進(jìn)行比較,把較小的元素向左移動(dòng),較大的元素向右移動(dòng)。經(jīng)過第一趟的n-1次比較,最大的元素排到了最右邊。第二趟的比較,從第一個(gè)比較到n-1個(gè),共比較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ù)段中有兩個(gè)長度為8的字?jǐn)?shù)組X和Y,其元素值分別為X1,X2,…,X10;Y1,Y2,…,Y10。變成實(shí)現(xiàn)如下計(jì)算并把結(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次計(jì)算,可以用循環(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)村庫房施工合同范例
- 萬達(dá)廣場(chǎng)股權(quán)轉(zhuǎn)讓合同范例
- 一般勞動(dòng)合同范例
- 2024至2030年橘子蠟燭項(xiàng)目投資價(jià)值分析報(bào)告
- 神農(nóng)架外墻清洗合同范例
- 過期肉雞銷售合同范例
- 陜西藝術(shù)職業(yè)學(xué)院《建筑設(shè)備自動(dòng)化A》2023-2024學(xué)年第一學(xué)期期末試卷
- 舞陽租房合同范例
- 陜西學(xué)前師范學(xué)院《綠色合成化學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年高中溫推板項(xiàng)目可行性研究報(bào)告
- 金融工程-廈門大學(xué)中國大學(xué)mooc課后章節(jié)答案期末考試題庫2023年
- 西門子plc實(shí)訓(xùn)總結(jié)2000字(4篇)
- 人音版五年級(jí)上冊(cè)音樂期末測(cè)試題
- 中國傳統(tǒng)文化英語(課堂PPT)
- 加油站投資概算表
- 危險(xiǎn)廢物管理臺(tái)賬模板(附錄B)(2)(3)里邊一共五張表表一是產(chǎn)生的臺(tái)賬表二是入危廢間填的表三和表五出危廢間和轉(zhuǎn)移時(shí)填的表四是有危廢自行利用處置時(shí)填的
- 16CJ72-1 預(yù)制及拼裝輕型板
- 抑郁相關(guān)疼痛機(jī)制性治療
- 玻璃幕墻設(shè)計(jì)說明
- DL-T 1966-2019 火力發(fā)電廠機(jī)組檢修監(jiān)理規(guī)范
- 壓力容器安全知識(shí)課件
評(píng)論
0/150
提交評(píng)論