匯編語言源程序格式_第1頁
匯編語言源程序格式_第2頁
匯編語言源程序格式_第3頁
匯編語言源程序格式_第4頁
匯編語言源程序格式_第5頁
已閱讀5頁,還剩92頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第2章 匯編語言程序格式,2.1 匯編語言語句格式 2.2 偽指令 2.3 匯編語言源程序基本框架,2.1 匯編語言語句格式,同其他程序設(shè)計語言一樣,匯編語言的翻譯器(匯編程序)對源程序有嚴(yán)格的格式要求。這樣,匯編程序才能確切翻譯源程序,形成功能等價的機器指令(目標(biāo)代碼),連接后能直接運行。匯編語言程序格式就是匯編語言必須遵循的語法規(guī)則。,2.1.1 匯編語言語句類型,匯編語言源程序由語句序列構(gòu)成,匯編語言程序中的語句可以分為指令語句、偽指令語句和宏指令語句三種。 (1)指令語句:對應(yīng)于CPU指令系統(tǒng)中的一條機器指令,由CPU執(zhí)行,能完成一定操作功能,能夠翻譯成機器代碼的語句。 (2)偽指令語

2、句:無對應(yīng)的機器指令,不由CPU執(zhí)行,只為匯編程序在翻譯匯編語言源程序時提供有關(guān)信息,并不翻譯成機器代碼的語句。 (3)宏指令語句:就是由若干條指令語句形成的語句,一條宏指令語句的功能相當(dāng)于若干條指令語句的功能,詳見第5章。,2.1.2 匯編語言語句格式,匯編語言源程序中的每個語句可以由4項組成,格式如下: 名字: 操作碼 操作數(shù),操作數(shù) ;注釋 其中,名字項是一個符號項。 操作碼項是一個操作碼的助記符,它可以是指令、偽指令或宏指令名。 操作數(shù)項由一個或多個表達(dá)式組成,它提供為執(zhí)行所要求的操作而需要的信息。 注釋項用來說明程序或語句的功能。“;”為識別注釋項的開始。 帶方括號的項是可選項,需要

3、根據(jù)具體情況而定。 匯編語言源程序中的每條語句一般占一行,各項之間必須用空格或制表符作為分隔符,操作數(shù)之間用逗號分隔。,1名字項 名字是用戶按照一定規(guī)則定義的標(biāo)識符,可由下列符號組成: 字母 AZ、az 數(shù)字 09 特殊字符 ?、.、_、$ 數(shù)字不能作名字項的第一個字符。而圓點僅能用作第一個字符,可以用很多字符來說明名字,但只有前面的31個字符能被匯編程序所識別。為了便于記憶,名字的定義應(yīng)該能夠見名知義,如用BUFFER表示緩沖區(qū)、SUM表示累加和等。 名字有兩種形式:標(biāo)號或變量。指令語句中的名字通常用標(biāo)號表示,而偽指令語句中的名字通常用變量名、段名和過程名表示,多數(shù)情況下用變量名表示。,(1

4、)標(biāo)號 標(biāo)號在代碼段中定義,也可以用EQU或LABEL偽指令來定義,標(biāo)號與其所代表的指令之間用冒號分開,用來代表一條指令所在單元的地址。標(biāo)號也可以作為過程名定義。標(biāo)號經(jīng)常在轉(zhuǎn)移指令的操作數(shù)字段出現(xiàn),用以表示轉(zhuǎn)向的目標(biāo)地址。標(biāo)號在命名時,應(yīng)盡量取有意義的字符,以便程序的閱讀和理解。,標(biāo)號有3種屬性:段屬性、偏移屬性和類型屬性。 段屬性:標(biāo)號所代表指令單元的段起始地址,此值必須在一個段寄存器中,而標(biāo)號的段則總是在CS寄存器中。 偏移屬性:標(biāo)號所代表指令單元的段內(nèi)偏移地址,標(biāo)號的偏移地址是從段起始地址到定義標(biāo)號的位置之間的字節(jié)數(shù)。對于16位段是16位無符號數(shù)。 類型屬性:用來指出標(biāo)號是在本段內(nèi)引用還

5、是在其他段中引用的。如是在段內(nèi)引用的,則稱為NEAR,轉(zhuǎn)移源和轉(zhuǎn)移目標(biāo)在同一個代碼段中,轉(zhuǎn)移時,只改變IP值,不改變CS值;如在段外引用,則稱為FAR,轉(zhuǎn)移源和轉(zhuǎn)移目標(biāo)在不同的代碼段中,轉(zhuǎn)移時,既改變IP值,又改變CS值。,(2)變量 變量在除代碼段以外的其它段中定義,后面不跟冒號。它也可以用EQU或LABEL偽指令來定義。變量是一個可以存放數(shù)據(jù)的存儲單元的名字,即存放數(shù)據(jù)的存儲單元的地址符號名。變量用DB、DW、DD定義,此時變量名僅表示該數(shù)據(jù)區(qū)或存儲區(qū)的第一個數(shù)據(jù)單元的首地址。變量經(jīng)常在操作數(shù)字段出現(xiàn)。,變量也有3種屬性:段屬性、偏移屬性和類型屬性。 段屬性:變量所代表數(shù)據(jù)單元的段起始地址

