




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、匯編語言匯編語言程序設(shè)計程序設(shè)計 模塊化程序設(shè)計概述 段的定義 模塊間的通訊 模塊的連接 源程序綜合舉例 匯編語言匯編語言程序設(shè)計程序設(shè)計7.1.1 模塊化程序設(shè)計概念模塊化程序設(shè)計概念 在設(shè)計大型程序時,常常要將整個問題分解為若干在設(shè)計大型程序時,常常要將整個問題分解為若干個小問題,必要時還要將小問題再次分解為更小的若干個小問題,必要時還要將小問題再次分解為更小的若干問題,每個小問題編寫成獨立的源文件,最后將所有的問題,每個小問題編寫成獨立的源文件,最后將所有的源文件連接起來組合成一個大程序。也就是說,一個程源文件連接起來組合成一個大程序。也就是說,一個程序往往由多個源文件組成,那么構(gòu)成一個
2、程序的各個相序往往由多個源文件組成,那么構(gòu)成一個程序的各個相對獨立的源文件通常稱為模塊。這樣把一個程序分成多對獨立的源文件通常稱為模塊。這樣把一個程序分成多個功能相對獨立的程序模塊分別編制、調(diào)試后,再用連個功能相對獨立的程序模塊分別編制、調(diào)試后,再用連接程序把它們連接在一起生成一個完整的程序的設(shè)計的接程序把它們連接在一起生成一個完整的程序的設(shè)計的方法稱為模塊化程序設(shè)計。方法稱為模塊化程序設(shè)計。 7.1.2 模塊化程序設(shè)計的優(yōu)點模塊化程序設(shè)計的優(yōu)點 開發(fā)速度快開發(fā)速度快 可維護(hù)性與可讀性強(qiáng)可維護(hù)性與可讀性強(qiáng) 可移埴性強(qiáng)可移埴性強(qiáng)匯編語言匯編語言程序設(shè)計程序設(shè)計7.1.3 模塊劃分的原則和方法模塊
3、劃分的原則和方法 模塊的劃分應(yīng)該是靈活的,但不應(yīng)是程序的等分,模塊的劃分應(yīng)該是靈活的,但不應(yīng)是程序的等分,應(yīng)使各模塊具有相對的獨立性和完整性,可以單獨編程、應(yīng)使各模塊具有相對的獨立性和完整性,可以單獨編程、調(diào)試,但也要考慮各個模塊之間的聯(lián)系。模塊劃分是一調(diào)試,但也要考慮各個模塊之間的聯(lián)系。模塊劃分是一個自上而下的過程。主模塊是一個總控模塊,首先確定個自上而下的過程。主模塊是一個總控模塊,首先確定主要的模塊,也就是說,要把總?cè)蝿?wù)劃分成幾個主要的主要的模塊,也就是說,要把總?cè)蝿?wù)劃分成幾個主要的子任務(wù)。一般來說,可以分成輸入任務(wù)、輸出任務(wù)和一子任務(wù)。一般來說,可以分成輸入任務(wù)、輸出任務(wù)和一個或多個進(jìn)
4、行處理或計算的子任務(wù)。在劃分子模塊的過個或多個進(jìn)行處理或計算的子任務(wù)。在劃分子模塊的過程中應(yīng)該明確每個模塊的功能、數(shù)據(jù)結(jié)構(gòu)及相互之間的程中應(yīng)該明確每個模塊的功能、數(shù)據(jù)結(jié)構(gòu)及相互之間的關(guān)系。第二步,對這些主要的子模塊根據(jù)需要再劃分成關(guān)系。第二步,對這些主要的子模塊根據(jù)需要再劃分成下一層的子模塊。第三步,重復(fù)上述過程,一直到程序下一層的子模塊。第三步,重復(fù)上述過程,一直到程序分成易于理解和易于實現(xiàn)的小模塊為止。分成易于理解和易于實現(xiàn)的小模塊為止。匯編語言匯編語言程序設(shè)計程序設(shè)計 1. 1. 模塊劃分的原則模塊劃分的原則 (1) (1) 一個主模塊完成對各子模塊的調(diào)用,實現(xiàn)總體任務(wù),一個主模塊完成對
5、各子模塊的調(diào)用,實現(xiàn)總體任務(wù),而每個子模塊完成相應(yīng)的子任務(wù),各模塊間除應(yīng)在功能上分開,而每個子模塊完成相應(yīng)的子任務(wù),各模塊間除應(yīng)在功能上分開,邏輯上獨立,減少橫向聯(lián)系外,不能使用轉(zhuǎn)移指令在模塊間轉(zhuǎn)邏輯上獨立,減少橫向聯(lián)系外,不能使用轉(zhuǎn)移指令在模塊間轉(zhuǎn)來轉(zhuǎn)去,避免邏輯上的混亂;來轉(zhuǎn)去,避免邏輯上的混亂; (2) (2) 子模塊大小應(yīng)適中,模塊過大就失去了模塊化的意子模塊大小應(yīng)適中,模塊過大就失去了模塊化的意義,也會給編程和調(diào)試帶來一定困難;模塊過小,會在的時間義,也會給編程和調(diào)試帶來一定困難;模塊過小,會在的時間和空間上造成浪費;和空間上造成浪費; (3) (3) 差別很大的兩個程序段應(yīng)作為兩個
6、模塊;差別很大的兩個程序段應(yīng)作為兩個模塊; (4) (4) 當(dāng)一些數(shù)據(jù)被多個程序段所公用,那么這些數(shù)據(jù)所當(dāng)一些數(shù)據(jù)被多個程序段所公用,那么這些數(shù)據(jù)所在的程序段應(yīng)作為一個模塊;在的程序段應(yīng)作為一個模塊; (5) (5) 當(dāng)某些程序功能片段為多個模塊所公用時,應(yīng)將它當(dāng)某些程序功能片段為多個模塊所公用時,應(yīng)將它們作為公用子程序模塊;們作為公用子程序模塊; (6) (6) 各個模塊的結(jié)構(gòu)最好能設(shè)計為單入口、單出口的形各個模塊的結(jié)構(gòu)最好能設(shè)計為單入口、單出口的形式,各模塊間的接口應(yīng)該簡單,要盡量減少公共標(biāo)識符的個數(shù)。式,各模塊間的接口應(yīng)該簡單,要盡量減少公共標(biāo)識符的個數(shù)。匯編語言匯編語言程序設(shè)計程序設(shè)計
7、2.2.模塊劃分的方法模塊劃分的方法 (1) (1) 層次圖層次圖 層次圖是表示模塊與模塊之間關(guān)系的方塊圖。層次層次圖是表示模塊與模塊之間關(guān)系的方塊圖。層次圖的頂端是主模塊,即一個總控制塊,直接控制位于其圖的頂端是主模塊,即一個總控制塊,直接控制位于其下一層的各個模塊的執(zhí)行,而各主要的子模塊再去控制下一層的各個模塊的執(zhí)行,而各主要的子模塊再去控制其下一層的子模塊。其下一層的子模塊。 (2) (2) 模塊說明模塊說明 模塊說明是對模塊的功能、算法、模塊輸入和輸出模塊說明是對模塊的功能、算法、模塊輸入和輸出以及它們的數(shù)據(jù)結(jié)構(gòu)的簡單說明。應(yīng)該考慮程序中哪些以及它們的數(shù)據(jù)結(jié)構(gòu)的簡單說明。應(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è)計程序設(shè)計7.2 7.2 段的定義段的定義 SEGMENT SEGMENT偽指令的完整的格式為:偽指令的完整的格式為: 段名段名 SEGMENT SEGMENT 定位類型定位類型 組合類型組合類型 類別類別 段名段名 ENDSENDS 7.2.1 7.2.1 定位類型定位類型 定位類型用于指定該段的段起始地址的特性,也稱為定位屬性或?qū)R屬性。連接程序定位類型用于指定該段的段起始地址的特性,也稱為定位屬性或?qū)R
9、屬性。連接程序連接目標(biāo)文件時,根據(jù)定位類型來確定段的開始地址。一共有連接目標(biāo)文件時,根據(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 3DWOR
10、D(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é)邊界開始,也就是說可以從任意單元地址起,也就是說為下一個段的起始地址從字節(jié)邊界開始,也就是說可以從任意單元地
11、址起,也就是說為下一個可用的字節(jié)地址開始??捎玫淖止?jié)地址開始。 當(dāng)段定義中沒有指定段的定位類型時,定位類型的缺省方式為當(dāng)段定義中沒有指定段的定位類型時,定位類型的缺省方式為PARAPARA。匯編語言匯編語言程序設(shè)計程序設(shè)計7.2.2 7.2.2 組合類型組合類型 組合類型也稱為組合屬性,組合類型標(biāo)明本段與其他模塊中組合類型也稱為組合屬性,組合類型標(biāo)明本段與其他模塊中同名段的組合連接關(guān)系,是用于控制本段與其他模塊中的同名、同名段的組合連接關(guān)系,是用于控制本段與其他模塊中的同名、同類型段的組合連接方式,有五種可選的組合類型。同類型段的組合連接方式,有五種可選的組合類型。 1 1PUBLICPUBL
12、IC 連接程序?qū)⒉煌K中的具有連接程序?qū)⒉煌K中的具有PUBLlCPUBLlC屬性的同名段連接在一屬性的同名段連接在一起,形成一個新的段,公用一個段基址。起,形成一個新的段,公用一個段基址。 2 2STACKSTACK STACK STACK與與PLIBLICPLIBLIC的處理方式一樣,只是連接后的段為堆棧段,的處理方式一樣,只是連接后的段為堆棧段,連接程序在連接過程中自動將新段的段基址送到堆棧段寄存器連接程序在連接過程中自動將新段的段基址送到堆棧段寄存器SSSS,新段的長度送到堆棧指針寄存器新段的長度送到堆棧指針寄存器SPSP。當(dāng)堆棧段定義時沒有說明為當(dāng)堆棧段定義時沒有說明為STACK
13、STACK類型,就要在程序中用指令給堆棧段寄存器類型,就要在程序中用指令給堆棧段寄存器SSSS和堆棧指針和堆棧指針寄存器寄存器 SPSP賦值,不然連接程序時就會產(chǎn)生警告信息。賦值,不然連接程序時就會產(chǎn)生警告信息。 3 3COMMONCOMMON COMMON COMMON類型會產(chǎn)生一個覆蓋段,連接程序把該類型的同名段類型會產(chǎn)生一個覆蓋段,連接程序把該類型的同名段指定相同的段地址,段的長度取決于最長的指定相同的段地址,段的長度取決于最長的COMMONCOMMON段的長度。段的長度。匯編語言匯編語言程序設(shè)計程序設(shè)計 4 4MEMORYMEMORY 連接程序不單獨區(qū)分連接程序不單獨區(qū)分MEMORYM
14、EMORY類型,把類型,把MEMORYMEMORY與與PUBLICPUBLIC類型同等對待。類型同等對待。MASMMASM程序允許使用它主要是為了與其他支持程序允許使用它主要是為了與其他支持Intel MEMORYIntel MEMORY類型的連接程序兼類型的連接程序兼容。容。 5 5ATAT表達(dá)式表達(dá)式 連接程序?qū)⒕哂羞B接程序?qū)⒕哂蠥TAT類型的段裝在表達(dá)式值所指定的段地址邊界上。這個類型的段裝在表達(dá)式值所指定的段地址邊界上。這個類型可以為標(biāo)號或變量賦予絕對地址,以便程序以標(biāo)號或變量的形式存取這類型可以為標(biāo)號或變量賦予絕對地址,以便程序以標(biāo)號或變量的形式存取這些存儲單元的內(nèi)容。一般在些存儲單
15、元的內(nèi)容。一般在ATAT類型的段中不定義指令或數(shù)據(jù),只說明一個地類型的段中不定義指令或數(shù)據(jù),只說明一個地址結(jié)構(gòu)。址結(jié)構(gòu)。 6 6NONENONE NONE NONE為默認(rèn)值,表示該段是獨立的,與其他同名段無組合關(guān)系,每段都為默認(rèn)值,表示該段是獨立的,與其他同名段無組合關(guān)系,每段都有自己的段起始地址。有自己的段起始地址。 7.2.3 7.2.3 類別類別 “ “類別類別”用于控制各段的存放順序,類別名相同的所有段要相鄰存放。用于控制各段的存放順序,類別名相同的所有段要相鄰存放。類別名可以是用單引號括起來任何合法的名稱,若類別名可以是用單引號括起來任何合法的名稱,若類別類別選擇項省略,則選擇項省略
16、,則表明該段類別為空。典型的類別名有:用于代碼段的表明該段類別為空。典型的類別名有:用于代碼段的CODECODE、用于數(shù)據(jù)段用于數(shù)據(jù)段的的DATADATA和用于堆棧段的和用于堆棧段的STACKSTACK。 匯編語言匯編語言程序設(shè)計程序設(shè)計7.3 模塊間的通訊模塊間的通訊 7.3.1 7.3.1 各模塊之間的通信方式各模塊之間的通信方式 當(dāng)程序由幾個模塊組成時,勢必存在一個模塊使用另當(dāng)程序由幾個模塊組成時,勢必存在一個模塊使用另一個模塊中定義的變量、標(biāo)號以及子程序等問題。由于子一個模塊中定義的變量、標(biāo)號以及子程序等問題。由于子程序與調(diào)用它的語句,定義變量、標(biāo)號及使用變量、標(biāo)號程序與調(diào)用它的語句,
17、定義變量、標(biāo)號及使用變量、標(biāo)號的語句分別在不同的模塊中,匯編是分開進(jìn)行的,匯編程的語句分別在不同的模塊中,匯編是分開進(jìn)行的,匯編程序無法知道子程序入口地址及變量、標(biāo)號的地址。因此,序無法知道子程序入口地址及變量、標(biāo)號的地址。因此,要由連接程序匯集各模塊送來的地址信息,綜合決定各個要由連接程序匯集各模塊送來的地址信息,綜合決定各個調(diào)用指令的轉(zhuǎn)移地址及變量、標(biāo)號地址。因此,匯編語言調(diào)用指令的轉(zhuǎn)移地址及變量、標(biāo)號地址。因此,匯編語言提供了幾種偽指令來完成不同模塊間的通訊。提供了幾種偽指令來完成不同模塊間的通訊。 1 1 TITLETITLE 格式:格式:TITLE TITLE 標(biāo)題標(biāo)題 功能:給原程
18、序指定一個標(biāo)題,而后功能:給原程序指定一個標(biāo)題,而后. .LSTLST文件每頁的文件每頁的頭都會出現(xiàn)這個標(biāo)題。頭都會出現(xiàn)這個標(biāo)題。 匯編語言匯編語言程序設(shè)計程序設(shè)計2 2NAMENAME和和ENDEND 在模塊化程序設(shè)計中,常要用到模塊定義偽指令。模塊定義使用在模塊化程序設(shè)計中,常要用到模塊定義偽指令。模塊定義使用NAMENAME和和ENDEND兩條偽指令。兩條偽指令。 模塊定義偽指令的一般格式為:模塊定義偽指令的一般格式為: 格式:格式: NAME NAME 模塊名模塊名 END END 標(biāo)號標(biāo)號 模塊名為本模塊的名稱,是模塊名為本模塊的名稱,是NAMENAME的操作數(shù);的操作數(shù);ENDEN
19、D表示源程序到此結(jié)束,表示源程序到此結(jié)束,若程序包含多個模塊,則每個模塊的最后必須有若程序包含多個模塊,則每個模塊的最后必須有ENDEND,如果是主模塊,其如果是主模塊,其ENDEND語句中可以指定一個標(biāo)號,這個標(biāo)號表示程序的啟動地址,只有主模語句中可以指定一個標(biāo)號,這個標(biāo)號表示程序的啟動地址,只有主模塊的塊的ENDEND語句后有標(biāo)號。語句后有標(biāo)號。匯編語言匯編語言程序設(shè)計程序設(shè)計 3 3PUBLICPUBLIC偽指令偽指令 格式:格式:PUBLIC PUBLIC 標(biāo)識符標(biāo)識符 , ,標(biāo)識符標(biāo)識符,.,. 功能:表明本模塊中所定義的標(biāo)識符能夠提供給其他模功能:表明本模塊中所定義的標(biāo)識符能夠提供
20、給其他模塊引用。塊引用。 在一模塊中,在一模塊中,PUBLICPUBLIC偽指令語句一般放在程序的開頭,偽指令語句一般放在程序的開頭,只能說明一次。只能說明一次。PUBLICPUBLIC偽指令其后的標(biāo)識符是本模塊定義的偽指令其后的標(biāo)識符是本模塊定義的可供其他模塊調(diào)用的標(biāo)識符。這些標(biāo)識符是在本模塊中定義可供其他模塊調(diào)用的標(biāo)識符。這些標(biāo)識符是在本模塊中定義的符號常量、標(biāo)號、過程名或變量,各名字之間用逗號隔開。的符號常量、標(biāo)號、過程名或變量,各名字之間用逗號隔開。注意:寄存器名或其值為實數(shù)及其值超過兩個字節(jié)的整數(shù)的注意:寄存器名或其值為實數(shù)及其值超過兩個字節(jié)的整數(shù)的符號常量均不能作公共標(biāo)識符使用。符
21、號常量均不能作公共標(biāo)識符使用。 一旦經(jīng)過一旦經(jīng)過PUBLICPUBLIC偽指令定義,偽指令定義,EXAMEXAM子程序就成為公共子子程序就成為公共子程序,即可被多個不同模塊調(diào)用。程序,即可被多個不同模塊調(diào)用。 匯編語言匯編語言程序設(shè)計程序設(shè)計 4 4EXTRNEXTRN偽指令偽指令 格式:格式:EXTRNEXTRN標(biāo)識符:類型標(biāo)識符:類型 ,標(biāo)識符:類型,標(biāo)識符:類型, 功能:用來說明本模塊中用到的標(biāo)識符是由其它模塊功能:用來說明本模塊中用到的標(biāo)識符是由其它模塊定義的,即本模塊要引用其他模塊定義的標(biāo)識符。定義的,即本模塊要引用其他模塊定義的標(biāo)識符。 EXTRN EXTRN是偽指令,其后的標(biāo)識符
22、就是本模塊中要引用是偽指令,其后的標(biāo)識符就是本模塊中要引用的外部標(biāo)識符。而且標(biāo)識符必須指出其類型。變量的類型的外部標(biāo)識符。而且標(biāo)識符必須指出其類型。變量的類型可以是可以是BYTEBYTE,WORDWORD或或DWORDDWORD,標(biāo)號和過程名的類型可以是標(biāo)號和過程名的類型可以是NEARNEAR或或FARFAR。所有的標(biāo)識符類型必須與原定義時的類型一所有的標(biāo)識符類型必須與原定義時的類型一致;被致;被EXTRNEXTRN偽指令說明的標(biāo)識符必須是在它所定義的模偽指令說明的標(biāo)識符必須是在它所定義的模塊中被塊中被PUBLICPUBLIC偽指令說明過的標(biāo)識符。偽指令說明過的標(biāo)識符。匯編語言匯編語言程序設(shè)計
23、程序設(shè)計7.4 模塊的連接模塊的連接 在模塊化程序設(shè)計中,一個大的程序分成了若干子模塊,每個模在模塊化程序設(shè)計中,一個大的程序分成了若干子模塊,每個模塊具有完整的結(jié)構(gòu)和獨立的功能,并且能單獨匯編和調(diào)試。在實際使塊具有完整的結(jié)構(gòu)和獨立的功能,并且能單獨匯編和調(diào)試。在實際使用時如何將這些具有獨立功能的模塊連接成一個完整的整體呢用時如何將這些具有獨立功能的模塊連接成一個完整的整體呢? ?一般一般分兩種情況:源程序級間的裝配連接和目標(biāo)文件級間的裝配連接。分兩種情況:源程序級間的裝配連接和目標(biāo)文件級間的裝配連接。 7.4.1 源程序級間的裝配連接源程序級間的裝配連接 將若干個源文件(將若干個源文件(*
24、*. .ASMASM)連成一個完整的文件,匯編后形成一連成一個完整的文件,匯編后形成一個目標(biāo)模塊個目標(biāo)模塊( .( .OBJ)OBJ)方式,稱為源程序裝配連接。源程序級間的裝配方式,稱為源程序裝配連接。源程序級間的裝配連接常常是被裝配的若干模塊分別以源文件的形式存在,當(dāng)需要在源連接常常是被裝配的若干模塊分別以源文件的形式存在,當(dāng)需要在源主程序中插入一個已存在的子程序文件,或是多個源文件要合成一塊主程序中插入一個已存在的子程序文件,或是多個源文件要合成一塊的時候使用。的時候使用。匯編語言匯編語言程序設(shè)計程序設(shè)計7.4.2 目標(biāo)文件級間的裝配連接目標(biāo)文件級間的裝配連接 目標(biāo)模塊連接就是通常所說的模
25、塊連接,是多模塊程序設(shè)計的主要形目標(biāo)模塊連接就是通常所說的模塊連接,是多模塊程序設(shè)計的主要形式。目標(biāo)模塊連接是把被裝配的各個模塊分別匯編后生成各自的目標(biāo)文件式。目標(biāo)模塊連接是把被裝配的各個模塊分別匯編后生成各自的目標(biāo)文件(.(.obj)obj)經(jīng)連接成一個可執(zhí)行文件經(jīng)連接成一個可執(zhí)行文件, ,它的實現(xiàn)比源文件連接復(fù)雜。它的實現(xiàn)比源文件連接復(fù)雜。 1 1目標(biāo)模塊連接目標(biāo)模塊連接 目標(biāo)模塊的連接時要使用連接程序目標(biāo)模塊的連接時要使用連接程序LINKLINK,通過通過LINKLINK將各模塊連接成一將各模塊連接成一個可執(zhí)行程序。命令格式如下:個可執(zhí)行程序。命令格式如下: LINK LINK 模塊模塊
26、l l文件名十模塊文件名十模塊2 2文件名十模塊文件名十模塊3 3文件名十文件名十 在在LINKLINK執(zhí)行時,向使用者詢問可執(zhí)行文件名時,回答一個指定的文件執(zhí)行時,向使用者詢問可執(zhí)行文件名時,回答一個指定的文件名,則連接后的可執(zhí)行文件名就是回答中所指定的文件名;如果沒有回答名,則連接后的可執(zhí)行文件名就是回答中所指定的文件名;如果沒有回答指定文件名,則連接后可執(zhí)行文件名將取所提供的第一個目標(biāo)文件名。假指定文件名,則連接后可執(zhí)行文件名將取所提供的第一個目標(biāo)文件名。假設(shè)設(shè)MASMMASM程序在程序在D D盤盤MASMMASM目錄下,目標(biāo)模塊為目錄下,目標(biāo)模塊為file_1.objfile_1.ob
27、j、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.obj ObjectModeles.obj: RunFilefile_1.exe RunFilefile_1.exe:mainfilemainfile ListFilenul.map ListFilenul.map:mainfilemainfile Libraries.lib Libraries.lib:匯編語言匯編語言程序設(shè)計程序設(shè)計2 2段的組
28、合與定位段的組合與定位 連接程序在執(zhí)行時要對目標(biāo)模塊做兩遍掃描,第一遍掃描是對所有連接程序在執(zhí)行時要對目標(biāo)模塊做兩遍掃描,第一遍掃描是對所有段分配段地址,并建立一張外部符號表;第二遍掃描是確定與這些外部段分配段地址,并建立一張外部符號表;第二遍掃描是確定與這些外部符號有關(guān)的指令機(jī)器碼值。連接完成后建立了裝入模塊,再由裝入程序符號有關(guān)的指令機(jī)器碼值。連接完成后建立了裝入模塊,再由裝入程序把該模塊裝入內(nèi)存等待執(zhí)行。把該模塊裝入內(nèi)存等待執(zhí)行。 對所有段分配段地址,涉及到段定義中的屬性以及對所有段分配段地址,涉及到段定義中的屬性以及PCPC機(jī)的可重定位技機(jī)的可重定位技術(shù)。匯編程序匯編成的目標(biāo)模塊均是以
29、浮動的零作為段起始地址,理論術(shù)。匯編程序匯編成的目標(biāo)模塊均是以浮動的零作為段起始地址,理論上講該模塊可以定位在主存中的任何地方。而連接程序可實現(xiàn)多個目標(biāo)上講該模塊可以定位在主存中的任何地方。而連接程序可實現(xiàn)多個目標(biāo)模塊的連接,并按各段的新定位地址修改有關(guān)的目標(biāo)代碼,使之成為一模塊的連接,并按各段的新定位地址修改有關(guān)的目標(biāo)代碼,使之成為一個整體來運行。在用連接程序?qū)⒍鄠€目標(biāo)模塊連接在一起時,被連接模個整體來運行。在用連接程序?qū)⒍鄠€目標(biāo)模塊連接在一起時,被連接模塊要向連接程序提供兩個方面的信息:各段之間的組合方式和各模塊之塊要向連接程序提供兩個方面的信息:各段之間的組合方式和各模塊之間的通信方式。
30、各段之間的組合方式由段定義中的組合類型和類別確定。間的通信方式。各段之間的組合方式由段定義中的組合類型和類別確定。 匯編語言匯編語言程序設(shè)計程序設(shè)計LINKLINK程序連接時,先處理組合類型,后處理定位類型,再處理程序連接時,先處理組合類型,后處理定位類型,再處理類類別別,因此,各模塊中具有同一種組合形式的段,其定位類型不得相,因此,各模塊中具有同一種組合形式的段,其定位類型不得相互矛盾,互矛盾,類別類別名或者省略,或者相同。名或者省略,或者相同。L1NKL1NK程序連接時把程序連接時把類別類別名相同的所有段名相同的所有段( (段名未必相同段名未必相同) )放在連續(xù)的存儲區(qū)內(nèi),但仍然是不同放在
31、連續(xù)的存儲區(qū)內(nèi),但仍然是不同的段。的段。類別類別名相同的各個段在連接時,先出現(xiàn)的在前,后出現(xiàn)的名相同的各個段在連接時,先出現(xiàn)的在前,后出現(xiàn)的在后,每段都有自己的超始地址。沒有類別名的邏輯段,與其它沒有在后,每段都有自己的超始地址。沒有類別名的邏輯段,與其它沒有類別名的邏輯段一起連續(xù)裝入內(nèi)存。類別名的邏輯段一起連續(xù)裝入內(nèi)存。 若多個模塊的段都為若多個模塊的段都為COMMONCOMMON組合類型,連接后組合成一個互相覆組合類型,連接后組合成一個互相覆蓋的段,段的長度取二者的長者,這種連接方法只有當(dāng)各模塊需要公蓋的段,段的長度取二者的長者,這種連接方法只有當(dāng)各模塊需要公共數(shù)據(jù)區(qū)時才使用,否則各數(shù)據(jù)段
32、內(nèi)容相互覆蓋便會出錯。若多個模共數(shù)據(jù)區(qū)時才使用,否則各數(shù)據(jù)段內(nèi)容相互覆蓋便會出錯。若多個模塊的段都為塊的段都為PUBLICPUBLIC組合類型,連接后組合成一個相鄰連接的段,互不組合類型,連接后組合成一個相鄰連接的段,互不覆蓋,連接順序由連接程序確定,組合后形成的段的長度約等于各個覆蓋,連接順序由連接程序確定,組合后形成的段的長度約等于各個段長度之和。段長度之和。匯編語言匯編語言程序設(shè)計程序設(shè)計7.5 源程序綜合舉例源程序綜合舉例 例例: : 從鍵盤輸入的一個長度不超過從鍵盤輸入的一個長度不超過5050個字符的字符串,將其個字符的字符串,將其中的小寫字母轉(zhuǎn)變?yōu)榇髮懽帜篙敵觯亲帜缸址蛔?。中?/p>
33、小寫字母轉(zhuǎn)變?yōu)榇髮懽帜篙敵?,非字母字符不變?解:可按題意和前面講述的原則,把整個程序分成解:可按題意和前面講述的原則,把整個程序分成3 3個模塊:個模塊: 模塊模塊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將串中的大寫字母轉(zhuǎn)換成小寫字母。
34、將串中的大寫字母轉(zhuǎn)換成小寫字母。 應(yīng)用例子層次圖應(yīng)用例子層次圖 匯編語言匯編語言程序設(shè)計程序設(shè)計;主模塊;主模塊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 STACKSEGMENT STACK STACKD
35、W 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, AXMOV DS, AXCAL
36、L 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è)計程序設(shè)計;子模塊;子模塊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等.壓縮文件請下載最新的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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 食品安全知識在營養(yǎng)餐制作中的應(yīng)用
- 馬桶淘寶采購合同范本
- 大連汽車職業(yè)技術(shù)學(xué)院《擊劍俱樂部(中級)》2023-2024學(xué)年第二學(xué)期期末試卷
- 跨國企業(yè)內(nèi)貿(mào)流程與優(yōu)化策略匯報
- 2025屆廣西南寧地區(qū)三下數(shù)學(xué)期末復(fù)習(xí)檢測模擬試題含解析
- 超聲波在農(nóng)業(yè)檢測中的應(yīng)用前景
- 嘉興職業(yè)技術(shù)學(xué)院《建筑設(shè)備(水)》2023-2024學(xué)年第二學(xué)期期末試卷
- 湖北中醫(yī)藥高等??茖W(xué)?!稊?shù)據(jù)庫原理與應(yīng)用(MySQL)》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣東培正學(xué)院《證券法》2023-2024學(xué)年第二學(xué)期期末試卷
- 西安醫(yī)學(xué)高等??茖W(xué)校《馬克思主義發(fā)展史》2023-2024學(xué)年第二學(xué)期期末試卷
- 小學(xué)信息技術(shù)-第8冊全冊-6年級下-電子工業(yè)出版社
- 《網(wǎng)絡(luò)攻擊與防御》課件第四章 基于系統(tǒng)的攻擊與防御
- 供電一把手講安全課
- JTG∕T F30-2014 公路水泥混凝土路面施工技術(shù)細(xì)則
- 建設(shè)工程施工專業(yè)分包合同(GF-2003-0213)
- 司法心理學(xué)課件
- 耳鼻喉科各項規(guī)章制度
- 湖南科技職業(yè)學(xué)院單招職業(yè)技能測試參考試題庫(含答案)
- 玻璃分化板制作工藝
- 減鹽減油健康教育
- 電動平車使用說明書
評論
0/150
提交評論