第07章-2 模塊化程序設(shè)計(jì)_第1頁
第07章-2 模塊化程序設(shè)計(jì)_第2頁
第07章-2 模塊化程序設(shè)計(jì)_第3頁
第07章-2 模塊化程序設(shè)計(jì)_第4頁
第07章-2 模塊化程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、匯編語言匯編語言程序設(shè)計(jì)程序設(shè)計(jì) 模塊化程序設(shè)計(jì)概述 段的定義 模塊間的通訊 模塊的連接 源程序綜合舉例 匯編語言匯編語言程序設(shè)計(jì)程序設(shè)計(jì)7.1.1 模塊化程序設(shè)計(jì)概念模塊化程序設(shè)計(jì)概念 在設(shè)計(jì)大型程序時(shí),常常要將整個(gè)問題分解為若干在設(shè)計(jì)大型程序時(shí),常常要將整個(gè)問題分解為若干個(gè)小問題,必要時(shí)還要將小問題再次分解為更小的若干個(gè)小問題,必要時(shí)還要將小問題再次分解為更小的若干問題,每個(gè)小問題編寫成獨(dú)立的源文件,最后將所有的問題,每個(gè)小問題編寫成獨(dú)立的源文件,最后將所有的源文件連接起來組合成一個(gè)大程序。也就是說,一個(gè)程源文件連接起來組合成一個(gè)大程序。也就是說,一個(gè)程序往往由多個(gè)源文件組成,那么構(gòu)成一個(gè)

2、程序的各個(gè)相序往往由多個(gè)源文件組成,那么構(gòu)成一個(gè)程序的各個(gè)相對(duì)獨(dú)立的源文件通常稱為模塊。這樣把一個(gè)程序分成多對(duì)獨(dú)立的源文件通常稱為模塊。這樣把一個(gè)程序分成多個(gè)功能相對(duì)獨(dú)立的程序模塊分別編制、調(diào)試后,再用連個(gè)功能相對(duì)獨(dú)立的程序模塊分別編制、調(diào)試后,再用連接程序把它們連接在一起生成一個(gè)完整的程序的設(shè)計(jì)的接程序把它們連接在一起生成一個(gè)完整的程序的設(shè)計(jì)的方法稱為模塊化程序設(shè)計(jì)。方法稱為模塊化程序設(shè)計(jì)。 7.1.2 模塊化程序設(shè)計(jì)的優(yōu)點(diǎn)模塊化程序設(shè)計(jì)的優(yōu)點(diǎn) 開發(fā)速度快開發(fā)速度快 可維護(hù)性與可讀性強(qiáng)可維護(hù)性與可讀性強(qiáng) 可移埴性強(qiáng)可移埴性強(qiáng)匯編語言匯編語言程序設(shè)計(jì)程序設(shè)計(jì)7.1.3 模塊劃分的原則和方法模塊

3、劃分的原則和方法 模塊的劃分應(yīng)該是靈活的,但不應(yīng)是程序的等分,模塊的劃分應(yīng)該是靈活的,但不應(yīng)是程序的等分,應(yīng)使各模塊具有相對(duì)的獨(dú)立性和完整性,可以單獨(dú)編程、應(yīng)使各模塊具有相對(duì)的獨(dú)立性和完整性,可以單獨(dú)編程、調(diào)試,但也要考慮各個(gè)模塊之間的聯(lián)系。模塊劃分是一調(diào)試,但也要考慮各個(gè)模塊之間的聯(lián)系。模塊劃分是一個(gè)自上而下的過程。主模塊是一個(gè)總控模塊,首先確定個(gè)自上而下的過程。主模塊是一個(gè)總控模塊,首先確定主要的模塊,也就是說,要把總?cè)蝿?wù)劃分成幾個(gè)主要的主要的模塊,也就是說,要把總?cè)蝿?wù)劃分成幾個(gè)主要的子任務(wù)。一般來說,可以分成輸入任務(wù)、輸出任務(wù)和一子任務(wù)。一般來說,可以分成輸入任務(wù)、輸出任務(wù)和一個(gè)或多個(gè)進(jìn)

4、行處理或計(jì)算的子任務(wù)。在劃分子模塊的過個(gè)或多個(gè)進(jìn)行處理或計(jì)算的子任務(wù)。在劃分子模塊的過程中應(yīng)該明確每個(gè)模塊的功能、數(shù)據(jù)結(jié)構(gòu)及相互之間的程中應(yīng)該明確每個(gè)模塊的功能、數(shù)據(jù)結(jié)構(gòu)及相互之間的關(guān)系。第二步,對(duì)這些主要的子模塊根據(jù)需要再劃分成關(guān)系。第二步,對(duì)這些主要的子模塊根據(jù)需要再劃分成下一層的子模塊。第三步,重復(fù)上述過程,一直到程序下一層的子模塊。第三步,重復(fù)上述過程,一直到程序分成易于理解和易于實(shí)現(xiàn)的小模塊為止。分成易于理解和易于實(shí)現(xiàn)的小模塊為止。匯編語言匯編語言程序設(shè)計(jì)程序設(shè)計(jì) 1. 1. 模塊劃分的原則模塊劃分的原則 (1) (1) 一個(gè)主模塊完成對(duì)各子模塊的調(diào)用,實(shí)現(xiàn)總體任務(wù),一個(gè)主模塊完成對(duì)