6、,此值必須在一個段寄存器中(DS、ES或SS中)。 偏移屬性:變量所代表數(shù)據(jù)單元的段內(nèi)偏移地址,變量的偏移地址是從段的起始地址到定義變量的位置之間的字節(jié)數(shù)。對于16位段是16位無符號數(shù)。在當(dāng)前段內(nèi)給出變量的偏移值等于當(dāng)前地址計數(shù)器的值,當(dāng)前地址計數(shù)器的值可以用$來表示。 類型屬性:變量的類型屬性定義該變量所保留的字節(jié)數(shù),如BYTE(1個字節(jié)長),WORD(2個字節(jié)長),DWORD(4個字節(jié)長)。這一點,將在數(shù)據(jù)定義偽指令中說明。 在同一個程序中,同樣的標(biāo)號或變量的定義只允許出現(xiàn)一次,否則匯編程序會指示出錯。,2操作碼項,操作碼項可以是指令、偽指令或宏指令的助記符。助記符表示指令語句的功能,如I

7、NC、MOV等,其符號與意義是由系統(tǒng)定義的,編程時必須照寫不誤,既不能多寫,也不能少寫,如果指令帶有前綴(如REP、REPE等),則指令前綴和指令助記符要用空格分開。 對于指令,匯編程序?qū)⑵浞g為機器語言指令。對于偽指令,匯編程序?qū)⒏鶕?jù)其所要求的功能進(jìn)行處理。對于宏指令,則將根據(jù)其定義展開。在第5章中將會專門討論。,3操作數(shù)項,指令中的操作數(shù)用來指定參與操作的數(shù)據(jù)。對于一般指令,可以有一個或兩個操作數(shù),也可以沒有操作數(shù);對于偽指令和宏指令,可以根據(jù)需要有多個操作數(shù)。操作數(shù)多于一個時,各操作數(shù)之間用逗號分開。,操作數(shù)可以是常數(shù)、寄存器、標(biāo)號、變量或由表達(dá)式組成。在這里,將專門對表達(dá)式加以說明。表

8、達(dá)式是常數(shù)、標(biāo)號、變量、寄存器與一些操作符相組合的序列,可以有數(shù)字表達(dá)式和地址表達(dá)式兩種。數(shù)字表達(dá)式由匯編程序根據(jù)優(yōu)先級規(guī)則計算得到一個常數(shù)值。地址表達(dá)式由匯編程序計算得到一個地址或一個常數(shù)值(地址間的距離長度)。 組成表達(dá)式的操作符有算術(shù)、邏輯、關(guān)系、數(shù)值返回、屬性操作符。,常用的操作符,算術(shù)操作符 邏輯與移位運算符 關(guān)系運算符 數(shù)值返回運算符 屬性運算符,算術(shù)操作符 算術(shù)運算符包括:+、*、/、MOD(取余)。 運算符MOD是作除法操作,取余數(shù),如10 MOD 3 = 1。 算術(shù)運算符可以用于數(shù)字表達(dá)式或地址表達(dá)式中。但當(dāng)它用于地址表達(dá)式時,只有當(dāng)其結(jié)果有明確的物理意義時才是有效的結(jié)果,例

9、如,兩個地址相乘或相除是無意義的。在地址表達(dá)式中,可以用+或-,但也必須注意其物理意義,例如把兩個不同段的地址相加也是無意義的。經(jīng)常使用的方法是“地址常量”來描述指針的移動,例如,SUM+1是指SUM字節(jié)單元的下一個字節(jié)單元的地址(注意:不是指SUM單元的內(nèi)容加1),而SUM-1則是指SUM字節(jié)單元的前一個字節(jié)單元的地址。,【例2.1】將首地址為ARRAY的字?jǐn)?shù)組的第6個字傳送到DX寄存器中。 MOV DX,ARRAY+(6-1)*2 【例2.2】數(shù)組ARR定義如下,試寫出把數(shù)組長度(字?jǐn)?shù))存入CX寄存器的指令。 ARR DW 1,2,3,4,5,6,7 ARREND DW ? 其中,ARRE

10、ND是為計算數(shù)組長度而建立的符號地址,則指令如下: MOV CX,(ARREND-ARR)/2 匯編程序在匯編期間將計算出表達(dá)式的值而形成指令: MOV CX,7,(2)邏輯與移位運算符 邏輯運算符 邏輯運算符包括:AND(邏輯與)、OR(邏輯或)、XOR(邏輯異或)、NOT(邏輯非)。 邏輯運算符是按位操作的,它的操作數(shù)只能是數(shù)字,且結(jié)果也為數(shù)字。邏輯運算符只能用在數(shù)字表達(dá)式中,不能用在地址表達(dá)式中。邏輯運算符和邏輯運算指令是有區(qū)別的,邏輯運算符的功能在匯編階段完成,邏輯運算指令的功能是在程序執(zhí)行階段完成。要注意AND、OR、XOR、NOT不是助記符,而是運算符。,【例2.3】AND AL,

