匯編語言匯編語言的基本語法_第1頁
匯編語言匯編語言的基本語法_第2頁
匯編語言匯編語言的基本語法_第3頁
匯編語言匯編語言的基本語法_第4頁
匯編語言匯編語言的基本語法_第5頁
已閱讀5頁,還剩73頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第7章 匯編語言的基本語法Assemble Languagen一種面向機(jī)器的程序設(shè)計(jì)語言,是一種用符號(hào)表示的低級(jí)程序設(shè)計(jì)語言(機(jī)器語言的符號(hào)化描(機(jī)器語言的符號(hào)化描述)述),通常是為特定計(jì)算機(jī)或計(jì)算機(jī)系列專門設(shè)計(jì)的。Assemble Languagen用匯編語言編寫的程序不能由機(jī)器直接執(zhí)行,而必須經(jīng)匯編程序翻譯成機(jī)器語言程序。匯編語言指令與翻譯成的機(jī)器語言指令之間基本是一一對(duì)應(yīng)的關(guān)系。n匯編過程示意:n采用匯編語言進(jìn)行程序設(shè)計(jì)的優(yōu)點(diǎn)采用匯編語言進(jìn)行程序設(shè)計(jì)的優(yōu)點(diǎn):n可充分利用機(jī)器的硬件功能和結(jié)構(gòu)特點(diǎn),加快程序的執(zhí)行速度,減少目標(biāo)程序所占用的存儲(chǔ)空間。n常用來編寫實(shí)時(shí)控制程序、實(shí)時(shí)通信程序?qū)崟r(shí)控

2、制程序、實(shí)時(shí)通信程序,有時(shí)也用來編制某些系統(tǒng)軟件程序。缺點(diǎn):缺點(diǎn):1. 編程效率低(與人們描述計(jì)算過程的需要差距大);2. 與機(jī)器硬件的具體結(jié)構(gòu)聯(lián)系過于緊密 在一種結(jié)構(gòu)的機(jī)器上開發(fā)的程序極難移植到另一種不同結(jié)構(gòu)的機(jī)器上去。示例程序DATA SEGMENT ;數(shù)據(jù)段 NUM DW 0011101000000111B NOTES DB The result is : , $DATA ENDSCODE SEGMENT ;代碼段 ASSUME CS:CODE,DS:DATA BEGIN: MOV AX, DATA MOV DS,AX MOV DX,OFFSET NOTES ;顯示提示信息 MOV AH

3、,9H INT 21H MOV BX,NUM ;將數(shù)裝入BX MOV CH,4 ;CH作循環(huán)計(jì)數(shù)器 示例程序(續(xù))ROTATE : DISPLAY: MOV CL, 4 ;CL中放移位位數(shù) MOV DL, AL ;顯示16進(jìn)制數(shù) ROL BX,CL MOV AH,2 MOV AL,BL INT 21H AND AL,0FH ;AL中為一位16進(jìn)制數(shù) DEC CH ADD AL,30H ;轉(zhuǎn)換為ASCII碼值 JNZ ROTATE CMP AL,9 ;是09的數(shù)碼? MOV AX,4C00H;返回DOS JLE DISPLAY INT 21H ADD AL,07H ;在AF之間 CODE END

4、S ;代碼段結(jié)束 END BEGIN ;模塊結(jié)束堆棧段定義格式堆棧段定義格式STACK SEGMENT STACK STA DB 50 DUP (?) TOP EQU LENGTH STASTACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS, AX MOV SP,TOP :CODE ENDS END START 7.1.2 匯編語言源程序的組成1. 偽指令語句和指令語句偽指令語句和指令語句q 匯編語言源程序中除了包含真正的指令外,還應(yīng)包含說明性的

5、“指令”。這些說明性的“指令”是面向匯編程序和連接程序的,稱為偽指令偽指令。q 宏匯編程序5.0版(MASM V5.0)規(guī)定,匯編語言源程序的每行只能寫一個(gè)語句: 指令語句或偽指令語句指令語句或偽指令語句。行長(zhǎng)不能超過128個(gè)字符。每個(gè)語句最多可由四個(gè)字段組成: 名字字段、操作字段、操作數(shù)字段和注釋字段。 q 偽指令語句是說明性語句,其格式為:偽指令語句是說明性語句,其格式為: q 名字偽指令說明符參數(shù)表達(dá)式名字偽指令說明符參數(shù)表達(dá)式1,參數(shù)表達(dá)式,參數(shù)表達(dá)式2, ;注釋;注釋q 其中,偽指令說明符(偽指令名偽指令名)是偽指令語句中不可缺少的主體,其余部分(方括號(hào)中的內(nèi)容)有時(shí)可省略。q 名字

