子程序及模塊化程序設(shè)計_第1頁
子程序及模塊化程序設(shè)計_第2頁
子程序及模塊化程序設(shè)計_第3頁
子程序及模塊化程序設(shè)計_第4頁
子程序及模塊化程序設(shè)計_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

子程序及模塊化程序設(shè)計第1頁,共29頁,2023年,2月20日,星期六8.1子程序設(shè)計方法子程序:在許多應(yīng)用程序中,常常需要多次使用某功能的指令序列。這時,為了減少重復(fù)編寫程序,節(jié)省內(nèi)存空間,把這一功能的指令序列組成一個相對獨立的程序段。在程序運行時,如果需要使用這個給定的功能,就轉(zhuǎn)移到這個獨立的程序段,待這個獨立的程序段指令序列執(zhí)行完后,又返回到原來位置繼續(xù)運行程序。我們把這個相對獨立的程序段就叫子程序或過程。第2頁,共29頁,2023年,2月20日,星期六

調(diào)用程序:編制程序時,按需要轉(zhuǎn)向子程序,稱為子程序調(diào)用,或稱為過程調(diào)用。調(diào)用子程序的程序稱為調(diào)用程序或主程序。主、子程序是相對而言的。但子程序一定是受調(diào)用程序或主程序調(diào)用的。第3頁,共29頁,2023年,2月20日,星期六8.1.1子程序定義格式:過程名PROC[NEAR/FAR]

過程名ENDP其中PROC表示過程定義開始,

ENDP表示過程定義結(jié)束。一般過程名同標(biāo)號一樣,具有三種屬性,即段屬性、偏移地址屬性以及類型屬性。而類型屬性可指定為NEAR或FAR兩種類型。具有NEAR屬性的子程序與調(diào)用程序應(yīng)在同一個邏輯段中,而具有FAR屬性的子程序和調(diào)用程序不在同一個邏輯段內(nèi)。若為NEAR類型屬性時可以省略“NEAR”。第4頁,共29頁,2023年,2月20日,星期六8.1.2子程序的調(diào)用與返回

1.段內(nèi)調(diào)用子程序調(diào)用可以在段內(nèi)調(diào)用,也可以在段間調(diào)用。如果是段內(nèi)調(diào)用,則在過程定義時,必須定義為NEAR類型。這時,過程定義可放在代碼段中,置于主程序體之前或之后。

第5頁,共29頁,2023年,2月20日,星期六2.段間調(diào)用子程序如果段間調(diào)用時,必須定義為FAR類型。段間調(diào)用通常用于不同模塊之間的調(diào)用。編寫不同模塊的段間調(diào)用程序,應(yīng)該注意以下幾個個問題:(1)主程序模塊和子程序模塊分別匯編,然后用連接程序?qū)⑺鼈冞B接在一起。(2)在主程序模塊中,主程序所調(diào)用的外部過程名必須用EXTRN偽指令說明。(3)在過程模塊中,提供給外段調(diào)用的過程名必須用PUBLIC偽指令說明。(4)模塊間其它公用符號名及外部符號名的定義不可缺少。

第6頁,共29頁,2023年,2月20日,星期六8.1.3現(xiàn)場保護(hù)與恢復(fù)要保護(hù)的寄存器:應(yīng)該是在子程序中將被使用,返回調(diào)用程序后仍然需要使用其原有內(nèi)容的那些寄存器。即保護(hù)調(diào)用程序和子程序兩者在使用上發(fā)生沖突的那些寄存器。但在編程時,一時很難弄清哪些是有沖突的寄存器,一種較為簡單的方法是把所有的寄存器均加以保護(hù)。第7頁,共29頁,2023年,2月20日,星期六8.1.4主程序與子程序的參數(shù)傳遞主程序在調(diào)用子程序前,必須把需要子程序處理的原始數(shù)據(jù)傳遞給子程序,即為子程序準(zhǔn)備入口參數(shù)。子程序根據(jù)入口參數(shù)進(jìn)行一系列處理之后得到處理結(jié)果,該結(jié)果必須送給調(diào)用它的主程序,即提供出口參數(shù)以便主程序使用。這種主程序為子程序準(zhǔn)備入口參數(shù),子程序為主程序提供出口參數(shù)的過程稱為參數(shù)傳遞。第8頁,共29頁,2023年,2月20日,星期六主程序與子程序之間傳遞參數(shù)的方式是事先約定好的。每一個子程序設(shè)計之前,必須確定其入口參數(shù)到哪里去取,處理后的結(jié)果送往何處。一旦子程序按此約定設(shè)計出來,無論在何處對它進(jìn)行調(diào)用都必須滿足子程序的要求,否則,子程序?qū)o法正常運行,或者得不到正確的結(jié)果。傳遞參數(shù)的多少反映程序模塊間的耦合程度。根據(jù)實際情況,子程序可以只有入口參數(shù)或只有出口參數(shù),也可以入口參數(shù)和出口參數(shù)同時存在。常用的參數(shù)傳遞方式有三種:寄存器傳遞、存儲單元傳遞和堆棧法傳遞。第9頁,共29頁,2023年,2月20日,星期六1.利用寄存器傳遞參數(shù)用寄存器傳遞參數(shù)就是將子程序的入口參數(shù)和出口參數(shù)都放在約定的寄存器中。此法的優(yōu)點是信息傳遞快,編程也較方便,并且節(jié)省內(nèi)存單元。但由于寄存器個數(shù)有限,而且在處理過程中要經(jīng)常使用寄存器,如果要傳遞的參數(shù)很多,將導(dǎo)致無空閑寄存器供編程用,所以此法只適用于要傳遞的參數(shù)較少的情況。