11、78H AND 0FH 等價于: AND AL,08H 【例2.4】設(shè)VALUE是字節(jié)型變量,分析下面這條語句執(zhí)行完AL寄存器的內(nèi)容。 MOV AL,VALUE AND 01H 在匯編后,該語句的源操作數(shù)(VALUE AND 01H)可能產(chǎn)生兩個結(jié)果之一:當(dāng)VALUE值的D0位為1時,VALUE和01與操作的結(jié)果為01H,則該語句變成MOV AL,01H;當(dāng)VALUE值的D0位為0時,VALUE和01與操作的結(jié)果為00H,則該語句變成MOV AL,00H。因此,執(zhí)行后AL寄存器的內(nèi)容為01H或00H。,移位運算符 移位運算符有:SHL(邏輯左移)、SHR(邏輯右移) 格式: 表達(dá)式 SHL(或

12、SHR) n(移位次數(shù)) 匯編程序?qū)⒈磉_(dá)式左移或右移n位,高位或低位補0,若移位次數(shù)大于15,則結(jié)果為0。 【例2.5】VAL EQU 5H;符號常量VAL值=5H MOV AL,VAL SHR 1;VAL=00000101B邏輯 右移1位為00000010=2 注意:移位運算符SHL/SHR在操作數(shù)中,匯編時對常量進(jìn)行移位;而移位指令SHL/SHR是在指令的操作碼位置,執(zhí)行時對寄存器或存儲器單元中的操作數(shù)移位。,(3)關(guān)系運算符 關(guān)系運算符包括:EQ(等于)、NE(不等)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于)6種。 格式:表達(dá)式1 關(guān)系運算符 表達(dá)式2 計算結(jié)果,若

13、關(guān)系成立,則為全1,即0FFFFH;關(guān)系不成立,則為全0。,【例2.6】MOV BX,32 EQ 45 等價于: MOV BX,0 【例2.7】MOV BX,56 GT 30 等價于: MOV BX,0FFFFH 【例2.8】MOV BX,(VAL LT 5) AND 20) OR (VAL GE 5) AND 30) 當(dāng)VAL5時,匯編結(jié)果應(yīng)該是: MOV BX,20 當(dāng)VAL5時,匯編結(jié)果應(yīng)該是: MOV BX,30,(4)數(shù)值返回運算符 數(shù)值返回運算符包括:SEG(取段地址)、OFFSET(取偏移地址)、TYPE(取類型值)、LENGTH(取長度)、SIZE(取總字節(jié)數(shù)) 這些操作符把一

14、些特征或存儲器地址的一部分作為數(shù)值回送,但不改變源操作數(shù)的屬性。,SEG 格式:SEG 變量名/標(biāo)號 匯編程序?qū)⒒厮妥兞炕驑?biāo)號的段地址值。 【例2.9】如果DATA_SEG是從存儲器的05000H開始的一個數(shù)據(jù)段的段名,OPER1是該段中的一個變量名,則 MOV BX,SEG OPER1 將把05000H作為立即數(shù)插入指令。實際上,由于段地址是由連接程序分配的,所以該立即數(shù)是連接時插入的。執(zhí)行期間則使BX寄存器的內(nèi)容變成為05000H,OFFSET 格式:OFFSET 變量名/標(biāo)號 匯編程序?qū)⒒厮妥兞炕驑?biāo)號的偏移地址。 【例2.10】MOV BX,OFFSET OPER_2 匯編程序?qū)PER

15、_2的偏移地址作為立即數(shù)回送給指令,而在執(zhí)行時則將該偏移地址裝入BX寄存器中,所以這條指令與 LEA BX,OPER_2 是等價的。,TYPE 格式:TYPE 變量名/標(biāo)號 如果該表達(dá)式是變量,則匯編程序?qū)⒒厮妥兞康囊宰止?jié)數(shù)表示的類型:DB為1,DW為2,DD為4。如果該表達(dá)式是標(biāo)號,則匯編程序?qū)⒒厮痛碓摌?biāo)號類型數(shù)值:NEAR為-1,F(xiàn)AR為-2。如果表達(dá)式為常數(shù),則應(yīng)回送0。 【例2.11】ARRAY DW 1,2,3 則對于指令:ADD SI,TYPE ARRAY 匯編程序?qū)⑵湫纬蔀椋?ADD SI,2,LENGTH 格式:LENGTH 變量名 對于變量中使用DUP的情況,匯編程序?qū)⒒厮?/p>

16、分配給該變量的單元數(shù),對于其他情況則送1。 【例2.12】FEES DW 100 DUP(0) 對于指令:MOV CX,LENGTH FEES 匯編程序?qū)⑵湫纬蔀椋?MOV CX,100,SIZE 格式:SIZE 變量名 匯編程序應(yīng)回送分配給該變量的總字節(jié)數(shù),也就是LENGTH和TYPE的乘積,即: SIZE=LENGTHTYPE 【例2.13】FEES DW 100 DUP(0) 對于指令:MOV CX,SIZE FEES 匯編程序?qū)⑵湫纬蔀椋?MOV CX,200,(5)屬性運算符 屬性運算符包括:PTR(屬性修改運算符)、“:”(段跨越前綴符)和SHORT(短取代運算符)。 PTR 格式

17、:類型 PTR 表達(dá)式 是屬性修改運算符,用PTR來建立符號地址,但它本身并不分配存儲器,只是用來給已分配的存儲地址賦予另一種屬性,使該地址具有另一種類型,僅在本語句有效。格式中的類型字段表示所賦予的新的類型屬性,而表達(dá)式字段則是被取代類型的符號地址。,【例2.16】已有數(shù)據(jù)定義如下: ARRAY DW ? 可以用以下語句對這兩個字節(jié)賦予另一種類型定義: ARRAY1 EQU BYTE PTR ARRAY ARRAY2 EQU BYTE PTR (ARRAY+1) 這里,ARRAY和ARRAY1兩個符號地址具有相同的段地址和偏移地址,但是它們的屬性類型不同,前者為1,后者為2。,此外,有時指令

