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

下載本文檔

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

文檔簡介

第07章-2模塊化程序設(shè)計第一頁,共22頁。

第07章-2模塊化程序設(shè)計

◆模塊化程序設(shè)計概述

◆模塊間的通訊

◆模塊的連接

◆源程序綜合舉例

第二頁,共22頁。7.1.1模塊化程序設(shè)計概念在設(shè)計大型程序時,常常要將整個問題分解為若干個小問題,必要時還要將小問題再次分解為更小的若干問題,每個小問題編寫成獨(dú)立的源文件,最后將所有的源文件連接起來組合成一個大程序。也就是說,一個程序往往由多個源文件組成,那么構(gòu)成一個程序的各個相對獨(dú)立的源文件通常稱為模塊。這樣把一個程序分成多個功能相對獨(dú)立的程序模塊分別編制、調(diào)試后,再用連接程序把它們連接在一起生成一個完整的程序的設(shè)計的方法稱為模塊化程序設(shè)計。

7.1.2模塊化程序設(shè)計的優(yōu)點(diǎn)1.開發(fā)速度快2.可維護(hù)性與可讀性強(qiáng)3.可移埴性強(qiáng)第三頁,共22頁。7.1.3模塊劃分的原則和方法模塊的劃分應(yīng)該是靈活的,但不應(yīng)是程序的等分,應(yīng)使各模塊具有相對的獨(dú)立性和完整性,可以單獨(dú)編程、調(diào)試,但也要考慮各個模塊之間的聯(lián)系。模塊劃分是一個自上而下的過程。主模塊是一個總控模塊,首先確定主要的模塊,也就是說,要把總?cè)蝿?wù)劃分成幾個主要的子任務(wù)。一般來說,可以分成輸入任務(wù)、輸出任務(wù)和一個或多個進(jìn)行處理或計算的子任務(wù)。在劃分子模塊的過程中應(yīng)該明確每個模塊的功能、數(shù)據(jù)結(jié)構(gòu)及相互之間的關(guān)系。第二步,對這些主要的子模塊根據(jù)需要再劃分成下一層的子模塊。第三步,重復(fù)上述過程,一直到程序分成易于理解和易于實(shí)現(xiàn)的小模塊為止。第四頁,共22頁。1.

