第六章子程序設(shè)計(jì)V2016_第1頁(yè)
第六章子程序設(shè)計(jì)V2016_第2頁(yè)
第六章子程序設(shè)計(jì)V2016_第3頁(yè)
第六章子程序設(shè)計(jì)V2016_第4頁(yè)
第六章子程序設(shè)計(jì)V2016_第5頁(yè)
已閱讀5頁(yè),還剩32頁(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、Wu Qiulan1第六章 子程序的設(shè)計(jì)6.2 子程序調(diào)用和返回指令6.3 子程序的結(jié)構(gòu)形式6.4 子程序的設(shè)計(jì)和調(diào)用6.5 子程序設(shè)計(jì)舉例6.1 子程序的概念與特性Wu Qiulan2第六章 子程序的設(shè)計(jì)本章重點(diǎn): 子程序的概念和特性 子程序的設(shè)計(jì)與調(diào)用 子程序的參數(shù)傳遞方法Wu Qiulan3第六章 子程序的設(shè)計(jì)DATA SEGMENT STR DB ASAAAASAAAAAA CNT EQU $-STR RESU DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX 引例:統(tǒng)計(jì)字符串中字符A

2、的個(gè)數(shù),存入RESU字節(jié)單元, 并以16進(jìn)制顯示。 MOV CX,CNT MOV BX,0 MOV DX,0COUNT:CMP STRBX,A JZ A_NO JMP NEXTA_NO: INC DLNEXT: INC BX LOOP COUNT MOV RESU,DL MOV CL,4 SHR DL,CL CMP DL,9 JBE NEXT1 ADD DL,7NEXT1:ADD DL,30H MOV AH,2 INT 21H ;顯示高位 MOV DL,RESU AND DL,0FH CMP DL,9 JBE NEXT2 ADD DL,7NEXT2:ADD DL,30H MOV AH,2 IN

3、T 21H ;顯示低位 MOV DL,H MOV AH,2 INT 21H ;顯示H MOV AH,4CH INT 21HCODE ENDS END STARTSHR執(zhí)行操作: 0 OPR CFDISP PROC CMP DL,9 JBE NEXT1 ADD DL,7NEXT1:ADD DL,30H MOV AH,2 INT 21H RETDISP ENDPCODE ENDS END START MOV CL,4 SHR DL,CL CALL DISP MOV DL,RESU AND DL,0FH CALL DISP MOV DL,H MOV AH,2 INT 21H MOV AH,4CH I

4、NT 21HWu Qiulan66.1 子程序的概念與特性 1、子程序:可多次調(diào)用,能完成特定功能的程序模塊。2、主程序:調(diào)用子程序的程序稱主程序。3、轉(zhuǎn)子:從主程序轉(zhuǎn)移到子程序的過(guò)程稱轉(zhuǎn)子。4、返主:子程序執(zhí)行完,返回到主程序的過(guò)程稱返主。 一、概念調(diào)用子程序調(diào)用子程序主程序子程序返回主程序和子程序的關(guān)系轉(zhuǎn)子返主轉(zhuǎn)子返主二、子程序的特性:一個(gè)子程序占一段存儲(chǔ)區(qū),可多次調(diào)用。:子程序可放在存儲(chǔ)器任意處。:子程序可調(diào)用其本身。:子程序可被中斷,在中斷處理中又可 被中斷服務(wù)程序調(diào)用。1、重復(fù)性3、可浮動(dòng)性2、通用性4、可遞歸性5、可重入性:功能通用。Wu Qiulan96.2 子程序調(diào)用和返回指令

5、一、段內(nèi)調(diào)用6.2.1 調(diào)用指令格式:CALL DST功能1、SP2SP,IP(SP)(斷點(diǎn)地址入棧)2、IP偏移量(子程序入口地址與CALL指令)IP注:子程序調(diào)用,隱含使用堆棧保存返回地址。SP SP IP*SSWu Qiulan10格式:CALL FAR PTR DST(DST子程序名)1、SP2SP,CS(SP) SP2SP,IP(SP)(斷點(diǎn)地址入棧)2、子程序入口地址的偏移量IP 子程序入口地址的段地址CS功能三、段間調(diào)用SP SP CSIP*SSSP CODE SEGMENT ASSUME CS:CODESTA : MOV DL, T CALL DISP MOV DL, A CA

6、LL DISP MOV AH, 4CH INT 21H例6.1:段內(nèi)直接調(diào)用,顯示字符TA。DISP PROC MOV AH, 2 INT 21H RETDISP ENDPCODE ENDS END STACODE1 SEGMENT ASSUME CS:CODE1START : MOV DL, T CALL FAR PTR DISP MOV DL, A CALL FAR PTR DISP MOV AH, 4CH INT 21HCODE1 ENDS例6.2:段間直接調(diào)用,顯示字符TA。CODE2 SEGMENT ASSUME CS:CODE2DISP PROC FAR MOV AH, 2 INT

7、 21H RETDISP ENDPCODE2 ENDS END STARTWu Qiulan13一、段內(nèi)返回格式:RET功能:(SP)IP,SP+2SP6.2.2 返回指令二、段內(nèi)帶立即數(shù)返回格式:RET n功能:(SP)IP,SP+2SP, SP+nSP格式:RET三、段間返回四、段間帶立即數(shù)返回格式:RET n功能(SP)IP,SP+2SP(SP)CS,SP+2SP, SP+nSP功能(SP)IP,SP+2SP(SP)CS,SP+2SP注:帶立即數(shù)返回指令中的n一般為偶數(shù),主要用來(lái)去掉 堆棧中的一些無(wú)用數(shù)據(jù)。Wu Qiulan156.3 子程序的結(jié)構(gòu)形式6.3.1 子程序的定義格式格式:子

8、程序名 PROC NEAR/FAR RET 子程序名 ENDP注:1、NEAR屬性:調(diào)用程序和子程序在同一代碼段中。 (段內(nèi)調(diào)用) 2、FAR屬性:調(diào)用程序和子程序在不同代碼段中。 (段間調(diào)用)CODE1 SEGMENT SUBR1 PROC FAR RETSUBR1 ENDP SUBR2 PROC NEAR RETSUBR2 ENDP CALL SUBR2 CALL SUBR1CODE1 ENDSCODE2 SEGMENT CALL FAR PTR SUBR1 CODE2 ENDS子程序SUBR1子程序SUBR2;段內(nèi)調(diào)用;段內(nèi)調(diào)用;段間調(diào)用Wu Qiulan176.3.2 現(xiàn)場(chǎng)保護(hù)和恢復(fù)現(xiàn)

9、場(chǎng)保護(hù):在子程序功能實(shí)現(xiàn)前,把將要用到的寄存器的 原有內(nèi)容保存起來(lái)?,F(xiàn)場(chǎng)恢復(fù):子程序功能實(shí)現(xiàn)后,將數(shù)據(jù)取出再送回原來(lái)的 寄存器中,保證子程序執(zhí)行前后這些寄存器的 內(nèi)容不被改變,從而不影響主程序?qū)@些寄存 器的使用。注:現(xiàn)場(chǎng)保護(hù)和恢復(fù)一般通過(guò)堆棧來(lái)完成,堅(jiān)持后進(jìn)先出的原則。PROG PROC PUSH AX PUSH BX PUSH CX;保護(hù)現(xiàn)場(chǎng) POPCX POPBX POPAX ;恢復(fù)現(xiàn)場(chǎng) RET ;返回?cái)帱c(diǎn)處PROG ENDP例:若子程序PROG中改變了寄存器AX,BX,CX的值,則可采用如下方法保護(hù)和恢復(fù)現(xiàn)場(chǎng)。Wu Qiulan196.4 子程序的設(shè)計(jì)和調(diào)用6.4.1 子程序的調(diào)用方法