18、中也要求使用PTR運算符。例如,當(dāng)匯編程序遇到“MOV BX,5”指令時,指令要求把立即數(shù)5存入BX寄存器內(nèi)容所指定的存儲單元中,但是,匯編程序不能分清是存入字單元還是字節(jié)單元,此時必須用PTR運算符來說明屬性,應(yīng)該寫明: MOV BYTE PTR BX,5 或MOV WORD PTR BX,5,: 格式:段寄存器:地址表達(dá)式 “:”稱為段運算符,又稱為段跨越前綴符。用于臨時給變量、標(biāo)號或地址表達(dá)式指定一個段屬性,地址表達(dá)式的EA和類型屬性不變。在指令中代替默認(rèn)的段以形成物理地址。 【例2.17】MOV AX,ES:BX+SI;PA=ES*16+EA,臨時替換默認(rèn)的DS, SHORT 短取代運

19、算符,用來修飾JMP指令中轉(zhuǎn)向地址的屬性,指出轉(zhuǎn)向地址是在下一條指令地址的-128+127個字節(jié)范圍內(nèi)。 【例2.18】JMP SHORT NEXT NEXT:MOV AX,BX,(6)運算符的優(yōu)先級 以上說明了5類常用的運算符,在計算表達(dá)式時,應(yīng)該首先計算優(yōu)先級高的運算符,同級運算符從自左向右進(jìn)行計算。下面給出運算符的優(yōu)先級別,從高到低排列如下: ( )、 、LENGTH、SIZE,然后是段跨越前綴符“:” PTR、OFFSET、SEG、TYPE、THIS以及段運算符 HIGH、LOW *、/、MOD、SHL、SHR +、- EQ、NE、LT、LE、GT、GE NOT AND OR、XOR

20、SHORT,4注釋項 注釋項由分號“;”開始,用來說明一條指令或一段程序的功能,它不屬于程序本身,在匯編過程中,匯編程序不會對注釋作任何加工,這部分不產(chǎn)生機器代碼,注釋只是為了增加程序的可讀性,便于閱讀、理解和修改程序。對于匯編語言程序來說,注釋項的作用是很明顯的,讀者應(yīng)該在編寫匯編程序的過程中,注意學(xué)會寫好注釋。,2.2 偽指令,2.2.1 處理器選擇偽指令 2.2.2 數(shù)據(jù)定義偽指令 2.2.3 模塊命名和標(biāo)題偽指令 2.2.4 程序結(jié)束偽指令(END) 2.2.5 完整段定義偽指令(SEGMENT、ENDS、 ASSUME) 2.2.6 簡化段定義偽指令 2.2.7 表達(dá)式賦值偽指令 2

21、.2.8 定位偽指令(ORG) 2.2.9 標(biāo)號定義偽指令(LABEL),2.2.1 處理器選擇偽指令,由于80 x86的所有處理器都支持8086/8088指令系統(tǒng),但每一種高檔的機型又都增加一些新的指令,因此,在編寫程序時要對所用處理器有一個明確的選擇。此類偽指令格式為: 8086;選擇8086指令系統(tǒng) 286;選擇80286指令系統(tǒng) 286P;選擇保護(hù)模式下80286指令系統(tǒng) 386;選擇80386指令系統(tǒng) 需要注意的問題: (1)處理器選擇偽指令在完整和簡化兩種程序框架中均可使 用。 (2)缺省時為選擇8088/8086微處理器指令系統(tǒng)。,2.2.2 數(shù)據(jù)定義偽指令,程序中所涉及到的大量

22、初始數(shù)據(jù)、中間數(shù)據(jù)和結(jié)果數(shù)據(jù),一般都要在程序設(shè)計時進(jìn)行預(yù)置和分配存儲空間,可以通過數(shù)據(jù)定義偽指令實現(xiàn),其格式為: 變量名 DB 表達(dá)式;定義字節(jié)型變量,每個操 作數(shù)占1個字節(jié)的內(nèi)存單元 變量名 DW 表達(dá)式;定義字型變量,每個操作 數(shù)占2個字節(jié)的內(nèi)存單元 變量名 DD 表達(dá)式;定義雙字型變量,每個操 作數(shù)占4個字節(jié)的內(nèi)存單元,其中,DB、DW、DD稱為偽指令助記符,分別用來定義字節(jié)型、字型、雙字型變量。數(shù)據(jù)定義偽指令可用于除代碼段以外的任何段中,但主要用于數(shù)據(jù)段和附加數(shù)據(jù)段中,用來按名字存取其對應(yīng)的內(nèi)存單元。數(shù)據(jù)定義偽指令可以為一個或連續(xù)的存儲單元設(shè)置數(shù)值初值。其中變量名、助記符和操作數(shù)之間以

