微機(jī)原理第八章微型計(jì)算機(jī)的程序設(shè)計(jì)_第1頁(yè)
微機(jī)原理第八章微型計(jì)算機(jī)的程序設(shè)計(jì)_第2頁(yè)
微機(jī)原理第八章微型計(jì)算機(jī)的程序設(shè)計(jì)_第3頁(yè)
微機(jī)原理第八章微型計(jì)算機(jī)的程序設(shè)計(jì)_第4頁(yè)
微機(jī)原理第八章微型計(jì)算機(jī)的程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩85頁(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)介

(優(yōu)選)微機(jī)原理第八章微型計(jì)算機(jī)的程序設(shè)計(jì)目前一頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)重點(diǎn):程序設(shè)計(jì)方法順序結(jié)構(gòu)程序分支結(jié)構(gòu)程序循環(huán)結(jié)構(gòu)程序子程序結(jié)構(gòu)目前二頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)8.1程序設(shè)計(jì)步驟1.分析問(wèn)題2.建立數(shù)學(xué)模型3.確定算法4.繪制程序流程圖5.內(nèi)存分配6.編制程序7.程序調(diào)試目前三頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)datasegmenta1db'hellon!',0dh,0ah,'$'dataendsStack1segmentparastack……..Stack1endscodesegmentassumecs:code,ds:data,ss:stack1

start:movax,datamovds,axmovah,4chint21hcodeends

endstart看一個(gè)例子數(shù)據(jù)段堆棧段代碼段目前四頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)8-1順序程序設(shè)計(jì)補(bǔ)充:二進(jìn)制編碼的十進(jìn)制數(shù)二進(jìn)制編碼的十進(jìn)制數(shù)

就是BCD碼(BinaryCodedDecimal)。①壓縮BCD碼是用4位二進(jìn)制數(shù)表示一位十進(jìn)制數(shù)。一個(gè)字節(jié)表示兩位十進(jìn)制數(shù)。如:10010110B表示96D②非壓縮BCD碼是用一個(gè)字節(jié)表示一位十進(jìn)制數(shù)。高4位總是0。如:00001001B表示9D

兩種BCD碼的編碼對(duì)照表目前五頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)兩種BCD碼的編碼對(duì)照表目前六頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)1.BCD數(shù)加法調(diào)整指令DAA和AAA(P196)DAA-----兩個(gè)壓縮BCD數(shù)相加調(diào)整指令:(AL&0FH)>9或者AF=1,則AL加6;(AL&0F0H)>90H或CF=1,則AL加60H;如:MOVAX,3456HADDAL,AH;AL=8AHDAA;AL=90H目前七頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)AAA-----兩個(gè)非壓縮BCD數(shù)相加調(diào)整指令若(AL&0FH)>9或AF=1,則(AL+6)&0FH送AL,AH加1且CF置1;否則:(AL&0F0H)送AL,AH不變且CF保持0不變;如:MOVAX,0806HADDAL,AH;AL=0EH,AH=08H(沒(méi)變)MOVAH,0AAA;屬于第1種情況,故AL為(AL+6)&0F=14H&0FH=04H;AH=01H目前八頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)【例8.1】的程序段為:stacksegmentstack‘stackdw32dup(0)stackstackendsdatasegmentW1 DW8931HW2 DW5678HSUMDB 3DUP(0)data endscode segmentbegin procfar assumess:stack,cs:code,ds:data pushds subax,ax pushax

目前九頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)