6、可為段名、過程名、變量名、符號(hào)名(或常量名)、宏名、結(jié)構(gòu)名、記錄名等。q例:例: A DB 20H,30H ; 注釋 q指令語句是可執(zhí)行語句,其格式為:指令語句是可執(zhí)行語句,其格式為: 名字名字:指令操作助記符操作數(shù)表達(dá)式指令操作助記符操作數(shù)表達(dá)式1,操作數(shù)表達(dá)式,操作數(shù)表達(dá)式2;注釋;注釋q其中,指令操作助記符指令操作助記符(指令名指令名)是指令語句中不可缺少的主體,其余部分(方括號(hào)中的內(nèi)容)有時(shí)可省略。q名字只能是標(biāo)號(hào)。q 注釋以分號(hào)開頭,分號(hào)右邊的內(nèi)容將被匯編程序忽略。注釋以分號(hào)開頭,分號(hào)右邊的內(nèi)容將被匯編程序忽略。q 例例 q L: ADD AX,BX ;注釋注釋 q 匯編程序負(fù)責(zé)計(jì)算

7、偽指令語句中表達(dá)式的值,解釋偽指令語句的含義并遵照“執(zhí)行”,但并不產(chǎn)生機(jī)器代碼但并不產(chǎn)生機(jī)器代碼。q 匯編程序負(fù)責(zé)計(jì)算指令語句中表達(dá)式的值,并將匯編指將匯編指令翻譯成機(jī)器指令代碼。令翻譯成機(jī)器指令代碼。q 指令語句經(jīng)匯編后,在可執(zhí)行程序運(yùn)行期間由CPU解釋,并由CPU按指令的要求完成各種運(yùn)算與操作。 7.1.4 匯編語言的表達(dá)式1. 匯編語言的標(biāo)識(shí)符2. 匯編語言的操作對(duì)象( 數(shù)據(jù)類型) (1) 常數(shù)、常量 編程時(shí)已經(jīng)確定其值,程序運(yùn)行期間不會(huì)改變其值的數(shù)編程時(shí)已經(jīng)確定其值,程序運(yùn)行期間不會(huì)改變其值的數(shù)據(jù)對(duì)象稱為常數(shù)。據(jù)對(duì)象稱為常數(shù)。 8086/8088CPU允許定義四種形式的常數(shù): 整數(shù)、字

8、符串、“組合BCD碼數(shù)”和實(shí)數(shù)(浮點(diǎn)數(shù)),但只能處理整數(shù)、字符串、“組合BCD碼數(shù)”,不能處理實(shí)數(shù)(浮點(diǎn)數(shù))。 q 常數(shù)表達(dá)式的名字稱為常量。常數(shù)表達(dá)式的名字稱為常量。q(程序員給出的一個(gè)名或助記名作為一個(gè)確定值的標(biāo)識(shí),(程序員給出的一個(gè)名或助記名作為一個(gè)確定值的標(biāo)識(shí), 其值在程序執(zhí)行過程中保持不變。)其值在程序執(zhí)行過程中保持不變。)q常量可用偽指令說明符“EQU”或“=”定義。q例如,A EQU 7或 A = 7都可將常量A的值定義為常數(shù)7。q 注意:偽指令說明符EQU左邊的符號(hào)名不允許重復(fù)定義,而“=”左邊的符號(hào)名可以重復(fù)定義。 即,A EQU 7 可以:A=7 A EQU 8 (不允許)

9、 A=8 n(2) 變量n編程時(shí)只能確定其初始值,程序運(yùn)行期間可修改其值的數(shù)編程時(shí)只能確定其初始值,程序運(yùn)行期間可修改其值的數(shù)據(jù)對(duì)象稱為變量。據(jù)對(duì)象稱為變量。變量是存儲(chǔ)單元中的數(shù)據(jù),可定義在任何段(DS、 ES、 SS、 CS),但通常都定義在數(shù)據(jù)段(DS)和附加段(ES)。n 變量由偽指令說明符DB、DW、DD等定義。需要時(shí)可給變量的地址取名字,變量名就是變量地址的名字,可稱為變量的符號(hào)地址。n例如例如, 在下列偽指令語句中,在下列偽指令語句中, A DB 50,60,70,80 DW 50,60,70,80 DD 50,60,70,80n用DB、DW、DD說明符各定義了4個(gè)變量,并給出了每

10、個(gè)變量的初始值。n用DB定義的每個(gè)變量占一個(gè)字節(jié)單元,用DW定義的每個(gè)變量占兩個(gè)連續(xù)的字節(jié)單元,用DD定義的每個(gè)變量占四個(gè)連續(xù)的字節(jié)單元,這些變量全部都按定義時(shí)的順序依次存儲(chǔ),只是用DB定義的第一個(gè)變量賦予了名字A。nA僅代表僅代表DB右邊第一個(gè)變量右邊第一個(gè)變量(即即DB右邊初值為右邊初值為50的變量的變量)的地址。的地址。 變量有如下的屬性:變量有如下的屬性: 段基值屬性: 指變量所在段的段基值; 偏移地址屬性: 指變量所在的存儲(chǔ)單元的段內(nèi)偏移地址; 類型屬性: 指變量所占存儲(chǔ)單元的字節(jié)數(shù)。n(3) 標(biāo)號(hào)n標(biāo)號(hào)就是指令地址的名字,也稱為指令的符號(hào)地址。標(biāo)號(hào)就是指令地址的名字,也稱為指令的符

