




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第4章 匯編語言,4.1.1匯編語言語句分類,匯編語言程序的基本組成單位是語句。 在8086宏匯編MASM中使用的語句有三種類型:指令語句、偽指令語句和宏指令語句。其中指令語句和偽指令語句是最常見、最基本的語句。,4.1.1匯編語言語句分類,(1)指令語句 每條指令語句都要產(chǎn)生相應(yīng)的機器語言目標代碼,對應(yīng)著機器的一種操作。 用于指示匯編語言如何將源程序進行匯編工作,如程序如何分段,有哪些邏輯段,哪些 (2)偽指令語句 邏輯段是當前段以及內(nèi)存單元如何分配等。偽指令語句的功能在匯編階段已經(jīng)全部完成,所 以不產(chǎn)生相應(yīng)的目標代碼。 (3)宏指令語句 宏指令是編程人員按照一定的規(guī)則來編寫的可供調(diào)用的一種
2、指令。一般來講,一條宏指令可以包括多條指令或偽指令。,4.1.2匯編語言語句格式,匯編語言的語句可以由名字、操作符、操作數(shù)和注釋4部分組成,一般格式如下: 名字 操作符 操作數(shù) ;注釋 各個組成部分之間以空格分隔,它們的含義如下: (1)名字 指令語句的名字是標號,必須以冒號“:”結(jié)束。標號是一條指令的符號地址,代表該指令代碼的起始字節(jié)單元地址。并不是每條指令都需要標號,只有在循環(huán)或分支入口語句前面選用標號,以便給循環(huán)或轉(zhuǎn)移指令提供轉(zhuǎn)向地址。偽指令語句中的名字可以是變量名、過程名、段名和符號名等,偽指令語句的名字不可以冒號“:”結(jié)束。,4.1.2匯編語言語句格式,(2)操作符 操作符就是各種指
3、令助記符。它可以是指令、偽指令或宏指令。 (3)操作數(shù) 不同的指令、偽指令所需的操作數(shù)個數(shù)不盡相同,可能是0個、1個或多個。若需多個操作數(shù),各個操作數(shù)之間要用逗號“,”或空格分隔。 (4)注釋 注釋是以分號“;”開始的任意字符串??梢詫懺谝粭l語句的后面,也可以獨占一行。其功能一般是對指令或程序段的功能和意義等加以解釋說明,好的注釋可以提高程序的可讀性和可維護性。匯編時注釋不產(chǎn)生目標代碼。,4.2符號定義語句,有時程序中會多次出現(xiàn)同一個表達式,可以用符號定義語句給該表達式定義一個符號,這樣既便于引用,又減少了程序修改量,而且還能夠提高源程序的可讀性。匯編后該符號代表一個確定的值。,4.2.1等值
4、語句,格式:符號名 EQU 表達式 功能:給表達式或表達式的值賦予一個符號名,定義后,程序中可以用該符號名代表該表達式。 說明:表達式可以是常數(shù)、數(shù)值表達式、另一個符號名或助記符等。用EQU語句定義的符號名在同一個程序中不允許重復定義。 VAL EQUTABLE1; VAL代替變量TABLE1 ADDR EQUBP+SI+100H; ADDR代替地址表達式BP+SI+100H A EQUAX; A代替寄存器AX MOVE EQUMOV ; MOVE代替指令助記符MOV 例如: COUNTEQU 50; COUNT代替常數(shù)50 COUNTEQU 50*25; SUM代替數(shù)值表達式50*25,4.
5、2.2等號語句,格式:符號名=表達式 功能:與等值語句的功能基本相同,不同之處僅在于等號語句中的表達式只能是常數(shù)或數(shù)值表達式表達式,等值語句中的表達式可以是常數(shù)、數(shù)值表達式、另一個符號名或助記符等;另外,在同一個程序中等號語句可以對一個符號重復定義,而等值語句不能對同一個符號重復定義。 例如: COUNT1=50; COUNT1代替常數(shù)50 COUNT1=100*20; 重新定義COUNT1 COUNT2 EQU 100*30; 錯誤,EQU不能對;COUNT2重復定義 COUNT2 EQU 100; COUNT2代替常數(shù)50,4.2.3解除定義語句PURGE,格式:PURGE 符號名1,符號
6、名2,,符號名n 功能:解除指定符號的定義。 例如: COUNT EQU 100; COUNT代替常數(shù)100 PURGECOUNT; 解除對符號COUNT的定義 COUNT EQU 100*30; 重新定義COUNT,4.3數(shù)據(jù)定義語句,數(shù)據(jù)定義偽指令為數(shù)據(jù)項分配存儲單元,用一個符號名與這個存儲單元相聯(lián)系且為這個數(shù)據(jù)提供一個任選的初始值。也可以只給變量分配存儲單元,而不賦予特定的值。 常用的數(shù)據(jù)定義偽指令有DB、DW、DD、DQ和DT等。 數(shù)據(jù)定義偽指令的一般格式為: 格式:變量名 數(shù)據(jù)定義偽指令 初始化參數(shù)表,4.3數(shù)據(jù)定義語句,說明: (1)如果此處給出了“變量名”,也就定義了一個變量。變
7、量名是該數(shù)據(jù)區(qū)的符號地址。在指令中通常利用變量名來引用內(nèi)存單元。 (2)數(shù)據(jù)定義偽指令DB、DW、DD、DQ和DT所分配的內(nèi)存單元的長度也不同。,4.3數(shù)據(jù)定義語句,(3)初始化參數(shù)表可以包含任意多個初始化參數(shù)。如果有多個初始化參數(shù)時,相互之間應(yīng)該用逗號“,”分開。每個參數(shù)能夠初始化一個內(nèi)存單元,它們可以是以下5種形式: ?:僅為變量預(yù)留一個存儲單元而不對該單元進行初始化。 例如: BUF1DB ? BUF2DW56H, 78H, ? , 3456H 以上偽指令執(zhí)行后,存儲單元分配情況如圖4-1(a)所示。 數(shù)字常量及數(shù)值表達式:可以是十進制、二進制、十六進制和八進制數(shù)字常數(shù),也可以是數(shù)值表達
8、式。但注意存入存儲單元的數(shù)據(jù)不能超出其表示范圍。例如,對于偽指令DB,常數(shù)或表達式的值不能超出-128255。 例如: DATA1 DB 18H,12H DATA2 DW 18H, 2A45H DATA3 DD 2F3A124BH,4.3數(shù)據(jù)定義語句,地址表達式:用在DW偽指令中,存入字單元的是偏移量部分。用在DD偽指令中,雙字單元的低字中存放偏移量,高字中存放段基址。 例如: ADDR1DWNEXT ADDR2DD NEXT 設(shè)NEXT是標號,代表代碼段中偏移100H的單元,(CS)=2000H。 字符串:字符串必須用單引號或雙引號括起來,其值是字符的ASCII值。注意:字符多于2個時,只能
9、使用DB定義。 例如: STR1 DB ABC STR2 DB D, E, F STR3 DWAB,4.3數(shù)據(jù)定義語句,重復次數(shù) DUP(初始化參數(shù)):其中的重復次數(shù)可以是任何整數(shù),初始化參數(shù)可以是中的任何一個。其作用是把括號中的初始化參數(shù)重復指定次數(shù)。 例如: BUF1 DB 2 DUP(02H,13H) BUF2 DW01H,2 DUP(16H),4.4.1常數(shù),所謂常數(shù)是這樣的數(shù)據(jù),在匯編源程序時,它的值就可以完全確定,且在程序運行時,它的值始終固定不變。常數(shù)分為數(shù)字常數(shù)和字符常數(shù)。 (1)數(shù)字常數(shù) 在匯編語言程序中,可以有十進制、二進制、十六進制和八進制數(shù)字常數(shù)。 十進制數(shù):以字母D結(jié)
10、尾,由于匯編語言中默認值是十進制數(shù),所以D也可以省略不寫。有效數(shù)字是09。例如,2008D,2008。 二進制數(shù):以字母B結(jié)尾,有效數(shù)字是0、1。例如,10100011B。 十六進制數(shù):以字母H結(jié)尾,有效數(shù)字是09和A(a)F(f)。例如,3BC5H,0FFH。需要注意的是,在匯編語言程序中,為了區(qū)別由A(a)F(f)組成的序列是一個十六進制數(shù)還是一個符號,凡是以字母A(a)F(f)為起始的十六進制數(shù),必須在前面冠以數(shù)字0。例如,0A3H表示十六進制常數(shù),而A3H表示一個符號。 八進制數(shù):以字母O或Q結(jié)尾,有效數(shù)字是07。例如,345Q,123O。,4.4.1常數(shù),(2)字符常數(shù) 在匯編語言程
11、序中,字符常數(shù)是用單引號或雙引號括起來的一個或多個字符。這些字符以ASCII編碼形式存儲在存儲單元中。例如,字符“1”的值是31H,字符“A”的值是41H,字符串“abcd”的值是61626364H。 (3)符號常數(shù) 在匯編語言程序中,經(jīng)常用符號定義語句將符號定義為某個常數(shù),然后就可以用該符號來代替這個常數(shù),這樣的常數(shù)叫做符號常數(shù)。 例如: NSIZE=20; NSIZE是符號常數(shù),表示20。 SUM EQU200*10; SUM是符號常數(shù),表示2000。,4.4.2變量,所謂變量是這樣的數(shù)據(jù),在程序運行中它的值可以改變。 變量有3種屬性:段屬性、偏移屬性和類型屬性。 (1)段屬性 該屬性定義
12、了變量所在段的段地址,其值必須在一個段寄存器中。變量的段地址通常存放在DS或ES中,也可以存放在SS或CS中,但通常存放在DS或ES中。例如: 有數(shù)據(jù)段定義如下: DATA SEGMENT DATA1 DB 12H,34H DATA2DW5678H DATAENDS 則通過指令: MOVAX,DATA MOVDS,AX 可以將DATA1、DATA2變量所在段的段地址放在了DS中。,4.4.2變量,(2)偏移屬性 該屬性表示變量相距段起始地址的字節(jié)數(shù),一般用一個16位無符號數(shù)表示。例如上例中的變量DATA1、DATA2的偏移地址分別是0000H和0003H。 (3)類型屬性 該屬性用來表示變量的
13、字節(jié)長度。例如,字節(jié)型變量的類型屬性值為1,字型變量的類型屬性值為2,雙字型變量的類型值為4。例如上例中的變量DATA1、DATA2的類型屬性分別是1和2。,4.4.3標號,匯編語言程序中的標號是機器指令存放位置的標識符號,即機器指令存放地址的符號表示,標號可以作為轉(zhuǎn)移指令或重復控制指令的目的操作數(shù),即指令要轉(zhuǎn)向的目的地址。標號一般只在代碼段中定義和使用。 標號代表了指令的符號地址,所以標號有三個屬性: (1)段屬性 該屬性定義了標號所在段的段地址,其值通常存放在段寄存器CS中。 (2)偏移屬性 該屬性表示定義標號的語句相距其所在段起始地址的字節(jié)數(shù)。 (3)類型屬性 標號的類型有兩種:NEAR
14、類型和FAR類型。NEAR類型的標號只能在定義該標號的段內(nèi)使用,而FAR類型的標號既可在段內(nèi)使用,也可在段外使用。,4.4.4表達式,所謂表達式,即由常數(shù)、變量和標號通過某些運算符連接而成,是匯編程序能夠理解的、能夠計算出結(jié)果的式子。 所有匯編表達式的數(shù)據(jù)計算或操作都是在匯編源程序的過程中完成,而非程序運行時完成。80 x86宏匯編語言中使用的表達式,根據(jù)其運算結(jié)果的類型可以分為數(shù)值表達式和地址表達式。 表達式中的運算符有:算術(shù)運算符、邏輯運算符、關(guān)系運算符、數(shù)值返回運算符和屬性修改運算符等。,4.4.4表達式,1算術(shù)運算符 算術(shù)運算符包括:+(加)、-(減)、*(乘)、(除)、MOD(模除)
15、。+、-、*、就是最常見的四則運算符,/運算的結(jié)果去兩個運算數(shù)商的整數(shù)部分。MOD是模除運算符,進行整數(shù)除法,結(jié)果只取余數(shù)部分。算術(shù)運算符的格式如下: 表達式1 算術(shù)運算符 表達式2 格式中的表達式和運算結(jié)果都是整數(shù)。 例如: MOVAX,1234H40H; 匯編成指令MOVAX,1274H MOVAX,2008H-400H; 匯編成指令MOVAX,1608 MOVAX,12H*4; 匯編成指令MOVAX,48H MOVAX,2008/400; 匯編成指令MOVAX,5H MOVAX,MOD 400; 匯編成指令MOVAX,8H,4.4.4表達式,2邏輯運算符 邏輯運算符包括:AND(與)、O
16、R(或)、NOT(非,也叫取反)和XOR(異或)。AND、OR、XOR、SHL(左移)和SHR(右移)運算符的格式如下: 數(shù)值表達式1 邏輯運算符 數(shù)值表達式2 NOT運算符的格式如下: NOT 數(shù)值表達式 格式中的表達式和運算結(jié)果都是整數(shù),SHL和SHR運算中的數(shù)值表達式2表示移動位數(shù)。邏輯運算都是按位進行的。 邏輯運算符僅用于數(shù)值表達式。 例如: MOVAX,1234H AND 0F0H; 匯編成指令MOVAX,30H MOVAX, 1234H OR 0F0H ; 匯編成指令MOVAX,12F4H MOVAX, NOT 1234H; 匯編成指令MOVAX,0EDCBH MOVAX, 123
17、4H XOR 0F0H; 匯編成指令MOVAX,8H,4.4.4表達式,3關(guān)系運算符 關(guān)系運算符包括:EQ(等于)、NE(不等于)、LT(小于)、LE(小于等于)、GT(大于)、GE(大于等于)。關(guān)系運算符的格式如下: 表達式1 關(guān)系運算符 表達式2 格式中的表達式都是整數(shù)。關(guān)系運算可以對兩個數(shù)值表達式或地址表達式的值進行某種關(guān)系比較,如果關(guān)系成立,結(jié)果為邏輯真值,用0FFFFH表示,否則結(jié)果為邏輯假值,用0表示。 關(guān)系運算符既可用于比較數(shù)值表達式,又可用于比較地址表達式,若比較的是數(shù)值表達式,則按照無符號數(shù)進行比較;若比較的是同段內(nèi)的地址表達式,則比較它們的偏移地址。 例如: COUNT=1
18、0; 定義符號常量的值為10; MOVAX,COUNT EQ 10H; 匯編成指令MOVAX,0 MOVAX,COUNT NE 10H; 匯編成指令MOVAX,0FFFFH,4.4.4表達式,4屬性返回運算符 屬性返回運算符包括:類型返回運算符TYPE、單元數(shù)返回運算符LENGTH、總字節(jié)數(shù)返回運算符SIZE、段基址返回運算符SEG和偏移量返回運算符OFFSET。屬性運算符的格式如下: 屬性返回運算符 地址表達式 屬性返回運算符的運算對象必須是由變量名或標號構(gòu)成的地址表達式,運算的結(jié)果是一個純數(shù)值。 (1)類型返回運算符TYPE:返回變量或標號類型屬性的數(shù)值形式.,4.4.4表達式,變量或標號
19、的類型和返回值的關(guān)系如表4-2所示。,4.4.4表達式,例如,有數(shù)據(jù)定義如下: DATASEGMENT DAB1DB12H,34H,56H,78H,9AH DAB2 DB 2 DUP (12H),0ABH,0CDH DAW1 DW 12H,34H,56H,78H,9AH DAW2 DW 3 DUP (1234H) DAD1 DD 12H,34H,56H,78H,9AH DAD2 DD 4 DUP (12345678H) DATAENDS 則有: MOVAX,TYPE DAB1; 匯編成指令MOVAX,1 MOVAX,TYPE DAB2; 匯編成指令MOVAX,1 MOVAX,TYPE DAW1
20、; 匯編成指令MOVAX,2 MOVAX,TYPE DAW2; 匯編成指令MOVAX,2 MOVAX,TYPE DAD1; 匯編成指令MOVAX,4 MOVAX,TYPE DAD2; 匯編成指令MOVAX,4,4.4.4表達式,(2) 單元數(shù)返回運算符LENGTH:返回變量所占的存儲單元個數(shù)。該運算返回的結(jié)果根據(jù)定義該變量的偽指令中的第一個參數(shù)的形式來確定。具體為:若第一個參數(shù)的形式為重復子句“n DUP (數(shù)值表達式)”,則LENGTH運算的結(jié)果為重復因子n。否則結(jié)果為1。 例如,設(shè)數(shù)據(jù)定義同上例,則有: MOVAX,LENGTH DAB1; 匯編成指令MOVAX,1 MOVAX,LENGT
21、H DAB2; 匯編成指令MOVAX,2 MOVAX,LENGTH DAW1; 匯編成指令MOVAX,1 MOVAX,LENGTH DAW2; 匯編成指令MOVAX,3 MOVAX,LENGTH DAD1; 匯編成指令MOVAX,1 MOVAX,LENGTH DAD2; 匯編成指令MOVAX,4,4.4.4表達式,(3)總字節(jié)數(shù)返回運算符SIZE:返回變量所占的總字節(jié)數(shù)。 例如:,設(shè)數(shù)據(jù)定義同上例,則有: MOVAX,SIZE DAB1; 匯編成指令MOVAX,5 MOVAX,SIZE DAB2; 匯編成指令MOVAX,4 MOVAX,SIZE DAW1; 匯編成指令MOV AX,10 MOV
22、AX,SIZE DAW2; 匯編成指令MOVAX,6 MOVAX,SIZE DAD1; 匯編成指令MOV AX,20 MOVAX,SIZE DAD2; 匯編成指令MOV AX,16,4.4.4表達式,(4)段基址返回運算符SEG:返回變量或標號所在段的段地址。 (5)偏移量返回運算符OFFSET:返回變量或標號在段內(nèi)的偏移地址。 例如: MOVAX,SEG DATA1 ; 將變量DATA1所在段的段地址送AX MOVBX,OFFSET DATA1 ; 將變量DATA1的偏移地址送BX,4.4.4表達式,5屬性設(shè)定運算符 (1)段超越前綴運算符“:” 該運算符用于給變量、標號或地址表達式臨時指定
23、一個段屬性。段超越前綴運算符使用格式如下: 段寄存器名:地址表達式 或:段名:地址表達式 例如: MOVAX,DS:10H ; 將數(shù)據(jù)段中偏移量為10H的字單元內(nèi)容送AX MOVES:20H,AL ; 將AX的內(nèi)容送附加段中偏移量為20H的字節(jié)單元,4.4.4表達式,(2)類型設(shè)定運算符PTR、THIS、SHORT PTR 該運算符的功能就是地址表達式所確定的存儲單元臨時設(shè)定為指定類型(BYTE、WORD、DEORD、NEAR或FAR)。這種臨時設(shè)定的類型僅在含有該運算符的語句內(nèi)有效。PTR的使用格式如下: 類型 PTR 地址表達式 例如: MOVBYTE PTR 100H,0FFH ; 將立
24、即數(shù)0FFH送偏移量為100H的字節(jié)單元 MOVWORD PTR 100H,0 ; 將偏移量為100H的字單元清0,4.4.4表達式,THIS 該運算符的功能與PTR類似,但具體用法不同。THIS的使用格式如下: 變量名EQU THIS 類型 運算的結(jié)果是具有指定類型的地址,其段地址和偏移地址取自運算符所在的語句。THIS運算符常用于給一個變量另取一個不同的名字,同時設(shè)定另外一種類型。 例如: DATAW EQUTHIS WORD DATAB DB5 DUP(0) 上例中,DATAW和DATAB具有相同的段地址和偏移地址,但DATAW的類型是字,而DATAB的類型是字節(jié)。,4.4.4表達式,S
25、HORT 該運算符用于說明其后的標號在短距離(-128127之間)內(nèi),一般用在向后轉(zhuǎn)移的JMP指令中,說明轉(zhuǎn)移的目標地址距離當前JMP指令不超過127字節(jié)。SHORT的使用格式如下: JMP SHORT 目標地址 例如: JMPSHORT LAB1 指令中的SHORT運算符說明標號LAB1與本條JMP指令的距離不超過127字節(jié)。,4.4.4表達式,6分離運算符 (1)分離高字節(jié)運算符HIGH 該運算的結(jié)果是其后的運算對象的高字節(jié)。 (2)分離低字節(jié)運算符LOW 該運算的結(jié)果是其后的運算對象的高字節(jié)。 例如: MOVBX,0ABCDH; 將0ABCDH送BX MOVAL,HIGH BX ; 將B
26、X內(nèi)容的高字節(jié)送AL MOVAH,LOW BX; 將BX內(nèi)容的低字節(jié)送AH MOVBX,AX; 將AX的內(nèi)容送BX 以上指令可實現(xiàn)將BX內(nèi)容的高、低字節(jié)內(nèi)容互換。,4.4.4表達式,7運算符的優(yōu)先級別 當匯編源程序時,如果同一個表達式中同時含有兩個或兩個以上的運算符時,應(yīng)按照運算符優(yōu)先級別確定運算的順序。 表達式的運算規(guī)則如下: (1)先計算圓括號內(nèi)的運算。如果圓括號有嵌套,按由內(nèi)到外的順序計算; (2)沒有圓括號或?qū)τ谝粚A括號內(nèi)的運算按照運算符優(yōu)先級別由高到低的順序計算; (3)對于優(yōu)先級別相同的運算按照由左到右的順序計算。,4.5 其它偽指令語句,在匯編語言中,除前面介紹的數(shù)據(jù)定義語句、
27、符號定義語句以外,還有其他偽指令語句,如段結(jié)構(gòu)偽指令、過程定義偽指令、模塊定義偽指令、80 x86指令集選擇偽指令和簡化段定義偽指令等。,4.5.1 段結(jié)構(gòu)偽指令,匯編語言程序是按段來組織程序和使用存儲器的。段結(jié)構(gòu)偽指令的作用就是在匯編語言程序中定義邏輯段,指明段的名稱、范圍、定位類型、組合類型和類別等。 段結(jié)構(gòu)偽指令主要包括SEGMENT、ENDS、ASSUME和ORG等。 完整段定義由SEGMENT和ENDS這一對偽指令實現(xiàn)。 完整段定義的一般其格式如下: 段名 SEGMENT 類型屬性列表 ; 本段語句序列(程序或數(shù)據(jù)) 段名 ENDS 其中,SEGMENT表示邏輯段的開始,ENDS則表
28、示一個邏輯段的結(jié)束。這一對偽指令必須同時出現(xiàn),缺一不可,并且兩個語句中的段名必須一致。,4.5.1 段結(jié)構(gòu)偽指令,1段首偽指令SEGMENT 該偽指令標志著一個段的開始,并可以給段賦予邊界類型、組合類型、使用類型和類別名等屬性。其格式如下: 段名 SEGMENT 邊界類型 組合類型 使用類型 類別名 段名由用戶指定。需要注意的是,對屬性如不指定,則采用默認值;但如指定,要一定要按上列次序依次指定。,4.5.1 段結(jié)構(gòu)偽指令,(1)邊界類型 邊界類型指明該段裝入內(nèi)存時,對段起始邊界的要求。邊界類型有下列4種: BYTE(字節(jié)邊界):表示本段從一個字節(jié)的邊界開始,即任一地址開始。 WORD(字邊界
29、):表示本段從一個偶字節(jié)的邊界開始。所以段的起始地址一定可以被2整除,即用二進制表示,最后1位是0。 PARA(節(jié)邊界):表示本段從一個小節(jié)的邊界開始(一個小節(jié)為16個字節(jié))。所以段的起始地址一定可以被16整除,即用二進制表示,最后4位都是0。 PAGE(頁邊界):表示本段從一個頁的邊界開始,存儲器從0號單元開始,每256個字節(jié)為一頁。所以段的起始地址(即段地址)一定可以被256整除,即用二進制表示,最后8位都是0。 以上邊界類型表示的段的起始地址為: BYTE: B WORD: B PARA: B PAGE: B 如果省略了邊界類型,則PARA是默認的邊界類型。,4.5.1 段結(jié)構(gòu)偽指令,(
30、2)合并類型 合并類型用來指示連接程序本段與同段名同類別的其它段合并與否以及合并方式。有下列5種選擇: NONE:表示本段與其它段無連接關(guān)系,因此它們在邏輯上仍然是分離的,盡管在物理上可能是相鄰的。NONE是默認的組合類型。 PUBLIC:連接程序在滿足邊界類型的前提下,將本段與其它具有相同段名、且也用PUBLIC說明的段放在連續(xù)的存儲空間中,形成一個新的邏輯段,其長度為各段長度之和。 COMMON:產(chǎn)生一個覆蓋段。連接程序?qū)⑾嗤蚊?、相同類別的COMMON段重疊放置,共享同一個存儲區(qū),覆蓋段的長度是各段長度的最大值。 STACK:用于指定一個堆棧段,連接程序?qū)TACK段與PUBLIC段同樣
31、處理。此外它還要指示裝入程序把合并后的段基址送入SS,并將SP設(shè)置成堆棧段的長度,于是第一次壓入的元素就占據(jù)了堆棧段的最后一個字單元。被連接程序中至少有一個STACK段,如果有多個,裝入程序時,SS指向第一個所遇到的STACK段。 AT 節(jié)地址:表示本段可定位在表達式所指定的小節(jié)邊界上。,4.5.1 段結(jié)構(gòu)偽指令,(3)類別名 類別名是寫在一對單引號中的名字,由用戶自己選定。連接程序把合并類型和類別名相同的所有段放置在連續(xù)的存儲區(qū)內(nèi)。所有無類別名的邏輯段也一起放置在連續(xù)的存儲區(qū)內(nèi)。 2段尾偽指令ENDS 該偽指令標志著一個段的結(jié)束。其格式如下: 段名 ENDS 其中,段名必須與SEGMENT指
32、令中的段名一致。,4.5.1 段結(jié)構(gòu)偽指令,3段尋址偽指令A(yù)SSUME 段尋址偽指令A(yù)SSUME用來說明各個段寄存器分別裝入哪個邏輯段的段起始地址,也就是說,將哪些段設(shè)置成當前段。其格式如下: ASSUME 段寄存器名:段名,段寄存器名:段名, 其中,段寄存器名對于8086/8088CPU而言是CS、DS、ES和SS中的一個。段名是程序中定義過的邏輯段段名。 段尋址偽指令A(yù)SSUME只是可以說明各個段寄存器和邏輯段的對應(yīng)關(guān)系,但并不能給段寄存器賦予實際的初始值。除了CS初始值可以在程序初始化的過程中由匯編程序自動給出之外,DS、ES、SS等段寄存器的初值一般都要在程序中用MOV指令給出。 例如
33、: MOV AX,DATA MOVDS,AX 以上指令的功能是將數(shù)據(jù)段的段地址值裝入DS。,4.5.1 段結(jié)構(gòu)偽指令,4.ORG偽指令 ORG偽指令設(shè)置其后的指令或數(shù)據(jù)的起始地址,即使指令或數(shù)據(jù)從指定的偏移地址開始存放。其一般格式如下: ORG 表達式 其中,表達式的值應(yīng)在范圍0000H0FFFFH之內(nèi)。 例如: DATA SEGMENT ORG 100H; 使變量X從偏移地址100H開始存放 X DB 12H Y DW 5 DUP (?) ORG 200H; 使變量Z從偏移地址200H開始存放 Z DD 0A000H DATA ENDS,4.5.1 段結(jié)構(gòu)偽指令,5.地址計數(shù)器$ 地址計數(shù)器
34、$表示下一個可用單元的地址。 例如: ORG 0050H; 使變量DATA1從偏移地址0050H開始存放 DATA1 DW1,2,3,4 ORG $+30H; 使變量DATA2從偏移地址0058H開始存放 DATA2DBABCD 地址計數(shù)器$在實際應(yīng)用中常用來確定數(shù)組中元素的個數(shù)。 又如: BUF1 DB 1,2,3,4,5 CNT1 EQU$-BUF ; CNT1的值為數(shù)組BUF1中數(shù)據(jù)元素的個數(shù) BUF2 DW 1,2,3,4,5 CNT2 EQU($-BUF2)/2 ; CNT2的值為數(shù)組BUF2中數(shù)據(jù)元素的個數(shù) BUF3 DD1,2,3,4,5 CNT3 EQU ($-BUF3)/4
35、; CNT3的值為數(shù)組BUF3中數(shù)據(jù)元素的個數(shù),4.5.2完整段定義結(jié)構(gòu),完整段定義結(jié)構(gòu)是指在程序中用段定義偽指令,對用到的邏輯段分別加以定義。完整段定義的典型結(jié)構(gòu)如下。 數(shù)據(jù)段名 SEGMENT; 數(shù)據(jù)段開始 數(shù)據(jù)段名 ENDS; 數(shù)據(jù)段結(jié)束 堆棧段名 SEGMENT; 堆棧段開始 堆棧段名 ENDS; 堆棧段結(jié)束 代碼段名 SEGMENT; 代碼段開始 ASSUME ; 段地址裝填 START: MOV AH,4CH INT 21H; 返回DOS 代碼段名 ENDS; 代碼段結(jié)束 END START,4.5.2完整段定義結(jié)構(gòu),【例4-1】求字存儲單元中兩個數(shù)之差,結(jié)果存入下一個相鄰的字單元
36、中。程序中使用完整段定義結(jié)構(gòu)。 NAMEEXAMPLE4-1 ; 以下為數(shù)據(jù)段 DATA SEGMENT BUF DW 3483H,4596H RES DW? DATAENDS ; 以下為堆棧段 STACKSEGMENT STACK STACK STA DW100 DUP(?) STACK ENDS,; 以下為代碼段 CODE SEGMENT ASSUME CS:CODE.DS:DATA START:MOVAX,DATA MOVDS,AX MOVAX,BUF SUBAX,BUF+2 MOVRES,AX MOVAH,4CH INT 21H CODEENDS ENDSTART,4.5.3 過程定義
37、偽指令,在程序設(shè)計中,通常把一些相對獨立的語句序列組織成一個過程,供程序調(diào)用執(zhí)行。過程又稱為子程序。過程定義偽指令PROC/ENDP的格式如下: 過程名PROC NEAR|FAR ; 指令序列 RET; 返回指令 過程名ENDP 定義一個過程必須在一個邏輯段內(nèi),過程名相當于標號,表示本過程的符號地址。過程有NEAR和FAR兩種類型,NEAR型的過程僅供段內(nèi)調(diào)用,F(xiàn)AR型的過程可供段間調(diào)用。類型缺省時,默認值為NEAR。 在一個過程中,至少要有一條過程返回指令RET,它可以書寫在過程中的任何位置,但過程執(zhí)行的最后一條指令一定是RET指令。,4.5.4模塊定義偽指令,在編寫規(guī)模較大的匯編語言源程序
38、時,可以將整個程序劃分為幾個獨立的模塊,對各個模塊文件分別編寫源程序、分別進行編輯、匯編,生成各自的目標程序,最后將這些目標程序連接成一個完整的可執(zhí)行程序。為了便于進行模塊連接和模塊間的相互訪問,在定義模塊時使用NAME、END等偽指令。,4.5.4模塊定義偽指令,1NAME偽指令 NAME偽指令用于給源程序匯編以后得到的目標程序指定一個模塊名,連接目標程序 時,將使用該模塊名表示目標程序。其格式如下: NAME 模塊名 需要指出的是,在NAME偽指令中不允許有標號。如果源程序中沒有用NAME偽指令指定模塊名,則匯編程序?qū)ITLE偽指令給出的“標題名”中前6個字符作為模塊名,如果源程序中既無
39、NAME偽指令,又無TITLE偽指令,則匯編程序?qū)⒃闯绦虻奈募鳛槟K名。,4.5.4模塊定義偽指令,2TITLE偽指令 TITLE偽指令用于給程序指定一個標題,一般不超過60個字符,以后的列表文件會在每一頁的第一行顯示這個標題。其格式如下: TITLE 文本 在程序中沒有NAME偽指令時,用其前6個字符作為模塊名。 3END偽指令 END偽指令指示用標號指定的地址作為程序執(zhí)行的啟動地址。其格式如下: END 標號 END偽指令將標號的段地址和偏移地址分別提供給代碼段寄存器CS和指令計數(shù)器IP。格式中的標號是可選項,當有多個模塊連接在一起時,則只有主模塊中的END偽指令使用標號。,4.5.5
40、 80 x86指令集選擇偽指令,指令集選擇偽指令用于通知匯編程序,以下程序使用哪一種指令集。選擇指令集的指令都以圓點“.”作為引導,在程序中使用時必須放在段外,一般放在程序的開始部分,對整個源程序起作用。 (1).8086:選擇8086/8088指令集,此偽指令可以省略。 (2).286:選擇80286指令集,不包括特權(quán)指令。 (3).286P:選擇80286保護模式指令集,包括特權(quán)指令。 (4).287:選擇80287數(shù)字協(xié)處理器指令集。 (5).386:選擇80386指令集,不包括特權(quán)指令。 (6).386P:選擇80386保護模式指令集,包括特權(quán)指令。 (7).387:選擇80387數(shù)字
41、協(xié)處理器指令集。 (8).486:選擇80486指令集,不包括特權(quán)指令。 (9).486P:選擇80486保護模式指令集,包括特權(quán)指令。 (10).586:選擇Pentium指令集,不包括特權(quán)指令。 (11).586P:選擇Pentium保護模式指令集,包括特權(quán)指令。 當一個程序未使用80 x86指令集選擇偽指令時,默認使用8086/8088指令集。80 x86指令集向上兼容。例如,在程序中使用了.486偽指令,則該程序中可以使用8086/8088、80286、80386和80486指令集中的指令,但是不能使用80586指令集中的指令和80486指令集中的特權(quán)指令。,4.5.6 簡化段定義偽指
42、令,簡化段定義是在MASM5.0版以后開始提供的。較之完整段定義結(jié)構(gòu)而言,其優(yōu)點在于程序結(jié)構(gòu)簡單,容易使用,并且容易和高級語言連接。但是它并不適合大多數(shù)匯編程序。編程人員可以根據(jù)實際需要和個人習慣選擇完整段結(jié)構(gòu)或簡化段結(jié)構(gòu)。,4.5.6 簡化段定義偽指令,1. 簡化段定義典型結(jié)構(gòu) 簡化段定義的典型結(jié)構(gòu)如下: .MODEL SMALL; 定義內(nèi)存模式為小模式 .386; 選擇386指令系統(tǒng)集 .DATA; 數(shù)據(jù)段開始 ; 數(shù)據(jù)段定義 .STACK512 ; 定義堆棧段及其尺寸為512字節(jié) .CODE; 代碼段開始 .STARTUP; 加載后程序入口點 ; 代碼段定義 .EXIT; 返回DOS或調(diào)
43、用程序 .END; 程序結(jié)束,4.5.6 簡化段定義偽指令,2. 簡化段定義偽指令 (1)模式選擇偽指令.MODEL 模式選擇偽指令.MODEL用于指明簡化段所用存儲模式。其格式如下: .MODEL 存儲模式 常用的存儲模式有以下幾種: TINY:指明簡化段所用存儲模式為微模式,在這種存儲模式下,所有數(shù)據(jù)及代碼放入同一個物理段內(nèi),整個程序不超過64KB。程序會產(chǎn)生一個MS-DOS的.com程序。DOS操作系統(tǒng)支持這種存儲模式。 SMALL:指明簡化段所用存儲模式為小模式,在這種存儲模式下,程序中有只有一個數(shù)據(jù)段和一個代碼段,分別放置所有的數(shù)據(jù)和代碼。因此,程序中的轉(zhuǎn)移和調(diào)用都被認為是NEAR型
44、,且DS在整個程序運行期間保持不變。MS-DOS和Windows操作系統(tǒng)支持這種存儲模式。,4.5.6 簡化段定義偽指令,MEDIUM:指明簡化段所用存儲模式為中模式,在這種存儲模式下,全部代碼可以超過64KB,可以被放置在多個段中,程序中的轉(zhuǎn)移和調(diào)用可以是NEAR型或FAR型,但所有數(shù)據(jù)仍要放在一個數(shù)據(jù)段中,因此,DS在整個程序運行期間保持不變。MS-DOS和Windows操作系統(tǒng)支持這種存儲模式。 COMPACT:指明簡化段所用存儲模式為壓縮模式,在這種存儲模式下,全部數(shù)據(jù)可以超過64KB,可以被放置在多個段中,但是單個數(shù)據(jù)項不能超過64KB。MS-DOS和Windows操作系統(tǒng)支持這種存
45、儲模式。 LARGE:指明簡化段所用存儲模式為大模式,在這種存儲模式下,代碼和數(shù)據(jù)都可以超過64KB,可以被放置在多個段中,但是單個數(shù)據(jù)項不能超過64KB。MS-DOS和Windows操作系統(tǒng)支持這種存儲模式。,4.5.6 簡化段定義偽指令,(2)數(shù)據(jù)段定義偽指令.DATA 數(shù)據(jù)段定義偽指令.DATA用于定義一個數(shù)據(jù)段,其格式如下: .DATA 名字 注意:如果有多個數(shù)據(jù)段,則用名字區(qū)別。只有一個數(shù)據(jù)段時,隱含段名為 DATA。 (3)堆棧段定義偽指令.STACK 堆棧段定義偽指令.STACK用于定義一個堆棧段,并形成SS及SP的初值,其格式如下: .STACK 長度 其中,長度的默認值為10
46、24字節(jié),即1KB,隱含段名為 STACK。,4.5.6 簡化段定義偽指令,(4)代碼段定義偽指令.CODE 代碼段定義偽指令.CODE用于定義一個代碼段。其格式如下: .CODE 名字 注意:如果有多個代碼段,則用名字區(qū)別。只有一個代碼段時,隱含段名為 CODE。 (5)程序返回偽指令.EXIT 程序返回偽指令.EXIT用于控制程序返回DOS操作系統(tǒng)或調(diào)用程序。其格式如下: .EXIT (6)程序開始偽指令.STARTUP 程序開始偽指令.STARTUP用于指示程序執(zhí)行的開始位置。其格式如下: .STARTUP,4.5.6 簡化段定義偽指令,【例4-2】簡化段定義結(jié)構(gòu)示例程序,實現(xiàn)兩個字型數(shù)
47、據(jù)相加運算。 NAME EXAMPLE4-2 .MODEL SMALL; 定義內(nèi)存模式為小模式 .386; 選擇386指令系統(tǒng)集 .DATA ; 數(shù)據(jù)段開始 DW1DW3483H DW2DW4596H SUM DW? .STACK 200; 定義堆棧段及其尺寸為200字節(jié) .CODE ; 代碼段開始 .STARTUP; 加載后程序入口點 MOVAX,DA1 ADDAX,DW2 MOVSUM,AX .EXIT; 返回DOS或調(diào)用程序 .END; 程序結(jié)束,4.6 宏指令,宏是一種高級匯編語言技術(shù),允許使用宏指令是宏匯編語言的一個最主要的特點。在這種技術(shù)中,允許將具有某中功能的語句序列定義成一條宏
48、指令供程序調(diào)用,從而避免重復書寫相同的語句序列。這樣做不僅可以提高編程效率,而且提高了程序的可讀性和易修改性。,4.6.1 宏指令定義、調(diào)用及展開,1宏定義 宏定義MACRO/ENDM的格式如下: 宏指令名 MACRO 形參列表 ;宏體(指令序列) ENDM MACRO語句表示要開始定義一個宏,宏指令名要遵守匯編語言標識符的命名規(guī)則。在整個程序中是唯一的,不能與其它的名字相同。宏體是由指令語句、偽指令語句甚至是宏指令語句組成的。ENDM語句表示宏定義結(jié)束。如果在宏調(diào)用時,允許對宏體中的某些部分進行適當修改,在宏定義時,把允許修改的部分用形式參數(shù)(簡稱形參)來表示,在宏調(diào)用時用實在參數(shù)(簡稱實參
49、)來替代相對應(yīng)的形參,形參之間用逗號分隔。,4.6.1 宏指令定義、調(diào)用及展開,例如:定義宏指令,將AX、BX、CX、DX的內(nèi)容依次壓棧 PUSH4MACRO PUSH AX PUSH BX PUSH CX PUSH DX ENDM 例如:定義宏指令,對兩個存儲單元(字節(jié)/字)的內(nèi)容相互交換 兩個存儲單元的內(nèi)容不能夠直接進行相互交換,可以借助于一個通用寄存器實現(xiàn)。以下宏定義中用形式參數(shù)M1、M2和R分別表示要用兩個存儲單元和一個寄存器為實在參數(shù)。 XCHG2MMACRO M1,M2,R MOV R,M1 XCHG R,M2 MOV M1,R ENDM,4.6.1 宏指令定義、調(diào)用及展開,2宏調(diào)
50、用 宏指令一經(jīng)定義,就可以在源程序的任何位置上使用宏指令,稱為宏調(diào)用。宏調(diào)用的格式如下: 宏指令名 實參列表 其中,宏指令名是用宏定義偽指令定義的名字。如果調(diào)用的是有參數(shù)的宏,則要用實參列表給出相應(yīng)的實參,實參之間用逗號隔開。實參應(yīng)與宏定義中的形參順序一致、類型相同、個數(shù)相等。,4.6.1 宏指令定義、調(diào)用及展開,【例4-3】下面的程序中調(diào)用了宏指令PUSH4 DATA SEGMENT DATAENDS STACKSEGMENT STACK STACK STA DW100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE.DS:DATA START:M
51、OVAX,DATA MOVDS,AX PUSH4 ; 調(diào)用宏指令PUSH4,將AX、BX、CX、DX的內(nèi)容依次壓棧 MOVAH,4CH INT 21H CODEENDS ENDSTART,4.6.1 宏指令定義、調(diào)用及展開,【例4-4】下面的程序中調(diào)用了宏指令XCHG2M DATA SEGMENT DA1DW1234H; 定義字型變量DA1 DA2DW5678H; 定義字型變量DA2 DATAENDS STACKSEGMENT STACK STACK STA DW100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE.DS:DATA START:MO
52、VAX,DATA MOVDS,AX XCHG2MDA1,DA2,AX ; 調(diào)用宏指令XCHG2M交換變量DA1、DA2的內(nèi)容 MOVAH,4CH INT 21H CODEENDS ENDSTART,4.6.1 宏指令定義、調(diào)用及展開,3宏展開 當源程序被匯編時,宏匯編程序要對每個掃描到的宏調(diào)用進行宏展開。所謂宏展開,就是用宏定義中宏體的目標代碼去替換宏調(diào)用,并用實參替換形參。經(jīng)宏展開之后,在程序的目標代碼中,每個宏調(diào)用位置都包含相應(yīng)宏體的目標代碼。而宏調(diào)用本身并不產(chǎn)生目標代碼,它僅調(diào)用宏定義的位置。用列表文件查看源程序時,將看到宏展開所產(chǎn)生的每一條指令前面都有“+”標記。 例如: 宏調(diào)用PUSH4對應(yīng)的宏展開為: +PUSHAX +PUSHBX +PUSHCX +PUSHDX 宏調(diào)用XCHG2MDA1,DA2,AX對應(yīng)的宏展開為: + MOV AX, DA1 + XCHG AX, D2 + MOV D1,AX,4.6.2 宏操作符,1連接操作符 語句序列1 ELSE ; 語句序列2 ENDIF 格式二: IFXX 條件 ; 語句序列 ENDIF,4.7.2 條件匯編,IFXX表示不同的條件偽指令,這里的條件必須是匯編時條件,即匯編程序能夠判定的條件。對于格式一,如果條件為真,匯編程序匯編直到IFXX 和ELSE之間的語句序列,否則匯編ELSE和ENDIF之間的語句序列;對于格
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 系列產(chǎn)品培訓
- 婦科腫瘤早期診斷
- 負壓患者心理護理
- 高效店長培訓體系構(gòu)建指南
- 2025年起重機械項目申請報告模板
- 2025年草除靈乙酯項目立項申請報告
- 2025年福建三明城發(fā)綠城物業(yè)服務(wù)有限公司招聘考試筆試試題(含答案)
- 【包頭】2025年內(nèi)蒙古包頭職業(yè)技術(shù)學院引進高層次和緊缺急需人才15人筆試歷年典型考題及考點剖析附帶答案詳解
- 給予樹教學設(shè)計課件
- 水果類教學課件
- CT增強掃描造影劑外滲的預(yù)防與處理
- Unit 2 Home Sweet Home 第6課時(Project Reading Plus) 2025-2026學年人教版英語八年級下冊
- 孤獨癥業(yè)務(wù)管理制度
- xx公司獎金管理制度
- 勞務(wù)服務(wù)購買協(xié)議書范本
- 2025-2030年中國生物醫(yī)學材料行業(yè)市場深度分析及發(fā)展前景與投資研究報告
- 2025年小學語文一年級下冊無紙筆測試題(小學一年級游園樂考無紙化檢測)
- 2025年地理中考時政熱點復習課件
- 區(qū)塊鏈技術(shù)在廣告業(yè)的應(yīng)用行業(yè)跨境出海項目商業(yè)計劃書
- 校準員試題及答案
- 2025-2030年中國臨空經(jīng)濟行業(yè)深度評估及市場研究發(fā)展研究報告
評論
0/150
提交評論