子程序的嵌套_第1頁(yè)
子程序的嵌套_第2頁(yè)
子程序的嵌套_第3頁(yè)
已閱讀5頁(yè),還剩2頁(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)介

1、本文格式為Word版,下載可任意編輯子程序的嵌套 一、子程序的嵌套 一個(gè)子程序作為調(diào)用程序去調(diào)用另一個(gè)子程序的狀況稱為子程序的嵌套。 嵌套深度:嵌套的層數(shù)稱為嵌套深度。不受限制。 嵌套子程序的設(shè)計(jì):沒(méi)有什么特別要求,除子程序的調(diào)用和返回應(yīng)正確使用CALL和RET指令外,要留意寄存器的愛(ài)護(hù)和恢復(fù)。如用堆棧傳送數(shù)據(jù)要避開因堆棧使用中的溢出問(wèn)題而造成子程序不能正確返回的錯(cuò)誤。有兩種可能發(fā)生堆棧溢出的狀況: 堆棧上溢:如堆棧已滿,但還想再存入信息,這種狀況稱為堆棧上溢。 堆棧下溢:如堆棧已空,但還想再取出信息,這種狀況稱為堆棧下溢。 遞歸子程序:子程序自己調(diào)用自己的狀況稱為遞歸調(diào)用,這種子程序稱為遞歸

2、子程序 二、嵌套深度 圖1表示了嵌套深度為2時(shí)的子程序嵌套狀況。 例1兩個(gè)6字節(jié)數(shù)相加。 分析:將一個(gè)字節(jié)相加的程序段設(shè)計(jì)為子程序。主程序分3次調(diào)用該子程序,但每次調(diào)用的參數(shù)不同。 程序如下: DATASEGMENT ADD1DBFEH,86H,7CH,35H,68H,77H ADD2DB45H,BCH,7DH,6AH,87H,90H SUMDB6DUP(0) COUNTDB6 DATAENDS STACKSEGMENT DB100DUP(?) STACKENDS CODESEGMENT ASSUMECS:CODE,DS:DATA,SS:STACK MADD:MOVAX,DATA MOVDS,

3、AX MOVAX,STACK MOVSS,AX MOVSI,OFFSETADD1 MOVDI,OFFSETADD2 MOVBX,OFFSETSUM MOVCX,COUNT;循環(huán)初值為6 CLC AGAIN:CALLSUBADD;調(diào)用子程序 LOOPAGAIN;循環(huán)調(diào)用6次 MOVAX,4C00H INT21H ;子程序入口參數(shù):SI,DI,BX出口參數(shù):SI,DI,BX SUBADDPROC;完成一個(gè)字節(jié)相加 PUSHAX;愛(ài)護(hù)AX的值 MOVAL,SI;SI是一個(gè)源操作數(shù)指針 ADCAL,DI;DI是另一個(gè)源操作數(shù)指針 MOVBX,AL;BX是結(jié)果操作數(shù)指針 INCSI INCDI INCB

4、X POPAX;恢復(fù)AX的值 RET SUBADDENDP CODEENDS ENDMADD 例2把內(nèi)存中的字變量NUMBER的值,轉(zhuǎn)換為4個(gè)ASCII碼表示的十六進(jìn)制數(shù)碼串,串的起始地址為STRING。 分析:把內(nèi)存中的字變量NUMBER的值,轉(zhuǎn)換為4個(gè)ASCII碼表示的十六進(jìn)制數(shù)碼串的工作設(shè)計(jì)成一個(gè)子程序,在這個(gè)子程序中再調(diào)用另一個(gè)子程序,由它完成從BCD碼到ASCII碼的轉(zhuǎn)換。 程序如下: DATASEGMENT NUMBERDW25AFH STRINGDB4DUP(?),0DH,0AH,$ DATAENDS CODESEGMENT ASSUMECS:CODE,DS:DATA BEGIN

5、:MOVAX,DATA MOVDS,AX MOVES,AX LEABX,STRING PUSHBX;將參數(shù)(結(jié)果地址指針)壓入堆棧 PUSHNUMBER;將源數(shù)據(jù)壓入堆棧 CALLBINHEX;調(diào)用子程序 LEADI,STRING MOVAH,9 INT21H BINHEXPROC PUSHBP MOVBP,SP PUSHAX PUSHDI PUSHCX PUSHDX PUSHF;以上為愛(ài)護(hù)現(xiàn)場(chǎng) MOVAX,BP+4;取出NUMBER MOVDI,BP+6;取出STRING的偏移地址 ADDDI,LENGTHSTRING-1;使DI指向轉(zhuǎn)換數(shù)據(jù) MOVDX,AX;愛(ài)護(hù)原始數(shù)據(jù) MOVCX,4

6、AGAIN:ANDAX,0FH;取低4位 CALLHEXD;調(diào)子程序 STD STOSB;愛(ài)護(hù)轉(zhuǎn)換數(shù)據(jù) PUSHCX;愛(ài)護(hù)CX的值 MOVCL,4 SHRDX,CL MOVAX,DX POPCX LOOPAGAIN POPF POPDX POPCX POPDI POPAX POPBP RET4 BINHEXENDP HEXDPROC;將AL中的BCD碼轉(zhuǎn)換成ASCII碼 CMPAL,0AH JLADDZ ADDAL,a-0-0AH;小寫字母轉(zhuǎn)換成ASCII碼,若為大寫 ADDZ:ADDAL,0;字母,則再加ADDAL,7 RET HEXDENDP CODEENDS EDNBEGIN 例63數(shù)的

7、階乘1 根據(jù)階乘的定義n!=n*(n-1)! 這是一個(gè)遞歸定義式,可采納子程序的的遞歸調(diào)用形式。程序如下: DATASEGMENT NUMDB5 FNUMDW? DATAENDS STACKSEGMENT DB100DUP(?) STACKENDS CODESEGMENT ASSUMECS:CODE,DS:DATA,SS:STACK BEGIN:PUSHDS MOVAX,0 PUSHAX MOVCX,1 PUSHCX MOVAH,0 MOVAL,NUM CALLFACTOR MOVFNUM,AX POPCX MOVAX,4C00H INT21H FACTORPROC CMPAX,0 JNZIIA MOVDL,1 RET

溫馨提示

  • 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)論