11、號(hào)地址。n標(biāo)號(hào)定義在指令的前面(通常是左邊),用冒號(hào)作為分隔符。標(biāo)號(hào)只能定義在代碼段(CS)中,它代表其后第一條指令的第一個(gè)字節(jié)的存儲(chǔ)單元地址,用于說明指令在存儲(chǔ)器中的存儲(chǔ)位置。例如, 在下列指令序列中, MOV CX, 2 L:DEC CX JZ LnL就是標(biāo)號(hào),它是JZ指令的直接操作數(shù)(轉(zhuǎn)移地址).n標(biāo)號(hào)有如下的屬性:標(biāo)號(hào)有如下的屬性: 段基值屬性: 指標(biāo)號(hào)后面第一條指令所在的代碼段的段基值; 偏移地址屬性: 指標(biāo)號(hào)后面第一條指令首字節(jié)的段內(nèi)偏移地址; 類型屬性: 也稱距離屬性,是指標(biāo)號(hào)與引用該標(biāo)號(hào)的指令之間允許距離的遠(yuǎn)、近遠(yuǎn)、近。 (4) 段名 每一個(gè)段都必須用SEGMENT和ENDS標(biāo)

12、識(shí)段的開始和結(jié)束,SEGMENT和ENDS左邊必須有名字,段名就是SEGMENT和ENDS左邊的名字。 對(duì)于同一個(gè)段,ENDS左邊的名字必須與SEGMENT左邊的名字相同。n(5) 過程名n過程就是一段程序,可以是主程序,也可以是子程序。一個(gè)代碼段中可以只有一個(gè)過程,也可以有多個(gè)過程。n每一個(gè)過程都可用PROC和ENDP標(biāo)識(shí)過程的開始和結(jié)束,PROC和ENDP左邊必須有名字,過程名就是PROC和ENDP左邊的名字。n對(duì)于同一個(gè)過程,ENDP左邊的名字必須與PROC左邊的名字相同。n過程名等同于標(biāo)號(hào),具有標(biāo)號(hào)的全部屬性。 (6) 偏移地址計(jì)數(shù)器$q匯編程序在對(duì)源程序進(jìn)行匯編的過程中,用偏移地址計(jì)

13、數(shù)器$來保存當(dāng)前正在匯編的指令的偏移地址或偽指令語句中變量的偏移地址。q 用戶可將用戶可將$用于自己編寫的源程序中。用于自己編寫的源程序中。q在每個(gè)段開始匯編時(shí),匯編程序( 匯編器)都將$清為0,以后,每處理一條指令或一個(gè)變量,$就增加一個(gè)值,此值為該指令或該變量所占的字節(jié)數(shù)。n可見,可見,$的內(nèi)容就是當(dāng)前指令或變量的偏移地址。的內(nèi)容就是當(dāng)前指令或變量的偏移地址。 n在偽指令中在偽指令中,$代表其所在地的偏移地址。例如,如果A的偏移地址是0074H,則語句nA DW 1, 2, $+4, 3, 4, $+4 中的第一個(gè)$+4的偏移地址為A+4,第二個(gè)$+4的偏移地址為A+10。n匯編后匯編后:

14、n第一個(gè)$+4:$+4=(A+4)+4=(0074H+4)+4=007CHn第二個(gè)$+4:$+4=(A+10)+4=(0074H+0AH)+4=0082Hn在指令中在指令中,$無論出現(xiàn)在指令的任何位置,都代表本條指令第一個(gè)字節(jié)的偏移地址。例如,“JZ $+6”的轉(zhuǎn)向地址是該指令的首地址加上6,$+6還必須是另一條指令的首地址。再如,在下述指令序列中, DEC CX JZ $+5 MOV AX, 2 LAB: .n因?yàn)?代表JZ指令的開始地址,而JZ指令占2個(gè)字節(jié),這里的MOV 指令占3個(gè)字節(jié),所以,在發(fā)生轉(zhuǎn)移時(shí),JZ指令會(huì)將程序轉(zhuǎn)向LAB標(biāo)號(hào)處的指令, 且標(biāo)號(hào)LAB 可省。3. 匯編語言的偽操