10、說(shuō)明1、子程序名2、子程序功能3、占用寄存器4、入口參數(shù)5、出口參數(shù)6、子程序調(diào)用示例:調(diào)用時(shí)用。:選擇子程序時(shí)參考。:子程序?qū)拇嫫鞯氖褂们闆r。:子程序執(zhí)行時(shí)應(yīng)具備的條件。:子程序執(zhí)行后結(jié)果存放位置。:說(shuō)明調(diào)用格式。Wu Qiulan206.4.2 子程序設(shè)計(jì)例6.3 :編寫子程序?qū)蓚€(gè)多字節(jié)二進(jìn)制數(shù)相加。說(shuō)明:1、子程序名:BADD2、子程序功能:將兩個(gè)多字節(jié)二進(jìn)制數(shù)相加。3、寄存器占用:AL、CX、SI、DI、BX,不改變寄存器的內(nèi)容。4、入口參數(shù):SI、DI寄存器分別指向兩加數(shù)首地址, BX指向和的首地址,CX中存放多字節(jié)的長(zhǎng)度。5、出口參數(shù):BX指向和的首地址。程序清單:BADD P

11、ROC NEAR/FAR PUSH SI PUSH DI PUSH AX PUSH BX PUSH CX ;現(xiàn)場(chǎng)保護(hù) CLCNEXT1:MOV AL, SI ;取第一個(gè)加數(shù)中一個(gè)字節(jié) ADC AL, DI ;和第二個(gè)加數(shù)中對(duì)應(yīng)字節(jié)相加 MOV BX, AL ;存儲(chǔ)結(jié)果 INC SI INC DI INC BX ;修改數(shù)據(jù)指針 LOOP NEXT1 ;未加完循環(huán) ADC BYTE PTRBX, 0 POP CX POP BX POP AX POP DI POP SI ;現(xiàn)場(chǎng)恢復(fù) RETBADD ENDPWu Qiulan236.4.3 子程序調(diào)用例6.4 :已知在BUF1、BUF2所指向的存儲(chǔ)單