movax,data movds,ax MOVAL,BYTEPTRW1;AL=31H(+78H) ADDAL,BYTEPTRW2;AL=A9H,CF=0,AF=0 DAA ;BCD數(shù)加法調(diào)整指令;AL=09H,CF=1 MOVSUM,AL MOVAL,BYTEPTRW1+1;AL=89H(+56H) ADCAL,BYTEPTRW2+1;AL=E0H,CF=0,AF=1 DAA ;AL=46H,CF=1 MOVSUM+1,AL MOVSUM+2,0;處理向萬(wàn)位的進(jìn)位 RCLSUM+2,1;也可用指令A(yù)DCSUM+2,0 retbeginendpcodeends endbegin目前十頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)例8.2非壓縮BCD數(shù)W1與W2(均為字變量)相加,將其和送到SUM字節(jié)變量中。datasegmentW1 DW0809H;即89DW2 DW0607H;即67DSUMDB 3DUP(0);一個(gè)字節(jié)放1位BCD碼,用來(lái)放加完后的值156data ends目前十一頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn) MOVAX,W1;AX=0809H,W2為0607H ADDAL,BYTEPTRW2;AL=10H,CF=0,AF=1 AAA ;屬于第一種情況,故;AL為(AL+06H)&0FH=10H+06H)&0FH;=16H&0FH=06H=AL;;AH加1且CF置CF=1,所以AH=08H+1=09H,則AX=0906H MOVSUM,AL;(SUM)=06H MOVAL,AH;AL=09H ADDAL,BYTEPTRW2+1

;AL=09H+06H=0FH,屬于第1種情況 MOVAH,0 AAA ;AL=05H,AH=01H;第一種情況處理:AL=(AL+06H)&0FH,因0FH+06H=15H,故AL=05H,AH=AH+1=0+1=01H,所以AX=0105H MOVWORDPTRSUM+1,AX;(SUM+1)=05,(SUM+2)=01

此句也可表達(dá)為MOV[SUM],AL;見(jiàn)P151目前十二頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)2.BCD數(shù)減法調(diào)整指令DAS和DAA(自看,P198)DAS-----兩個(gè)壓縮BCD數(shù)相減調(diào)整指令:(AL&0FH)>9,則AL減6;(AL&0F0H)>90H,則AL減60H;如:MOVAX,5634HSUBAL,AH;AL=DEH,有借位DAS;AL=78H,保持借位即134-56AAS-----兩個(gè)非壓縮BCD數(shù)相減調(diào)整指令目前十三頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)3.非壓縮BCD數(shù)乘除法調(diào)整指令A(yù)AM和AAD(P199,自看)目前十四頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)順序程序設(shè)計(jì)舉例:

例7.7鏡子程序,P183-184datasegmentOBUFDB‘>’0DH,0AH,‘$’IBUFDB0FFH,0,255DUP(0)data ends目前十五頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)MOVDX,OFFSETOBUF;顯示提示符“>”并回車換行MOVAH,O9INT21HMOVDX,OFFSETIBUF;輸入并顯示字符串MOVAH,10INT21HMOVBL,IBUF+1MOVBH,0MOVIBUF[BX+2],‘$’MOVDL,0AH;換行MOVAH,2INT21HMOVDX,OFFSETIBUF+2;再顯示輸入的字符串MOVAH,9INT21H目前十六頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)8.2分支程序設(shè)計(jì)特點(diǎn):利用改變標(biāo)志位的指令和轉(zhuǎn)移指令來(lái)實(shí)現(xiàn)。無(wú)條件轉(zhuǎn)移指令:JMP(見(jiàn)P207)條件轉(zhuǎn)移指令:Jcondshort-label(偏移地址送到IP)特點(diǎn):滿足條件,則實(shí)現(xiàn)段內(nèi)轉(zhuǎn)移;80386開(kāi)始才可以轉(zhuǎn)移到代碼段的任何位置。目前十七頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前十八頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前十九頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前二十頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前二十一頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前二十二頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前二十三頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前二十四頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前二十五頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)8.3循環(huán)程序設(shè)計(jì)目前二十六頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前二十七頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)8.3.2重復(fù)控制指令LOOPshort-labelLOOPZshort-label或LOOPEshort-labelLOOPNZshort-label或LOOPNEshort-labelJCXZshort-labelJECXZshort-label共同點(diǎn):均受CX或EXC的值控制,詳見(jiàn)P214-215目前二十八頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)8.3.3單重循環(huán)設(shè)計(jì)舉例例8.11計(jì)算Z=X+Y,其中X和Y是雙字變量分析:雙字變量是4個(gè)字節(jié),則和可能占5個(gè)字節(jié)目前二十九頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前三十頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前三十一頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前三十二頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前三十三頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前三十四頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前三十五頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前三十六頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前三十七頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)作業(yè)8.4編寫求兩個(gè)4位非壓縮BCD數(shù)之和,將和送顯示器顯示的程序。(P261)分析:兩加數(shù)各要4個(gè)字節(jié)單元,可以為DD類型;考慮到進(jìn)位,和要5個(gè)字節(jié)單元,另外,輸出到顯示器的結(jié)束符號(hào)’$’需要一個(gè)單元存放,故共需6個(gè)字節(jié)。因此,數(shù)據(jù)段定義為:datasegment