23、空格隔開,且方括號中內(nèi)容為可選項。表達(dá)式可為如下幾種情況:常數(shù)表達(dá)式、問號(?)、地址表達(dá)式(適用DW和DD)、字符及字符串(適用于DB)、重復(fù)子句DUP(表達(dá)式)、用逗號分開的上述各項。,需要說明的是: (1)若是字符串且是DB類型時,必須以單引號括起來,括起來的字符個數(shù)不能超過255個,字符串以ASCII碼的形式按地址遞增的順序依次存放在以變量名開始的內(nèi)存單元中; (2)若是?時,表示為變量預(yù)留內(nèi)存單元。例如: X1 DB ?;為變量X1預(yù)留1個字節(jié)單元; (3)若是帶DUP的表達(dá)式表示定義多個相同的操作數(shù)和要預(yù)留多個內(nèi)存單元。DUP的使用格式如下: 表達(dá)式 DUP(操作數(shù)項) 表達(dá)式為要

24、重復(fù)的次數(shù);操作數(shù)表示要重復(fù)的內(nèi)容,可以是常數(shù)或表達(dá)式、字符串、?和帶DUP的表達(dá)式。,【例2.19】操作數(shù)可以是常數(shù),或者是表達(dá)式。 DATA1 DB 12,4,10H;每個操作數(shù)占用一個字節(jié)單元 DATA2 DW 100,100H,-5;每個操作數(shù)占用一個字單元 DATA3 DD 3*20,0FFFDH;每個操作數(shù)占用一個雙字單元 匯編程序可以在匯編期間在存儲器中存入數(shù)據(jù),如圖2.1所示。,圖2.1 例2.19的匯編結(jié)果,【例2.20】操作數(shù)也可以是字符串。下面3個定義語句是等價的。存儲器存儲情況如圖2.2所示。 STR1 DB ABCD ;存放地址由低到高分別為:41H、42H、43H、

25、44H STR1 DB A,B,C,D STR1 DB 41H,42H,43H,44H,圖2.2 例2.20的匯編結(jié)果,2.2.3 模塊命名和標(biāo)題偽指令,1模塊命名偽指令(NAME) 格式:NAME 模塊名 該命令表示一個模塊的開始,并給出該模塊名。如果程序中沒有使用NAME偽指令,也可以使用TITLE偽指令來給源程序設(shè)置標(biāo)題,以后每頁的第一行都列出該標(biāo)題。 2標(biāo)題偽指令(TITLE) 格式:TITLE TEXT 這里TEXT為標(biāo)題,即為不加引號的字符串,最長為60個字符。一個程序模塊中只允許一個TITLE命令,否則會引起誤會。在無NAME命令情況下,TEXT的前6個字符一般用作模塊名。,2.

26、2.4 程序結(jié)束偽指令(END),格式:END 標(biāo)號 其中:標(biāo)號可以是過程名或帶“:”的標(biāo)號,標(biāo)號表示為程序開始執(zhí)行的起始地址,即主程序中的第一條可執(zhí)行指令的地址。當(dāng)標(biāo)號缺省時表示該程序是一個子程序,不能單獨運行,只能被其他程序調(diào)用。 模塊的一般形式為: NAME 模塊名 所有的語句 END 啟動標(biāo)號或過程,2.2.5 完整段定義偽指令(SEGMENT、ENDS、ASSUME),8086按照邏輯段組織程序,具有代碼段、數(shù)據(jù)段、附加段和堆棧段。因此,一個匯編語言源程序可以包括若干個代碼段、數(shù)據(jù)段或堆棧段,段與段之間的順序可以隨意排列。邏輯段用匯編語言源程序中的段定義偽指令來定義。,1完整段定義偽

27、指令(SEGMENT、ENDS) 采用完整段定義偽指令可具體控制匯編程序和連接程序在內(nèi)存中組織代碼和數(shù)據(jù)的方式。為此,需要用段定義偽操作,其格式如下: 段名 SEGMENT 定位類型 組合類型 類別名 段名 ENDS,定義了一個以SEGMENT偽指令開始,以ENDS偽指令結(jié)束的存儲段,二者總是成對出現(xiàn),缺一不可。中間省略的部分稱為段體。對數(shù)據(jù)段、附加段、堆棧段來說,一般為變量、符號定義等偽指令;對代碼段來說,則主要是程序代碼。方括號中的為可選項,當(dāng)有可選項時各項順序不能錯,可選項之間用空格隔開。下面分別介紹這些部分的作用。 (1) 段名 段名是用戶自定義的,但不要與指令助記符或偽指令重名,用來

28、指示匯編程序為該段分配的存儲區(qū)的首地址,它有段地址和偏移地址兩個屬性。段開始和段結(jié)束的段名必須相同。,(2) 定位類型 說明段的起始地址的邊界要求,指示連接程序按定位類型提出的要求,安排各段在內(nèi)存的相互銜接方式。它有5種可選擇類型: BYTE:段的起始地址可以從任何地址開始。 段起始地址(20位): B WORD:段的起始地址必須以偶地址開始,即該地 址的D0位應(yīng)為0。 段起始地址(20位): 0 B, DWORD:段的起始地址必須為4的倍數(shù),即該地址的D1和D0位應(yīng)為0。 段起始地址(20位): 00 B PARA:段的起始地址必須從小段邊界開始,即該地址的D3D0位應(yīng)為0。 段起始地址(2

29、0位): 0000 B PAGE:段的起始地址必須從頁的邊界開始,即該地址的D7D0位應(yīng)為0。 段起始地址(20位): 0000 0000 B 如未指定定位類型,則匯編程序默認(rèn)為PARA。,(3) 組合類型 當(dāng)程序有多個段時,組合類型用來說明段與段之間是怎樣連接和定位的,共有6種組合類型: 不指定或稱隱含方式:表示本段與其他模塊中的同 名段無連接關(guān)系,它將作為一個獨立的段運行。 PUBLIC:本段與其他模塊中說明為PUBLIC方式的 同名段順序連接,組成一個大的邏輯段,它們共用 同一個段起始地址。 COMMON:本段與其他模塊中說明為COMMON方 式的同名段從同一地址開始重疊連接,段長是同名

