




已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第5章 結(jié)構(gòu)化程序設(shè)計,5.1 子程序的概念 5.2 子程序的定義、調(diào)用和返回 * 5.3 子程序的現(xiàn)場保護與參數(shù)傳遞* 5.4 子程序設(shè)計 * 5.5 子程序的嵌套與遞歸調(diào)用 5.6 宏匯編程序設(shè)計,教學基本內(nèi)容,5.1 子程序的概念,1、子程序:在程序設(shè)計中,我們會發(fā)現(xiàn)一些多次無規(guī)律重復(fù)的程序段或語句序列。解決此類問題一個行之有效的方法就是將它們設(shè)計成可供反復(fù)調(diào)用的獨立的子程序結(jié)構(gòu),以便在需要時調(diào)用。在匯編語言中,子程序又稱過程。 過程(子程序):是指功能相對獨立的一段程序。 主程序和子程序間的關(guān)系:調(diào)用子程序的程序稱為主調(diào)程序或主程序,被調(diào)用的程序稱為子程序。,、程序中使用子程序的好處 子程序作為一個功能性模塊,供一個程序甚至多個程序使用: 可以簡化源程序結(jié)構(gòu); 提高程序的可讀性與可維護性; 有利于代碼復(fù)用; 提高程序的設(shè)計效率。,1、子程序的定義:由子程序定義偽指令PROC和ENDP來完成。其格式如下: 子程序名 PROC NEAR/FAR ;過程體 子程序名 ENDP 解釋:(1)子程序名是子程序入口地址的符號表示。同標號一樣,具有三種屬性,即段屬性、偏移地址屬性以及類型屬性。 (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時,要保證過程的正確調(diào)用和返回 說明: RET可以帶參數(shù),子程序返回指令(RET),放在子程序的末尾,它使子程序在執(zhí)行完任務(wù)后將堆棧中的斷點彈出,控制程序返回主程序繼續(xù)執(zhí)行被打斷的程序。而返回地址(斷點)就是子程序調(diào)用時入棧保護的斷點地址IP(段內(nèi)調(diào)用)或IP和CS值(段間調(diào)用)。通常,RET指令的類型是隱含的,它自動與子程序定義時的類型相匹配,如果是段內(nèi),返回時將棧頂?shù)囊粋€字彈給IP寄存器;如為段間,返回時先從棧頂彈出一個字給IP,接著再彈出一個字給CS。但是,當采用間接調(diào)用時,必須注意:保證CALL指令的類型與過程中RET指令的類型匹配,以免發(fā)生錯誤。例如CALL WORD PTRBX只能是段內(nèi)調(diào)用,而CALL DWORD PTRBX能夠調(diào)用一個遠過程(段間調(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è)計:多個子程序的調(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)部,否則會破壞主程序結(jié)構(gòu),5.3子程序的現(xiàn)場保護與參數(shù)傳遞,PROG PROC PUSH AX PUSH BX PUSH CX ;保護現(xiàn)場 PUSH DX POP DX POP CX POP BX ;恢復(fù)現(xiàn)場 POP AX RET ;返回斷點處 PROG ENDP,例如:若子程序PROG中改變了寄存器AX,BX,CX,DX的值,則可采用此方法保護和恢復(fù)現(xiàn)場。,一、信息的保護與恢復(fù),二、主程序與過程的參數(shù)傳遞方式,主程序子程序的參數(shù)傳遞: 入口參數(shù) 也稱入口條件,是指主程序調(diào)用子程序前,為子程序內(nèi)部數(shù)據(jù)處理準備所需的預(yù)置值; 出口參數(shù) 也稱出口條件,是子程序返回主程序后,把子程序處理的結(jié)果傳遞給主程序的數(shù)據(jù)。 參數(shù)傳遞的基本方法有: (1)寄存器法:通過CPU寄存器傳遞參數(shù)。傳遞數(shù)據(jù)方便、快捷,但所能傳遞的數(shù)據(jù)長度和個數(shù)都有限。 (2)變量法:通過內(nèi)存單元(組)傳遞參數(shù)。傳遞數(shù)據(jù)的長度和個數(shù)可不受限制,程序設(shè)計比較靈活。 (3)堆棧法:通過堆棧傳遞參數(shù)。用堆棧保存所要傳遞的數(shù)據(jù)或存儲地址,利用堆棧數(shù)據(jù)存取的特點,是常用的參數(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,通過堆棧功能最強/最靈活/最復(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多字數(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,;主程序為過程 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)用點,并廢除4個參數(shù)共8字節(jié) add64 endp ;子過程結(jié)束 code ends end main,在子程序設(shè)計中 要明確地定義出這個子程序的入口參數(shù)和出口參數(shù),使調(diào)用者能方便地使用子程序。 在子程序中要合理地保存主程序和子程序都用到的寄存器和存儲單元,以使主程序能正確地運行。,子程序是提高程序設(shè)計效率的良好手段
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年薯類生產(chǎn)項目申請報告模板
- 2025建筑工程施工合同范本下載
- 中醫(yī)視角下的糖尿病解析與治療
- 2025中外技術(shù)合作合同書模板
- 團隊合同協(xié)議書怎么簽
- 2025YY年醫(yī)療機構(gòu)藥品供應(yīng)合同樣本
- 2025至2030年中國帶液晶顯示型密碼鍵盤行業(yè)投資前景及策略咨詢報告
- 兒科護理營養(yǎng)性缺鐵性貧血
- 2025至2030年中國加味牛肉伊面行業(yè)投資前景及策略咨詢報告
- 2025至2030年中國全紙多層密實紙箱行業(yè)投資前景及策略咨詢報告
- 2023家具采購合同范本專業(yè)版-1
- GB/T 29319-2012光伏發(fā)電系統(tǒng)接入配電網(wǎng)技術(shù)規(guī)定
- 職業(yè)史證明【模板】
- GB/T 11264-2012熱軋輕軌
- 國學導(dǎo)論·巴蜀文化課件
- 旅游出入境與交通管理法規(guī)制度課件
- 《事業(yè)單位人事管理條例》及其配套制度講義課件
- 《遺愛寺》-完整版課件
- 試卷交接簽字單
- 加油站相鄰企業(yè)安全應(yīng)急救援互助協(xié)議
- 傳媒公司合作合同
評論
0/150
提交評論