15、作(運(yùn)算)符n匯編語言中的操作符號(hào)很多,可分為算術(shù)操作符、邏輯操算術(shù)操作符、邏輯操作符、關(guān)系操作符、重復(fù)置數(shù)作符、關(guān)系操作符、重復(fù)置數(shù)(復(fù)制復(fù)制)操作符、取屬性操作符、取屬性(分析分析)操作符、指定屬性操作符、指定屬性(合成合成)操作符、分離操作符、結(jié)構(gòu)和記操作符、分離操作符、結(jié)構(gòu)和記錄中專用的操作符錄中專用的操作符等幾類。n這些操作符都是面向匯編程序的,都由匯編程序解釋并“執(zhí)行”,而不是像指令那樣由CPU去執(zhí)行。n通常稱這些操作符為偽操作符偽操作符,稱對(duì)應(yīng)的操作為偽操作。偽操作。 (1) 算術(shù)偽操作n常見的有+、-、MOD、SHL、SHR、*、/共7個(gè)符號(hào),分別表示加、減、取模(求余數(shù))、邏

16、輯左移、邏輯右移、乘、除。這些操作符都可用于數(shù)據(jù)之間的運(yùn)算,+、-操作符還可用于地址之間、數(shù)據(jù)與地址之間的運(yùn)算。n 用于數(shù)據(jù)之間的運(yùn)算時(shí)用于數(shù)據(jù)之間的運(yùn)算時(shí),按每個(gè)操作符的定義進(jìn)行。n例如,在字節(jié)操作時(shí),n“124 MOD 3”的結(jié)果為1n“10110101B SHL 2”的結(jié)果為11010100Bn n再例如,對(duì)如下的定義, W1 DW 1, 2, 3, 4, 5, 6, 7 B1 DB 10, 20, 30, 40, 50 N1 EQU B1-W1 N2 EQU $-W1 B2 DB 0n則N1=14,它是從W1開始到B1前為止的一組變量的字節(jié)數(shù);nN2=19,它是從W1開始到B2($代表

17、的地址)前為止的一組變量的字節(jié)數(shù)。(2) 關(guān)系偽操作n關(guān)系偽操作對(duì)兩個(gè)數(shù)據(jù)進(jìn)行比較,有EQ、NE、LT、GT、LE、GE共6個(gè)符號(hào),分別表示等于、不等于、小于、大于、小于或等于、大于或等于,操作的結(jié)果為邏輯值。n若條件滿足,則結(jié)果為“真”,若條件不滿足,則結(jié)果為“假”?!罢妗庇?1(n位全1)表示,“假”用0(n位全0)表示。n例如,在字操作時(shí): n(60H LE 70H) GE (60H LT 30H) = 0FFFFH GE 0000H = 0FFFFH。(3) 邏輯偽操作n有NOT、AND、OR、XOR共4個(gè)符號(hào),分別表示非、與、或、異或,可用于對(duì)兩個(gè)(或一個(gè))數(shù)據(jù)進(jìn)行操作。n例如,在字