30、 段中最長的段的長度。,STACK:表示該段是堆棧段的一部分。把所有相同 類別名的具有STACK組合類型的段連接成一個連 續(xù)段,該段長度為各原有段的總和。將連續(xù)段首地 址送SS,段內(nèi)最大偏移地址送SP(SP指向棧頂)。 當(dāng)定義了STACK屬性后,在主程序中可省略對SS和 SP的初始化。 MEMORY:與PUBLIC同義。 AT表達(dá)式:表示本段的段地址由表達(dá)式的值得到。 該段的偏移地址為“零”。這種方式用戶可直接規(guī)定該 段的起始地址。例如,AT 1000H,定位的段首地址 為(1000H:0000H),但這種方式不能用于代碼段。,(4) 類別名 類別名必須用單引號括起來。連接時對不同模塊、不同名

31、的程序段只要類別名相同,則放在一個連續(xù)的物理空間,但每段之間是獨立的,不進(jìn)行組合。,2指定段寄存器偽指令(ASSUME) 在程序中,必須明確段和段寄存器之間的關(guān)系,這可用ASSUME偽指令來實現(xiàn),其格式為: ASSUME 段寄存器名:段名,段寄存器名:段名 ASSUME偽指令告訴匯編程序,在運行期間通過哪個段寄存器才能找到所要的指令和數(shù)據(jù)。該指令放在程序的代碼段中。 如:ASSUME CS:CODE,ES:EXTRA,DS:DATA,SS:STACK,3段寄存器的裝入 ASSUME偽指令只是指出各段和段寄存器之間的關(guān)系,但并未真正將段基地址裝入相應(yīng)的段寄存器中,所以在程序的代碼段開始處就應(yīng)該先

32、進(jìn)行數(shù)據(jù)段DS、附加段ES和堆棧段SS的段基址的裝入,否則無法正確對數(shù)據(jù)進(jìn)行尋址操作。而代碼段CS則在加載程序后由系統(tǒng)自動裝入。 DS和ES的裝填方法可以使用相同的方法,直接由用戶程序進(jìn)行加載。,(1) DS、ES的裝入 MOV AX,DATA ;數(shù)據(jù)段段基地址送AX寄存器 MOV DS,AX ;AX寄存器的內(nèi)容送數(shù)據(jù)段寄存器DS 或 MOV AX,SEG X ;變量X所在數(shù)據(jù)段的段基址送AX寄存器 MOV DS,AX,(2) CS的裝入 對CS和IP的裝入方法是利用END后的標(biāo)號來完成的。因為該標(biāo)號是可執(zhí)行程序的起始地址。如: START: END START 系統(tǒng)自動將START所在段的段

33、地址送CS寄存器,將START所在段內(nèi)的偏移地址送IP寄存器。,(3) SS的裝入 方法1:堆棧段SS也可以不用用戶裝入,而由系統(tǒng)自動裝填。但是在定義堆棧段時,必須把參數(shù)寫全。這時,將程序裝入內(nèi)存,系統(tǒng)會自動地把堆棧段地址和堆棧指針置入SS和SP中,因而可以不在代碼段中裝入SS和SP的值。 STACK1 SEGMENT PARA STACK STACK DB 50H DUP(?) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE, SS:STACK1 CODE ENDS 當(dāng)目標(biāo)代碼裝入存儲器后,SS中已自動裝入STACK段的段基值,堆棧指針SP指向堆棧的底部+1的

34、存儲單元。,方法2: STACK1 SEGMENT PARA DW 50H DUP(?) TOP LABEL WORD;TOP屬性為WORD STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK1 START:MOV AX,STACK1 MOV SS,AX;堆棧段的段地址送SS MOV SP,OFFSET TOP;堆棧段的棧頂?shù)刂匪蚐P TOP是該堆棧的初始棧頂部地址。,4操作系統(tǒng)下匯編程序的正常結(jié)束 對于可執(zhí)行文件(.EXE)在DOS提示符下正常結(jié)束可以用兩種方法: 方法1: MOV AX,4C00H; INT 21H 方法2: MAIN PROC

35、 FAR PUSH DS;保存原來的數(shù)據(jù)段段地址 MOV AX,0H;0送AX PUSH AX;0壓棧 RET;返回DOS MAIN ENDP,2.2.6 簡化段定義偽指令,簡化的段定義書寫簡單,有利于實現(xiàn)匯編語言程序模塊與高級語言程序模塊的連接,它可以由操作系統(tǒng)自動安排段序,自動保證名字定義的一致性。,1存儲模式選擇偽操作(MODEL) 格式:MODEL 模式類型 本語句一般放在段定義之前,用來指明簡化段所用的內(nèi)存模式,即用來說明在存儲器中是如何安放各個段的。模式類型說明代碼段在程序中如何安排,代碼的尋址是近還是遠(yuǎn);數(shù)據(jù)段在程序中又是如何安排的,數(shù)據(jù)的尋址是近還是遠(yuǎn)。根據(jù)它們的不同組合,模式