5、各子模塊的調(diào)用,實(shí)現(xiàn)總體任務(wù),而每個(gè)子模塊完成相應(yīng)的子任務(wù),各模塊間除應(yīng)在功能上分開,而每個(gè)子模塊完成相應(yīng)的子任務(wù),各模塊間除應(yīng)在功能上分開,邏輯上獨(dú)立,減少橫向聯(lián)系外,不能使用轉(zhuǎn)移指令在模塊間轉(zhuǎn)邏輯上獨(dú)立,減少橫向聯(lián)系外,不能使用轉(zhuǎn)移指令在模塊間轉(zhuǎn)來轉(zhuǎn)去,避免邏輯上的混亂;來轉(zhuǎn)去,避免邏輯上的混亂; (2) (2) 子模塊大小應(yīng)適中,模塊過大就失去了模塊化的意子模塊大小應(yīng)適中,模塊過大就失去了模塊化的意義,也會(huì)給編程和調(diào)試帶來一定困難;模塊過小,會(huì)在的時(shí)間義,也會(huì)給編程和調(diào)試帶來一定困難;模塊過小,會(huì)在的時(shí)間和空間上造成浪費(fèi);和空間上造成浪費(fèi); (3) (3) 差別很大的兩個(gè)程序段應(yīng)作為兩個(gè)

6、模塊;差別很大的兩個(gè)程序段應(yīng)作為兩個(gè)模塊; (4) (4) 當(dāng)一些數(shù)據(jù)被多個(gè)程序段所公用,那么這些數(shù)據(jù)所當(dāng)一些數(shù)據(jù)被多個(gè)程序段所公用,那么這些數(shù)據(jù)所在的程序段應(yīng)作為一個(gè)模塊;在的程序段應(yīng)作為一個(gè)模塊; (5) (5) 當(dāng)某些程序功能片段為多個(gè)模塊所公用時(shí),應(yīng)將它當(dāng)某些程序功能片段為多個(gè)模塊所公用時(shí),應(yīng)將它們作為公用子程序模塊;們作為公用子程序模塊; (6) (6) 各個(gè)模塊的結(jié)構(gòu)最好能設(shè)計(jì)為單入口、單出口的形各個(gè)模塊的結(jié)構(gòu)最好能設(shè)計(jì)為單入口、單出口的形式,各模塊間的接口應(yīng)該簡(jiǎn)單,要盡量減少公共標(biāo)識(shí)符的個(gè)數(shù)。式,各模塊間的接口應(yīng)該簡(jiǎn)單,要盡量減少公共標(biāo)識(shí)符的個(gè)數(shù)。匯編語言匯編語言程序設(shè)計(jì)程序設(shè)計(jì)

7、2.2.模塊劃分的方法模塊劃分的方法 (1) (1) 層次圖層次圖 層次圖是表示模塊與模塊之間關(guān)系的方塊圖。層次層次圖是表示模塊與模塊之間關(guān)系的方塊圖。層次圖的頂端是主模塊,即一個(gè)總控制塊,直接控制位于其圖的頂端是主模塊,即一個(gè)總控制塊,直接控制位于其下一層的各個(gè)模塊的執(zhí)行,而各主要的子模塊再去控制下一層的各個(gè)模塊的執(zhí)行,而各主要的子模塊再去控制其下一層的子模塊。其下一層的子模塊。 (2) (2) 模塊說明模塊說明 模塊說明是對(duì)模塊的功能、算法、模塊輸入和輸出模塊說明是對(duì)模塊的功能、算法、模塊輸入和輸出以及它們的數(shù)據(jù)結(jié)構(gòu)的簡(jiǎn)單說明。應(yīng)該考慮程序中哪些以及它們的數(shù)據(jù)結(jié)構(gòu)的簡(jiǎn)單說明。應(yīng)該考慮程序中

8、哪些數(shù)據(jù)應(yīng)該放在公共數(shù)據(jù)區(qū),供所有模塊訪問,哪些數(shù)據(jù)數(shù)據(jù)應(yīng)該放在公共數(shù)據(jù)區(qū),供所有模塊訪問,哪些數(shù)據(jù)可在有直接從屬關(guān)系的模塊間傳送??稍谟兄苯訌膶訇P(guān)系的模塊間傳送。 返回返回匯編語言匯編語言程序設(shè)計(jì)程序設(shè)計(jì)7.2 7.2 段的定義段的定義 SEGMENT SEGMENT偽指令的完整的格式為:偽指令的完整的格式為: 段名段名 SEGMENT SEGMENT 定位類型定位類型 組合類型組合類型 類別類別 段名段名 ENDSENDS 7.2.1 7.2.1 定位類型定位類型 定位類型用于指定該段的段起始地址的特性,也稱為定位屬性或?qū)R屬性。連接程序定位類型用于指定該段的段起始地址的特性,也稱為定位屬

