微機原理及應(yīng)用3-10_第1頁
微機原理及應(yīng)用3-10_第2頁
微機原理及應(yīng)用3-10_第3頁
微機原理及應(yīng)用3-10_第4頁
微機原理及應(yīng)用3-10_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

格式:子程序名

PROC

[類型]

(子程序內(nèi)容)RET

子程序名

ENDP

3.10子程序設(shè)計子程序——具有一定功能的獨立程序段。說明:子程序名屬性①段屬性——子程序所在的段地址;

②偏移屬性——子程序第一條指令的偏移地址;

類型屬性——NEAR/FAR型,NEAR可省略。主程序子程序返回地址(斷點地址)一.子程序調(diào)用與返回指令1.子程序調(diào)用指令CALL功能:①保護斷點(斷點地址壓棧保護); ②轉(zhuǎn)子程序(子程序入口地址→IP/CS,IP)。(1)段內(nèi)直接調(diào)用子程序和主程序在同一代碼段中。

格式:CALL子程序名

操作:(SP-1,SP-2)←IP,SP←SP-2; IP←子程序入口偏移地址(由子程序名決定)。調(diào)用范圍:64KB。SP→SP→IPHIPLSS:堆棧例:…

CALL

NAC …

NACPROC … RET NACENDP(2)段內(nèi)間接調(diào)用指令子程序和主程序在同一代碼段中。格式:CALLOPR;OPR≡{R,M(字)}或CALLWORDPTROPR操作:SP←SP-2;[SP,SP+1]←IP;保護斷點

IP←[EA];子程序入口EA為依尋址方式所得的有效地址例3.32 CALLWORD PTR[BX] CALLBX CALLWORD PTR[BP][SI] CALLWORD PTRES:[SI]其中第二條指令,子程序入口偏移地址就是BX的內(nèi)容,其他三條指令的入口偏移地址都是存放在采用各種存儲器尋址方式的相鄰二個內(nèi)存單元中。由于是段內(nèi)調(diào)用,CS值保持不變。(3)段間直接調(diào)用

格式:CALLFARPTR子程序名;操作:(SP-1,SP-2)←CS,SP←SP-2;保護斷點 (SP-1,SP-2)←IP,SP←SP-2; CS←子程序入口段地址;轉(zhuǎn)子程序入口 IP←子程序入口偏移地址。

調(diào)用范圍:1MB。SP→SP→IPHIPLCSHCSLSP→SS(4)段間間接調(diào)用格式:CALLDWORDPTROPR;

OPR≡{M(雙字)}操作:(SP-1,SP-2)←CS,SP←SP-2;保護斷點(SP-1,SP-2)←IP,SP←SP-2;IP←(EA);轉(zhuǎn)子程序入口CS←(EA+2)。調(diào)用范圍:1MB。例:CALLDWORDPTR[BX];CALLDWORDPTRVALUE[BP][SI];2、返回指令

格式:RET;

功能:恢復(fù)斷點(棧頂斷點地址→IP/CS,IP)。

操作:①段內(nèi)調(diào)用的RET指令I(lǐng)P←(SP,SP+1),SP←SP+2。②段間調(diào)用的RET指令I(lǐng)P←(SP,SP+1),SP←SP+2;CS←(SP,SP+1),SP←SP+2。

說明:RET是段內(nèi)/段間返回,取決于CALL

的屬性(段內(nèi)/段間),系統(tǒng)自動調(diào)用。

二、保護現(xiàn)場和恢復(fù)現(xiàn)場 子程序中要用到某些寄存器,而這些寄存器中又存放有主程序的有用信息。子程序執(zhí)行前,將這些寄存器的內(nèi)容加以保護—保護現(xiàn)場;子程序執(zhí)行后,恢復(fù)這些寄存器的內(nèi)容—恢復(fù)現(xiàn)場。 通常在子程序一開始,利用PUSH指令將有關(guān)的內(nèi)容壓入堆棧保護;在子程序執(zhí)行返回指令前用POP指令從堆棧中取出數(shù)據(jù),彈回原來的寄存器。當(dāng)然,保護和恢復(fù)現(xiàn)場的工作也可在主程序中完成。

保護現(xiàn)場與恢復(fù)現(xiàn)場通常用成對的PUSH/POP指令完成。例3.35

SUB1PROCFAR PUSH AX; PUSH BX;保護現(xiàn)場 PUSHCX; PUSHDX;

…;(子程序?qū)嶋H內(nèi)容) POP DX; POP CX;恢復(fù)現(xiàn)場 POP BX;(后進先出) POP AX;

RET;SUB1 ENDP;三、

子程序的說明文件(1)子程序名:一般取具有象征意義的標識符。(2)子程序的功能:說明子程序完成的具體任務(wù)。(3)子程序所占用寄存器和工作單元的情況。

