《匯編語言程序設(shè)計(jì)》第5章 基本匯編語言程序設(shè)計(jì)_第1頁
《匯編語言程序設(shè)計(jì)》第5章 基本匯編語言程序設(shè)計(jì)_第2頁
《匯編語言程序設(shè)計(jì)》第5章 基本匯編語言程序設(shè)計(jì)_第3頁
《匯編語言程序設(shè)計(jì)》第5章 基本匯編語言程序設(shè)計(jì)_第4頁
《匯編語言程序設(shè)計(jì)》第5章 基本匯編語言程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩68頁未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡(jiǎn)介

第五章基本匯編語言程序設(shè)計(jì)第5章基本匯編語言程序設(shè)計(jì)5.1匯編語言程序的設(shè)計(jì)步驟5.2順序結(jié)構(gòu)的程序設(shè)計(jì)5.3分支結(jié)構(gòu)的程序設(shè)計(jì)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)5.5子程序設(shè)計(jì)第5章基本匯編語言程序設(shè)計(jì)5.1匯編語言程序的設(shè)計(jì)步驟5.2順序結(jié)構(gòu)的程序設(shè)計(jì)5.3分支結(jié)構(gòu)的程序設(shè)計(jì)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)5.5子程序設(shè)計(jì)5.1匯編語言程序的設(shè)計(jì)步驟匯編語言程序設(shè)計(jì)的基本步驟程序的基本結(jié)構(gòu)5.1匯編語言程序的設(shè)計(jì)步驟一個(gè)良好的程序應(yīng)該滿足以下要求:(1)程序要結(jié)構(gòu)化,簡(jiǎn)明、可讀性好,便于調(diào)試。(2)執(zhí)行速度快,程序代碼效率高。(3)占用存儲(chǔ)空間少。匯編語言程序設(shè)計(jì)的基本步驟5.1匯編語言程序的設(shè)計(jì)步驟匯編語言程序設(shè)計(jì)的基本步驟:1.分析題意,確定數(shù)據(jù)結(jié)構(gòu)和算法2.根據(jù)算法繪制程序流程圖3.根據(jù)流程圖編寫程序4.調(diào)試程序匯編語言程序設(shè)計(jì)的基本步驟5.1匯編語言程序的設(shè)計(jì)步驟例5.1在100個(gè)字的無符號(hào)整數(shù)字中找出最大數(shù)。匯編語言程序設(shè)計(jì)的基本步驟5.1匯編語言程序的設(shè)計(jì)步驟1.分析題意,確定數(shù)據(jù)結(jié)構(gòu)和算法(1)初始化,建立一個(gè)數(shù)據(jù)指針指向數(shù)據(jù)區(qū)的首地址;(2)將第一個(gè)數(shù)存入寄存器(如AX)中;(3)調(diào)整數(shù)據(jù)指針,使其指向下一個(gè)數(shù);(4)將數(shù)據(jù)指針?biāo)傅臄?shù)與寄存器AX的內(nèi)容相比較,如果該數(shù)較大,則將其存入AX,否則丟掉;(5)重復(fù)執(zhí)行(3)、(4)兩步,直至將數(shù)組中的數(shù)據(jù)全部處理完。匯編語言程序設(shè)計(jì)的基本步驟5.1匯編語言程序的設(shè)計(jì)步驟2.根據(jù)算法繪制程序流程圖匯編語言程序設(shè)計(jì)的基本步驟5.1匯編語言程序的設(shè)計(jì)步驟3.根據(jù)流程圖編寫程序DATASEGMENTARRAYDW100DUP(?)DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX LEASI,ARRAY;將ARRAY的首地址送入數(shù)據(jù)指針SI MOVCX,99;設(shè)置循環(huán)次數(shù)

MOVAX,[SI];將第一個(gè)數(shù)存入AXNEXT: ADDSI,2;修改數(shù)據(jù)指針指向下一個(gè)數(shù)據(jù)

CMPAX,[SI];兩數(shù)比較