9、性或?qū)R屬性。連接程序連接目標(biāo)文件時(shí),根據(jù)定位類型來確定段的開始地址。一共有連接目標(biāo)文件時(shí),根據(jù)定位類型來確定段的開始地址。一共有5 5種選擇。種選擇。 1 1PAGE(PAGE(頁頁) ) 段的起始地址從頁邊界開始,也就是說必須為段的起始地址從頁邊界開始,也就是說必須為256256的倍數(shù),即該地址的最后的倍數(shù),即該地址的最后8 8位二進(jìn)制位二進(jìn)制位應(yīng)為位應(yīng)為0 0。 2 2PARA(PARA(節(jié)節(jié)) ) 段的起始地址必須從段邊界開始,也就是說必須為段的起始地址必須從段邊界開始,也就是說必須為1616的倍數(shù),即該地址的最后的倍數(shù),即該地址的最后4 4位二位二進(jìn)制位應(yīng)為進(jìn)制位應(yīng)為0 0。 3 3

10、DWORD(DWORD(雙字雙字) ) 段的起始地址必須從雙字邊界開始,也就是說必須為段的起始地址必須從雙字邊界開始,也就是說必須為4 4的倍數(shù),即該地址的最低兩位的倍數(shù),即該地址的最低兩位二進(jìn)制位應(yīng)為二進(jìn)制位應(yīng)為0 0。 4 4WORD(WORD(字字) ) 段的起始地址必須從字邊界開始,也就是說必須為偶數(shù)地址,即該地址的最低一位二段的起始地址必須從字邊界開始,也就是說必須為偶數(shù)地址,即該地址的最低一位二進(jìn)制位應(yīng)為進(jìn)制位應(yīng)為0 0。 5 5BYTE(BYTE(字節(jié)字節(jié)) ) 段的起始地址從字節(jié)邊界開始,也就是說可以從任意單元地址起,也就是說為下一個(gè)段的起始地址從字節(jié)邊界開始,也就是說可以從任

11、意單元地址起,也就是說為下一個(gè)可用的字節(jié)地址開始??捎玫淖止?jié)地址開始。 當(dāng)段定義中沒有指定段的定位類型時(shí),定位類型的缺省方式為當(dāng)段定義中沒有指定段的定位類型時(shí),定位類型的缺省方式為PARAPARA。匯編語言匯編語言程序設(shè)計(jì)程序設(shè)計(jì)7.2.2 7.2.2 組合類型組合類型 組合類型也稱為組合屬性,組合類型標(biāo)明本段與其他模塊中組合類型也稱為組合屬性,組合類型標(biāo)明本段與其他模塊中同名段的組合連接關(guān)系,是用于控制本段與其他模塊中的同名、同名段的組合連接關(guān)系,是用于控制本段與其他模塊中的同名、同類型段的組合連接方式,有五種可選的組合類型。同類型段的組合連接方式,有五種可選的組合類型。 1 1PUBLIC

12、PUBLIC 連接程序?qū)⒉煌K中的具有連接程序?qū)⒉煌K中的具有PUBLlCPUBLlC屬性的同名段連接在一屬性的同名段連接在一起,形成一個(gè)新的段,公用一個(gè)段基址。起,形成一個(gè)新的段,公用一個(gè)段基址。 2 2STACKSTACK STACK STACK與與PLIBLICPLIBLIC的處理方式一樣,只是連接后的段為堆棧段,的處理方式一樣,只是連接后的段為堆棧段,連接程序在連接過程中自動(dòng)將新段的段基址送到堆棧段寄存器連接程序在連接過程中自動(dòng)將新段的段基址送到堆棧段寄存器SSSS,新段的長(zhǎng)度送到堆棧指針寄存器新段的長(zhǎng)度送到堆棧指針寄存器SPSP。當(dāng)堆棧段定義時(shí)沒有說明為當(dāng)堆棧段定義時(shí)沒有說明為S

13、TACKSTACK類型,就要在程序中用指令給堆棧段寄存器類型,就要在程序中用指令給堆棧段寄存器SSSS和堆棧指針和堆棧指針寄存器寄存器 SPSP賦值,不然連接程序時(shí)就會(huì)產(chǎn)生警告信息。賦值,不然連接程序時(shí)就會(huì)產(chǎn)生警告信息。 3 3COMMONCOMMON COMMON COMMON類型會(huì)產(chǎn)生一個(gè)覆蓋段,連接程序把該類型的同名段類型會(huì)產(chǎn)生一個(gè)覆蓋段,連接程序把該類型的同名段指定相同的段地址,段的長(zhǎng)度取決于最長(zhǎng)的指定相同的段地址,段的長(zhǎng)度取決于最長(zhǎng)的COMMONCOMMON段的長(zhǎng)度。段的長(zhǎng)度。匯編語言匯編語言程序設(shè)計(jì)程序設(shè)計(jì) 4 4MEMORYMEMORY 連接程序不單獨(dú)區(qū)分連接程序不單獨(dú)區(qū)分MEM