W1DD01020304H W2DD05060708H SUMDB5DUP(0) DB‘$’dataends目前三十八頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)代碼段中的核心語(yǔ)句MOVCX,4MOVSI,0MOVDI,4;要在[SUM+4]中放個(gè)位,[SUM+0]中放最高位的進(jìn)位。XORAX,AX;清CFA1:MOVAL,BYTEPTRW1[SI]; ADCAL,BYTEPTRW2[SI] AAA MOVSUM[DI],AL INCSI DECDI LOOPA1 MOVSUM[DI],0 RCLSUM[DI];以上是得到加的結(jié)果,放在SUM中。下面是輸出到顯示器的程序語(yǔ)句

MOVDX,OFFSETSUM MOVAH,09 INT21H

目前三十九頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)作業(yè)8.5編寫求兩個(gè)4位壓縮BCD數(shù)之和,將和送顯示器顯示的程序。(P261)分析:兩個(gè)加數(shù)各要2個(gè)字節(jié)單元,可以為DW類型;考慮到進(jìn)位,和要3個(gè)字節(jié)單元,另外,輸出到顯示器的結(jié)束符號(hào)’$’需要一個(gè)單元存放,故共需4個(gè)字節(jié)。因此,數(shù)據(jù)段定義為:datasegment

W1DW1234H W2DW5678H SUMDB3DUP(0) DB‘$’dataends目前四十頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)代碼段中的核心語(yǔ)句MOVCX,2MOVSI,0MOVDI,2;要在[SUM+2]中放個(gè)位,[SUM+0]中放最高位的進(jìn)位。XORAX,AX;清CFA1:MOVAL,BYTEPTRW1[SI]; ADCAL,BYTEPTRW2[SI] DAA MOVSUM[DI],AL INCSI DECDI LOOPA1 MOVSUM[DI],0 RCLSUM[DI];以上是得到加的結(jié)果,放在SUM中。下面是輸出到顯示器的程序語(yǔ)句

MOVDX,OFFSETSUM MOVAH,09 INT21H

目前四十一頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)作業(yè)8.17編寫求輸入算式’加數(shù)1+加數(shù)2’的和并送顯。(加數(shù)及其和均為4位(即指壓縮)BCD數(shù),P262)

分析:要求先有屏幕顯示輸出‘加數(shù)1+加數(shù)2:’,然后從鍵盤輸入兩個(gè)4個(gè)字節(jié)的BCD數(shù),加完后送顯。用到的變量:W1和W2因?yàn)閺逆I盤輸入,均不確定是幾位十進(jìn)制,故需確定其最大位數(shù)不超過(guò)要用W1目前四十二頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)例6.2將內(nèi)存(10050)單元的內(nèi)容拆成兩段,每段4位,并將它們分別存入內(nèi)存(10051)和(10052)單元。即(10050)單元中的低4位放入(10051)單元中的低4位,而(10050)單元中的高4位放入(10052)單元中的低4位。目前四十三頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)開(kāi)始初始化用間址方法取數(shù)到AL用AND指令將該數(shù)“與”O(jiān)FH取得低4位,存入內(nèi)存(10051)單元再取出原始數(shù)到AL邏輯右移得高4位,存入內(nèi)存(10052)單元暫停邏輯右移得高4位,存入內(nèi)存(10052)單元目前四十四頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)程序段如下:MOVAX,1000HMOVDS,AX;給段寄存器DS賦值MOVSI,50HMOVAL,[SI];把物理地址為10000H+0050H=10050H