第10頁,共29頁,2023年,2月20日,星期六2.利用存儲器傳遞參數(shù)用存儲單元傳遞參數(shù)就是將入口參數(shù)和出口參數(shù)都放到事先約定好的存儲單元之中。此法的優(yōu)點是參數(shù)傳遞的數(shù)量不受限制,每個參數(shù)都有獨立的存儲單元,編寫程序時不易出錯。缺點是要占用一定數(shù)量的存儲單元。

第11頁,共29頁,2023年,2月20日,星期六3.利用堆棧傳遞參數(shù)該方法是利用堆棧作為主程序和子程序之間傳遞參數(shù)的工具。優(yōu)點是參數(shù)不占用寄存器,也無需另開辟存儲單元,將參數(shù)存放在公用的堆棧區(qū),處理完之后堆?;謴?fù)原狀,不影響其他程序段使用堆棧。缺點是由于參數(shù)和子程序的返回地址混雜在一起,訪問參數(shù)時必須準(zhǔn)確地計算它們在堆棧內(nèi)的位置。如果操作不慎,在執(zhí)行RET指令時,棧頂存放的可能不是返回地址,從而導(dǎo)致運行混亂。由此可見,使用該方法編制程序比較復(fù)雜。第12頁,共29頁,2023年,2月20日,星期六8.2子程序設(shè)計舉例見教材第13頁,共29頁,2023年,2月20日,星期六8.3子程序的嵌套與遞歸1.子程序的嵌套主程序可以調(diào)用子程序,子程序還可以再去調(diào)用另一個子程序,這種情況稱為子程序的嵌套。子程序嵌套的層數(shù)沒有限制,只要堆棧空間允許即可。

嵌套子程序的設(shè)計與調(diào)用方法與前面介紹的子程序設(shè)計與調(diào)用方法一致。第14頁,共29頁,2023年,2月20日,星期六要特別注意以下幾點:調(diào)用指令CALL與返回指令RET必須成對使用。用寄存器傳遞參數(shù)或作為工作單元時,要及時保存和恢復(fù)寄存器內(nèi)容。若程序中用到堆棧,要注意堆棧的正確操作方法。第15頁,共29頁,2023年,2月20日,星期六2.子程序的遞歸調(diào)用子程序的遞歸調(diào)用是指一個子程序直接或間接地調(diào)用自己。遞歸子程序一般對應(yīng)于數(shù)學(xué)上對函數(shù)的遞歸定義,它往往能設(shè)計出效率較高的程序,完成相當(dāng)復(fù)雜的計算,遞歸調(diào)用要注意必須有結(jié)束遞歸調(diào)用的判斷語句。這里以階層函數(shù)為例,說明遞歸子程序的設(shè)計方法。第16頁,共29頁,2023年,2月20日,星期六8.4模塊化程序設(shè)計

模塊化程序設(shè)計在編程中有重要的作用。當(dāng)多人要合作編寫一個較大的軟件時,要把軟件劃分為多個模塊,再定義各模塊之間的接口,然后各自完成自己的模塊,最后還要把各模塊鏈接在一起組成軟件。第17頁,共29頁,2023年,2月20日,星期六8.4.1基本思想和主要步驟 模塊化程序設(shè)計的本質(zhì)思想是自頂向下、逐步求精。在完成一個大的任務(wù)時,將大任務(wù)劃分為多個功能模塊,必要時還要將這些模塊劃分為更小的功能模塊。第18頁,共29頁,2023年,2月20日,星期六