14、ORYMEMORY類型,把類型,把MEMORYMEMORY與與PUBLICPUBLIC類型同等對(duì)待。類型同等對(duì)待。MASMMASM程序允許使用它主要是為了與其他支持程序允許使用它主要是為了與其他支持Intel MEMORYIntel MEMORY類型的連接程序兼類型的連接程序兼容。容。 5 5ATAT表達(dá)式表達(dá)式 連接程序?qū)⒕哂羞B接程序?qū)⒕哂蠥TAT類型的段裝在表達(dá)式值所指定的段地址邊界上。這個(gè)類型的段裝在表達(dá)式值所指定的段地址邊界上。這個(gè)類型可以為標(biāo)號(hào)或變量賦予絕對(duì)地址,以便程序以標(biāo)號(hào)或變量的形式存取這類型可以為標(biāo)號(hào)或變量賦予絕對(duì)地址,以便程序以標(biāo)號(hào)或變量的形式存取這些存儲(chǔ)單元的內(nèi)容。一般在

15、些存儲(chǔ)單元的內(nèi)容。一般在ATAT類型的段中不定義指令或數(shù)據(jù),只說明一個(gè)地類型的段中不定義指令或數(shù)據(jù),只說明一個(gè)地址結(jié)構(gòu)。址結(jié)構(gòu)。 6 6NONENONE NONE NONE為默認(rèn)值,表示該段是獨(dú)立的,與其他同名段無組合關(guān)系,每段都為默認(rèn)值,表示該段是獨(dú)立的,與其他同名段無組合關(guān)系,每段都有自己的段起始地址。有自己的段起始地址。 7.2.3 7.2.3 類別類別 “ “類別類別”用于控制各段的存放順序,類別名相同的所有段要相鄰存放。用于控制各段的存放順序,類別名相同的所有段要相鄰存放。類別名可以是用單引號(hào)括起來任何合法的名稱,若類別名可以是用單引號(hào)括起來任何合法的名稱,若類別類別選擇項(xiàng)省略,則選

16、擇項(xiàng)省略,則表明該段類別為空。典型的類別名有:用于代碼段的表明該段類別為空。典型的類別名有:用于代碼段的CODECODE、用于數(shù)據(jù)段用于數(shù)據(jù)段的的DATADATA和用于堆棧段的和用于堆棧段的STACKSTACK。 返回返回匯編語言匯編語言程序設(shè)計(jì)程序設(shè)計(jì)7.3 模塊間的通訊模塊間的通訊 7.3.1 7.3.1 各模塊之間的通信方式各模塊之間的通信方式 當(dāng)程序由幾個(gè)模塊組成時(shí),勢(shì)必存在一個(gè)模塊使用另當(dāng)程序由幾個(gè)模塊組成時(shí),勢(shì)必存在一個(gè)模塊使用另一個(gè)模塊中定義的變量、標(biāo)號(hào)以及子程序等問題。由于子一個(gè)模塊中定義的變量、標(biāo)號(hào)以及子程序等問題。由于子程序與調(diào)用它的語句,定義變量、標(biāo)號(hào)及使用變量、標(biāo)號(hào)程序

17、與調(diào)用它的語句,定義變量、標(biāo)號(hào)及使用變量、標(biāo)號(hào)的語句分別在不同的模塊中,匯編是分開進(jìn)行的,匯編程的語句分別在不同的模塊中,匯編是分開進(jìn)行的,匯編程序無法知道子程序入口地址及變量、標(biāo)號(hào)的地址。因此,序無法知道子程序入口地址及變量、標(biāo)號(hào)的地址。因此,要由連接程序匯集各模塊送來的地址信息,綜合決定各個(gè)要由連接程序匯集各模塊送來的地址信息,綜合決定各個(gè)調(diào)用指令的轉(zhuǎn)移地址及變量、標(biāo)號(hào)地址。因此,匯編語言調(diào)用指令的轉(zhuǎn)移地址及變量、標(biāo)號(hào)地址。因此,匯編語言提供了幾種偽指令來完成不同模塊間的通訊。提供了幾種偽指令來完成不同模塊間的通訊。 1 1 TITLETITLE 格式:格式:TITLE TITLE 標(biāo)題標(biāo)