JAELOOP1;AX≥[SI],轉(zhuǎn)LOOP1 MOVAX,[SI];否則,將較大數(shù)存入AX LOOP1:DECCX JNZNEXT MOVAH,4CH INT21HCODEENDS ENDSTART匯編語言程序設(shè)計(jì)的基本步驟5.1匯編語言程序的設(shè)計(jì)步驟4.調(diào)試程序兩個(gè)階段:靜態(tài)檢查上機(jī)運(yùn)行調(diào)試程序的基本結(jié)構(gòu)5.1匯編語言程序的設(shè)計(jì)步驟1.順序結(jié)構(gòu)2.分支結(jié)構(gòu)3.循環(huán)結(jié)構(gòu)程序的基本結(jié)構(gòu)5.1匯編語言程序的設(shè)計(jì)步驟1.順序結(jié)構(gòu)程序的基本結(jié)構(gòu)5.1匯編語言程序的設(shè)計(jì)步驟2.分支結(jié)構(gòu)程序的基本結(jié)構(gòu)5.1匯編語言程序的設(shè)計(jì)步驟3.循環(huán)結(jié)構(gòu)第5章基本匯編語言程序設(shè)計(jì)5.1匯編語言程序的設(shè)計(jì)步驟5.2順序結(jié)構(gòu)的程序設(shè)計(jì)5.3分支結(jié)構(gòu)的程序設(shè)計(jì)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)5.5子程序設(shè)計(jì)5.2順序結(jié)構(gòu)的程序設(shè)計(jì)例5.2將一字?jǐn)?shù)據(jù)從數(shù)據(jù)段的某個(gè)單元傳送到另一個(gè)單元。分析:因?yàn)?086.8088指令系統(tǒng)不允許在存儲(chǔ)器與存儲(chǔ)器之間直接傳送數(shù)據(jù),所以必須借助CPU內(nèi)部的通用寄存器AX、BX、CX、DX等,先將存儲(chǔ)單元中的字?jǐn)?shù)據(jù)傳送到寄存器,再將其由寄存器傳送到存儲(chǔ)器的另一個(gè)字單元。5.2順序結(jié)構(gòu)的程序設(shè)計(jì)DATASEGMENTFIRSTDW1234HSECONDDW?DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVAX,F(xiàn)IRST MOVSECOND,AX MOVAH,4CH INT21HCODEENDS ENDSTART5.2順序結(jié)構(gòu)的程序設(shè)計(jì)例5.3將鍵盤輸入的小寫字母用大寫字母顯示出來。分析:本題目涉及三個(gè)知識(shí)點(diǎn):(1)輸入:在8086.8088指令系統(tǒng)中,字符的輸入是由DOS21H中斷的01H子功能來實(shí)現(xiàn)的,命令序列如下: MOVAH,01H INT21H

其作用是從鍵盤接收一個(gè)字符并將該字符的ASCII碼存入寄存器AL中。5.2順序結(jié)構(gòu)的程序設(shè)計(jì)(2)輸出:在8086.8088指令系統(tǒng)中,字符的輸出是由DOS21H中斷的02H子功能來實(shí)現(xiàn)的,命令序列如下: MOVAH,02H INT21H

其作用是將寄存器DL中所存放的字符進(jìn)行顯示輸出,故在執(zhí)行該命令序列之前,應(yīng)先將被輸出字符的ASCII碼存入DL中。(3)小寫字母向大寫字母的轉(zhuǎn)換:將小寫字母的ASCII碼值減去20H即可得到對(duì)應(yīng)大寫字母的ASCII碼值。5.2順序結(jié)構(gòu)的程序設(shè)計(jì)CODESEGMENT ASSUMECS:CODESTART:MOVAH,01H INT21H SUBAL,20H MOVDL,AL MOVAH,02H INT21H MOVAH,4CH INT21HCODEENDS ENDSTART第5章基本匯編語言程序設(shè)計(jì)5.1匯編語言程序的設(shè)計(jì)步驟5.2順序結(jié)構(gòu)的程序設(shè)計(jì)5.3分支結(jié)構(gòu)的程序設(shè)計(jì)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)5.5子程序設(shè)計(jì)5.3分支結(jié)構(gòu)的程序設(shè)計(jì)雙分支結(jié)構(gòu)的程序設(shè)計(jì)多分支程序設(shè)計(jì)雙分支結(jié)構(gòu)的程序設(shè)計(jì)5.3分支結(jié)構(gòu)的程序設(shè)計(jì)框架結(jié)構(gòu):

