![循環(huán)程序設(shè)計(jì)_第1頁(yè)](http://file4.renrendoc.com/view/1c9c14390b15eb5772ee95d67f24a657/1c9c14390b15eb5772ee95d67f24a6571.gif)
![循環(huán)程序設(shè)計(jì)_第2頁(yè)](http://file4.renrendoc.com/view/1c9c14390b15eb5772ee95d67f24a657/1c9c14390b15eb5772ee95d67f24a6572.gif)
![循環(huán)程序設(shè)計(jì)_第3頁(yè)](http://file4.renrendoc.com/view/1c9c14390b15eb5772ee95d67f24a657/1c9c14390b15eb5772ee95d67f24a6573.gif)
![循環(huán)程序設(shè)計(jì)_第4頁(yè)](http://file4.renrendoc.com/view/1c9c14390b15eb5772ee95d67f24a657/1c9c14390b15eb5772ee95d67f24a6574.gif)
![循環(huán)程序設(shè)計(jì)_第5頁(yè)](http://file4.renrendoc.com/view/1c9c14390b15eb5772ee95d67f24a657/1c9c14390b15eb5772ee95d67f24a6575.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
微型計(jì)算機(jī)原理及應(yīng)用第4章匯編語(yǔ)言程序設(shè)計(jì)循環(huán)程序有兩種結(jié)構(gòu):“先執(zhí)行,后判斷”和“先判斷,后執(zhí)行。
4.4.4循環(huán)結(jié)構(gòu)程序初始化循環(huán)體參數(shù)修改循環(huán)控制?YN程序當(dāng)中有一部分指令,需要反復(fù)的執(zhí)行,需要編寫(xiě)循環(huán)結(jié)構(gòu)程序。初始化循環(huán)體修改參數(shù)循環(huán)控制?YN先執(zhí)行,再判斷條件。先判斷條件,再執(zhí)行無(wú)論哪種結(jié)構(gòu),循環(huán)程序都可由如下四部分組成:(1)循環(huán)初始化部分
循環(huán)之前的一些準(zhǔn)備工作。比如數(shù)據(jù)處理一般要設(shè)置地址指針、循環(huán)次數(shù)及某標(biāo)志的設(shè)置,相關(guān)寄存器的清零等操作。只有正確地進(jìn)行了初始化設(shè)置,循環(huán)程序才能正確運(yùn)行,及時(shí)停止。(2)循環(huán)體:是要重復(fù)執(zhí)行的那部分指令或程序段。(3)修改參數(shù):為下一次循環(huán)做些準(zhǔn)備。比如說(shuō)地址指針的修改,循環(huán)次數(shù)的檢驗(yàn)(4)循環(huán)控制:就是循環(huán)的判別,我這次循環(huán)是否該結(jié)束了循環(huán)結(jié)束的控制:用計(jì)數(shù)器控制循環(huán)結(jié)束。(見(jiàn)實(shí)例)用特征碼控制循環(huán)結(jié)束。(見(jiàn)實(shí)例)循環(huán)程序結(jié)構(gòu)【例1】※設(shè)內(nèi)存BUFF開(kāi)始的單元中依次存放著30個(gè)8位無(wú)符號(hào)數(shù),求它們的和并放在SUM單元中,試編寫(xiě)程序MOV SI,BUFF;設(shè)地址指針MOV CX,30;設(shè)計(jì)數(shù)初值XOR AX,AX;設(shè)累加器初值(標(biāo)志位清零AGAIN:ADD AL,[SI] ADC AH,0; INC SI LOOP AGAIN;循環(huán)累加
MOV SUM,AX循環(huán)程序結(jié)構(gòu)解決ADDAL,[SI]的進(jìn)位問(wèn)題AH=AH+0+CF數(shù)據(jù)段怎么處理?[例2]統(tǒng)計(jì)以BUFFER為起始地址的100個(gè)單元中負(fù)數(shù)的個(gè)數(shù),并將統(tǒng)計(jì)出來(lái)的負(fù)數(shù)個(gè)數(shù)送NUM單元。(P145) XOR
BL,BL ;存放負(fù)數(shù)的個(gè)數(shù) MOV
CX,100 ;統(tǒng)計(jì)次數(shù) LEA
SI,BUFFER CLDNEXT: LODSB ;取一個(gè)數(shù) TEST
AL,80H JZ
GOON INCBLGOON:LOOPNEXT ;是負(fù)數(shù),計(jì)數(shù)器加1 MOVNUM,BL例3將BX中的16進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼,存放到BUF開(kāi)始的內(nèi)存單元中,并在屏幕上顯示出數(shù)值。
數(shù)字0—9對(duì)應(yīng)的ASCII碼為30H---39H(加30H)數(shù)字A—F對(duì)應(yīng)的ASCII碼為41H---46H(加37H)循環(huán)程序結(jié)構(gòu)MOVSI,OFFSETBUFMOV CH,4;四個(gè)16進(jìn)制數(shù)需要處理NEXT:MOVCL,4;左移4位 ROLBX,CL MOVAL,BL
ANDAL,0FH CMPAL,0AH JCSTOREADDAL,7HSTORE:ADD AL,30HMOV[SI],AL
MOV AH,2 MOV DL,AL INT 21H
INC SI DEC CH JNZ NEXT HLT循環(huán)程序結(jié)構(gòu)循環(huán)程序結(jié)構(gòu)例[4]※統(tǒng)計(jì)AX寄存器中1的個(gè)數(shù),結(jié)果放到CL寄存器中。MOVCL,0;將來(lái)放1的個(gè)數(shù)L1:ANDAX,AX;AX不變,但影響ZF標(biāo)志位JZSTOP;如果AX=0那么下面的程序就不必要了SALAX,1;算術(shù)左移,將最低位送入CF
JNCL2;檢驗(yàn)CF的值是1還是0?INCCLL2:JMPL1STOP:MOVAH,4CHINT21H
該程序沒(méi)有設(shè)置循環(huán)次數(shù),看AX是不是0決定是否循環(huán)循環(huán)程序結(jié)構(gòu)參考程序(2)
MOVCH,16MOVCL,0L1:SALAX,1JNCL2INCCLL2:DECCHJNZL1STOP:MOVAH,4CHINT21H先判斷,后執(zhí)行該程序有設(shè)置循環(huán)次數(shù),看CH是不是0決定是否循環(huán)8.5子程序設(shè)計(jì)1.子程序的定義程序設(shè)計(jì)中,把多次重復(fù)出現(xiàn)、具有通用性、能夠完成特定處理任務(wù)的程序段編寫(xiě)成獨(dú)立的程序模塊。特性:(1)重復(fù)性;(2)通用性;(3)浮動(dòng)性;(4)模塊化;8.5.1子程序概念主程序與子程序調(diào)用關(guān)系主程序K:調(diào)用子程序ADK:……J:調(diào)用子程序ADJ:…………子程序A……返回主程序8.5.1子程序概念
MAIN PROC FAR;主程序
……
CALL SUBR1
…… RET MAIN ENDP
SUBR1 PROC NEAR;子程序(NEAR可省略)…… RET SUBR1 ENDPMAIN及其子程序SUBR1在同一代碼段中,SUBR1定義為NEAR屬性。如果調(diào)用程序和子程序不在同一個(gè)代碼段中,則使用FAR屬性程序的主程序看作DOS調(diào)用的一個(gè)子程序,因而DOS對(duì)MAIN的調(diào)用以及MAIN中的RET就是FAR屬性。8.5.1子程序概念CALL和NEAR為調(diào)用指令基本功能:
將子程序的返回地址(即CALL指令的下一條指令的地址,簡(jiǎn)稱斷點(diǎn)地址,包括段地址和偏移地址)壓入堆棧,以便執(zhí)行完子程序后能返回主程序,并從斷點(diǎn)處繼續(xù)往下執(zhí)行,然后按照某種尋址方式轉(zhuǎn)向子程序的入口地址去執(zhí)行子程序。子程序定義的語(yǔ)法格式:
<子程序名>PROCAttribute…….RET<子程序名>ENDP子程序定義的語(yǔ)法格式SUBT PROC PUSH AX ;現(xiàn)場(chǎng)保護(hù)PUSH BXPUSH CXPUSH DX…… ;子程序體POP DX ;現(xiàn)場(chǎng)恢復(fù)POP CXPOP BXPOP AXRETSUBT ENDP例5-13PUSH指令把子程序所需要使用的寄存器內(nèi)容保存在堆棧中POP指令把寄存器內(nèi)容恢復(fù)原狀子程序結(jié)構(gòu)形式—保護(hù)現(xiàn)場(chǎng)與恢復(fù)現(xiàn)場(chǎng)注意:子程序中用到的寄存器是應(yīng)該保護(hù)的。如果使用寄存器在主程序和子程序之間傳送參數(shù),這種寄存器就不一定需要保護(hù),特別是向主程序回送結(jié)果的寄存器,更不應(yīng)該因保存和恢復(fù)寄存器而破壞了應(yīng)該向主程序傳送的信息。先入后出的原則掌握以下幾點(diǎn):調(diào)用子程序用CALL指令,返回調(diào)用程序用RET指令。子程序允許嵌套調(diào)用。進(jìn)入子程序后首先要保護(hù)主程序的運(yùn)行狀態(tài)(標(biāo)志位)和使用的寄存器內(nèi)容(稱為保護(hù)現(xiàn)場(chǎng)),退出子程序前要恢復(fù)現(xiàn)場(chǎng)。調(diào)用前要預(yù)先確定子程序中要使用哪些寄存器,并定義入口參數(shù)和出口參數(shù)。參數(shù)傳遞可利用寄存器、存儲(chǔ)單元或堆棧(要用BP尋址)。子程序設(shè)計(jì)舉例子程序設(shè)計(jì)——參數(shù)傳遞方法利用寄存器:主程序把給子程序的參數(shù)直接放在的約定的寄存器,子程序從中取參數(shù);子程序處理結(jié)果也放在約定寄存器中。利用存儲(chǔ)單元:這種參數(shù)傳遞方法,把所需傳遞的參數(shù)直接放在子程序調(diào)用指令代碼之后。利用堆棧:這種方法將參數(shù)壓入堆棧,在子程序運(yùn)行時(shí)從堆棧中取參數(shù)。返回主程序后主程序從堆棧中取結(jié)果。入口參數(shù):主程序送給子程序處理的信息出口參數(shù):子程序送給主程序的處理結(jié)果【例1】?jī)蓚€(gè)6字節(jié)數(shù)相加。
分析:將一個(gè)字節(jié)相加的程序段設(shè)計(jì)為子程序。主程序分3次調(diào)用該子程序,但每次調(diào)用的參數(shù)不同。DATA SEGMENTADD1DB FEH,86H,7CH,35H,68H,77HADD2DB 45H,BCH,7DH,6AH,87H,90HSUMDB6DUP(0)COUNT DB 6DATA ENDSSTACK SEGMENT DB 100DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKMADD: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX
MOV SI,OFFSET ADD1 MOV DI,OFFSET ADD2 MOV BX,OFFSETSUM MOV CX,COUNT;循環(huán)初值為6 CLCAGAIN:CALL SUBADD;調(diào)用子程序
LOOPAGAIN;循環(huán)調(diào)用6次
MOV AX,4C00H INT 21H
子程序入口參數(shù):SI,DI,BX出口參數(shù):SI,DI,BX
SUBADDPROC
;完成一個(gè)字節(jié)相加
PUSH AX;保護(hù)AX的值
MOV AL,[SI];SI是一個(gè)源操作數(shù)指針
ADC AL,[DI];DI是另一個(gè)源操作數(shù)指針
MOV [BX],AL;BX是結(jié)果操作數(shù)指針
INC SI INC DI INC BX
POP AX;恢復(fù)AX的值
RETSUBADD ENDPCODE ENDS ENDMADD4.4.5子程序設(shè)計(jì)[例4-16]從一個(gè)字符串刪去一個(gè)字符。DATA SEGMENTSTRING DB‘Exxperince’LENGTH DW$_STRINGKEY DB‘X’DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATAMAIN PROC
FARSTART: MOVAX,DATA MOVDS,AX LEA
BX,STRING多余的字符 LEACX,LENGTH PUSHBXPUSHCXMOVAL,KEYCALLDELCHARMOVAH,4CH INT21HMAIN ENDPDELCHAR PROC PUSHBP MOVBP,SP PUSHSI PUSHDI PUSHCX程序執(zhí)行時(shí)堆棧最滿時(shí)的狀態(tài)CLDMOVSI,[BP+4]MOVCX,[SI]MOVDI,[BP+6]REPNESCASBJNEDONEMOV
SI,[BP+4]
DECWORD
PTR[SI]MOVSI,DIDECDIREPMOVSBDONE: POP
CX POP
DI POP
SI POP
BP RET
4DELCHARENDPCODE ENDS END
START[例4-18]當(dāng)I/O狀態(tài)端口0378H的Bit1為0時(shí),表示外設(shè)忙;為1則表示外設(shè)可以接收數(shù)據(jù)。現(xiàn)將當(dāng)前數(shù)據(jù)段中從BUFFER開(kāi)始的連續(xù)100個(gè)字節(jié)的內(nèi)容從I/O數(shù)據(jù)端口03F8H輸出到外設(shè)。SENDATA PROCFAR
PUSHAXPUSHDXPUSHSIPUSHCXLEASI,BUFFERMOVCL,100AGAIN: MOV
DX,0378HWAIT: IN
AL,DX
TESTAL,02H JZ
WAITMOV
AL,[SI] MOVDX,3F8HOUTDX,ALINCSIDECCLJNZ
AGAINPOPCXPOP
SI POP
DX POPAX RETSENDATA ENDP4.5常見(jiàn)程序設(shè)計(jì)舉例DATASEGMENTMASCDB‘2’,‘6’,‘A’,‘1’MBIN DB2DUP(?)DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATABEGIN:MOVAX,DATA MOVDS,AX MOVCL,4MOVCH,CLLEASI,MASCCLD[例4-19]把ASCII碼形式表示的數(shù)轉(zhuǎn)換為二進(jìn)制碼。ASCII碼存放在以MASC為首地址的內(nèi)存單元中,轉(zhuǎn)換結(jié)果放MBIN。 XORAX,AX XORDX,DXNEXT1:LODSMASC
ANDAL,7FH CMPAL,‘0’ JLERROR CMPAL,‘9’ JGNEXT2 SUBAL,30H JMPSHORTNEXT3NEXT2:CMPAL,‘A’ JLERROR
CMPAL,‘F’ JGERROR SUBAL,37HNEXT3:ORDL,AL RORDX,CL
DECCH JNZNEXT1 MOVWORDPTRMBIN,DX MOVAH,4CH INT21HCODEENDS EDNBEGIN[例4-20]把存放在BUFF中的16位二進(jìn)制數(shù)轉(zhuǎn)換為ASCII表示的等值數(shù)字字符串。例如FFFFH轉(zhuǎn)換成等值的數(shù)字字符串‘65535’。DATASEGMENTBUFFDW4FB6HASCC DB5DUP(?)DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVCX,5LEADI,ASCCXORDX,DX
MOVBX,0AHAGAIN:DIVBX
ADDDL,30H MOV[DI],DL JLERROR INCDI ANDAX,AX JZSTO MOVDL,0 LOOPAGAINSTO:MOVAX,4CH INT21HCODE ENDS ENDSTART[例4-21]兩個(gè)多字節(jié)二進(jìn)制數(shù)求和。DATASEGMENTBUFF1DB4FH,0B6H,7CH,34H,56H,1FHBUFF2DB13H,24H,57H,68H,F(xiàn)DH,9AHSUM DB6DUP(?)CONT DB3DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVSI,OFFSETBUFF1MOVDI,OFFSETBUFF2
MOVBX,OFFSETSUMMOVCL,CONT
ADDDL,30H MOVCH,0 CLCGOON:MOVAX,[SI] ADCAX,[DI] ADDSI,2 ADDDI,2 MOV[BX],AX ADDBX,2 LOOPGOON MOVAX,4CH INT21HCODE ENDS ENDSTART[例4-22]把一個(gè)二進(jìn)制數(shù)轉(zhuǎn)換為BCD碼。分析:將一個(gè)二進(jìn)制數(shù)轉(zhuǎn)換為BCD碼,可以把該二進(jìn)制數(shù)不斷地除以10,并記下余數(shù),直到商為0。余數(shù)序列就是所求的BCD碼,第一個(gè)余數(shù)為該BCD的最低位。轉(zhuǎn)換出的BCD碼是擴(kuò)展BCD碼,要得到壓縮的BCD碼,要取各數(shù)字的低四位,將其拼接在一起。DATASEGMENTMBINDW4FB6HMBCDDB5DUP(?)DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX
MOVAX,MBIN LEABX,MBCD XOR
DX,DX
MOVCX,0AHDIVCX
MOV[BX],DL MOVDL,0 DIVCX INCBX MOV[BX],DL MOVDL,0 DIVCX INCBX
MOV[BX],DL MOVDL,0 DIVCX INCBX MOV[BX],DL INCBX MOV[BX]
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司行政年度工作計(jì)劃2025(13篇)
- 2025新聞?dòng)浾邆€(gè)人工作總結(jié)(8篇)
- 2024年6月教師工作總結(jié)范文(7篇)
- 關(guān)于愛(ài)情演講2024(31篇)
- 2024-2025學(xué)年重慶市巴渝學(xué)校高一上學(xué)期期中考試歷史試卷
- 2024-2025學(xué)年內(nèi)蒙古自治區(qū)赤峰市高三上學(xué)期期中考試歷史試卷
- 2025年合伙企業(yè)員工餐飲合同
- 2025年環(huán)氧大豆油項(xiàng)目規(guī)劃申請(qǐng)報(bào)告
- 2025年制造業(yè)薪資談判集體協(xié)商協(xié)議指導(dǎo)范本
- 2025年共有債權(quán)缺失的離婚協(xié)議書(shū)規(guī)范文本
- 保護(hù)和傳承中國(guó)傳統(tǒng)文化遺產(chǎn)閱讀題答案
- 【長(zhǎng)安的荔枝中李善德的人物形象分析7800字(論文)】
- 勞動(dòng)合同范本1997
- 廣東省2024年普通高中學(xué)業(yè)水平合格性考試語(yǔ)文仿真模擬卷01(原卷版)
- 2024CSCO食管癌診療指南解讀
- QB/T 6019-2023 制漿造紙專業(yè)設(shè)備安裝工程施工質(zhì)量驗(yàn)收規(guī)范 (正式版)
- 2024年山東省安全生產(chǎn)普法知識(shí)競(jìng)賽考試題庫(kù)(含答案)
- 2024年廣西南寧市初中畢業(yè)班適應(yīng)性測(cè)試數(shù)學(xué)試卷
- 建筑入侵報(bào)警系統(tǒng)-入侵報(bào)警系統(tǒng)概述
- (正式版)JBT 10437-2024 電線電纜用可交聯(lián)聚乙烯絕緣料
- 【S城投公司償債能力存在的問(wèn)題及優(yōu)化建議探析8000字(論文)】
評(píng)論
0/150
提交評(píng)論