18、題 功能:給原程序指定一個(gè)標(biāo)題,而后功能:給原程序指定一個(gè)標(biāo)題,而后. .LSTLST文件每頁的文件每頁的頭都會(huì)出現(xiàn)這個(gè)標(biāo)題。頭都會(huì)出現(xiàn)這個(gè)標(biāo)題。 匯編語言匯編語言程序設(shè)計(jì)程序設(shè)計(jì)2 2NAMENAME和和ENDEND 在模塊化程序設(shè)計(jì)中,常要用到模塊定義偽指令。模塊定義使用在模塊化程序設(shè)計(jì)中,常要用到模塊定義偽指令。模塊定義使用NAMENAME和和ENDEND兩條偽指令。兩條偽指令。 模塊定義偽指令的一般格式為:模塊定義偽指令的一般格式為: 格式:格式: NAME NAME 模塊名模塊名 END END 標(biāo)號(hào)標(biāo)號(hào) 模塊名為本模塊的名稱,是模塊名為本模塊的名稱,是NAMENAME的操作數(shù);的操

19、作數(shù);ENDEND表示源程序到此結(jié)束,表示源程序到此結(jié)束,若程序包含多個(gè)模塊,則每個(gè)模塊的最后必須有若程序包含多個(gè)模塊,則每個(gè)模塊的最后必須有ENDEND,如果是主模塊,其如果是主模塊,其ENDEND語句中可以指定一個(gè)標(biāo)號(hào),這個(gè)標(biāo)號(hào)表示程序的啟動(dòng)地址,只有主模語句中可以指定一個(gè)標(biāo)號(hào),這個(gè)標(biāo)號(hào)表示程序的啟動(dòng)地址,只有主模塊的塊的ENDEND語句后有標(biāo)號(hào)。語句后有標(biāo)號(hào)。匯編語言匯編語言程序設(shè)計(jì)程序設(shè)計(jì) 3 3PUBLICPUBLIC偽指令偽指令 格式:格式:PUBLIC PUBLIC 標(biāo)識(shí)符標(biāo)識(shí)符 , ,標(biāo)識(shí)符標(biāo)識(shí)符,.,. 功能:表明本模塊中所定義的標(biāo)識(shí)符能夠提供給其他模功能:表明本模塊中所定義

20、的標(biāo)識(shí)符能夠提供給其他模塊引用。塊引用。 在一模塊中,在一模塊中,PUBLICPUBLIC偽指令語句一般放在程序的開頭,偽指令語句一般放在程序的開頭,只能說明一次。只能說明一次。PUBLICPUBLIC偽指令其后的標(biāo)識(shí)符是本模塊定義的偽指令其后的標(biāo)識(shí)符是本模塊定義的可供其他模塊調(diào)用的標(biāo)識(shí)符。這些標(biāo)識(shí)符是在本模塊中定義可供其他模塊調(diào)用的標(biāo)識(shí)符。這些標(biāo)識(shí)符是在本模塊中定義的符號(hào)常量、標(biāo)號(hào)、過程名或變量,各名字之間用逗號(hào)隔開。的符號(hào)常量、標(biāo)號(hào)、過程名或變量,各名字之間用逗號(hào)隔開。注意:寄存器名或其值為實(shí)數(shù)及其值超過兩個(gè)字節(jié)的整數(shù)的注意:寄存器名或其值為實(shí)數(shù)及其值超過兩個(gè)字節(jié)的整數(shù)的符號(hào)常量均不能作公

21、共標(biāo)識(shí)符使用。符號(hào)常量均不能作公共標(biāo)識(shí)符使用。 一旦經(jīng)過一旦經(jīng)過PUBLICPUBLIC偽指令定義,偽指令定義,EXAMEXAM子程序就成為公共子子程序就成為公共子程序,即可被多個(gè)不同模塊調(diào)用。程序,即可被多個(gè)不同模塊調(diào)用。 返回返回匯編語言匯編語言程序設(shè)計(jì)程序設(shè)計(jì) 4 4EXTRNEXTRN偽指令偽指令 格式:格式:EXTRNEXTRN標(biāo)識(shí)符:類型標(biāo)識(shí)符:類型 ,標(biāo)識(shí)符:類型,標(biāo)識(shí)符:類型, 功能:用來說明本模塊中用到的標(biāo)識(shí)符是由其它模塊功能:用來說明本模塊中用到的標(biāo)識(shí)符是由其它模塊定義的,即本模塊要引用其他模塊定義的標(biāo)識(shí)符。定義的,即本模塊要引用其他模塊定義的標(biāo)識(shí)符。 EXTRN EXTR

22、N是偽指令,其后的標(biāo)識(shí)符就是本模塊中要引用是偽指令,其后的標(biāo)識(shí)符就是本模塊中要引用的外部標(biāo)識(shí)符。而且標(biāo)識(shí)符必須指出其類型。變量的類型的外部標(biāo)識(shí)符。而且標(biāo)識(shí)符必須指出其類型。變量的類型可以是可以是BYTEBYTE,WORDWORD或或DWORDDWORD,標(biāo)號(hào)和過程名的類型可以是標(biāo)號(hào)和過程名的類型可以是NEARNEAR或或FARFAR。所有的標(biāo)識(shí)符類型必須與原定義時(shí)的類型一所有的標(biāo)識(shí)符類型必須與原定義時(shí)的類型一致;被致;被EXTRNEXTRN偽指令說明的標(biāo)識(shí)符必須是在它所定義的模偽指令說明的標(biāo)識(shí)符必須是在它所定義的模塊中被塊中被PUBLICPUBLIC偽指令說明過的標(biāo)識(shí)符。偽指令說明過的標(biāo)識(shí)符。

