




已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第5章 結(jié)構(gòu)化程序設(shè)計(jì),5.1 子程序的概念 5.2 子程序的定義、調(diào)用和返回 * 5.3 子程序的現(xiàn)場保護(hù)與參數(shù)傳遞* 5.4 子程序設(shè)計(jì) * 5.5 子程序的嵌套與遞歸調(diào)用 5.6 宏匯編程序設(shè)計(jì),教學(xué)基本內(nèi)容,5.1 子程序的概念,1、子程序:在程序設(shè)計(jì)中,我們會(huì)發(fā)現(xiàn)一些多次無規(guī)律重復(fù)的程序段或語句序列。解決此類問題一個(gè)行之有效的方法就是將它們設(shè)計(jì)成可供反復(fù)調(diào)用的獨(dú)立的子程序結(jié)構(gòu),以便在需要時(shí)調(diào)用。在匯編語言中,子程序又稱過程。 過程(子程序):是指功能相對獨(dú)立的一段程序。 主程序和子程序間的關(guān)系:調(diào)用子程序的程序稱為主調(diào)程序或主程序,被調(diào)用的程序稱為子程序。,、程序中使用子程序的好處 子程序作為一個(gè)功能性模塊,供一個(gè)程序甚至多個(gè)程序使用: 可以簡化源程序結(jié)構(gòu); 提高程序的可讀性與可維護(hù)性; 有利于代碼復(fù)用; 提高程序的設(shè)計(jì)效率。,1、子程序的定義:由子程序定義偽指令PROC和ENDP來完成。其格式如下: 子程序名 PROC NEAR/FAR ;過程體 子程序名 ENDP 解釋:(1)子程序名是子程序入口地址的符號表示。同標(biāo)號一樣,具有三種屬性,即段屬性、偏移地址屬性以及類型屬性。 (2)PROC表示子程序定義開始,ENDP表示子程序定義結(jié)束。 (3) NEAR/FAR 2、子程序的調(diào)用和返回 過程定義后,可在主程序中用CALL指令,反復(fù)調(diào)用。 過程結(jié)束,由返回指令RET返回主程序。,演示,5.2 子程序的定義、調(diào)用和返回,主程序與子程序, CALL 過程名 ,主程序, RET,子程序,回到CALL指令后的指令處返回地址,5.2 子程序的定義、調(diào)用和返回(續(xù)),子程序調(diào)用指令(CALL),CALL指令分成4種類型 CALL子程序名 ;段內(nèi)直接調(diào)用 CALL r16/m16 ;段內(nèi)間接調(diào)用 CALL far ptr子程序 ;段間直接調(diào)用 CALL far ptr mem ;段間間接調(diào)用 CALL指令需要保存返回地址: 段內(nèi)調(diào)用偏移地址IP入棧 SPSP2,SS:SPIP 段間調(diào)用偏移地址IP和段地址CS入棧 SPSP2,SS:SPCS SPSP2,SS:SPIP,5.2 子程序的定義、調(diào)用和返回(續(xù)),子程序返回指令(RET),RET n 功能:彈出CALL指令壓入堆棧的返回地址 段內(nèi)返回偏移地址IP出棧 IPSS:SP, SPSP2 段間返回偏移地址IP和段地址CS出棧 IPSS:SP,SPSP2 CSSS:SP,SPSP2,注意:在使用CALL和RET時(shí),要保證過程的正確調(diào)用和返回 說明: RET可以帶參數(shù),子程序返回指令(RET),放在子程序的末尾,它使子程序在執(zhí)行完任務(wù)后將堆棧中的斷點(diǎn)彈出,控制程序返回主程序繼續(xù)執(zhí)行被打斷的程序。而返回地址(斷點(diǎn))就是子程序調(diào)用時(shí)入棧保護(hù)的斷點(diǎn)地址IP(段內(nèi)調(diào)用)或IP和CS值(段間調(diào)用)。通常,RET指令的類型是隱含的,它自動(dòng)與子程序定義時(shí)的類型相匹配,如果是段內(nèi),返回時(shí)將棧頂?shù)囊粋€(gè)字彈給IP寄存器;如為段間,返回時(shí)先從棧頂彈出一個(gè)字給IP,接著再彈出一個(gè)字給CS。但是,當(dāng)采用間接調(diào)用時(shí),必須注意:保證CALL指令的類型與過程中RET指令的類型匹配,以免發(fā)生錯(cuò)誤。例如CALL WORD PTRBX只能是段內(nèi)調(diào)用,而CALL DWORD PTRBX能夠調(diào)用一個(gè)遠(yuǎn)過程(段間調(diào)用),這樣RET才能夠識別返回類型。,例: NEAR 類型子程序 code SEGMENT ;code段 CALL subp ;調(diào)用指令 ,xor指令的地址入棧 xor ax,ax mov ah,4ch int 21h subp PROC NEAR ;子程序定義 RET ;返回 subp ENDP code ENDS END START,、子程序的書寫形式,1多處調(diào)用完成同一功能的子程序: code SEGMENT start: CALL sub CALL sub MOV AH, 4CH INT 21H sub PROC 、 、 RET sub ENDP code ENDS end start,2模塊化程序設(shè)計(jì):多個(gè)子程序的調(diào)用 code SEGMENT begin: CALL sub1 CALL sub2 CALL sub3 MOV AH, 4CH INT 21H sub1 PROC 、 RET sub1 ENDP sub2 PROC 、 RET sub2 ENDP sub3 PROC 、 RET sub3 ENDP code ENDS END begin,子程序結(jié)構(gòu)示例,子程序的位置通常在主程序的所有可執(zhí)行指令之前或之后,不能放在主程序的可執(zhí)行指令序列內(nèi)部,否則會(huì)破壞主程序結(jié)構(gòu),5.3子程序的現(xiàn)場保護(hù)與參數(shù)傳遞,PROG PROC PUSH AX PUSH BX PUSH CX ;保護(hù)現(xiàn)場 PUSH DX POP DX POP CX POP BX ;恢復(fù)現(xiàn)場 POP AX RET ;返回?cái)帱c(diǎn)處 PROG ENDP,例如:若子程序PROG中改變了寄存器AX,BX,CX,DX的值,則可采用此方法保護(hù)和恢復(fù)現(xiàn)場。,一、信息的保護(hù)與恢復(fù),二、主程序與過程的參數(shù)傳遞方式,主程序子程序的參數(shù)傳遞: 入口參數(shù) 也稱入口條件,是指主程序調(diào)用子程序前,為子程序內(nèi)部數(shù)據(jù)處理準(zhǔn)備所需的預(yù)置值; 出口參數(shù) 也稱出口條件,是子程序返回主程序后,把子程序處理的結(jié)果傳遞給主程序的數(shù)據(jù)。 參數(shù)傳遞的基本方法有: (1)寄存器法:通過CPU寄存器傳遞參數(shù)。傳遞數(shù)據(jù)方便、快捷,但所能傳遞的數(shù)據(jù)長度和個(gè)數(shù)都有限。 (2)變量法:通過內(nèi)存單元(組)傳遞參數(shù)。傳遞數(shù)據(jù)的長度和個(gè)數(shù)可不受限制,程序設(shè)計(jì)比較靈活。 (3)堆棧法:通過堆棧傳遞參數(shù)。用堆棧保存所要傳遞的數(shù)據(jù)或存儲地址,利用堆棧數(shù)據(jù)存取的特點(diǎn),是常用的參數(shù)傳遞方法。,例5-1:分別用三種參數(shù)傳遞方法編寫求12的和的程序。要求將結(jié)果送到內(nèi)存單元,并顯示。,DATA SEGMENT SUM DB 0 DATA ENDS STACK SEGMENT DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START: MOV AX,DATA MOV DS,AX MOV AL, 1 MOV BL, 2 CALL subprog mov ah,4cH int 21h CODE ENDS END START,Subprog PROC ADD AL, BL OR AL, 30H MOV SUM, AL Mov dl,al Mov ah,2 Int 21h RET sub ENDP,通過寄存器傳送,通過變量傳送,DATA SEGMENT SUM DB 0 D1 DB ? D2 DB ? DATA ENDS STACK SEGMENT DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START: MOV AX,DATA MOV DS,AX MOV D1, 1 MOV D2, 2 CALL SPROG MOV AH,4ch INT 21H CODE ENDS END START,SPROG PROC MOV AL, D1 ADD AL, D2 OR AL, 30H MOV SUM, AL MOV dl,al MOV ah,2 INT 21h RET SPROG ENDP END START,Spr PROC PUSH BP MOV BP, SP MOV AX, BP+6 MOV BX, BP+4 ADD AL, BL OR AL, 30H MOV DL,AL MOV AH,2 INT 21H MOV SUM, AL POP BP RET Spr ENDP,DATA SEGMENT SUM DB 0 DATA ENDS STACK SEGMENT DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START: MOV AX,DATA MOV DS,AX MOV AL, 1 MOV BL, 2 MOV AH,0 MOV BH,0 PUSH AX PUSH BX CALL SPR POP BX POP AX MOV AH,4CH INT 21H CODE ENDS END START,通過堆棧功能最強(qiáng)/最靈活/最復(fù)雜,例5-2:多字節(jié)數(shù)相加的程序(寄存器傳遞過程參數(shù)),data segment num1 db 01h,02h,03h,04h,05h,06h num2 db 0ffh,07h,0ffh,03h,01h,06h len equ $- num2 data ends stack segment stack dw 100 dup(?) stack ends code segment assume cs:code,ds:data,ss:stack,Start: mov ax,data mov ds,ax lea si,num1 lea di,num2 mov cx,len call mpadd mov ah,4ch int 21h,Mpadd proc push ax push cx push si push di jcxz exit clc Next: mov al,di adc si,al inc si inc di loop next Exit: pop di pop si pop cx pop ax ret Mpadd endp Code ends end start,例5-3多字?jǐn)?shù)相加的程序(堆棧傳遞子程序參數(shù)) RET指令中參數(shù)的應(yīng)用例子,data segment va11 dw 9898h,7676h,5454h,3232h ;被加數(shù) va12 dw 9898h,7676h,5454h,3232h ;加數(shù) buffer dw 4 dup(?) ;和 len equ $-buffer data ends stack segment stack dw 100 dup(?) stack ends code segment assume cs:code,ds:data,ss:stack,es:data,;主程序?yàn)檫^程 MAIN PROC FAR push ds xor ax,ax push ax mov ax,data mov ds,ax mov es,ax mov ax,len/2 push ax mov ax,offset buffer push ax mov ax,offset va11 push ax mov ax,offset va12 push ax,Call add64 mov ah,4ch int 21h main endp ;主程序結(jié)束,;子過程ADD64開始 add64 proc push bp ; mov bp,sp push bx push si push di push cx pushf ;保存現(xiàn)場 mov si,bp+4 ; mov bx,bp+6 mov di,bp+8 mov cx,bp+10 ;讀取參數(shù) cld,clc again: lodsw adc ax,bx stosw inc bx inc bx loop again popf ; pop cx pop di pop si pop bx pop bp ;恢復(fù)現(xiàn)場 ret 8 ;返回調(diào)用點(diǎn),并廢除4個(gè)參數(shù)共8字節(jié) add64 endp ;子過程結(jié)束 code ends end main,在子程序設(shè)計(jì)中 要明確地定義出這個(gè)子程序的入口參數(shù)和出口參數(shù),使調(diào)用者能方便地使用子程序。 在子程序中要合理地保存主程序和子程序都用到的寄存器和存儲單元,以使主程序能正確地運(yùn)行。,子程序是提高程序設(shè)計(jì)效率的良好手段
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 預(yù)防感冒安全課件
- 儀器管理標(biāo)識培訓(xùn)
- 科室職業(yè)健康培訓(xùn)
- 音樂課件軟件小學(xué)生
- 水肌酸產(chǎn)品項(xiàng)目建設(shè)管理方案(參考模板)
- 電網(wǎng)側(cè)獨(dú)立儲能示范項(xiàng)目環(huán)境影響報(bào)告書(范文模板)
- 2025年脲醛塑料項(xiàng)目合作計(jì)劃書
- xx片區(qū)城鄉(xiāng)供水一體化項(xiàng)目風(fēng)險(xiǎn)管理方案(范文模板)
- 2025年真空電子器件及零件項(xiàng)目建議書
- 2025年抗?jié)儾∷庬?xiàng)目建議書
- 《食品生產(chǎn)經(jīng)營企業(yè)落實(shí)食品安全主體責(zé)任監(jiān)督管理規(guī)定》解讀與培訓(xùn)
- 2025年日歷表(A4版含農(nóng)歷可編輯)
- 高空作業(yè)車外墻施工方案
- 扶貧農(nóng)產(chǎn)品購銷合同協(xié)議(農(nóng)產(chǎn)品購銷合同模板)
- 汽車維修高級工考試試題及參考答案
- 檢驗(yàn)科安全管理制度匯總
- GB/T 5782-2016六角頭螺栓
- GB/T 23445-2009聚合物水泥防水涂料
- GB/T 13451.2-1992著色顏料相對著色力和白色顏料相對散射力的測定光度計(jì)法
- GB/T 11264-2012熱軋輕軌
- 山東省中小學(xué)校檔案管理暫行辦法
評論
0/150
提交評論