先行指令

JXX標(biāo)號(hào)1

指令序列1 JMP標(biāo)號(hào)2;轉(zhuǎn)到出口標(biāo)號(hào)1:指令序列2標(biāo)號(hào)2:…功能:JXX條件成立時(shí)轉(zhuǎn)到標(biāo)號(hào)1處執(zhí)行指令序列2,否則執(zhí)行指令序列1,然后跳轉(zhuǎn)到標(biāo)號(hào)2的程序出口處。雙分支結(jié)構(gòu)的程序設(shè)計(jì)5.3分支結(jié)構(gòu)的程序設(shè)計(jì)例5.4比較兩個(gè)帶符號(hào)數(shù)的大小,把大數(shù)存入MAX單元。分析:比較兩數(shù)可用CMP指令,而帶符號(hào)數(shù)的比較結(jié)果可由標(biāo)志位SF、OF來確定,選用的轉(zhuǎn)移指令應(yīng)為JG、JL等。DATASEGMENTADW34BDW65MAXDW?DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVAX,A MOVBX,B CMPAX,BX JLNEXT MOVMAX,AX JMPEXITNEXT:MOVMAX,BXEXIT:MOVAH,4CH INT21HCODEENDS ENDSTART5.3分支結(jié)構(gòu)的程序設(shè)計(jì)雙分支結(jié)構(gòu)的程序設(shè)計(jì)5.3分支結(jié)構(gòu)的程序設(shè)計(jì)例5.5比較兩個(gè)字符串STRING1和STRING2所含字符是否完全相同,若相同則顯示′MATCH′,若不相同則顯示′NOMATCH′。分析:比較兩個(gè)字符串可用指令REPECMPSB,比較后如果ZF=1,則兩個(gè)字符串完全相同,如果ZF=0,則兩個(gè)字符串不完全相同。字符串的輸出是由DOS21H中斷的09H子功能來實(shí)現(xiàn)的,該子功能要求將被輸出的字符串存入數(shù)據(jù)段中,存儲(chǔ)時(shí)以′$′結(jié)束,輸出時(shí)將其首地址存入DX寄存器。DATASEGMENTSTRING1DB′ABCDEFG′OUT1DB′MATCH$′OUT2DB′NOMATCH$′DATAENDSEXTRASEGMENTSTRING2DB′ABCDEFG′EXTRAENDSCODESEGMENT ASSUMECS:CODE,DS:DATA,ES:EXTRASTART:MOVAX,DATA MOVDS,AX MOVAX,EXTRA MOVES,AX MOVCX,7;字符串長度存入CX LEASI,STRING1;STRING1的首地址存入SI LEADI,ES:STRING2;STRING2的首地址存入DI CLD;置方向標(biāo)志DF=0 REPECMPSB;相同時(shí)重復(fù)比較