12、元中各存放4字節(jié)二進(jìn)制數(shù),編程將兩個(gè)4字節(jié)二進(jìn)制數(shù)相加,和存入由BUF3所指向的存儲(chǔ)單元。DATA SEGMENT BUF1 DB 34H, 18H, 61H, 01H BUF2 DB 12H, 14H, 72H, 11H CNT EQU $-BUF2 BUF3 DB CNT+1 DUP (?)DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART:MOV AX, DATA MOV DS, AXWu Qiulan246.4.4 主程序與子程序參數(shù)傳遞方式入口參數(shù):主程序傳遞給子程序的待處理的數(shù)據(jù)。出口參數(shù):子程序執(zhí)行完后,傳遞給主程序的結(jié)果。參數(shù)傳

13、遞方式通過(guò)寄存器傳遞參數(shù)通過(guò)堆棧傳遞參數(shù)通過(guò)存儲(chǔ)單元傳遞參數(shù)Wu Qiulan25一、通過(guò)寄存器傳遞參數(shù)例6.5 :編寫子程序?qū)崿F(xiàn)字節(jié)數(shù)據(jù)塊傳送。入口參數(shù):SI指向源塊首地址,DI指向目的塊首地址, CX指向數(shù)據(jù)塊長(zhǎng)度。出口參數(shù):SI指向源塊首地址,DI指向目的塊首地址。DATA SEGMENT BUF1 DB 34H, 18H, 61H, 01H CNT EQU $-BUF1 BUF2 DB CNT DUP (?)DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART:MOV AX, DATA MOV DS, AX MOV SI, OFFSET

