版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第07章-2模塊化程序設(shè)計(jì)第一頁(yè),共22頁(yè)。
第07章-2模塊化程序設(shè)計(jì)
◆模塊化程序設(shè)計(jì)概述
◆
◆模塊間的通訊
◆模塊的連接
◆源程序綜合舉例
第二頁(yè),共22頁(yè)。7.1.1模塊化程序設(shè)計(jì)概念在設(shè)計(jì)大型程序時(shí),常常要將整個(gè)問(wèn)題分解為若干個(gè)小問(wèn)題,必要時(shí)還要將小問(wèn)題再次分解為更小的若干問(wèn)題,每個(gè)小問(wèn)題編寫成獨(dú)立的源文件,最后將所有的源文件連接起來(lái)組合成一個(gè)大程序。也就是說(shuō),一個(gè)程序往往由多個(gè)源文件組成,那么構(gòu)成一個(gè)程序的各個(gè)相對(duì)獨(dú)立的源文件通常稱為模塊。這樣把一個(gè)程序分成多個(gè)功能相對(duì)獨(dú)立的程序模塊分別編制、調(diào)試后,再用連接程序把它們連接在一起生成一個(gè)完整的程序的設(shè)計(jì)的方法稱為模塊化程序設(shè)計(jì)。
7.1.2模塊化程序設(shè)計(jì)的優(yōu)點(diǎn)1.開(kāi)發(fā)速度快2.可維護(hù)性與可讀性強(qiáng)3.可移埴性強(qiáng)第三頁(yè),共22頁(yè)。7.1.3模塊劃分的原則和方法模塊的劃分應(yīng)該是靈活的,但不應(yīng)是程序的等分,應(yīng)使各模塊具有相對(duì)的獨(dú)立性和完整性,可以單獨(dú)編程、調(diào)試,但也要考慮各個(gè)模塊之間的聯(lián)系。模塊劃分是一個(gè)自上而下的過(guò)程。主模塊是一個(gè)總控模塊,首先確定主要的模塊,也就是說(shuō),要把總?cè)蝿?wù)劃分成幾個(gè)主要的子任務(wù)。一般來(lái)說(shuō),可以分成輸入任務(wù)、輸出任務(wù)和一個(gè)或多個(gè)進(jìn)行處理或計(jì)算的子任務(wù)。在劃分子模塊的過(guò)程中應(yīng)該明確每個(gè)模塊的功能、數(shù)據(jù)結(jié)構(gòu)及相互之間的關(guān)系。第二步,對(duì)這些主要的子模塊根據(jù)需要再劃分成下一層的子模塊。第三步,重復(fù)上述過(guò)程,一直到程序分成易于理解和易于實(shí)現(xiàn)的小模塊為止。第四頁(yè),共22頁(yè)。1.
模塊劃分的原則(1)一個(gè)主模塊完成對(duì)各子模塊的調(diào)用,實(shí)現(xiàn)總體任務(wù),而每個(gè)子模塊完成相應(yīng)的子任務(wù),各模塊間除應(yīng)在功能上分開(kāi),邏輯上獨(dú)立,減少橫向聯(lián)系外,不能使用轉(zhuǎn)移指令在模塊間轉(zhuǎn)來(lái)轉(zhuǎn)去,避免邏輯上的混亂;(2)子模塊大小應(yīng)適中,模塊過(guò)大就失去了模塊化的意義,也會(huì)給編程和調(diào)試帶來(lái)一定困難;模塊過(guò)小,會(huì)在的時(shí)間和空間上造成浪費(fèi);(3)差別很大的兩個(gè)程序段應(yīng)作為兩個(gè)模塊;(4)當(dāng)一些數(shù)據(jù)被多個(gè)程序段所公用,那么這些數(shù)據(jù)所在的程序段應(yīng)作為一個(gè)模塊;(5)當(dāng)某些程序功能片段為多個(gè)模塊所公用時(shí),應(yīng)將它們作為公用子程序模塊;(6)各個(gè)模塊的結(jié)構(gòu)最好能設(shè)計(jì)為單入口、單出口的形式,各模塊間的接口應(yīng)該簡(jiǎn)單,要盡量減少公共標(biāo)識(shí)符的個(gè)數(shù)。第五頁(yè),共22頁(yè)。2.模塊劃分的方法(1)層次圖層次圖是表示模塊與模塊之間關(guān)系的方塊圖。層次圖的頂端是主模塊,即一個(gè)總控制塊,直接控制位于其下一層的各個(gè)模塊的執(zhí)行,而各主要的子模塊再去控制其下一層的子模塊。(2)模塊說(shuō)明模塊說(shuō)明是對(duì)模塊的功能、算法、模塊輸入和輸出以及它們的數(shù)據(jù)結(jié)構(gòu)的簡(jiǎn)單說(shuō)明。應(yīng)該考慮程序中哪些數(shù)據(jù)應(yīng)該放在公共數(shù)據(jù)區(qū),供所有模塊訪問(wèn),哪些數(shù)據(jù)可在有直接從屬關(guān)系的模塊間傳送。返回第六頁(yè),共22頁(yè)。7.2段的定義SEGMENT偽指令的完整的格式為:段名SEGMENT[定位類型][組合類型][‘類別’]┇段名ENDS7.2.1定位類型定位類型用于指定該段的段起始地址的特性,也稱為定位屬性或?qū)R屬性。連接程序連接目標(biāo)文件時(shí),根據(jù)定位類型來(lái)確定段的開(kāi)始地址。一共有5種選擇。1.PAGE(頁(yè))段的起始地址從頁(yè)邊界開(kāi)始,也就是說(shuō)必須為256的倍數(shù),即該地址的最后8位二進(jìn)制位應(yīng)為0。2.PARA(節(jié))段的起始地址必須從段邊界開(kāi)始,也就是說(shuō)必須為16的倍數(shù),即該地址的最后4位二進(jìn)制位應(yīng)為0。3.DWORD(雙字)段的起始地址必須從雙字邊界開(kāi)始,也就是說(shuō)必須為4的倍數(shù),即該地址的最低兩位二進(jìn)制位應(yīng)為0。4.WORD(字)段的起始地址必須從字邊界開(kāi)始,也就是說(shuō)必須為偶數(shù)地址,即該地址的最低一位二進(jìn)制位應(yīng)為0。5.BYTE(字節(jié))段的起始地址從字節(jié)邊界開(kāi)始,也就是說(shuō)可以從任意單元地址起,也就是說(shuō)為下一個(gè)可用的字節(jié)地址開(kāi)始。當(dāng)段定義中沒(méi)有指定段的定位類型時(shí),定位類型的缺省方式為PARA。第七頁(yè),共22頁(yè)。7.2.2組合類型組合類型也稱為組合屬性,組合類型標(biāo)明本段與其他模塊中同名段的組合連接關(guān)系,是用于控制本段與其他模塊中的同名、同類型段的組合連接方式,有五種可選的組合類型。1.PUBLIC連接程序?qū)⒉煌K中的具有PUBLlC屬性的同名段連接在一起,形成一個(gè)新的段,公用一個(gè)段基址。2.STACKSTACK與PLIBLIC的處理方式一樣,只是連接后的段為堆棧段,連接程序在連接過(guò)程中自動(dòng)將新段的段基址送到堆棧段寄存器SS,新段的長(zhǎng)度送到堆棧指針寄存器SP。當(dāng)堆棧段定義時(shí)沒(méi)有說(shuō)明為STACK類型,就要在程序中用指令給堆棧段寄存器SS和堆棧指針寄存器SP賦值,不然連接程序時(shí)就會(huì)產(chǎn)生警告信息。3.COMMONCOMMON類型會(huì)產(chǎn)生一個(gè)覆蓋段,連接程序把該類型的同名段指定相同的段地址,段的長(zhǎng)度取決于最長(zhǎng)的COMMON段的長(zhǎng)度。第八頁(yè),共22頁(yè)。4.MEMORY連接程序不單獨(dú)區(qū)分MEMORY類型,把MEMORY與PUBLIC類型同等對(duì)待。MASM程序允許使用它主要是為了與其他支持IntelMEMORY類型的連接程序兼容。5.AT表達(dá)式連接程序?qū)⒕哂蠥T類型的段裝在表達(dá)式值所指定的段地址邊界上。這個(gè)類型可以為標(biāo)號(hào)或變量賦予絕對(duì)地址,以便程序以標(biāo)號(hào)或變量的形式存取這些存儲(chǔ)單元的內(nèi)容。一般在AT類型的段中不定義指令或數(shù)據(jù),只說(shuō)明一個(gè)地址結(jié)構(gòu)。6.NONENONE為默認(rèn)值,表示該段是獨(dú)立的,與其他同名段無(wú)組合關(guān)系,每段都有自己的段起始地址。
7.2.3類別“類別”用于控制各段的存放順序,類別名相同的所有段要相鄰存放。類別名可以是用單引號(hào)括起來(lái)任何合法的名稱,若‘類別’選擇項(xiàng)省略,則表明該段類別為空。典型的類別名有:用于代碼段的‘CODE’、用于數(shù)據(jù)段的‘DATA’和用于堆棧段的‘STACK’。返回第九頁(yè),共22頁(yè)。7.3模塊間的通訊
7.3.1各模塊之間的通信方式當(dāng)程序由幾個(gè)模塊組成時(shí),勢(shì)必存在一個(gè)模塊使用另一個(gè)模塊中定義的變量、標(biāo)號(hào)以及子程序等問(wèn)題。由于子程序與調(diào)用它的語(yǔ)句,定義變量、標(biāo)號(hào)及使用變量、標(biāo)號(hào)的語(yǔ)句分別在不同的模塊中,匯編是分開(kāi)進(jìn)行的,匯編程序無(wú)法知道子程序入口地址及變量、標(biāo)號(hào)的地址。因此,要由連接程序匯集各模塊送來(lái)的地址信息,綜合決定各個(gè)調(diào)用指令的轉(zhuǎn)移地址及變量、標(biāo)號(hào)地址。因此,匯編語(yǔ)言提供了幾種偽指令來(lái)完成不同模塊間的通訊。1.
TITLE格式:TITLE[標(biāo)題]功能:給原程序指定一個(gè)標(biāo)題,而后.LST文件每頁(yè)的頭都會(huì)出現(xiàn)這個(gè)標(biāo)題。第十頁(yè),共22頁(yè)。2.NAME和END在模塊化程序設(shè)計(jì)中,常要用到模塊定義偽指令。模塊定義使用NAME和END兩條偽指令。模塊定義偽指令的一般格式為:格式:[NAME模塊名]┆END[標(biāo)號(hào)]模塊名為本模塊的名稱,是NAME的操作數(shù);END表示源程序到此結(jié)束,若程序包含多個(gè)模塊,則每個(gè)模塊的最后必須有END,如果是主模塊,其END語(yǔ)句中可以指定一個(gè)標(biāo)號(hào),這個(gè)標(biāo)號(hào)表示程序的啟動(dòng)地址,只有主模塊的END語(yǔ)句后有標(biāo)號(hào)。第十一頁(yè),共22頁(yè)。3.PUBLIC偽指令格式:PUBLIC標(biāo)識(shí)符[,標(biāo)識(shí)符,...]功能:表明本模塊中所定義的標(biāo)識(shí)符能夠提供給其他模塊引用。在一模塊中,PUBLIC偽指令語(yǔ)句一般放在程序的開(kāi)頭,只能說(shuō)明一次。PUBLIC偽指令其后的標(biāo)識(shí)符是本模塊定義的可供其他模塊調(diào)用的標(biāo)識(shí)符。這些標(biāo)識(shí)符是在本模塊中定義的符號(hào)常量、標(biāo)號(hào)、過(guò)程名或變量,各名字之間用逗號(hào)隔開(kāi)。注意:寄存器名或其值為實(shí)數(shù)及其值超過(guò)兩個(gè)字節(jié)的整數(shù)的符號(hào)常量均不能作公共標(biāo)識(shí)符使用。一旦經(jīng)過(guò)PUBLIC偽指令定義,EXAM子程序就成為公共子程序,即可被多個(gè)不同模塊調(diào)用。返回第十二頁(yè),共22頁(yè)。4.EXTRN偽指令格式:EXTRN標(biāo)識(shí)符:類型[,標(biāo)識(shí)符:類型,…]功能:用來(lái)說(shuō)明本模塊中用到的標(biāo)識(shí)符是由其它模塊定義的,即本模塊要引用其他模塊定義的標(biāo)識(shí)符。EXTRN是偽指令,其后的標(biāo)識(shí)符就是本模塊中要引用的外部標(biāo)識(shí)符。而且標(biāo)識(shí)符必須指出其類型。變量的類型可以是BYTE,WORD或DWORD,標(biāo)號(hào)和過(guò)程名的類型可以是NEAR或FAR。所有的標(biāo)識(shí)符類型必須與原定義時(shí)的類型一致;被EXTRN偽指令說(shuō)明的標(biāo)識(shí)符必須是在它所定義的模塊中被PUBLIC偽指令說(shuō)明過(guò)的標(biāo)識(shí)符。第十三頁(yè),共22頁(yè)。7.4模塊的連接
在模塊化程序設(shè)計(jì)中,一個(gè)大的程序分成了若干子模塊,每個(gè)模塊具有完整的結(jié)構(gòu)和獨(dú)立的功能,并且能單獨(dú)匯編和調(diào)試。在實(shí)際使用時(shí)如何將這些具有獨(dú)立功能的模塊連接成一個(gè)完整的整體呢?一般分兩種情況:源程序級(jí)間的裝配連接和目標(biāo)文件級(jí)間的裝配連接。
7.4.1源程序級(jí)間的裝配連接將若干個(gè)源文件(*.ASM)連成一個(gè)完整的文件,匯編后形成一個(gè)目標(biāo)模塊(.OBJ)方式,稱為源程序裝配連接。源程序級(jí)間的裝配連接常常是被裝配的若干模塊分別以源文件的形式存在,當(dāng)需要在源主程序中插入一個(gè)已存在的子程序文件,或是多個(gè)源文件要合成一塊的時(shí)候使用。第十四頁(yè),共22頁(yè)。7.4.2目標(biāo)文件級(jí)間的裝配連接目標(biāo)模塊連接就是通常所說(shuō)的模塊連接,是多模塊程序設(shè)計(jì)的主要形式。目標(biāo)模塊連接是把被裝配的各個(gè)模塊分別匯編后生成各自的目標(biāo)文件(.obj)經(jīng)連接成一個(gè)可執(zhí)行文件,它的實(shí)現(xiàn)比源文件連接復(fù)雜。1.目標(biāo)模塊連接目標(biāo)模塊的連接時(shí)要使用連接程序LINK,通過(guò)LINK將各模塊連接成一個(gè)可執(zhí)行程序。命令格式如下:
LINK模塊l文件名十模塊2文件名十模塊3文件名十…在LINK執(zhí)行時(shí),向使用者詢問(wèn)可執(zhí)行文件名時(shí),回答一個(gè)指定的文件名,則連接后的可執(zhí)行文件名就是回答中所指定的文件名;如果沒(méi)有回答指定文件名,則連接后可執(zhí)行文件名將取所提供的第一個(gè)目標(biāo)文件名。假設(shè)MASM程序在D盤MASM目錄下,目標(biāo)模塊為、和,則
D:\MASM>LINKObjectModeles[.obj]:↙Run]:mainfile↙List]:mainfile↙Libraries[.lib]:↙第十五頁(yè),共22頁(yè)。2.段的組合與定位連接程序在執(zhí)行時(shí)要對(duì)目標(biāo)模塊做兩遍掃描,第一遍掃描是對(duì)所有段分配段地址,并建立一張外部符號(hào)表;第二遍掃描是確定與這些外部符號(hào)有關(guān)的指令機(jī)器碼值。連接完成后建立了裝入模塊,再由裝入程序把該模塊裝入內(nèi)存等待執(zhí)行。對(duì)所有段分配段地址,涉及到段定義中的屬性以及PC機(jī)的可重定位技術(shù)。匯編程序匯編成的目標(biāo)模塊均是以浮動(dòng)的零作為段起始地址,理論上講該模塊可以定位在主存中的任何地方。而連接程序可實(shí)現(xiàn)多個(gè)目標(biāo)模塊的連接,并按各段的新定位地址修改有關(guān)的目標(biāo)代碼,使之成為一個(gè)整體來(lái)運(yùn)行。在用連接程序?qū)⒍鄠€(gè)目標(biāo)模塊連接在一起時(shí),被連接模塊要向連接程序提供兩個(gè)方面的信息:各段之間的組合方式和各模塊之間的通信方式。各段之間的組合方式由段定義中的組合類型和類別確定。
第十六頁(yè),共22頁(yè)。LINK程序連接時(shí),先處理組合類型,后處理定位類型,再處理‘類別’,因此,各模塊中具有同一種組合形式的段,其定位類型不得相互矛盾,‘類別’名或者省略,或者相同。L1NK程序連接時(shí)把‘類別’名相同的所有段(段名未必相同)放在連續(xù)的存儲(chǔ)區(qū)內(nèi),但仍然是不同的段?!悇e’名相同的各個(gè)段在連接時(shí),先出現(xiàn)的在前,后出現(xiàn)的在后,每段都有自己的超始地址。沒(méi)有類別名的邏輯段,與其它沒(méi)有類別名的邏輯段一起連續(xù)裝入內(nèi)存。若多個(gè)模塊的段都為COMMON組合類型,連接后組合成一個(gè)互相覆蓋的段,段的長(zhǎng)度取二者的長(zhǎng)者,這種連接方法只有當(dāng)各模塊需要公共數(shù)據(jù)區(qū)時(shí)才使用,否則各數(shù)據(jù)段內(nèi)容相互覆蓋便會(huì)出錯(cuò)。若多個(gè)模塊的段都為PUBLIC組合類型,連接后組合成一個(gè)相鄰連接的段,互不覆蓋,連接順序由連接程序確定,組合后形成的段的長(zhǎng)度約等于各個(gè)段長(zhǎng)度之和。返回第十七頁(yè),共22頁(yè)。7.5源程序綜合舉例[例:]從鍵盤輸入的一個(gè)長(zhǎng)度不超過(guò)50個(gè)字符的字符串,將其中的小寫字母轉(zhuǎn)變?yōu)榇髮懽帜篙敵?,非字母字符不變。解:可按題意和前面講述的原則,把整個(gè)程序分成3個(gè)模塊:模塊1是主程序,通過(guò)調(diào)用模塊2和模塊3定義的子程序?qū)崿F(xiàn)接收字符串以及小寫字母轉(zhuǎn)換大寫字母的任務(wù);模塊2定義子程序IN_SUB接收輸入的字符串及子程序OUT_SUB輸出字符串;模塊3定義子程序TRANS將串中的大寫字母轉(zhuǎn)換成小寫字母。應(yīng)用例子層次圖
第十八頁(yè),共22頁(yè)。;主模塊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é)束第十九頁(yè),共22頁(yè)。;子模塊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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園工作總結(jié)感恩每一天
- 2024年設(shè)備監(jiān)理師考試題庫(kù)含答案(綜合卷)
- 演藝經(jīng)紀(jì)人的工作總結(jié)
- 服裝行業(yè)的搭配顧問(wèn)工作總結(jié)
- 建材行業(yè)行政后勤工作總結(jié)
- 2025年高考?xì)v史一輪復(fù)習(xí)之文化傳承與文化創(chuàng)新
- 花藝裝飾行業(yè)美工工作技能總結(jié)
- 2024年設(shè)備監(jiān)理師考試題庫(kù)及答案【真題匯編】
- 2024消防安全知識(shí)教育總結(jié)范文(35篇)
- 農(nóng)村蓋房傷亡合同(2篇)
- 大慶市2025屆高三年級(jí)第二次教學(xué)質(zhì)量檢測(cè)(二模)政治試卷(含答案)
- 2025年內(nèi)江資中縣融媒體中心招考聘用新媒體工作人員3人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 裝修材料合同范例
- 【7地RJ期末】安徽省合肥市廬江縣2023-2024學(xué)年七年級(jí)上學(xué)期期末地理試題(含解析)
- 共用線路三方協(xié)議合同范例
- 戰(zhàn)略規(guī)劃的關(guān)鍵要點(diǎn)
- 社會(huì)工作服務(wù)質(zhì)量保障措施
- 雅禮中學(xué)2024-2025學(xué)年初三創(chuàng)新人才選拔數(shù)學(xué)試題及答案
- 冬季高空作業(yè)施工方案
- 山西云時(shí)代技術(shù)有限公司招聘筆試題目
- 2024-2025學(xué)年人教版九年級(jí)數(shù)學(xué)上學(xué)期復(fù)習(xí):圓的綜合解答題 壓軸題型專項(xiàng)訓(xùn)練(30道題)
評(píng)論
0/150
提交評(píng)論