;中的存儲(chǔ)內(nèi)容給ALANDAL,0FH;把AL中的前4位清0,取得低4位值MOV[SI+1],AL;把得到的低4位放到(10051H)單元MOVAL,[SI];再取出需拆字節(jié)放到AL中MOVCL,4SHRAL,CL;邏輯右移4次,前4位補(bǔ)0;MOV[SI+2],AL;放入(10052)單元ANDAL,F(xiàn)0HMOVE[SI+2],AL目前四十五頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)6-3、分枝結(jié)構(gòu)程序兩分支結(jié)構(gòu)目前四十六頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)多分支結(jié)構(gòu)

目前四十七頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)例6.3求AX累加器和BX寄存器中兩個(gè)無(wú)符號(hào)數(shù)之差的絕對(duì)值,結(jié)果放在內(nèi)存(2800)單元中。分析:不知AX與BX中數(shù)的大小,故需先判斷誰(shuí)大,然后用大的減小的才可求得絕對(duì)值,其流程圖如圖6-5目前四十八頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)開(kāi)始初始化,清CFAX-BXAXAX內(nèi)存(2800和(2801)單元暫停邏輯右移得高4位,存入內(nèi)存(10052)單元AX-BX≥0AX-BXAXBX內(nèi)存(2800和(2801)單元否是目前四十九頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)相應(yīng)程序段如下(p141)

CLCSUBAX,BXJCAA;進(jìn)位位為1,就轉(zhuǎn)移到AAMOVDI,2800HMOV[DI],AXHLTAA:SUBBX,AXMOVDI,2800HMOV[DI],BXHLT目前五十頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)例6.4從外設(shè)71號(hào)中取一個(gè)數(shù)M,判斷其值是否在10和20之間,即10≤M<20.

如果M≥20H,則送0FFH給外設(shè)73H;

如果M<10,則送00H給外設(shè)73H;

如果10≤M<20,則送88H給外設(shè)73H.

分析:根據(jù)題意,我們可以看出這是一個(gè)需要兩次判斷M大小的問(wèn)題。我們可以先判M是否大于10,再判M是否大于20。

(2)根據(jù)解決問(wèn)題的思路,我們先畫出程序流程圖,如下圖所示。從圖6中程序流程圖來(lái)看,兩個(gè)分支都要“回歸”原程序。

(3)編制的程序如下:目前五十一頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前五十二頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)相關(guān)程序段如下(p142)

START:INAL,71H;將71H端口的字節(jié)讀入AL

CLC;清除CF

CMPAL,10;AL-10,結(jié)果不返回

JCLP1;小于10轉(zhuǎn)LP1

CMPAL,20;AL-20,結(jié)果不返回

JCLP2;10AL<20轉(zhuǎn)LP2

MOVBL,0FFH;將0FFH送入BL寄存器

LP3:OUT73H,BL;將0FFH輸出到73H端口

HLT;暫停

LP1:MOVBL,00

JMPLP3

LP2:MOVBL,88H

JMPLP3

只能用累加器AX/AL作為執(zhí)行輸入/輸出過(guò)程的機(jī)構(gòu),故要改為AL。故OUT73H,BL替換為:MOVAL,BLOUT73H,AL目前五十三頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)賦初值條件循環(huán)體修改YN開(kāi)始6-4、循環(huán)程序設(shè)計(jì)1、先判斷條件,然后執(zhí)行循環(huán)體。目前五十四頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)賦初值循環(huán)體修改條件?NY開(kāi)始2、先執(zhí)行循環(huán)體,然后判斷條件。特點(diǎn):至少執(zhí)行一次循環(huán)體。目前五十五頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)例6.5求兩個(gè)多字節(jié)數(shù)之和,這兩個(gè)數(shù)在10050H地址開(kāi)始的內(nèi)存單元中,連續(xù)存放,低位在小地址一端,結(jié)果放在這兩個(gè)數(shù)之后。設(shè)這兩個(gè)多字節(jié)數(shù)均為8個(gè)字節(jié)。流程圖如下:目前五十六頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)初始化段地址DS:1000H第一個(gè)數(shù)指針SI=50H第二個(gè)數(shù)指針DI=58H結(jié)果指針BX=60H循環(huán)次數(shù)CX=4清除進(jìn)位位CF取一個(gè)字AXCX=0YN開(kāi)始和數(shù)=前一次+(指針)即AXAX+[DI]+CF