14、BUF1 ;源串首地址 MOV DI, OFFSET BUF2 ;目的串首地址 MOV CX, CNT ;長(zhǎng)度 CALL MOVD ;調(diào)用子程序 MOV AH, 4CH INT 21H ;返回DOS設(shè)置入口參數(shù)MOVD PROC NEAR ;子程序定義開(kāi)始 PUSH AX PUSH SI PUSH DI ;現(xiàn)場(chǎng)保護(hù)LOP1: MOV AL, SI ;取源串中一數(shù)據(jù) MOV DI, AL ;存入目的串 INC SI ;修改源串指針 INC DI ;修改目的串指針 LOOP LOP1 ;沒(méi)傳完,繼續(xù) POP DI POP SI POP AX ;現(xiàn)場(chǎng)恢復(fù) RET ;返回MOVD ENDP ;子程序定

15、義結(jié)束CODE ENDS END STARTWu Qiulan28二、通過(guò)堆棧傳遞參數(shù)例6.6 :編寫子程序?qū)崿F(xiàn)字節(jié)數(shù)據(jù)塊傳送。入口參數(shù):源塊首地址,目的塊首地址,數(shù)據(jù)塊長(zhǎng)度,使用寄存器把三個(gè)參數(shù)壓棧。DATA SEGMENT BUF1 DB 34H,18H,61H,01H CNT EQU $-BUF1 BUF2 DB CNT DUP (?)DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART:MOV AX, DATA MOV DS, AX MOV AX, OFFSET BUF1 PUSH AX ;源串首地址入棧 MOV AX, OFFSET B

16、UF2 PUSH AX ;目的串首地址入棧 MOV AX, CNT PUSH AX ;長(zhǎng)度入棧 CALL MOVD ;調(diào)用子程序 MOV AH, 4CH INT 21H ;返回DOSMOVD PROC NEAR ;子程序定義開(kāi)始 POP BX ;彈出返回地址BX POP CX ;彈出長(zhǎng)度CX POP DI ;彈出目的串首地址DI POP SI ;彈出源串首地址SI PUSH BX ;返回地址入棧 設(shè)置入口參數(shù) LOP1: MOV AL, SI ;取源串中一數(shù)據(jù) MOV DI, AL ;存入目的串 INC SI ;修改源串指針 INC DI ;修改目的串指針 LOOP LOP1 ;沒(méi)傳完,繼續(xù)

17、RET ;返回MOVD ENDP ;子程序定義結(jié)束CODE ENDS END STARTWu Qiulan31三、通過(guò)存儲(chǔ)單元傳遞參數(shù)例6.7 :編寫子程序?qū)崿F(xiàn)字節(jié)數(shù)據(jù)塊傳送。入口參數(shù):源塊首地址,目的塊首地址,數(shù)據(jù)塊長(zhǎng)度,使用存儲(chǔ)器把三個(gè)參數(shù)傳遞給子程序。DATA SEGMENT BUF1 DB 34H,18H,61H,01H CNT EQU $-BUF1 BUF2 DB CNT DUP (?) BUF3 DW 3 DUP (?)DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART:MOV AX,DATA MOV DS,AXMOV BX,OFF

18、SET BUF1MOV BUF3, BX ;存源串首地址MOV BX,OFFSET BUF2MOV BUF32, BX ;存目的串首地址MOV CX, CNTMOV BUF34, CX ;存長(zhǎng)度CALL MOVD ;調(diào)用子程序MOV AH,4CHINT 21H ;返回DOS設(shè)置入口參數(shù) MOVD PROC NEAR ;子程序定義開(kāi)始 MOV SI, BUF3 ;取源串首地址SI MOV DI, BUF3+2 ;取目的串首地址DI MOV CX, BUF3 +4 ;取長(zhǎng)度CXLOP1: MOV AL, SI ;取源串中一數(shù)據(jù) MOV DI, AL ;存入目的串 INC SI ;修改源串指針 INC DI ;修改目的串指針 LOOP LOP1 ;沒(méi)傳完,繼續(xù) RET ;返回MOVD ENDP ;子程序定義結(jié)束CODE

溫馨提示

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