36、類型可以有如下5種。,Tiny模式:也叫微模式,所有數(shù)據(jù)及代碼放 入同一 個物理段 內(nèi),該模式用于編寫較小的 源程序,這 種模式的源程序最終可以形成COM文件。 Small:也叫小模式,所有數(shù)據(jù)放入一個 64KB的段 中,所有代碼放入另一個64KB的段中,即程序中只 有一個數(shù)據(jù)段和一個代碼段這是一般應(yīng)用程序最常 用的一種模式。,Medium:也叫中模式:所有數(shù)據(jù)放入一個 64KB的 段中,代碼可以放入多于一個的段中,即程序中可 以有多個代碼段。 Compact:也叫壓縮模式,所有代碼放入另 一個 64KB的段中,數(shù)據(jù)可以放入多于一個的段中,即程 序中可以有多個數(shù)據(jù)段。 Large:也叫大模式,

37、代碼和數(shù)據(jù)都可以分別放入 多于一個的段中,即程序中可以有多個代碼段和多 個數(shù)據(jù)段。,2數(shù)據(jù)段定義偽指令(DATA) 格式: DATA 名字 定義一個數(shù)據(jù)段,如果有多個數(shù)據(jù)段,則用名字來 區(qū)別:只有一個數(shù)據(jù)段時,隱含段名為DATA。 3堆棧段定義偽指令(STACK) 格式: STACK 長度 定義一個堆棧段,并形成SS及SP的初值,SP的默認(rèn) 值為1024,隱含段名為STACK??蛇x的長度參數(shù)指定 堆棧段所占存儲區(qū)的字節(jié)數(shù),默認(rèn)大小是1KB。,4代碼段定義偽指令(CODE) 格式: CODE 名字 定義一個代碼段,如果有多個代碼段,則用名字來 區(qū)別:只有一個代碼段時,隱含段名為CODE。 5程序

38、開始偽指令(STARTUP) 格式: STARTUP,該偽指令按照給定的CPU類型,根據(jù) MODEL語句選擇 的存儲模式,產(chǎn)生程序開始執(zhí)行的代碼,同時還指定了程序開始執(zhí)行的起點。 在小模式下,STARTUP偽指令主要設(shè)置了數(shù)據(jù)段DS的值,同時按照存儲模式要求使堆棧段SS=DS。使用了STARTUP偽指令,可以省略將數(shù)據(jù)段寄存器裝入DS的語句。,6程序返回偽指令(EXIT) 格式: EXIT EXIT產(chǎn)生終止程序執(zhí)行返回操作系統(tǒng)的指令代碼。 它的可選參數(shù)是一個返回的數(shù)碼,通常用0代表沒有錯 誤,例如,EXIT 0對應(yīng)的代碼是: MOV AX,4C00H INT 21H STARTUP和EXIT的

39、引入,大大簡化了匯編語 言程序的復(fù)雜度。,7與簡化段定義有關(guān)的預(yù)定義符號 匯編程序中給出了與簡化段定義有關(guān)的一組 預(yù)定義符號,它們可在程序中出現(xiàn),并由匯編程 序識別使用。如在完整段定義情況下,需要用段 名裝入數(shù)據(jù)段寄存器, MOV AX,DATA MOV DS,AX,若采用簡化段定義,則數(shù)據(jù)段只用DATA來定義,而并 未給出段名,此時可用 MOV AX,DATA MOV DS,AX 這里,預(yù)定以符號DATA就給出了數(shù)據(jù)段定的段名。 需要說明的是,當(dāng)使用簡化段定義偽指令時,必須在這些簡化段偽指令出現(xiàn)之前,即程序的一開始先用 MODEL定義存儲模型,然后再用簡化段定義偽指令定 義段。每一個新段的開

40、始就是上一段的結(jié)束,而不必用 ENDS作為段的結(jié)束符。,2.2.7 表達(dá)式賦值偽指令,有時程序中多次出現(xiàn)同一個表達(dá)式,為方便起見,可以將該表達(dá)式賦予一個名字,以后凡是用到該表達(dá)式的地方,就用這個名字來代替。在需要修改該表達(dá)式的值時,只需在賦予名字的地方修改即可??梢?,表達(dá)式賦值偽指令的引入提高了程序的可讀性,也使其更加易于修改。,1等值偽指令EQU 格式:符號名 EQU 表達(dá)式 用符號名來代替表達(dá)式的值。在程序中凡是需要 用到該表達(dá)式的地方均可用符號名來替換。在同 一源程序中,EQU偽操作中的表達(dá)式是不允許重 復(fù)定義的。上式中的表達(dá)式可以是任何有效的操 作數(shù)格式,可以是任何可以求出常數(shù)值的表達(dá)