(4)子程序的入口參數(shù):說明子程序運行所需的參數(shù)以及存放位置。(5)子程序的出口參數(shù):說明子程序運行完畢的結(jié)果參數(shù)及存放的位置。(6)子程序示例:通過所舉示范例子,把具體的參數(shù)值代入,使之更具體了解子程序的功能。例3.34有一子程序說明文件如下①子程序名:DTOB②功能:完成將兩位十進制數(shù)(BCD碼)轉(zhuǎn)換成二進制數(shù)。③入口參數(shù):AL寄存器中存放要轉(zhuǎn)換的十進制數(shù)。④出口參數(shù):CL寄存器中存放轉(zhuǎn)換后的二進制數(shù)。⑤占用寄存器:BX⑥示例:輸入AL=01010110B(56)

輸出CL=00111000B1.寄存器傳送參數(shù)例3.36統(tǒng)計一個字中的“1”的個數(shù)。

算法1)用BCNT1子程序完成統(tǒng)計一字節(jié)中“1”的個數(shù)。2)用AL作入口參數(shù),存放被統(tǒng)計的字節(jié);3)用BX作出口參數(shù)存放統(tǒng)計結(jié)果。

子程序的說明文件為:;子程序名:BCNT1;功能:統(tǒng)計一個字節(jié)中的“1”的個數(shù);入口參數(shù):AL-需要統(tǒng)計1的個數(shù)的字節(jié)數(shù);出口參數(shù):統(tǒng)計結(jié)果存入BX四、主程序與子程序之間參數(shù)的傳遞及其舉例主程序AX←取數(shù)據(jù)CALLBCNT1PUSHBXAL←AHCALLBCNT1POPAXAX←AX+BX存結(jié)果END子程序BCNT1BX←0CX←08HROLAL,1CF=0BX←BX+1CX-1≠0RETYNN?;主程序(主、子程序同段)

ASTACKSEGMENTSTACK DW256DUP(?) TOP LABELWORD

ASTACKENDS

DATASEGMENT TW DW1234HTWS DW00H

DATAENDS

CODESEGMENTASSUMECODE:CS,DATA:DS,STACK:SSSTART:MOVAX,DATAMOVDS,AX MOVAX,ASTACK MOVSS,AX MOVSP,OFFSETTOP MOVAX,TW

CALLBCNT1;近程調(diào)用 PUSHBX MOV AL,AH

CALLBCNT1;近程調(diào)用 POP AX ADD AX,BX MOVTWS,AXMOVAH,4CH; INT21H;BCNT1PROC ;段內(nèi)子程序MOVBX,0; MOVCX,08H;LOOP1:ROLAL,1; JNCNEXT; INCBX;NEXT:LOOPLOOP1; RET;

BCNT1ENDP

CODE ENDS; ENDSTART;說明:

用BCNT1作標號可省去過程定義。;主程序(主、子程序不同段)STACKSEGMENTSTACK;

DW256DUP(?);TOP LABELWORD; STACK ENDS DATA SEGMENTTW DW1234H;TWS DW00H;存結(jié)果DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART: MOVAX,DATA; MOVDS,AX;

MOVAX,STACK; MOVSS,AX; MOVSP,OFFSETTOP; MOV AX,TW;

CALL

FARPTRBCNT1

;遠程調(diào)用

PUSH BX;第一次統(tǒng)計結(jié)果入棧 MOV AL,AH;

CALL

FARPTR

BCNT1

;遠程調(diào)用

POP AX;第一次統(tǒng)計結(jié)果送AX ADD AX,BX; MOV TWS,AX;存統(tǒng)計結(jié)果 MOV AH,4CH; INT 21H;CODE ENDS;LOOP1: ROL AL,1; JNC NEXT; INC BX;NEXT: LOOPLOOP1; RET;

BCNT1ENDPCODE1 ENDS; ENDSTART;源程序結(jié)束

CODE1SEGMENT;子程序ASSUMECS:CODE1;

BCNT1PROCFAR MOVBX,0; MOVCX,08H;2.用堆棧傳送參數(shù)利用堆棧不僅可用來保存返回地址,而且還可以用來存放主程序和子程序之間傳遞的參數(shù)數(shù)據(jù)。用堆棧傳遞參數(shù)的方法是在調(diào)用子程序之前,用PUSH指令將入口參數(shù)壓入堆棧,在子程序中通過出棧方式依次獲得這些參數(shù)。經(jīng)過子程序操作處理后再將出口參數(shù)壓入堆棧,返回主程序后再通過出棧獲得結(jié)果。使用這種方式傳遞參數(shù)時,特別要注意堆棧中斷點的保存與恢復(fù)。例3.37編一數(shù)據(jù)模塊傳送子程序,指定用堆棧來傳遞參數(shù)。;子程序名:MOVTOM;功能:完成數(shù)據(jù)塊的傳送;入口參數(shù):源數(shù)據(jù)塊首址,目的數(shù)據(jù)塊首址,數(shù)據(jù)塊長度均通過堆棧傳送;出口參數(shù):在內(nèi)存單元DEST開始存放傳送好的數(shù)據(jù)塊;主程序STACKSEGMENTSTACK DW256DUP(?)TOPLABELWORDSTACKENDSDATA SEGMENTSOUCEDB38H,7CH,0AFH,…COUNTEQU$-SOUCEDEST DBCOUNTDUP(?)DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATA MOVDS,AX MOV AX,STACK MOV SS,AX LEA SP,TOP MOV SI,OFFSETSOUCE MOV DI,OFFSETDEST MOV CX,COUNT