SISI+2修改指針DIDI+2計(jì)數(shù)器CXCX-1暫停結(jié)果和的指針起始值應(yīng)該為60H,請(qǐng)分析!目前五十七頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)相關(guān)程序段如下(p144)START:MOVAX,1000HMOVDS,AXMOVSI,50H;第一個(gè)指數(shù)指針SI=50HMOVDI,58H;第二個(gè)指數(shù)指針DI=58HMOVBX,60H;結(jié)果指針60HCLC;清進(jìn)位CF=0AA:MOVAX,[SI];取一個(gè)字到AXADCAX,[DI];AX=AX+[DI]+CFMOV[BX],AX;存一個(gè)字到BX;

PUSHF;保護(hù)進(jìn)位CF;

ADDSI,2;修改第一個(gè)數(shù)的指針SI=SI+2ADDDI,2;修改第二個(gè)數(shù)的指針DI=DI+2ADDBX,2;修改結(jié)果指針BX=BX+2POPF;恢復(fù)標(biāo)志寄存器

LOOPAA;CX=CX-1,若CX≠0,轉(zhuǎn)AAHLT;CX=0,暫停目前五十八頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)例2、編程序統(tǒng)計(jì)AX寄存器中1的個(gè)數(shù)。(采用AX=0?做為循環(huán)的條件)(本題即書上第六章習(xí)題第6.6題,見(jiàn)P152)其程序流程圖如下圖目前五十九頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前六十頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)程序如下:CODESEGMENTASSUMECS:CODESTART:MOVCX,0;存1的個(gè)數(shù)AGAIN:TESTAX,0FFFFHJZBSALAX,1;算術(shù)左移一位,此處用SHL(邏輯左移)也可JNCA;進(jìn)位不等于1,則轉(zhuǎn)A;INCCX;進(jìn)位為1,CX=CX+1;A:JMPAGAINB:MOVAH,4CH;相當(dāng)于B:HLTINT21HCODEENDS ENDSTART目前六十一頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)例6.6要求設(shè)計(jì)一個(gè)軟件延時(shí)程序,延時(shí)時(shí)間約1ms左右。

(1)分析題目:此題是想讓計(jì)算機(jī)做一些無(wú)用的操作,來(lái)拖延時(shí)間。我們可以從指令手冊(cè)中查得各條指令所需的時(shí)間節(jié)拍,但一般指令執(zhí)行時(shí)間只有幾個(gè)時(shí)鐘周期,亦即只有幾個(gè)微秒,為了能用較少的指令來(lái)編較長(zhǎng)時(shí)間的延時(shí),我們可以利用循環(huán)程序結(jié)構(gòu)。(2)程序流程圖如圖6-11所示。目前六十二頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前六十三頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)

在這個(gè)框圖中,初始化部分由于沒(méi)有數(shù)據(jù)操作問(wèn)題,因此也就不用設(shè)置間接地址指針。另外,延時(shí)的時(shí)間主要取決于循環(huán)體及循環(huán)次數(shù)。我們從手冊(cè)上可以查得PUSHF和POPF指令分別為10和8個(gè)時(shí)鐘節(jié)拍,LOOPBX指令為3.4個(gè)時(shí)鐘節(jié)拍在此循環(huán)體需要用10+8+3.4=21.4拍,而每個(gè)時(shí)鐘節(jié)拍是根據(jù)此系統(tǒng)的晶振頻率而定的。假設(shè)此系統(tǒng)用的是8Hz的晶振,則每個(gè)時(shí)鐘節(jié)拍需要0.125微秒因此我們可以根據(jù)下列公式算出循環(huán)次數(shù):目前六十四頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前六十五頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前六十六頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前六十七頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)6-5子程序子程序:相對(duì)主程序而言,是被主程序調(diào)用的程序.子程序調(diào)用示意圖:

目前六十八頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)子程序是程序設(shè)計(jì)中經(jīng)常使用的程序結(jié)構(gòu),通過(guò)把一些固定的、經(jīng)常使用的功能做成子程序的形式,可以使源程序及目標(biāo)程序大大縮短,提高程序設(shè)計(jì)的效率和可靠性。對(duì)于一個(gè)子程序,應(yīng)該注意它的入口參數(shù)和出口參數(shù)。入口參數(shù)是由主程序傳給子程序的參數(shù),而出口參數(shù)是子程序運(yùn)算完傳給主程序的結(jié)果。另外,子程序所使用的寄存器和存儲(chǔ)單元往往需要保護(hù),以免影響返回后主程序的運(yùn)行。主程序在調(diào)用子程序時(shí),一方面初始數(shù)據(jù)要傳給子程序,另一方面子程序運(yùn)行結(jié)果要傳給主程序,因此,主子程序之間的參數(shù)傳遞是非常重要的。目前六十九頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)參數(shù)傳遞一般有三種方法實(shí)現(xiàn)。

(1)利用寄存器。這是一種最常見(jiàn)方法,把所需傳遞的參數(shù)直接放在主程序的寄存器中傳遞給子程序。(2)利用存儲(chǔ)單元。這種參數(shù)傳遞方法,把所需傳遞的參數(shù)直接放在子程序調(diào)用指令代碼之后。(3)利用堆棧。這種方法將參數(shù)壓入堆棧,在子程序運(yùn)行時(shí)從堆棧中取參數(shù),其程序流程圖如下圖所示。目前七十頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)堆棧程序流程圖目前七十一頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)例6.7延時(shí)1秒的子程序段(見(jiàn)P148)DELAYS:PUSHFPUSHBXPUSHCXMOVBX,3E8HMOVCX,176HLP2:MOVCX,176HLP1:PUSHFPOPFLOOPLP1DECBXJNZLP2POPCXPOPBXPOPFRETSUB_DELAYSPROCNEARSUB_DELAYSENDP把寄存器FR、BX、CX的內(nèi)容壓進(jìn)堆棧,以保護(hù)CPU現(xiàn)場(chǎng)按“先入后出”原則把棧中內(nèi)容彈回到寄存器中去,以恢復(fù)CPU現(xiàn)場(chǎng)。目前七十二頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)例6.8

找一個(gè)數(shù)據(jù)塊中的最大數(shù),其中數(shù)據(jù)塊的長(zhǎng)度>1,并且放在內(nèi)存(2001)單元中,而數(shù)據(jù)塊本身是從(2002)單元開(kāi)始存放的,最后,把找出的最大值放到(2000)單元中。假設(shè)這段數(shù)據(jù)塊中的數(shù)都是無(wú)符號(hào)的8位數(shù)。(1)分析題目:此題必定是個(gè)循環(huán)程序,而且在處理部分應(yīng)包括判斷分支環(huán)節(jié)。(2)根據(jù)指令系統(tǒng),我們可以采用尋找最大值的計(jì)算方法。目前七十三頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)

首先,我們用00值放在AL累加器中作為最大值;然后,用數(shù)據(jù)塊的第一個(gè)數(shù)和AL中的數(shù)做比較,如果比00大,則用這個(gè)數(shù)取代00,放入AL中;接著取出第二個(gè)數(shù)與AL中的數(shù)做比較,如果比它大,取而代之,否則不取代,如此往復(fù),直至最后一個(gè)數(shù)。這樣,最后AL累加器中必定存放著最大的數(shù)。這就是尋找最大值的方法,而數(shù)據(jù)塊的總長(zhǎng)度(數(shù)的個(gè)數(shù))就是循環(huán)次數(shù)。(3)繪制出此計(jì)算過(guò)程的程序流程如圖6-l5所示。目前七十四頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前七十五頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前七十六頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)改為子程序時(shí)的