18、操作時(shí),1234H OR 2AFEH = 3AFEH,NOT 0F0H = 0FF0FH;在字節(jié)操作時(shí),NOT 0F0H = 0FH。(4) 重復(fù)置數(shù)(復(fù)制)偽操作n只有DUP一個(gè)符號(hào),表示對(duì)其后(右邊)的數(shù)據(jù)進(jìn)行重復(fù)設(shè)置(復(fù)制),使用格式是: 重復(fù)次數(shù)重復(fù)次數(shù)DUP (初值初值1, 初值初值2, )n其中,重復(fù)次數(shù)為無符號(hào)整數(shù)(165535),初值1、初值2 為變量的初始值。例如, n下面各行的寫法都等效:下面各行的寫法都等效: W DW 25,8,2,3,2,3,6,8,2,3,2,3,6 W DW 25,2 DUP(8,2,3,2,3,6) W DW 1 DUP(25),2 DUP(8,

19、2 DUP(2,3),6) W DW 1 DUP(25),2 DUP(1 DUP(8),2 DUP(2,3),1 DUP(6)n 第一行的寫法將13個(gè)變量分為13組,每組重復(fù)1次。后三行的寫法將13個(gè)變量分為兩組,第一組將25重復(fù)一次,第二組將(8,2,3,2,3,6)重復(fù)兩次。n無論哪種寫法,我們都將第一組變量的重復(fù)次數(shù)稱為W的長(zhǎng)度,將W的長(zhǎng)度與W的類型之積稱為W的大小。此處,W的長(zhǎng)度為1,類型為2,大小為2。長(zhǎng)度和大小也可看作變量的屬性。n練習(xí):練習(xí):若定義若定義A DB 1, 2, 5 DUP(0,1,2 DUP(3),則在則在A的的存儲(chǔ)區(qū)前存儲(chǔ)區(qū)前6個(gè)字節(jié)單元的數(shù)據(jù)是個(gè)字節(jié)單元的數(shù)據(jù)是

20、 1,2,0,1,3,3. . (5) 取屬性(也稱分析)偽操作n取屬性偽操作可以取出運(yùn)算對(duì)象的某個(gè)屬性。常見的有SEG、OFFSET、TYPE、LENGTH、SIZE共5個(gè)符號(hào),分別表示取段基值、取偏移地址、取類型、取長(zhǎng)度、取大小,操作的結(jié)果都是數(shù)值常數(shù)。n格式: SEG 變量名或標(biāo)號(hào)變量名或標(biāo)號(hào)n 返回變量或標(biāo)號(hào)所在段的段基值。例如,若A為變量名或標(biāo)號(hào),則SEG A表示A所在段的段基值。n 格式: OFFSET 變量名或標(biāo)號(hào)變量名或標(biāo)號(hào)n 返回變量或標(biāo)號(hào)的偏移地址部分。例如,若A為變量名或標(biāo)號(hào);則OFFSET A表示A的偏移地址部分。n格式: TYPE 變量名或標(biāo)號(hào)變量名或標(biāo)號(hào)n 返回變量

21、或標(biāo)號(hào)的類型屬性值。n格式: LENGTH 變量名變量名 返回變量的長(zhǎng)度,即以DUP形式表示的第一組變量被重復(fù)設(shè)置的次數(shù)。n 格式: SIZE 變量名變量名n 返回變量的大小,即TYPELENGTH的值。也就是說,SIZE=TYPELENGTH。n 關(guān)于關(guān)于TYPE、LENGTH和和SIZE的含義舉例的含義舉例n對(duì)于對(duì)于“W1 DW 20 DUP(3, 10 DUP(7)”,則,則TYPE W1=2,LENGTH W1=20,SIZE W1=40;n 對(duì)于對(duì)于“W2 DW 8, 20 DUP(3, 10 DUP(7)”,則,則TYPE W2=2,LENGTH W2=1, SIZE W2=2;n

22、 對(duì)于對(duì)于“B1 DB 20 DUP(3, 10 DUP(7)”,則,則TYPE B1=1,LENGTH B1= ,SIZE B1= ;n 對(duì)于對(duì)于“B2 DB 8, 20 DUP(3, 10 DUP(7)”,則,則TYPE B2= ,LENGTH B2= , SIZE B2= 。(6) 指定屬性(也稱合成)偽操作n指定屬性偽操作可用于指定存儲(chǔ)器操作數(shù)或標(biāo)號(hào)的屬性,常見的有PTRPTR、:、THISTHIS共3個(gè)符號(hào),其功能分別為: 指定存儲(chǔ)器操作數(shù)或標(biāo)號(hào)的類型、指定存儲(chǔ)器操作數(shù)的段歸屬、指定當(dāng)?shù)氐淖兞炕驑?biāo)號(hào)的類型。n 格式: 類型名類型名 PTR PTR 存儲(chǔ)器操作數(shù)或標(biāo)號(hào)存儲(chǔ)器操作數(shù)或標(biāo)號(hào)

23、 例如,指令“MOVBX, 5”的含義是將常數(shù)5送入存儲(chǔ)單元BX中 。該存儲(chǔ)單元的偏移地址由BX確定,段基值隱含為DS。但匯編程序無法確定常數(shù)5是字節(jié)還是字,也無法確定存儲(chǔ)單元BX的內(nèi)容是字節(jié)還是字,所以無法操作。n格式: 段寄存器名段寄存器名 : 存儲(chǔ)器操作數(shù)存儲(chǔ)器操作數(shù) 臨時(shí)指定存儲(chǔ)器操作數(shù)的段歸屬。例如,“MOV AX, ES:BX”表示該存儲(chǔ)單元的段基值取自ES,而不是隱含的DS。 格式: THIS 類型名類型名n臨時(shí)指定當(dāng)前地址處變量或標(biāo)號(hào)的類型。例如,THIS BYTE表示當(dāng)前地址處變量的類型為字節(jié),THIS FAR表示當(dāng)前地址處標(biāo)號(hào)的類型為遠(yuǎn)。nTHIS操作符會(huì)在當(dāng)前段內(nèi)產(chǎn)生一個(gè)

24、偏移地址與$的值相等的操作數(shù),該操作數(shù)的類型由THIS右邊的類型名確定。q THIS 可以像PTR一樣建立一個(gè)指定類型(BYTE,WORD或DWORD)或指定距離(NEAR或FAR)的操作數(shù)。該操作數(shù)的段地址和偏移地址與下一個(gè)存儲(chǔ)單元地址相同。q THIS 往往和偽指令說明符EQU 連用,為當(dāng)前存儲(chǔ)單元定義一個(gè)指定類型的變量或標(biāo)號(hào),并為下一個(gè)能分配存儲(chǔ)單元的變量和標(biāo)號(hào)定義新的類型。例如: A EQU THIS BYTE B DD 12345678Hq 就是將一個(gè)雙字類型變量B臨時(shí)指定為字節(jié)類型變量,它與A 具有相同的段地址和偏移量。 n例例: . A EQU THIS BYTE B DD 12

25、345678H . CLD MOV SI, OFFSET A LODSB ;AL (DS:SI), SI SI+1 DATA SEGMENT A EQU THIS BYTE B DD 12345678HDATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS,AX CLD MOV SI, OFFSET A LODSB ;AL (DS:SI), SI SI+1 MOV AX,4C00H INT 21HCODE ENDS END START 又如:又如: START EQU THIS FARSTART EQU T

26、HIS FAR MOV CX ,100 MOV CX ,100 這樣,MOV 指令 有一個(gè)FAR 屬性的地址START,這就允許其他段的JMP 指令直接跳到START來。 (7) 分離操作符n有SHORT、HIGH和和LOW三個(gè),其功能是從其后的操作數(shù)(或與其后的操作數(shù)有關(guān)的數(shù)據(jù))中分離出一部分內(nèi)容作為返回值。n 格式: SHORT 標(biāo)號(hào)標(biāo)號(hào) 只取出標(biāo)號(hào)與IP之差(標(biāo)號(hào)-IP)的低字節(jié),即將標(biāo)號(hào)按短(距離)處理。n 格式: HIGH 字操作數(shù)字操作數(shù) 從字操作數(shù)中分離出高字節(jié)。例如,HIGH 1234H的操作結(jié)果為12H。n 格式: LOW 字操作數(shù)字操作數(shù) 從字操作數(shù)中分離出低字節(jié)。例如,L

27、OW 1234H的操作結(jié)果為34H。4. 匯編語言的表達(dá)式 (1) 表達(dá)式及分類表達(dá)式及分類 用偽操作符將操作對(duì)象組合起來即得到表達(dá)式,單個(gè)操作對(duì)象也可稱為表達(dá)式。表達(dá)式可作為指令語句中的操作數(shù)或偽指令語句中的參數(shù)。按操作性質(zhì)的不同可將表達(dá)式分為四類: 算術(shù)表達(dá)式算術(shù)表達(dá)式 邏輯表達(dá)式邏輯表達(dá)式 關(guān)系表達(dá)式關(guān)系表達(dá)式 特殊表達(dá)式特殊表達(dá)式 (2) 表達(dá)式的操作順序 表達(dá)式中常用的偽操作符按以下順序依次優(yōu)先處理表達(dá)式中常用的偽操作符按以下順序依次優(yōu)先處理: (i)()、 、(ii)LENGTH、WIDTH、SIZE、MASK (iii)(結(jié)構(gòu)字段名操作符結(jié)構(gòu)字段名操作符) (iv): (段超越前

28、綴的操作符段超越前綴的操作符) (v)PTR、OFFSET、SEG、TYPE、THIS (vi)HIGH、LOW (i)+ (正號(hào)正號(hào))、- (負(fù)號(hào)負(fù)號(hào)) (ii)*、/ (iii)MOD、SHL、SHR (iv)+、 - EQ、NE、LT、LE、GT、GE (i) NOT (ii) AND (iii) OR、XOR SHORT 例如,因?yàn)槔纾驗(yàn)椤癏IGH”運(yùn)算優(yōu)先于運(yùn)算優(yōu)先于“+”運(yùn)算,所以,運(yùn)算,所以, HIGH 1234H + 2 = 12H + 2 = 14H HIGH (1234H + 2) = HIGH 1236H = 12H7.1.5 匯編語言的偽指令說明符 1. 數(shù)據(jù)定義數(shù)

29、據(jù)定義(存儲(chǔ)單元分配存儲(chǔ)單元分配) 數(shù)據(jù)定義說明符用于定義變量,也就是為變量分配存儲(chǔ)單元并可同時(shí)預(yù)置初始值,有DB、DW、DD、DF、DQ、DT共6種說明符,分別表示存儲(chǔ)單元分配時(shí)以字節(jié)為單位、以字為單位、以雙字為單位、以3字(遠(yuǎn)字)為單位、以4字為單位、以10字節(jié)為單位。 例如,在下述定義中,例如,在下述定義中, A DB 12H, ? B DW ?, 3456H C DD 789ABCDEH D DB A, B, C, D E DB ABCD F DW AB, CD 上述各變量的存儲(chǔ)情況如圖7.4所示。顯然,DBAB和DWAB的存儲(chǔ)情況不同。A圖圖7.4 變量在存儲(chǔ)器中的存儲(chǔ)情況變量在存儲(chǔ)

30、器中的存儲(chǔ)情況 12?5634BDEBC9A78C41424344D41424344E42414443F程序例程序例DATA SEGMENT TAB DW 1,2,3,4,5,6 ENTRY EQU 3DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATAL: MOV AX, DATA MOV DS, AX MOV BX,OFFSET TAB ADD BX, ENTRY ; MOV AX, TAB+3 MOV AX, BXCODE ENDS END L 上述程序執(zhí)行后,上述程序執(zhí)行后,AX= 2. 符號(hào)定義(表達(dá)式賦值) 有 =、EQU、PURGE共3種說明

31、符,含義分別是被賦予、被賦予、取消(釋放)。 (1)格式: 符號(hào)名 = 表達(dá)式 將表達(dá)式的值賦予符號(hào)名,以后即可用該符號(hào)名代表此表達(dá)式的值。 (2) 格式: 符號(hào)名 EQU 表達(dá)式或另一組標(biāo)識(shí)符 將表達(dá)式的值或另一組標(biāo)識(shí)符賦予符號(hào)名,以后即可用該符號(hào)名代表此表達(dá)式的值或代替另一組標(biāo)識(shí)符。(3) 格式: PURGE 符號(hào)名1,符號(hào)名2, 取消(釋放)被EQU定義的符號(hào)名,以后即可用EQU對(duì)該符號(hào)名再賦予不同的含義。3. 段定義 段定義說明符共有3種,即SEGMENT、ENDS和ASSUME,含義分別是段開始、段結(jié)束、指定段寄存器。(1) 格式: 段名 SEGMENT定位類型組合類型類別 從段名代

32、表的段基值開始定義一個(gè)段。其中的定位類型、組合類型和類別一般都可省略,若不省略時(shí)各項(xiàng)的順序不能變。 定位類型定位類型: 連接時(shí)用于指定該段應(yīng)開始于什么樣的物理地址??蛇x擇下列4種之一: BYTE: 從當(dāng)前可用的字節(jié)地址從當(dāng)前可用的字節(jié)地址XXXX XXXX XXXX XXXX XXXX(任一地址任一地址)開始;開始; WORD: 從當(dāng)前可用的字地址從當(dāng)前可用的字地址XXXX XXXX XXXX XXXX XXX0(偶數(shù)地址偶數(shù)地址)開始;開始; PARA(缺省缺省): 從當(dāng)前可用的節(jié)地址從當(dāng)前可用的節(jié)地址XXXX XXXX XXXX XXXX 0000(16的倍數(shù)的倍數(shù))開始;開始; PAGE

33、: 從當(dāng)前可用的頁地址從當(dāng)前可用的頁地址XXXX XXXX XXXX 0000 0000(256的倍數(shù)的倍數(shù))開始開始。 其中,1節(jié)(paragraph) 為16字節(jié),1頁為16節(jié)即256字節(jié)。 組合類型: 連接時(shí)用于指定同名的各段之間的組合方式??蛇x擇下列6種之一: PUBLIC STACK COMMON MEMORY AT表達(dá)式表達(dá)式 NONE(缺省缺省) 若省略組合類型或說明為NONE類型,則表示各個(gè)段不組合,各有自己的段基值。 對(duì)堆棧段,必須用STACK類型說明,不能省略 。 類別: 是要將組合后的各段按類別分類存放,同類別的段將被相鄰地放在一起。類別是由用戶定義的、用一對(duì)引號(hào)括起來的

34、、長(zhǎng)度不超過40個(gè)字符的名字(標(biāo)識(shí)符)。 (2)格式:格式: 段名段名 ENDS 表示該段到此結(jié)束。這里的段名必須與該段開始時(shí)SEGMENT左邊的段名相同。 (3) 格式:格式: ASSUME 段寄存器名段寄存器名1:段名段名1,段寄存器名,段寄存器名2:段名段名2, 該語句必須出現(xiàn)在有關(guān)的變量及標(biāo)號(hào)使用之前,用于指定某段(用段名標(biāo)識(shí))中的變量、標(biāo)號(hào)等數(shù)據(jù)項(xiàng)由哪個(gè)段寄存器尋址。4. 指定段內(nèi)的偏移地址 常用的有ORG和和EVEN兩種說明符,是指定下一個(gè)要用的存儲(chǔ)單元的偏移地址。 (1)格式: ORG 常數(shù)表達(dá)式常數(shù)表達(dá)式 指定當(dāng)前可用的存儲(chǔ)單元的偏移地址為常數(shù)表達(dá)式的值,就是將常數(shù)表達(dá)式的值送

35、入$。 (2) 格式: EVEN 將當(dāng)前可用的存儲(chǔ)單元的偏移地址調(diào)整為最近的偶數(shù)值,就是將當(dāng)前可用的最小偶數(shù)偏移地址值送入$。 例如,在下述偽指令語句序列中, ORG 1000H A DB 47H, 12H, 45H EVEN B DB 47H ORG 1000H ORG 1000H 將將A A的偏移地址部分指定為的偏移地址部分指定為1000H1000H,從,從A A開始存放開始存放3 3個(gè)個(gè)字節(jié)變量,占用地址字節(jié)變量,占用地址1000H1000H、1001H1001H和和1002H1002H,B B的偏移地址部分的偏移地址部分本應(yīng)是本應(yīng)是1003H1003H,但,但EVENEVEN指令會(huì)將指

36、令會(huì)將B B的偏移地址部分的偏移地址部分調(diào)整為偶數(shù)地址調(diào)整為偶數(shù)地址1004H1004H。n對(duì)于字?jǐn)?shù)組,為保證其從偶地址開始,可在它前面用EVEN 偽操作來達(dá)到這一目的,形如:n DATA-SEG SEGMENT EVEN WORD-ARRAY DW 100 DUP(?) DATA-SEG ENDS5. 過程定義 有PROC、ENDP兩種說明符,含義分別是過程開始與過程結(jié)束,必須成對(duì)出現(xiàn)。 (1)格式: 過程名過程名 PROC 類型屬性名 從過程名代表的地址開始定義一個(gè)過程,其中的類型屬性名可選擇NEAR或FAR兩種之一,前者表示該過程為近過程,后者表示該過程為遠(yuǎn)過程。 如果不給出類型屬性名或

37、給出NEAR,則視為近過程。 (2)格式: 過程名過程名 ENDP 表示該過程到此結(jié)束。這里的過程名必須與過程開始時(shí)PROC左邊的過程名相同。過程過程(子程序子程序)的基本結(jié)構(gòu)的基本結(jié)構(gòu) Proc-A PROC NEAR(或FAR) _過程名過程名 _ . . . _ RET Proc-A ENDP 6. 類型定義n類型定義說明符只有一個(gè),即LABEL,可用來給當(dāng)前地址處的變量或標(biāo)號(hào)取一個(gè)別名,并賦予另一種類型屬性。n格式: 變量名或標(biāo)號(hào) LABEL 類型屬性名n“LABEL”和“EQU THIS”的作用類似7.宏定義、宏調(diào)用和宏擴(kuò)展宏定義、宏調(diào)用和宏擴(kuò)展n宏(MACRO)是源程序中一段有獨(dú)立

38、功能的程序代碼、它只需在源程序中定義一次,就可以多次用一條宏指令來調(diào)用它。n宏定義宏定義是用偽指令來實(shí)現(xiàn)的。其格式為:MACRO?ENDMdummy Parameter List宏指令名宏指令名宏定義體宏定義體形式參數(shù)形式參數(shù)(用逗號(hào)隔開)其中MACRO和ENDM是一對(duì)偽指令說明符,這對(duì)偽指令之間是宏定義體一組有獨(dú)立功能的程序代碼Macro-namen經(jīng)宏定義定義后的宏指令就可以在源程序中調(diào)用經(jīng)宏定義定義后的宏指令就可以在源程序中調(diào)用,這種對(duì)對(duì)宏指令的調(diào)用稱宏指令的調(diào)用稱宏調(diào)用宏調(diào)用,宏調(diào)用的格式為:nMacro-name actual parameter list(每一項(xiàng)之間用逗號(hào)隔開)n當(dāng)

39、源程序被匯編時(shí),匯編程序?qū)?duì)每個(gè)宏調(diào)用作宏展開宏展開。宏展開就是用宏定義體取代源程序中的宏指令名,而且用實(shí)在參數(shù)一一取代宏定義的形式參數(shù)。例例1 宏定義可以無變?cè)甓x宏定義:SAVEREG MACRO PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI ENDM宏調(diào)用宏調(diào)用: SAVEREG宏展開宏展開: 將宏定義體的內(nèi)容(具有獨(dú)立功能的代碼段具有獨(dú)立功能的代碼段)全部列出。宏定義開始宏定義開始宏定義體宏定義體宏定義結(jié)束宏定義結(jié)束宏指令宏指令例例2 宏定義帶形式參數(shù)宏定義宏定義: FOO MACRO P1, P2, P3 MOV AX, P1 P2 P3 ENDM宏調(diào)用宏調(diào)用: FOO WORD_VAR, INC, AX宏展開宏展開: MOV AX, WORD_VAR INC AX子程序調(diào)用和宏調(diào)用工作方式的區(qū)別n子程序調(diào)用工作方式子程序調(diào)用工作方式:XA,yBCALL QxC,yDCALL Q主程序Q: . . . RET子程序Q(x,y)執(zhí)行時(shí)調(diào)用n宏調(diào)用工作方式:宏調(diào)用工作方式:Q A,BQ C,D主程序匯編時(shí)展開Q(A,B)Q(C,D)Q MACRO x,yENDM子程序調(diào)用和宏調(diào)用工作方式的區(qū)別子程序調(diào)用和宏調(diào)用工作方式的區(qū)別n

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論