23、匯編語言匯編語言程序設(shè)計(jì)程序設(shè)計(jì)7.4 模塊的連接模塊的連接 在模塊化程序設(shè)計(jì)中,一個(gè)大的程序分成了若干子模塊,每個(gè)模在模塊化程序設(shè)計(jì)中,一個(gè)大的程序分成了若干子模塊,每個(gè)模塊具有完整的結(jié)構(gòu)和獨(dú)立的功能,并且能單獨(dú)匯編和調(diào)試。在實(shí)際使塊具有完整的結(jié)構(gòu)和獨(dú)立的功能,并且能單獨(dú)匯編和調(diào)試。在實(shí)際使用時(shí)如何將這些具有獨(dú)立功能的模塊連接成一個(gè)完整的整體呢用時(shí)如何將這些具有獨(dú)立功能的模塊連接成一個(gè)完整的整體呢? ?一般一般分兩種情況:源程序級(jí)間的裝配連接和目標(biāo)文件級(jí)間的裝配連接。分兩種情況:源程序級(jí)間的裝配連接和目標(biāo)文件級(jí)間的裝配連接。 7.4.1 源程序級(jí)間的裝配連接源程序級(jí)間的裝配連接 將若干個(gè)源文

24、件(將若干個(gè)源文件(* *. .ASMASM)連成一個(gè)完整的文件,匯編后形成一連成一個(gè)完整的文件,匯編后形成一個(gè)目標(biāo)模塊個(gè)目標(biāo)模塊( .( .OBJ)OBJ)方式,稱為源程序裝配連接。源程序級(jí)間的裝配方式,稱為源程序裝配連接。源程序級(jí)間的裝配連接常常是被裝配的若干模塊分別以源文件的形式存在,當(dāng)需要在源連接常常是被裝配的若干模塊分別以源文件的形式存在,當(dāng)需要在源主程序中插入一個(gè)已存在的子程序文件,或是多個(gè)源文件要合成一塊主程序中插入一個(gè)已存在的子程序文件,或是多個(gè)源文件要合成一塊的時(shí)候使用。的時(shí)候使用。匯編語言匯編語言程序設(shè)計(jì)程序設(shè)計(jì)7.4.2 目標(biāo)文件級(jí)間的裝配連接目標(biāo)文件級(jí)間的裝配連接 目標(biāo)

25、模塊連接就是通常所說的模塊連接,是多模塊程序設(shè)計(jì)的主要形目標(biāo)模塊連接就是通常所說的模塊連接,是多模塊程序設(shè)計(jì)的主要形式。目標(biāo)模塊連接是把被裝配的各個(gè)模塊分別匯編后生成各自的目標(biāo)文件式。目標(biāo)模塊連接是把被裝配的各個(gè)模塊分別匯編后生成各自的目標(biāo)文件(.(.objobj) )經(jīng)連接成一個(gè)可執(zhí)行文件經(jīng)連接成一個(gè)可執(zhí)行文件, ,它的實(shí)現(xiàn)比源文件連接復(fù)雜。它的實(shí)現(xiàn)比源文件連接復(fù)雜。 1 1目標(biāo)模塊連接目標(biāo)模塊連接 目標(biāo)模塊的連接時(shí)要使用連接程序目標(biāo)模塊的連接時(shí)要使用連接程序LINKLINK,通過通過LINKLINK將各模塊連接成一將各模塊連接成一個(gè)可執(zhí)行程序。命令格式如下:個(gè)可執(zhí)行程序。命令格式如下: L

26、INK LINK 模塊模塊l l文件名十模塊文件名十模塊2 2文件名十模塊文件名十模塊3 3文件名十文件名十 在在LINKLINK執(zhí)行時(shí),向使用者詢問可執(zhí)行文件名時(shí),回答一個(gè)指定的文件執(zhí)行時(shí),向使用者詢問可執(zhí)行文件名時(shí),回答一個(gè)指定的文件名,則連接后的可執(zhí)行文件名就是回答中所指定的文件名;如果沒有回答名,則連接后的可執(zhí)行文件名就是回答中所指定的文件名;如果沒有回答指定文件名,則連接后可執(zhí)行文件名將取所提供的第一個(gè)目標(biāo)文件名。假指定文件名,則連接后可執(zhí)行文件名將取所提供的第一個(gè)目標(biāo)文件名。假設(shè)設(shè)MASMMASM程序在程序在D D盤盤MASMMASM目錄下,目標(biāo)模塊為目錄下,目標(biāo)模塊為file_1

27、.objfile_1.obj、file_2.objfile_2.obj和和file_3.objfile_3.obj,則則 D:MASMLINK file_1+file_2+file_3D:MASMLINK file_1+file_2+file_3 ObjectModeles.objObjectModeles.obj : RunFilefile_1.exe RunFilefile_1.exe:mainfilemainfile ListFilenul.mapListFilenul.map:mainfilemainfile Libraries.lib Libraries.lib:匯編語言匯編語言程序

28、設(shè)計(jì)程序設(shè)計(jì)2 2段的組合與定位段的組合與定位 連接程序在執(zhí)行時(shí)要對(duì)目標(biāo)模塊做兩遍掃描,第一遍掃描是對(duì)所有連接程序在執(zhí)行時(shí)要對(duì)目標(biāo)模塊做兩遍掃描,第一遍掃描是對(duì)所有段分配段地址,并建立一張外部符號(hào)表;第二遍掃描是確定與這些外部段分配段地址,并建立一張外部符號(hào)表;第二遍掃描是確定與這些外部符號(hào)有關(guān)的指令機(jī)器碼值。連接完成后建立了裝入模塊,再由裝入程序符號(hào)有關(guān)的指令機(jī)器碼值。連接完成后建立了裝入模塊,再由裝入程序把該模塊裝入內(nèi)存等待執(zhí)行。把該模塊裝入內(nèi)存等待執(zhí)行。 對(duì)所有段分配段地址,涉及到段定義中的屬性以及對(duì)所有段分配段地址,涉及到段定義中的屬性以及PCPC機(jī)的可重定位技機(jī)的可重定位技術(shù)。匯編程

29、序匯編成的目標(biāo)模塊均是以浮動(dòng)的零作為段起始地址,理論術(shù)。匯編程序匯編成的目標(biāo)模塊均是以浮動(dòng)的零作為段起始地址,理論上講該模塊可以定位在主存中的任何地方。而連接程序可實(shí)現(xiàn)多個(gè)目標(biāo)上講該模塊可以定位在主存中的任何地方。而連接程序可實(shí)現(xiàn)多個(gè)目標(biāo)模塊的連接,并按各段的新定位地址修改有關(guān)的目標(biāo)代碼,使之成為一模塊的連接,并按各段的新定位地址修改有關(guān)的目標(biāo)代碼,使之成為一個(gè)整體來運(yùn)行。在用連接程序?qū)⒍鄠€(gè)目標(biāo)模塊連接在一起時(shí),被連接模個(gè)整體來運(yùn)行。在用連接程序?qū)⒍鄠€(gè)目標(biāo)模塊連接在一起時(shí),被連接模塊要向連接程序提供兩個(gè)方面的信息:各段之間的組合方式和各模塊之塊要向連接程序提供兩個(gè)方面的信息:各段之間的組合方式