程序段MAX:PUSHFPUSHAXPUSHCXPUSHSISTART:MOVSI,2001HMOVCL,[SI]INCSIMOVAL,00MOVCH,00HLP:CLCCMPAL,[SI]JCBBJMPAABB:MOVAL,[SI]AA:INCSILOOPLPMOV[2000H],ALHLTPOPSIPOPCXPOPAXPOPFRETSUB1PROCNEAR/FARSUB1ENDP目前七十七頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)目前七十八頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)1、調(diào)用程序和子程序在同一代碼段子程序的類型應(yīng)為NEARcod1segment………

CALLSUB1…..

SUB1PROCNEAR…….RETSUB1ENDP

cod1ends紅色部分為子程序子程序調(diào)用方式介紹:目前七十九頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)2、調(diào)用程序和子程序不在同一代碼段子程序的類型應(yīng)為FAR。子程序SUB1的類型是FAR,可段間調(diào)用,也可段內(nèi)調(diào)用.CODE2SEGMENT……..

SUB1PROCNEAR

…….RETSUB1ENDP……..

CALLSUB1

…….CODE2ENDSCODE1SEGMENT………

CALLFARPTRSUB1……..

CODE1ENDS目前八十頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)

CODE2SEGMENT……..

SUB1PROCNEAR

…….SUB1ENDP……..

CALLSUB1;段內(nèi)調(diào)用

…….CODE2ENDS

子程序SUB1的類型是FAR,可段間調(diào)用,也可段內(nèi)調(diào)用.目前八十一頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)6.6查表程序要點(diǎn):1)確定表格的起始地址(或稱基地址)給BX2)確定要查找對(duì)象在表中的序號(hào),(或稱索引值)給AL。3)要用到換碼指令XLAT,將累加器中的值變?yōu)閮?nèi)存表格中的某一個(gè)值。注:表格的起始地址為內(nèi)存物理地址中的偏移地址目前八十二頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)例6.9:在5.2節(jié)中表5-2所列的十進(jìn)制的7段顯示碼實(shí)例,用程序來(lái)實(shí)現(xiàn),假設(shè)這段數(shù)據(jù)存放在2000H開(kāi)始的內(nèi)存中,取出“5”所對(duì)應(yīng)的7段碼。程序段為:START:MOVBX,2000HMOVAL,5XLATHLT目前八十三頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)例2編一子程序利用XLAT指令把十六進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼。假設(shè)ASCII碼存放在以DAT1為首地址的數(shù)據(jù)區(qū)中,對(duì)應(yīng)的十六進(jìn)制數(shù)放在以DAT2為首地址的數(shù)據(jù)區(qū)中,轉(zhuǎn)換結(jié)果送以DAT3為首地址的數(shù)據(jù)區(qū)中。分析:首地址即基址DAT1送給BX,ASCII碼表總共有7FH(即128)個(gè)字符。所以索引值要從0變到128(存放在DAT2為首地址的數(shù)據(jù)區(qū)中),需要用到循環(huán)將得到的值送到以DAT3為首地址的數(shù)據(jù)區(qū)中。查表核心程序語(yǔ)句為:

MOVBX,2000H(表的首地址)

MOVAL,5(表中對(duì)應(yīng)的偏移量,即索引值)

XLAT此程序段的結(jié)果是將查到的結(jié)果送到累加器AX中目前八十四頁(yè)\總數(shù)九十頁(yè)\編于五點(diǎn)SUB1PROCNEARSTART:LEASI,[DAT2];或?yàn)镸OVSI,DAT2LEADI,[DAT3];或?yàn)镸OVDI,DAT3MOVBX,DAT1MOVCX,16LP1:MOVAL,[SI];或?yàn)長(zhǎng)ODSB,即從RAMAX/ALXLATMOV[DI],AL;STOSB,即從AX/ALRAM

INCSI;若用了LODSB與STOSB,則不用此兩句,

INCDI

;因?yàn)榇僮鲿r(shí)SI和DI作自動(dòng)增量修改

溫馨提示

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

評(píng)論

0/150

提交評(píng)論