模塊劃分的原則(1)一個主模塊完成對各子模塊的調(diào)用,實(shí)現(xiàn)總體任務(wù),而每個子模塊完成相應(yīng)的子任務(wù),各模塊間除應(yīng)在功能上分開,邏輯上獨(dú)立,減少橫向聯(lián)系外,不能使用轉(zhuǎn)移指令在模塊間轉(zhuǎn)來轉(zhuǎn)去,避免邏輯上的混亂;(2)子模塊大小應(yīng)適中,模塊過大就失去了模塊化的意義,也會給編程和調(diào)試帶來一定困難;模塊過小,會在的時間和空間上造成浪費(fèi);(3)差別很大的兩個程序段應(yīng)作為兩個模塊;(4)當(dāng)一些數(shù)據(jù)被多個程序段所公用,那么這些數(shù)據(jù)所在的程序段應(yīng)作為一個模塊;(5)當(dāng)某些程序功能片段為多個模塊所公用時,應(yīng)將它們作為公用子程序模塊;(6)各個模塊的結(jié)構(gòu)最好能設(shè)計為單入口、單出口的形式,各模塊間的接口應(yīng)該簡單,要盡量減少公共標(biāo)識符的個數(shù)。第五頁,共22頁。2.模塊劃分的方法(1)層次圖層次圖是表示模塊與模塊之間關(guān)系的方塊圖。層次圖的頂端是主模塊,即一個總控制塊,直接控制位于其下一層的各個模塊的執(zhí)行,而各主要的子模塊再去控制其下一層的子模塊。(2)模塊說明模塊說明是對模塊的功能、算法、模塊輸入和輸出以及它們的數(shù)據(jù)結(jié)構(gòu)的簡單說明。應(yīng)該考慮程序中哪些數(shù)據(jù)應(yīng)該放在公共數(shù)據(jù)區(qū),供所有模塊訪問,哪些數(shù)據(jù)可在有直接從屬關(guān)系的模塊間傳送。返回第六頁,共22頁。7.2段的定義SEGMENT偽指令的完整的格式為:段名SEGMENT[定位類型][組合類型][‘類別’]┇段名ENDS7.2.1定位類型定位類型用于指定該段的段起始地址的特性,也稱為定位屬性或?qū)R屬性。連接程序連接目標(biāo)文件時,根據(jù)定位類型來確定段的開始地址。一共有5種選擇。1.PAGE(頁)段的起始地址從頁邊界開始,也就是說必須為256的倍數(shù),即該地址的最后8位二進(jìn)制位應(yīng)為0。2.PARA(節(jié))段的起始地址必須從段邊界開始,也就是說必須為16的倍數(shù),即該地址的最后4位二進(jìn)制位應(yīng)為0。3.DWORD(雙字)段的起始地址必須從雙字邊界開始,也就是說必須為4的倍數(shù),即該地址的最低兩位二進(jìn)制位應(yīng)為0。4.WORD(字)段的起始地址必須從字邊界開始,也就是說必須為偶數(shù)地址,即該地址的最低一位二進(jìn)制位應(yīng)為0。5.BYTE(字節(jié))段的起始地址從字節(jié)邊界開始,也就是說可以從任意單元地址起,也就是說為下一個可用的字節(jié)地址開始。當(dāng)段定義中沒有指定段的定位類型時,定位類型的缺省方式為PARA。第七頁,共22頁。7.2.2組合類型組合類型也稱為組合屬性,組合類型標(biāo)明本段與其他模塊中同名段的組合連接關(guān)系,是用于控制本段與其他模塊中的同名、同類型段的組合連接方式,有五種可選的組合類型。1.PUBLIC連接程序?qū)⒉煌K中的具有PUBLlC屬性的同名段連接在一起,形成一個新的段,公用一個段基址。2.STACKSTACK與PLIBLIC的處理方式一樣,只是連接后的段為堆棧段,連接程序在連接過程中自動將新段的段基址送到堆棧段寄存器SS,新段的長度送到堆棧指針寄存器SP。當(dāng)堆棧段定義時沒有說明為STACK類型,就要在程序中用指令給堆棧段寄存器SS和堆棧指針寄存器SP賦值,不然連接程序時就會產(chǎn)生警告信息。3.COMMONCOMMON類型會產(chǎn)生一個覆蓋段,連接程序把該類型的同名段指定相同的段地址,段的長度取決于最長的COMMON段的長度。第八頁,共22頁。4.MEMORY連接程序不單獨(dú)區(qū)分MEMORY類型,把MEMORY與PUBLIC類型同等對待。MASM程序允許使用它主要是為了與其他支持IntelMEMORY類型的連接程序兼容。5.AT表達(dá)式連接程序?qū)⒕哂蠥T類型的段裝在表達(dá)式值所指定的段地址邊界上。這個類型可以為標(biāo)號或變量賦予絕對地址,以便程序以標(biāo)號或變量的形式存取這些存儲單元的內(nèi)容。一般在AT類型的段中不定義指令或數(shù)據(jù),只說明一個地址結(jié)構(gòu)。6.NONENONE為默認(rèn)值,表示該段是獨(dú)立的,與其他同名段無組合關(guān)系,每段都有自己的段起始地址。

7.2.3類別“類別”用于控制各段的存放順序,類別名相同的所有段要相鄰存放。類別名可以是用單引號括起來任何合法的名稱,若‘類別’選擇項(xiàng)省略,則表明該段類別為空。典型的類別名有:用于代碼段的‘CODE’、用于數(shù)據(jù)段的‘DATA’和用于堆棧段的‘STACK’。返回第九頁,共22頁。7.3模塊間的通訊

7.3.1各模塊之間的通信方式當(dāng)程序由幾個模塊組成時,勢必存在一個模塊使用另一個模塊中定義的變量、標(biāo)號以及子程序等問題。由于子程序與調(diào)用它的語句,定義變量、標(biāo)號及使用變量、標(biāo)號的語句分別在不同的模塊中,匯編是分開進(jìn)行的,匯編程序無法知道子程序入口地址及變量、標(biāo)號的地址。因此,要由連接程序匯集各模塊送來的地址信息,綜合決定各個調(diào)用指令的轉(zhuǎn)移地址及變量、標(biāo)號地址。因此,匯編語言提供了幾種偽指令來完成不同模塊間的通訊。1.