JNZOUTPUT2;不匹配,轉(zhuǎn)OUTPUT2 LEADX,OUT1;OUT1首地址存入DX MOVAH,09H;輸出OUT1 INT21H JMPEXIT;轉(zhuǎn)EXIT,結(jié)束OUTPUT2:LEADX,OUT2;OUT2首地址存入DX MOVAH,09H;輸出OUT2 INT21HEXIT:MOVAH,4CH INT21HCODEENDS ENDSTART5.3分支結(jié)構(gòu)的程序設(shè)計(jì)多分支序設(shè)計(jì)5.3分支結(jié)構(gòu)的程序設(shè)計(jì)例5.6比較兩個(gè)無符號(hào)整數(shù)A和B,若A>B則輸出“>”,若A<B則輸出“<”,若A=B則輸出“=”。分析:根據(jù)題意,本題應(yīng)有三個(gè)分支:A>B、A<B和A=B,按照邏輯分解的方法,我們可先將其歸并為兩個(gè)條件:A≥B和A<B,由此形成兩個(gè)分支,再將分支A≥B進(jìn)一步分解為A>B和A=B,各分支均可用條件轉(zhuǎn)移指令來實(shí)現(xiàn)。DATASEGMENTADW34BDW56DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVAX,A MOVBX,B CMPAX,BX JAENEXT1 MOVDL,′<′ JMPEXITNEXT1:JANEXT2 MOVDL,′=′ JMPEXITNEXT2:MOVDL,′>′EXIT:MOVAH,02H INT21H MOVAH,4CH INT21HCODEENDS ENDSTART5.3分支結(jié)構(gòu)的程序設(shè)計(jì)多分支序設(shè)計(jì)5.3分支結(jié)構(gòu)的程序設(shè)計(jì)例5.7已知兩個(gè)整數(shù)字節(jié)變量A和B,試編寫完成下列操作的程序:

(1)若兩個(gè)數(shù)中只有一個(gè)是奇數(shù),則將奇數(shù)存入ABUF單元,偶數(shù)存入BBUF單元中。(2)若兩個(gè)數(shù)均為奇數(shù),則兩數(shù)分別加1,并存回原變量處。(3)若兩個(gè)數(shù)均為偶數(shù),則兩變量不變。分析:在計(jì)算機(jī)中,數(shù)據(jù)的奇偶性取決于最低位的值,0為偶數(shù),1為奇數(shù)。因此可采用位測(cè)試的辦法來判斷。首先判斷A與B是否同種類型的數(shù),不是同種類型,再判斷B是否為偶數(shù),由B的類型可確定A的類型,再按要求(1)進(jìn)行處理;同樣,當(dāng)A、B是同種類型時(shí),也判斷B是否為偶數(shù),再按要求(2)或(3)進(jìn)行處理。判斷A、B兩數(shù)是否同類,可使用XOR指令將兩數(shù)異或,若結(jié)果的最低位為0,則兩數(shù)同類。多分支程序設(shè)計(jì)5.3分支結(jié)構(gòu)的程序設(shè)計(jì)5.3分支結(jié)構(gòu)的程序設(shè)計(jì)DATASEGMENTABUFDBABBUFDBBDATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVAL,ABUF MOVBL,BBUF XORAL,BL TESTAL,01H;測(cè)試是否同類 JZCLASS;是同類,轉(zhuǎn)CLASS TESTBL,01H;不是同類,測(cè)試B是否偶數(shù) JZEXIT;B是偶數(shù),滿足要求(1),轉(zhuǎn)EXIT XCHGBL,ABUF;B不是偶數(shù),按要求(1),交換兩數(shù) MOVBBUF,BL JMPEXIT;轉(zhuǎn)EXITCLASS:TESTBL,01H;同類時(shí),測(cè)試B是否偶數(shù) JZEXIT;B是偶數(shù),滿足要求(3),轉(zhuǎn)EXIT INCABUF;B不是偶數(shù),按要求(2),兩數(shù)同時(shí)加1 INCBBUFEXIT:MOVAH,4CH INT21HCODEENDS ENDSTART第5章基本匯編語言程序設(shè)計(jì)5.1匯編語言程序的設(shè)計(jì)步驟5.2順序結(jié)構(gòu)的程序設(shè)計(jì)5.3分支結(jié)構(gòu)的程序設(shè)計(jì)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)5.5子程序設(shè)計(jì)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)循環(huán)程序的結(jié)構(gòu)循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)方法循環(huán)程序的結(jié)構(gòu)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)循環(huán)程序都可由如下三部分組成:1.設(shè)置循環(huán)的初始狀態(tài)2.循環(huán)體3.循環(huán)控制部分循環(huán)程序的結(jié)構(gòu)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)1.設(shè)置循環(huán)的初始狀態(tài) 循環(huán)程序的初始狀態(tài),應(yīng)該在進(jìn)入循環(huán)體之前設(shè)置,其目的是保證循環(huán)體能夠正常運(yùn)行和結(jié)束,具體內(nèi)容包括設(shè)置循環(huán)次數(shù)的計(jì)數(shù)值或其他能使循環(huán)結(jié)束的條件的初值,以及為循環(huán)體正常工作而建立的初始狀態(tài)等。循環(huán)程序的結(jié)構(gòu)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)2.循環(huán)體 循環(huán)體是整個(gè)循環(huán)程序中需要重復(fù)執(zhí)行的程序段,即循環(huán)工作的主體。它由循環(huán)的工作部分和修改部分組成。循環(huán)的工作部分是為完成程序功能而設(shè)計(jì)的主要程序段,循環(huán)的修改部分則是為保證循環(huán)體在執(zhí)行有限次后能夠正常結(jié)束而設(shè)置的程序段,一般是對(duì)循環(huán)控制參數(shù)進(jìn)行修改,而該參數(shù)的變化通常是有規(guī)律的。循環(huán)程序的結(jié)構(gòu)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)3.循環(huán)控制部分 每個(gè)循環(huán)程序必須選擇一個(gè)循環(huán)控制條件來控制循環(huán)的運(yùn)行和結(jié)束,而合理地選擇這個(gè)控制條件就成為循環(huán)程序設(shè)計(jì)的關(guān)鍵問題。循環(huán)程序的結(jié)構(gòu)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)(1)循環(huán)次數(shù)已知,用循環(huán)次數(shù)作為循環(huán)的控制條件