PUSH CX

;數(shù)據(jù)塊長度進棧

PUSH DI

;目的數(shù)據(jù)塊首地址棧

PUSH SI

;源數(shù)據(jù)塊首地址進棧

CALL MOVTOM…MOVTOM PROCNEAR

POPBX ;取出斷點

POPSI

;源數(shù)據(jù)塊首址出棧

POPDI

;目的數(shù)據(jù)塊首址出棧

POPCX

;數(shù)據(jù)塊長度出棧

PUSHBX ;保存斷點LOP1:MOVAL,[SI] MOV[DI],AL INCSI INCDI LOOP LOP1 RETMOVTOM ENDPCODEENDS3.用存儲單元傳遞參數(shù)主程序在調(diào)用子程序前,將所有入口參數(shù)按約定的次序存入存儲區(qū)的某一區(qū)域內(nèi),進入子程序后按約定從該存儲區(qū)中取出輸入?yún)?shù)進行處理,所得出口參數(shù)也按約定的次序存入指定存儲區(qū),返回主程序后就可取得結(jié)果。

例3.38

把4個字節(jié)單元的非壓縮型BCD碼(高4位為0)壓縮為4位壓縮型BCD碼,存放到指定的BCD碼單元中。

該子程序的入口參數(shù)是存放4個字節(jié)的非壓縮型BCD碼的首址BUF。出口參數(shù),即壓縮合并后的4位BCD碼,存放在字單元BCDE中,都是通過存儲單元來傳遞參數(shù)的。;子程序名:MERGE;功能:將4位非壓縮型BCD碼壓縮成4位壓縮型BCD碼;入口參數(shù):4位非壓縮型BCD碼存放在BUF開始的單元中;出口參數(shù):壓縮后的4位BCD碼存放在BCDE字單元中MERGEPROCNEAR

PUSHAX ;保護現(xiàn)場 PUSHBX PUSHCX;PUSHCL? PUSHSI MOVSI,OFFSETBUF;取首址 MOVAL,[SI] ;取一位BCD碼 MOVBL,[SI+1] ;再取一位BCD碼MOVCL,4 SHLBL,CL ;左移4位 ADDAL,BL ;合并兩位BCD碼 MOVAH,[SI+2] ;取一位BCD碼 MOVBH,[SI+3] ;再取一位BCD碼 MOVCL,4 SHLBH,CL ;左移4位 ADDAH,BH ;合并兩位BCD碼 MOVBCDE,AX;四位壓縮BCD碼送BCDE單元

POPSI ;恢復(fù)現(xiàn)場(能不能在主程序中pop) POPCX POPBX POPAX RETMERGEENDP4、子程序綜合舉例例3.39

編寫將n個8位無符號二進制數(shù)排成遞增序列的子程序SORT。將例3.28改寫成子程序,以供調(diào)用。入口參數(shù):①存放n個數(shù)的字節(jié)存儲區(qū)首址;②待排序的元素個數(shù)n。出口參數(shù):已排序的數(shù)仍存放在字節(jié)存儲區(qū)中。由于要傳遞的參數(shù)不多,故可采用寄存器方式傳遞參數(shù)。

子程序SORT的說明及程序如下:;子程序名:SORT;功能:將一組8位無符號二進制數(shù)按遞增順序排列。;入口參數(shù) BX——存放待排序數(shù)組存儲區(qū)首址 CX——存放待排序數(shù)組元素的個數(shù);出口參數(shù):已排成遞增序列的n個無符號數(shù)仍存放在由BX指示首址的字節(jié)存儲區(qū)中。五、子程序的嵌套與遞歸

1.子程序的嵌套子程序嵌套是指子程序本身再次調(diào)用別的子程序?!瑿allsub1……Callsub2…RET…Callsub3…RET………RET主程序子程序1子程序2子程序3ADR1ADR2ADR3注意:(1)嵌套過程中的逐層調(diào)用及按層返回是由堆棧保證的。即先調(diào)用的后返回,而后調(diào)用的先返回。ADR1ADR2ADR3CALLSUB1SPSPSPSPCALLSUB2CALLSUB3調(diào)用ADR1ADR2ADR3CALLSUB1SPSPSPSPCALLSUB2CALLSUB3返回(2)除了調(diào)用和返回外,在子程序中還可能會用到堆棧,必須指出的是,子程序中若需使用堆棧,則壓入操作與彈出操作必須成對。只有這樣,才能保證每個子程序返回前SP恰好指向返回地址。遞歸子程序?qū)?yīng)于數(shù)學(xué)上對函

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論