TITLE格式:TITLE[標(biāo)題]功能:給原程序指定一個標(biāo)題,而后.LST文件每頁的頭都會出現(xiàn)這個標(biāo)題。第十頁,共22頁。2.NAME和END在模塊化程序設(shè)計中,常要用到模塊定義偽指令。模塊定義使用NAME和END兩條偽指令。模塊定義偽指令的一般格式為:格式:[NAME模塊名]┆END[標(biāo)號]模塊名為本模塊的名稱,是NAME的操作數(shù);END表示源程序到此結(jié)束,若程序包含多個模塊,則每個模塊的最后必須有END,如果是主模塊,其END語句中可以指定一個標(biāo)號,這個標(biāo)號表示程序的啟動地址,只有主模塊的END語句后有標(biāo)號。第十一頁,共22頁。3.PUBLIC偽指令格式:PUBLIC標(biāo)識符[,標(biāo)識符,...]功能:表明本模塊中所定義的標(biāo)識符能夠提供給其他模塊引用。在一模塊中,PUBLIC偽指令語句一般放在程序的開頭,只能說明一次。PUBLIC偽指令其后的標(biāo)識符是本模塊定義的可供其他模塊調(diào)用的標(biāo)識符。這些標(biāo)識符是在本模塊中定義的符號常量、標(biāo)號、過程名或變量,各名字之間用逗號隔開。注意:寄存器名或其值為實(shí)數(shù)及其值超過兩個字節(jié)的整數(shù)的符號常量均不能作公共標(biāo)識符使用。一旦經(jīng)過PUBLIC偽指令定義,EXAM子程序就成為公共子程序,即可被多個不同模塊調(diào)用。返回第十二頁,共22頁。4.EXTRN偽指令格式:EXTRN標(biāo)識符:類型[,標(biāo)識符:類型,…]功能:用來說明本模塊中用到的標(biāo)識符是由其它模塊定義的,即本模塊要引用其他模塊定義的標(biāo)識符。EXTRN是偽指令,其后的標(biāo)識符就是本模塊中要引用的外部標(biāo)識符。而且標(biāo)識符必須指出其類型。變量的類型可以是BYTE,WORD或DWORD,標(biāo)號和過程名的類型可以是NEAR或FAR。所有的標(biāo)識符類型必須與原定義時的類型一致;被EXTRN偽指令說明的標(biāo)識符必須是在它所定義的模塊中被PUBLIC偽指令說明過的標(biāo)識符。第十三頁,共22頁。7.4模塊的連接

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

7.4.1源程序級間的裝配連接將若干個源文件(*.ASM)連成一個完整的文件,匯編后形成一個目標(biāo)模塊(.OBJ)方式,稱為源程序裝配連接。源程序級間的裝配連接常常是被裝配的若干模塊分別以源文件的形式存在,當(dāng)需要在源主程序中插入一個已存在的子程序文件,或是多個源文件要合成一塊的時候使用。第十四頁,共22頁。7.4.2目標(biāo)文件級間的裝配連接目標(biāo)模塊連接就是通常所說的模塊連接,是多模塊程序設(shè)計的主要形式。目標(biāo)模塊連接是把被裝配的各個模塊分別匯編后生成各自的目標(biāo)文件(.obj)經(jīng)連接成一個可執(zhí)行文件,它的實(shí)現(xiàn)比源文件連接復(fù)雜。1.目標(biāo)模塊連接目標(biāo)模塊的連接時要使用連接程序LINK,通過LINK將各模塊連接成一個可執(zhí)行程序。命令格式如下:

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