MOVCX,N標(biāo)號(hào): … … … LOOP標(biāo)號(hào)循環(huán)程序的結(jié)構(gòu)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)(2)循環(huán)次數(shù)已知,但也有可能使用其他特征或條件來使循環(huán)提前結(jié)束

MOVCX,N標(biāo)號(hào): … … … LOOPZ.LOOPNZ標(biāo)號(hào)循環(huán)程序的結(jié)構(gòu)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)(3)循環(huán)次數(shù)是未知的,這時(shí)就要根據(jù)具體情況找出控制循環(huán)結(jié)束的條件直到型循環(huán):標(biāo)號(hào): … … …

影響條件標(biāo)志位的指令

JXX標(biāo)號(hào)循環(huán)程序的結(jié)構(gòu)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)當(dāng)型循環(huán):標(biāo)號(hào)2: …

影響條件標(biāo)志位的指令

JXX標(biāo)號(hào)1 … … … JMP標(biāo)號(hào)2

標(biāo)號(hào)1:…循環(huán)程序的結(jié)構(gòu)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)設(shè)計(jì)循環(huán)程序的步驟:

(1)分析問題,確定循環(huán)次數(shù)是已知的還是未知的,是否有提前結(jié)束循環(huán)的情況,從而決定選用哪一種循環(huán)最恰當(dāng);

(2)根據(jù)循環(huán)變化的規(guī)律,確定適合于循環(huán)設(shè)計(jì)的工作部分;

(3)考慮循環(huán)參數(shù)的修改部分,分析并確定參數(shù)的每次修改方法;

(4)設(shè)置循環(huán)控制部分及循環(huán)參數(shù)的置初值部分,可根據(jù)循環(huán)程序控制方法的不同,來設(shè)置循環(huán)參數(shù)的初值。循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)方法5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)兩種基本模式:單循環(huán)結(jié)構(gòu)多重循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)方法5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)1.單循環(huán)結(jié)構(gòu)2.多重循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)方法-單循環(huán)結(jié)構(gòu)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)例5.8編程計(jì)算10個(gè)整數(shù)之和(不考慮溢出),并將結(jié)果存入SUM中。分析:這10個(gè)整數(shù)可存放在數(shù)組ARRAY中,從而將題目轉(zhuǎn)化為對(duì)數(shù)組元素求和,根據(jù)數(shù)組元素下標(biāo)的變化規(guī)律來設(shè)計(jì)循環(huán),本題中循環(huán)次數(shù)固定為10次,因此可使用LOOP指令。5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)DATASEGMENTARRAYDW3,5,6,7,2,4,1,6,8,9SUMDW?DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVSI,0 ;設(shè)置數(shù)組中第一個(gè)元素的偏移量