30、和各模塊之間的通信方式。各段之間的組合方式由段定義中的組合類型和類別確定。間的通信方式。各段之間的組合方式由段定義中的組合類型和類別確定。 匯編語言匯編語言程序設(shè)計(jì)程序設(shè)計(jì)LINKLINK程序連接時(shí),先處理組合類型,后處理定位類型,再處理程序連接時(shí),先處理組合類型,后處理定位類型,再處理類類別別,因此,各模塊中具有同一種組合形式的段,其定位類型不得相,因此,各模塊中具有同一種組合形式的段,其定位類型不得相互矛盾,互矛盾,類別類別名或者省略,或者相同。名或者省略,或者相同。L1NKL1NK程序連接時(shí)把程序連接時(shí)把類別類別名相同的所有段名相同的所有段( (段名未必相同段名未必相同) )放在連續(xù)的存

31、儲(chǔ)區(qū)內(nèi),但仍然是不同放在連續(xù)的存儲(chǔ)區(qū)內(nèi),但仍然是不同的段。的段。類別類別名相同的各個(gè)段在連接時(shí),先出現(xiàn)的在前,后出現(xiàn)的名相同的各個(gè)段在連接時(shí),先出現(xiàn)的在前,后出現(xiàn)的在后,每段都有自己的超始地址。沒有類別名的邏輯段,與其它沒有在后,每段都有自己的超始地址。沒有類別名的邏輯段,與其它沒有類別名的邏輯段一起連續(xù)裝入內(nèi)存。類別名的邏輯段一起連續(xù)裝入內(nèi)存。 若多個(gè)模塊的段都為若多個(gè)模塊的段都為COMMONCOMMON組合類型,連接后組合成一個(gè)互相覆組合類型,連接后組合成一個(gè)互相覆蓋的段,段的長(zhǎng)度取二者的長(zhǎng)者,這種連接方法只有當(dāng)各模塊需要公蓋的段,段的長(zhǎng)度取二者的長(zhǎng)者,這種連接方法只有當(dāng)各模塊需要公共數(shù)據(jù)