41、 式,也可以是任何有效的助記符。舉例如下。,【例2.26】 D1 EQU 80 ;常數(shù) D2 EQU X+2 ;表達(dá)式 D3 EQU SI+2 ;存儲單元 D4 EQU ES:SI+2 ;存儲單元 D5 EQU CX ;寄存器 D6 EQU ADD ;指令助記符,2等號偽指令“=” 格式:符號名 = 表達(dá)式 “=”的功能與EQU偽指令的功能類似,不同的是:在同一 個程序中,“=”可以對一個符號重復(fù)定義。 【例2.27】Y1=7 Y1=128 的定義是正確的。 而Y1 EQU 7 Y1 EQU 128 的定義是錯誤的。,3解除定義偽指令PURGE 格式:PURGE 符號1,符號2,符號n 解除指

42、定符號的定義,解除符號定義后,可以用EQU重新定義。 【例2.28】Y1 EQU 7 PURGE Y1 Y1 EQU 128 上面的定義是正確的。,2.2.8 定位偽指令(ORG),1地址計數(shù)器 在介紹該語句之前,先介紹地址計數(shù)器。在匯編程序 對源程序匯編過程中,使用地址計算器保存當(dāng)前正在匯編 的指令的偏移地址。每遇到一個新的段,把地址計數(shù)器 初始化為零,每處理一條指令,地址計數(shù)器就增加一個 值,此值為該指令所需要的字節(jié)數(shù)。地址計數(shù)器的值可 用符號表示,匯編語言允許用戶直接用來應(yīng)用地址 計數(shù)器的值,因此指令 JNE +5 的轉(zhuǎn)向地址是JNE指令的首地址加上5。,當(dāng)用在指令中時,它表示本條指令的

43、第一個字節(jié)的地 址。在這里,+5必須是另一條指令的首地址。否則, 匯編程序?qū)⒅甘境鲥e信息。當(dāng)用在偽操作的參數(shù)字段 時,則和它用在指令中的情況不同,它所表示的是地址 計數(shù)器的當(dāng)前值。 【例2.29】ARRAY DW,1,2,+4,3,4 如匯編時ARRAY分配的偏移地址為0074,則匯編后的存 儲區(qū)將如圖2.8所示。數(shù)組中兩個+4得到的結(jié)果是不同 的,這是由于的值是在不斷變化的緣故。,圖2.8 例2.29的匯編結(jié)果,2、ORG偽指令 匯編地址計數(shù)器的值可以用定位偽指令ORG來設(shè)置。 格式:ORG 常數(shù)表達(dá)式 該指令告知匯編程序,使其后的指令或數(shù)據(jù)從表 達(dá)式的值所指定的偏移地址開始存放。如常數(shù)表

44、達(dá)式的值為n,則ORG偽指令可以使下一個字節(jié) 的地址成為常數(shù)表達(dá)式的值n。常數(shù)表達(dá)式的值 應(yīng)為正整數(shù)065535之間的值。,【例2.30】有一個數(shù)據(jù)段的內(nèi)容如下,請分析各變量的偏移地址或內(nèi)容。 DATA SEGMENT;數(shù)據(jù)段定義開始偽指令 ORG 100H;以下所定義的第一個變量 的偏移地址從100H開始 X DB 12H;X的偏移地址為0100H Y DW ?;Y的偏移地址為0101H ORG 200H;以下所定義的第一個變量 的偏移地址從200H開始 Z DD 9C56H;Z的偏移地址為0200H DATA ENDS;數(shù)據(jù)段定義結(jié)束偽指令,2.2.9 標(biāo)號定義偽指令(LABEL),格式:

45、符號名 LABEL 類型 為緊跟在LABEL偽指令后的變量、標(biāo)號建 立新的符號名,并刷新其類型屬性。對于標(biāo)號, 其類型為NEAR,F(xiàn)AR;對變量,其類型為 BYTE、WORD、DWORD。LABEL偽指令提供 了另一種定義標(biāo)號或變量名的方法,但它并不為 符號名分配存儲空間。,【例2.31】LABEL與變量的連用 BARRAY LABEL BYTE ARRAY DW 100 DUP(0) ADD AL,BARRAY99 ;取第100個字節(jié)元素 做加法 ADD AX,ARRAY98 ;取第50個字做加法 上例中定義了兩種類型的變量。BARRAY為字節(jié)型, ARRAY為字型。它們的段值和偏移地址完全

46、相同,都指 向保留的100個字單元的首地址。目的是完成程序中字節(jié) 和字的兩種類型的操作。,【例2.32】LABEL與標(biāo)號的連用 SUBRTE LABEL FAR SUBRT:SUB AX,AX JMP SUBRT;段內(nèi)轉(zhuǎn)移 FARPRO PROC FAR JMP SUBTRE;段間轉(zhuǎn)移 兩個標(biāo)號SUBRTE和SUBRT均指向同一指令,但由于它們的類型不 同(SUBRTE是FAR,而SUBRT后有冒號,其類型隱含為NEAR), 所以可用不同的調(diào)用方法(近或遠(yuǎn))來訪問標(biāo)號所指的程序段。其他代 碼段可通過遠(yuǎn)標(biāo)號SUBRTE來訪問該程序段,當(dāng)前代碼段可通過近 標(biāo)號SUBRT來訪問該程序段。,2.3.1 完整段定義框架,2.3 匯編語言源程序基本框架,框架1: STACK SEGMENT ;定義堆棧段 STACK ENDS D

溫馨提示

  • 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

提交評論