MOVCX,10;設(shè)置循環(huán)次數(shù)

MOVAX,0;累加器清0NEXT:ADDAX,ARRAY[SI];累加

ADDSI,2;計(jì)算下一元素偏移量

LOOPNEXT;CX-1≠0時(shí)繼續(xù)循環(huán)

MOVSUM,AX;累加和存入SUM MOVAH,4CH INT21HCODEENDS ENDSTART循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)方法-單循環(huán)結(jié)構(gòu)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)例5.9在ADDR單元中存放著數(shù)Y的地址,試編制一程序把Y中1的個(gè)數(shù)存入COUNT單元中。分析:要測(cè)出Y中1的個(gè)數(shù)就應(yīng)逐位測(cè)試,一個(gè)比較簡(jiǎn)單的辦法是用移位的方法把各位依次移到最高位,然后根據(jù)最高有效位是否為1來計(jì)數(shù)。循環(huán)的結(jié)束可以用計(jì)數(shù)值16來控制,但考慮到數(shù)Y的末幾位全為0(如1011010000000000B)的特殊情況,循環(huán)應(yīng)能提前結(jié)束,且可能為零次循環(huán),為了提高程序的執(zhí)行效率,應(yīng)采用當(dāng)型結(jié)構(gòu),以測(cè)試數(shù)是否為0來作為結(jié)束條件。5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)DATASEGMENTADDRDWYYDW0102HCOUNTDW?DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVCX,0;計(jì)數(shù)器清0 MOVBX,ADDR;取Y的地址

MOVAX,[BX];將Y存入AXREPEAT:TESTAX,0FFFFH;測(cè)試Y JZEXIT;如果Y=0,轉(zhuǎn)EXIT結(jié)束

JNSSHIFT;如果SF=0,轉(zhuǎn)SHIFT INCCX;SF=1,計(jì)數(shù)器加1SHIFT:SHLAX,1;Y邏輯左移1位

JMPREPEAT;繼續(xù)循環(huán)EXIT:MOVCOUNT,CX;1的個(gè)數(shù)存入COUNT MOVAH,4CH INT21HCODEENDS ENDSTART循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)方法-單循環(huán)結(jié)構(gòu)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)例5.10有一串20個(gè)字符的字符串存儲(chǔ)于首地址為STRING的存儲(chǔ)區(qū)中,要求在字符串中查找空格(ASCII碼為20H),如果找到則輸出“FOUNDSPACE”,否則輸出“NOTFOUNDSPACE”。分析:本題可以使用查找字符串的指令REPNZSCASB來實(shí)現(xiàn),也可以用循環(huán)指令來實(shí)現(xiàn)。在此,我們采用循環(huán)指令的方法用CMP指令逐個(gè)字符進(jìn)行查找。根據(jù)題意,有兩種可能性:

(1)在查找中找到了空格符,此時(shí)ZF=1,應(yīng)該提前結(jié)束循環(huán);

(2)如一直查找到字符串結(jié)束還未找到空格符,則由于循環(huán)計(jì)數(shù)器CX變?yōu)?而結(jié)束循環(huán)。據(jù)此,本題應(yīng)考慮使用LOOPE或LOOPNE指令。5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)DATASEGMENTSTRINGDB″MYPERSONALCOMPUTER″OUT1DB″FOUNDSPACE$″OUT2DB″NOTFOUNDSPACE$″DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MOVCX,20;字符串長度存入CX MOVSI,-1 MOVAL,20H;空格符存入ALNEXT: INCSI;修改地址

CMPAL,STRING[SI];比較字符

LOOPNENEXT;不相等時(shí)重復(fù)

JNZNOTFOUND;ZF=0轉(zhuǎn)到NOT_FOUND MOVDX,OFFSETOUT1;否則,輸出OUT1字符串

MOVAH,09H INT21H JMPEXITNOTFOUND: MOVDX,OFFSETOUT2;輸出OUT2字符串