D:\MASM>LINKObjectModeles[.obj]:↙Run]:mainfile↙List]:mainfile↙Libraries[.lib]:↙第十五頁,共22頁。2.段的組合與定位連接程序在執(zhí)行時要對目標(biāo)模塊做兩遍掃描,第一遍掃描是對所有段分配段地址,并建立一張外部符號表;第二遍掃描是確定與這些外部符號有關(guān)的指令機(jī)器碼值。連接完成后建立了裝入模塊,再由裝入程序把該模塊裝入內(nèi)存等待執(zhí)行。對所有段分配段地址,涉及到段定義中的屬性以及PC機(jī)的可重定位技術(shù)。匯編程序匯編成的目標(biāo)模塊均是以浮動的零作為段起始地址,理論上講該模塊可以定位在主存中的任何地方。而連接程序可實(shí)現(xiàn)多個目標(biāo)模塊的連接,并按各段的新定位地址修改有關(guān)的目標(biāo)代碼,使之成為一個整體來運(yùn)行。在用連接程序?qū)⒍鄠€目標(biāo)模塊連接在一起時,被連接模塊要向連接程序提供兩個方面的信息:各段之間的組合方式和各模塊之間的通信方式。各段之間的組合方式由段定義中的組合類型和類別確定。

第十六頁,共22頁。LINK程序連接時,先處理組合類型,后處理定位類型,再處理‘類別’,因此,各模塊中具有同一種組合形式的段,其定位類型不得相互矛盾,‘類別’名或者省略,或者相同。L1NK程序連接時把‘類別’名相同的所有段(段名未必相同)放在連續(xù)的存儲區(qū)內(nèi),但仍然是不同的段?!悇e’名相同的各個段在連接時,先出現(xiàn)的在前,后出現(xiàn)的在后,每段都有自己的超始地址。沒有類別名的邏輯段,與其它沒有類別名的邏輯段一起連續(xù)裝入內(nèi)存。若多個模塊的段都為COMMON組合類型,連接后組合成一個互相覆蓋的段,段的長度取二者的長者,這種連接方法只有當(dāng)各模塊需要公共數(shù)據(jù)區(qū)時才使用,否則各數(shù)據(jù)段內(nèi)容相互覆蓋便會出錯。若多個模塊的段都為PUBLIC組合類型,連接后組合成一個相鄰連接的段,互不覆蓋,連接順序由連接程序確定,組合后形成的段的長度約等于各個段長度之和。返回第十七頁,共22頁。7.5源程序綜合舉例[例:]從鍵盤輸入的一個長度不超過50個字符的字符串,將其中的小寫字母轉(zhuǎn)變?yōu)榇髮懽帜篙敵?,非字母字符不變。解:可按題意和前面講述的原則,把整個程序分成3個模塊:模塊1是主程序,通過調(diào)用模塊2和模塊3定義的子程序?qū)崿F(xiàn)接收字符串以及小寫字母轉(zhuǎn)換大寫字母的任務(wù);模塊2定義子程序IN_SUB接收輸入的字符串及子程序OUT_SUB輸出字符串;模塊3定義子程序TRANS將串中的大寫字母轉(zhuǎn)換成小寫字母。應(yīng)用例子層次圖

第十八頁,共22頁。;主模塊BLOCK_1:NAME BLOCK_1 ;模塊1PUBLIC BUF ;本模塊緩沖區(qū),其它模塊要使用EXTRN IN_SUB:FAR,OUTSTR:FAR,TRANS:FAR;使用其它模塊的子程序STACK SEGMENTSTACK‘STACK’DW32DUP(0)STACK ENDSDATA SEGMENTBUF DB50,?,50DUP(?)DATA ENDSCODESG SEGMENTMAIN PROCFARASSUME CS:CODE,DS:DATA,SS:STACKMOVAX,DATAMOVDS,AXCALLFARPTRIN_SUB ;調(diào)輸入字符子程序IN_SUBCALLFARPTRTRANS ;調(diào)轉(zhuǎn)換字符子程序TRANSCALLFARPTROUT_SUB ;調(diào)輸入字符子程序OUT_SUBMOVAX,4C00H ;返回INT21HMAIN ENDPCODESG ENDSENDMAIN ;主模塊結(jié)束第十九頁,共22頁。;子模塊2BLOCK_2NAME BLOCK_2 ;命名模塊2EXTRN BUF:BYTE ;使用其它模塊的緩沖區(qū)PUBLIC IN_SUB,OUT_SUB ;其它模塊要使用CODE SEGMENTASSUME CS:CODEIN_SUB PROCFAR ;輸入子程序 PUSHDX PUSHAX LEADX,BUF MOVAH,10 INT21H ;輸入字符 POPAX POPDX RETIN_SUB ENDPOUT_SUB PROCFAR PUSHDX PUSHAX LEAD

溫馨提示

  • 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

提交評論