32、區(qū)時(shí)才使用,否則各數(shù)據(jù)段內(nèi)容相互覆蓋便會(huì)出錯(cuò)。若多個(gè)模共數(shù)據(jù)區(qū)時(shí)才使用,否則各數(shù)據(jù)段內(nèi)容相互覆蓋便會(huì)出錯(cuò)。若多個(gè)模塊的段都為塊的段都為PUBLICPUBLIC組合類型,連接后組合成一個(gè)相鄰連接的段,互不組合類型,連接后組合成一個(gè)相鄰連接的段,互不覆蓋,連接順序由連接程序確定,組合后形成的段的長(zhǎng)度約等于各個(gè)覆蓋,連接順序由連接程序確定,組合后形成的段的長(zhǎng)度約等于各個(gè)段長(zhǎng)度之和。段長(zhǎng)度之和。返回返回匯編語言匯編語言程序設(shè)計(jì)程序設(shè)計(jì)7.5 源程序綜合舉例源程序綜合舉例 例例: : 從鍵盤輸入的一個(gè)長(zhǎng)度不超過從鍵盤輸入的一個(gè)長(zhǎng)度不超過5050個(gè)字符的字符串,將其個(gè)字符的字符串,將其中的小寫字母轉(zhuǎn)變?yōu)榇?/p>

33、寫字母輸出,非字母字符不變。中的小寫字母轉(zhuǎn)變?yōu)榇髮懽帜篙敵觯亲帜缸址蛔儭?解:可按題意和前面講述的原則,把整個(gè)程序分成解:可按題意和前面講述的原則,把整個(gè)程序分成3 3個(gè)模塊:個(gè)模塊: 模塊模塊1 1是主程序,通過調(diào)用模塊是主程序,通過調(diào)用模塊2 2和模塊和模塊3 3定義的子程序?qū)崿F(xiàn)接定義的子程序?qū)崿F(xiàn)接收字符串以及小寫字母轉(zhuǎn)換大寫字母的任務(wù);模塊收字符串以及小寫字母轉(zhuǎn)換大寫字母的任務(wù);模塊2 2定義子程序定義子程序IN_SUBIN_SUB接收輸入的字符串及子程序接收輸入的字符串及子程序OUT_SUBOUT_SUB輸出字符串;模塊輸出字符串;模塊3 3定定義子程序義子程序TRANSTRANS

34、將串中的大寫字母轉(zhuǎn)換成小寫字母。將串中的大寫字母轉(zhuǎn)換成小寫字母。 應(yīng)用例子層次圖應(yīng)用例子層次圖 匯編語言匯編語言程序設(shè)計(jì)程序設(shè)計(jì);主模塊;主模塊BLOCK_1BLOCK_1:NAME NAME BLOCK_1 BLOCK_1 ;模塊模塊1 1PUBLIC PUBLIC BUFBUF;本模塊緩沖區(qū),其它模塊要使用本模塊緩沖區(qū),其它模塊要使用EXTRN EXTRN IN_SUB:FAR,OUTSTR:FAR,TRANS:FARIN_SUB:FAR,OUTSTR:FAR,TRANS:FAR;使用其它模塊的子程序使用其它模塊的子程序STACK STACK SEGMENT STACK STACKSEGM

35、ENT STACK STACKDW 32 DUP(0)DW 32 DUP(0)STACK STACK ENDSENDSDATA DATA SEGMENT SEGMENTBUF BUF DB 50 , ? , 50 DUP(?)DB 50 , ? , 50 DUP(?)DATA DATA ENDS ENDSCODESG CODESG SEGMENTSEGMENTMAIN MAIN PROC FARPROC FARASSUME ASSUME CS:CODE,DS:DATA,SS:STACKCS:CODE,DS:DATA,SS:STACKMOV AX, DATAMOV AX, DATAMOV DS,

36、 AXMOV DS, AXCALL FAR PTR IN_SUB CALL FAR PTR IN_SUB ;調(diào)輸入字符子程序調(diào)輸入字符子程序IN_SUBIN_SUBCALL FAR PTR TRANSCALL FAR PTR TRANS;調(diào)轉(zhuǎn)換字符子程序調(diào)轉(zhuǎn)換字符子程序TRANSTRANSCALL FAR PTR OUT_SUBCALL FAR PTR OUT_SUB;調(diào)輸入字符子程序調(diào)輸入字符子程序OUT _SUBOUT _SUBMOV AX, 4C00HMOV AX, 4C00H;返回返回INT 21HINT 21HMAIN MAIN ENDPENDPCODESG CODESG ENDSENDS END MAIN END MAIN ; ;主模塊結(jié)束主模塊結(jié)束 匯編語言匯編語言程序設(shè)計(jì)程序設(shè)計(jì);子模塊;子模塊2 2 BLOCK_2BLOCK_2NAME NAME BLOCK_2BLOCK_2;命名模塊命名模塊2 2EXTRN EXTRN BUF:BYTE BUF:BYTE ;使用其它模塊的緩沖區(qū)使用其它模塊的緩沖區(qū)PUBLIC PUBLIC IN_SUB,OUT_SUBIN_SUB,OUT_SUB;其它模塊要使用其它模塊要使

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論