MOVAH,09H INT21HEXIT: MOVAH,4CH INT21HCODEENDS ENDSTART循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)方法-單循環(huán)結(jié)構(gòu)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)例5.11將正數(shù)N插入一個(gè)已排序的字?jǐn)?shù)組的正確位置。該數(shù)組的首地址和末地址分別為ARRAYHEAD和AYYAYEND,其中所有數(shù)均為正數(shù)且已按遞增的次序排列。分析:由于數(shù)組的首地址和末地址都是已知的,因此數(shù)組長度可以確定。但是這里只要求插入一個(gè)數(shù),并不一定要掃描整個(gè)數(shù)組,所以可以用找到應(yīng)插入數(shù)的位置作為循環(huán)的結(jié)束條件。此外,為空出要插入數(shù)的位置,其后的全部元素都應(yīng)后移一個(gè)字(即向地址增大的方向移動(dòng)一個(gè)字),所以算法上應(yīng)該從數(shù)組的尾部向頭部查找,可逐字取出數(shù)組中的一個(gè)數(shù)K與N作比較,如K>N,則把K后移一個(gè)字,然后繼續(xù)向前查找;如果K≤N,則把N插入在K之后就可以結(jié)束程序了。5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)DATASEGMENTARRAYHEADDW3,5,14,23,36,45,56,67,78,99ARRAYENDDW101NDW32DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MOVAX,N;N送入AX MOVARRAYHEAD-2,-1;數(shù)組前一字單元置-1 MOVSI,0LOCATE: CMPARRAYEND[SI],AX;K與N比較

JLEINSERT;K≤N,轉(zhuǎn)INSERT,插入N MOVBX,ARRAYEND[SI]

MOVARRAYEND[SI+2],BX ;K>N,K后移一個(gè)字

SUBSI,2;準(zhǔn)備取前一個(gè)元素

JMPLOCATE;繼續(xù)查找INSERT: MOVARRAYEND[SI+2],AX;N插在K之后

MOVAH,4CH INT21HCODEENDS ENDSTART循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)方法-單循環(huán)結(jié)構(gòu)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)例5.12設(shè)有數(shù)組X和Y。X數(shù)組中有X1,X2,…,X10;Y數(shù)組中有Y1,Y2,…,Y10。試編制程序計(jì)算: Z1=X1+Y1 Z2=X2+Y2 Z3=X3-Y3 Z4=X4-Y4 Z5=X5-Y5 Z6=X6+Y6 Z7=X7-Y7 Z8=X8-Y8 Z9=X9+Y9 Z10=X10+Y10結(jié)果存入Z數(shù)組。循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)方法-單循環(huán)結(jié)構(gòu)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)分析:對(duì)于這種問題,我們也可用循環(huán)程序結(jié)構(gòu)來完成。已知循環(huán)計(jì)數(shù)值為10,每次循環(huán)的操作數(shù)是可以順序取出的,但所做的操作卻有不同,這里有兩種操作:加法和減法。為了區(qū)別每次應(yīng)該做哪一種操作,可以設(shè)立標(biāo)志位,如標(biāo)志位為0做加法,為1做減法,這樣進(jìn)入循環(huán)后只要判別標(biāo)志位就可確定應(yīng)該做的操作了。5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)DATASEGMENTXDW1,2,9,8,7,3,6,5,4,1YDW2,1,2,3,4,2,3,2,1,5ZDW10DUP(?)LOGICRULEDW00DCH;邏輯尺DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATA START:MOVAX,DATA MOVDS,AX MOVCX,10;設(shè)置循環(huán)次數(shù)

MOVBX,0 MOVDX,LOGICRULEL: MOVAX,X[BX]

SHRDX,1;邏輯尺右移1位

JCSUBB;CF=1,轉(zhuǎn)SUBB ADDAX,Y[BX]

JMPRESULTSUBB: SUBAX,Y[BX]