模塊化程序設(shè)計的步驟: (1)根據(jù)整個程序應(yīng)達(dá)到的功能,將其劃分為不同層次的功能模塊,并畫出層次圖。 (2)確定每個功能模塊的任務(wù),確定如何在功能模塊中建立段,以及確定各個定位方式、組合方式和“類別”,以便與其他的段適當(dāng)組合。 (3)確定每個功能模塊與其他相關(guān)功能模塊之間如何通信。 (4)編制各個程序模塊,包括給出程序模塊的說明;將各個程序模塊分別做匯編,生成各自的模塊和可執(zhí)行模塊并調(diào)試。 (5)使用連接程序?qū)⒏鱾€目標(biāo)模塊連接起來形成一個可執(zhí)行模塊并做整體調(diào)試。

第19頁,共29頁,2023年,2月20日,星期六8.4.2模塊間通信的基本方法

在多個模塊間的協(xié)同工作中,一個模塊可能要引用另一模塊中定義的符號常量、變量、標(biāo)號及過程名等標(biāo)識符。在定義了可為其他模塊引用的標(biāo)識符的模塊中使用PUBLIC偽指令;在需引用其他模塊所定義的標(biāo)識符的模塊中使用EXTRN偽指令。第20頁,共29頁,2023年,2月20日,星期六1.PUBLIC偽指令

PUBLIC標(biāo)識符,...,標(biāo)識符 ;說明公共標(biāo)識符表示這些標(biāo)識符是本模塊定義、可被外部模塊引用的公共標(biāo)識符,可以是變量名、標(biāo)號、過程名以及由EQU(或=)定義的符號名。

第21頁,共29頁,2023年,2月20日,星期六2.EXTRN偽指令

EXTRN

標(biāo)識符:類型,……,標(biāo)識符:類型 ;說明外部標(biāo)識符表示這些標(biāo)識符是外部模塊定義、本模塊要引用的外部標(biāo)識符,主要類型包括:

NEAR和FAR(用于過程)。

BYTE、WORD、DWORD等(用于變量)。下面我們通過實例來說明模塊間通信的方式。第22頁,共29頁,2023年,2月20日,星期六8.4.3子程序庫建立和使用的方法庫文件對學(xué)過C/C++語言程序設(shè)計的讀者來說應(yīng)該是不會陌生的,該語言的程序設(shè)計環(huán)境提供了大量的庫文件,也就是說,提供了大量的標(biāo)準(zhǔn)函數(shù)或過程。第23頁,共29頁,2023年,2月20日,星期六假設(shè)現(xiàn)有目標(biāo)文件sub1.obj、sub2.obj和sub3.obj,要用它們建立庫文件mylib.lib??捎孟铝蟹椒▉斫⒃搸煳募悍椒?:所有目標(biāo)文件都準(zhǔn)備好了,可一次性把它們加入到庫文件中

…>lib

mylib+sub1+sub2+sub3

方法2:隨著目標(biāo)文件的逐個生成,而依次把它們加入到庫文件中

…>lib

mylib+sub1

…>lib

mylib+sub2

…>lib

mylib+sub3第24頁,共29頁,2023年,2月20日,星期六假如源文件sub3.asm已修改,并也生成了新的目標(biāo)文件sub3.obj,這時,就需要把庫文件mylib.lib中的sub3.obj替換成新的目標(biāo)文件。于是,可用下面命令來實現(xiàn)替換:

…>lib

mylib

-+sub3

當(dāng)提示輸入目標(biāo)庫文件名(Outputlibrary)時,可按“回車”用默認(rèn)的原庫文件名。如果想查看庫文件mylib.lib中各文件的大小和存放的先后次序,可用下列命令:

…>lib

mylib,list

;把庫文件mylib.lib中的文件結(jié)構(gòu)生成到文件list中

…>type

list第25頁,共29頁,2023年,2月20日,星期六8.4.4匯編語言與高級語言的接口

C/C++語言是一個被廣泛使用的程序設(shè)計語言,它不僅具有良好的高級語言特征,而且還具有一些低級語言的特點,如:寄存器變量、位操作等。所以,C語言的程序與匯編語言程序之間能很平滑地銜接。另外,目前主要的C語言程序開發(fā)環(huán)境,也都提供了很好的混合編程手段。第26頁,共29頁,2023年,2月20日,星期六在C語言中,嵌入?yún)R編語言的語法如下(*):asm<opcode><operands><;ornewline>注意:這里的分號';'不是匯編語言中起注釋作用的分號,而是作為語句的分隔符。第27頁,共29頁,2023年,2月20日,星期六若C語言源程序

溫馨提示

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

評論

0/150

提交評論