RESULT:MOVZ[BX],AX;結(jié)果存入Z ADDBX,2 LOOPL MOVAH,4CH INT21HCODEENDS ENDSTART循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)方法-多重循環(huán)結(jié)構(gòu)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)多重循環(huán)指的是循環(huán)的嵌套,即循環(huán)體部分又包含了另一個(gè)循環(huán)。多重循環(huán)程序設(shè)計(jì)的基本方法和單循環(huán)的設(shè)計(jì)方法是一致的,應(yīng)分別考慮各層循環(huán)的控制條件及其程序?qū)崿F(xiàn),相互之間不能混淆。另外應(yīng)該注意在每次通過外層循環(huán)再次進(jìn)入內(nèi)層循環(huán)時(shí),內(nèi)層循環(huán)的初始條件必須重新設(shè)置。特別要注意的是,如果內(nèi)、外層循環(huán)都使用CX做循環(huán)計(jì)數(shù)器,在進(jìn)入內(nèi)層循環(huán)之前一定要先把外層循環(huán)的循環(huán)計(jì)數(shù)器的值保存下來,才能設(shè)置內(nèi)層循環(huán)的次數(shù)。循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)方法-多重循環(huán)結(jié)構(gòu)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)常見的雙重循環(huán)的程序結(jié)構(gòu):

外層循環(huán)初始化

MOVCX,外層循環(huán)次數(shù)MLOOP1: … ;外層循環(huán)體的指令

MOVDI,CX ;保存外層循環(huán)次數(shù)內(nèi)層循環(huán)初始化

MOVCX,內(nèi)層循環(huán)次數(shù)N ;設(shè)置內(nèi)層循環(huán)次數(shù)LOOP2: … ;內(nèi)層循環(huán)的循環(huán)體

LOOPLOOP2 ;繼續(xù)內(nèi)層循環(huán)

MOVCX,DI ;恢復(fù)外層循環(huán)的次數(shù)

… ;外層循環(huán)體的指令序列

LOOPLOOP1 ;繼續(xù)外層循環(huán)第5章基本匯編語言程序設(shè)計(jì)5.1匯編語言程序的設(shè)計(jì)步驟5.2順序結(jié)構(gòu)的程序設(shè)計(jì)5.3分支結(jié)構(gòu)的程序設(shè)計(jì)5.4循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)5.5子程序設(shè)計(jì)5.5子程序設(shè)計(jì)子程序的定義子程序的設(shè)計(jì)要求子程序的參數(shù)傳遞及應(yīng)用舉例子程序的定義5.5子程序設(shè)計(jì)

過程名PROC屬性

過程名ENDP 過程名為標(biāo)識(shí)符,其寫法與標(biāo)號(hào)的寫法相同,它代表子程序入口的符號(hào)地址;屬性是指子程序的類型屬性,它可以是NEAR或FAR。

屬性的確定原則如下:

如果子程序只允許被與它在同一代碼段中的程序調(diào)用,則屬性應(yīng)設(shè)置為NEAR,否則,應(yīng)設(shè)置為FAR。子程序的定義5.5子程序設(shè)計(jì)例5.13調(diào)用程序和子程序在同一代碼段中。

CODESEGMENT

;主程序

MAINPROCFAR …CALLSUB1 … RET MAINENDP

;子程序

SUB1PROCNEAR … RET SUB1ENDP CODEENDS由于調(diào)用程序MAIN和子程序SUB1在同一代碼段中,所以SUB1定義為NEAR屬性,這樣MAIN中對(duì)SUB1的調(diào)用和SUB1中的RET就都是NEAR屬性的。但是一般說來,主過程MAIN應(yīng)定義為FAR屬性,這是由于我們把程序的主過程看做是DOS調(diào)用的一個(gè)子程序,因而DOS對(duì)MAIN的調(diào)用以及MAIN中的RET就是FAR屬性的。子程序的定義5.5子程序設(shè)計(jì)例5.14調(diào)用程序和子程序不在同一個(gè)代碼段內(nèi)。

;代碼段1 CODE1SEGMENT … ;子程序

SUBTPROCFAR … RET SUBTENDP … CALLSUBT ;段內(nèi)調(diào)用

CODE1ENDS ;代碼段1結(jié)束

;代碼段2 CODE2SEGMENT … CALLSUBT ;段間調(diào)用

… CODE2ENDS ;代碼段

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論