




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、匯編語言程序設(shè)計及上機指導(dǎo)匯編語言語法匯編語言程序設(shè)計及上機指導(dǎo)匯編語言語法09 九月 20225.1.1 匯編語言程序的基本概念 指令與偽指令的集合構(gòu)成匯編語言語句.MODEL SMALL ;定義內(nèi)存工作模式為小模式 .386 ;定義指令系統(tǒng)為80386指令集 .STACK ;定義1K個字節(jié)的堆棧段 .DATA ;數(shù)據(jù)段開始DATA1 DD 12340000H ;定義第一個32位數(shù)據(jù)的值為12340000H DATA2 DD 5678H ;定義第二個32位數(shù)據(jù)的值為5678H SUM DD ? ;定義用來存放前兩個數(shù)據(jù)之和的第三個數(shù)據(jù) .CODE ;代碼段開始,數(shù)據(jù)段結(jié)束 .STARTUP
2、;程序開始 MOV EAX,DATA1 ;取第一個數(shù)到EAX ADD EAX,DATA2 ;求和 MOV SUM,EAX ;保存結(jié)果(12345678H)至SUM .EXIT 0 ;程序結(jié)束,正常返回到操作系統(tǒng) END ;結(jié)束匯編04 九月 20225.1.1 匯編語言程序的基本概念 09 九月 20225.1.2 匯編語言的基本語法一、字符集英文字符:AZ z數(shù)字字符:09算術(shù)運算符: /關(guān)系運算符:分隔符:,(逗號) ;(分號) ( )(括號) (引號)(空格) TAB(制表符)控制符:CR(回車) LF(換行)FF(換頁)其它字符:$ & _(下劃線) ? % !二、標識符1)標識符的第
3、一個字符必須是字母、問號“?”、“”符、或下劃線“_”;2)從第二個字符開始可以是字母、數(shù)字、或“?”、“”、“_”;3)一個標識符的長短可以由131個字符組成。例如:X,GAM_31,?JACK5是正確的;而8P,DATA 8是不正確的。04 九月 20225.1.2 匯編語言的基本語法一、字符集09 九月 2022三、保留字寄存器名、指令助記符、偽操作命令、表達式運算符,以及屬性操作符等都是系統(tǒng)專用的保留字。這些保留字是不能用作標識符的。四、語句一條語句一般只占一行,超過一行時必須用續(xù)行符號“”指示兩條語句不能寫在同一行。語句可以有注釋,一般寫在語句之后或單獨占一行,是以“;”開始的字符串
4、。04 九月 2022三、保留字09 九月 20225.2 匯編語言的數(shù)據(jù)和表達式匯編語言能識別的數(shù)據(jù)是常量、變量和標號。5.2.1 常量常量是匯編時已經(jīng)確定的值,主要用于偽指令中給變量賦值,或作為指令語句中的立即數(shù)或存儲器操作數(shù)的組成部分。一常量的類型數(shù)據(jù)形式格 式取值范圍舉例注 釋二進制數(shù)B0110010011B二進制數(shù)以B結(jié)尾八進制數(shù)Q07123Q八進制數(shù)以Q結(jié)尾十進制數(shù)D09256D,3458十進制數(shù)以D結(jié)尾或者缺省十六進制數(shù)H09 AF0A3H,12345H十六進制數(shù)以H結(jié)尾,最前面必須是09字符或字符串ASCII字符ABC兩端必須加或”04 九月 20225.2 匯編語言的數(shù)據(jù)和表
5、達式匯編語言09 九月 2022二符號定義偽指令 用于給程序中多次出現(xiàn)的同一個常量或表達式賦一個符號名,也可以為其它符號名取一個新名字,并賦給新的類型屬性。(1) EQU偽指令例: FIRST EQU 1 ;定義常數(shù) SECOND EQU FIRST*3+8 ;定義數(shù)值表達式 ADDR1 EQU DS:EBP+4 ;定義地址表達式 DWORDS EQU THIS DWORD ;定義下面的字節(jié)變量為雙字類型 BYTES DB 10 DUP (0) ADDR2 EQU WORD PTR BYTES ;重新定義變量BYTES的名字和屬性 START: MOV EAX,EBX GOON EQU FAR
6、 PTR START ;重新定義標號START的名字和屬性 COUNT EQU ECX ;為ECX重新取名注意:該等值語句只作為符號定義用,不產(chǎn)生任何目標代碼,也不占用存儲單元,并且不能是程序中曾經(jīng)定義過的符號名。04 九月 2022二符號定義偽指令09 九月 2022(2) “”偽指令“”偽操作命令與EQU具有相同的功能,但它定義的符號允許重新定義。例:PERSON=10 ;定義PERSON等于10 PERSON=PERSON+5 ;重新定義PERSON等于1504 九月 2022(2) “”偽指令09 九月 20225.2.2 變量變量的值可以在程序運行過程中可隨時修改,變量名是存放數(shù)據(jù)的
7、存儲單元符號地址,變量的值為對應(yīng)存儲單元的內(nèi)容。一變量的屬性段屬性(SEG),指變量所在段的段基址。偏移地址屬性(OFFSET),指變量所在段中的偏移地址,即變量所在地址與段基址之間的字節(jié)距離。類型屬性(TYPE),指變量占用存儲單元的字節(jié)數(shù)。若占用一個字節(jié),稱為字節(jié)變量,其類型為BYTE;若占用兩個字節(jié),稱為字變量,其類型為WORD;若占用四個字節(jié),稱為雙字變量,其類型為DWORD;若占用六字節(jié),其類型為FWORD;若占用八字節(jié),其類型為QWORD;若占用十字節(jié),其類型為TBYTE。04 九月 20225.2.2 變量變量的值可以在程序運行過09 九月 2022二變量定義偽指令就是為數(shù)據(jù)分配
8、存儲單元,且對這個存儲單元取一個名字,即變量名。語句的格式如下:變量名 DB/DW/DD/DF/DQ/DT 表達式1,表達式2,變量名是可選的,DB/DW/DD/DF/DQ/DT是偽操作命令必須選用一種,表達式是賦給變量的初值,常見的有如下幾種:(1)數(shù)值變量定義語句例: D_BYTE DB 30H,40H DB 50HD_WORD DW 1234H,5678HD_DWORD DD D_DWORDD_TBYTE DT ?D_FWORD DF 1234567890ABHD_QWORD DQ 1122334455667788H04 九月 2022二變量定義偽指令09 九月 2022(2)字符串變量
9、定義語句可以用DB來實現(xiàn),即為串中的每一個字符分配一個字節(jié)存儲單元。字符串必須用引號括起來,并且不超過256個字符,它們在內(nèi)存中自左至右把字符的ASCII碼按地址遞增順序依次存放。 例: STRING1 DB ABCDEFG用DW也可以定義字符串變量,即給兩個字符組成的字符串分配兩個字節(jié)存儲單元,它們在內(nèi)存中的順序是前一個字符為高字節(jié),存放在高地址,后一個字符為低字節(jié),存放在低地址。 例: STRING2 DW AB,CD,EF04 九月 2022(2)字符串變量定義語句09 九月 2022(3)?語句存儲單元中不預(yù)置確定的值,常用來預(yù)留存儲單元,存放程序的中間結(jié)果或最終結(jié)果。 例:FIRST
10、 DB ? ;分配一個字節(jié)單元 SECOND DD ?,?,? ;分配三個雙字單元(4)帶DUP的變量定義語句DUP 是重復(fù)數(shù)據(jù)定義操作符,可以為若干重復(fù)數(shù)據(jù)分配存儲單元,并賦給相應(yīng)的變量名。例:D1 DB 5 DUP (0) D2 DW 10H DUP (5678H) D3 DD 20H DUP (?)第一條語句為變量D1分配5個字節(jié)單元,每個單元初始值都為0;第二條語句為變量D2重復(fù)分配10H個字單元,每個單元初始值都為5678H,共占有20H個字節(jié);第三條語句為變量D3保留20H個雙字單元,沒有定義初始值。 D4 DB 200 DUP (4 DUP (6),8)表示為變量D4重復(fù)分配20
11、0個數(shù)據(jù)序列6,6,6,6,8,共占有1000個字節(jié)單元。04 九月 2022(3)?語句09 九月 2022三內(nèi)存定位和定義數(shù)制偽指令(1)ORG偽指令和當(dāng)前位置計數(shù)器匯編時將段名填入段表,同時為該段配備一個初值為0的位置計數(shù)器$。計數(shù)器依次累計段內(nèi)語句被匯編后生成的目標代碼字節(jié)個數(shù)。可用ORG偽指令把位置計數(shù)器的值設(shè)置成需要的值。在數(shù)據(jù)段中,ORG后面的數(shù)據(jù)定義偽指令就從指定位置進行分配單元;在代碼段中,ORG后面的一條指令語句就從指定位置生成目標代碼;表達式的值應(yīng)該是非負的整數(shù)。例: ORG 0F0H ;從0F0H開始安排數(shù)據(jù) ORG $+10H ;跳過10H個字節(jié)后安排數(shù)據(jù) DW 1,
12、$+4,$+4 ;100H單元的字值為1,102H單元的字值 ;為106H,104H單元的字值為108H ARRAY DB 12,34,56,5 DUP (?) ;定義字節(jié)數(shù)組LEN EQU $-ARRAY ;LEN的值為ARRAY變量所占的字節(jié)數(shù)804 九月 2022三內(nèi)存定位和定義數(shù)制偽指令(1)ORG09 九月 2022(2)EVEN偽指令 用來把段內(nèi)位置計數(shù)器的值置為偶數(shù)地址邊界對齊,如果遇到EVEN時計數(shù)器$值非偶數(shù),則匯編程序自動插入NOP指令(在代碼段中),使其為偶數(shù);或者將$的值加1(數(shù)據(jù)段中)。(3).RADIX偽指令 宏匯編默認常量基數(shù)都是十進制數(shù),可用.RADIX偽命令把
13、缺省基數(shù)改為216范圍內(nèi)的任意基數(shù): .RADIX 其中,表達式與當(dāng)前基數(shù)無關(guān),一定是十進制數(shù)。例: MOV AX,0FFH MOV BX,20 .RADIX 16 MOV CX,0FF MOV DX,20D其中AX和CX寄存器的內(nèi)容相同,BX和DX寄存器內(nèi)容相同。04 九月 2022(2)EVEN偽指令 09 九月 20225.2.3 標號標號之后必須有一個冒號(:),標號也可以單占一行。一標號的屬性 段屬性(SEG),指標號所在段的段基址。 偏移地址屬性(OFFSET),指標號所在段中的偏移地址,即標號所在地址與段基址之間的字節(jié)距離。 距離屬性或類型屬性(TYPE),標號可作為轉(zhuǎn)移和調(diào)用指
14、令的目標地址,也可作為過程定義偽指令的過程名。當(dāng)標號只允許作為段內(nèi)轉(zhuǎn)移或調(diào)用指令的目標地址時,距離屬性為NEAR;當(dāng)標號作為段間轉(zhuǎn)移或調(diào)用指令的目標地址時,距離屬性為FAR。例如:JMP LABEL1 ;程序跳轉(zhuǎn)到標號LABEL1的位置CALL FAR PTR SUBPROGRAM ;調(diào)用SUBPROGRAM過程(FAR)LABEL1: ;LABEL1為段內(nèi)轉(zhuǎn)移標號(距離屬性缺省為NEAR) LABEL2: ;LABEL2為段內(nèi)轉(zhuǎn)移標號,單獨占一行 SUBPROGRAM PROC FAR ;SUBPROGRAM是屬性為FAR的過程 RET 標號的距離屬性可用LABEL偽指令加以改變。04 九月
15、 20225.2.3 標號09 九月 2022二LABEL偽指令(1)與變量連用用來給相連的變量取一個新的名字,并指定新的類型屬性。例:B_VAR1 LABEL BYTE W_VAR1 DW 3456H W_VAR2 LABEL WORD D_VAR2 DD 87654321H給字變量W_VAR1一個新名字B_VAR1,類型屬性BYTE。如果以字類型訪問該變量,應(yīng)使用變量名W_VAR1;而以字節(jié)類型訪問該變量時,應(yīng)使用B_VAR1。如果想按字訪問D_VAR2變量,則可以用W_VAR2。注意:B_VAR1和W_VAR2都是給變量增加類型屬性,并不另外占用存儲單元(2)與標號連用用來給相連的指令地
16、址(即標號)定義一個新的標號,并指定新的距離屬性。例: DISTFAR LABEL FAR DISTNEAR: MOV EAX,EBX給近標號DISTNEAR取一個新的標號名DISTFAR,距離屬性修改為FAR。當(dāng)其它代碼段中的轉(zhuǎn)移或調(diào)用指令引用時,可使用標號DISTFAR,而在本段引用時,只要使用標號DISTNEAR即可,但它們實際上是指向同一條指令。用LABEL偽指令的定義,實現(xiàn)了按不同的標號名和不同的轉(zhuǎn)移方式而轉(zhuǎn)移到同一個標號的目的。04 九月 2022二LABEL偽指令09 九月 20225.2.4 表達式和運算符一、算術(shù)運算符包括+、-、*、/、MOD、 SHL和SHR共七種;+、-
17、、*、/參加運算的數(shù)和運算結(jié)果均為整數(shù);除法運算為整除,而模除的運算結(jié)果為余數(shù);左移或右移運算符可使二進制數(shù)左移或右移若干位,相當(dāng)于二進制數(shù)進行乘法或除法運算。例:TEMP=10+5 ;TEMP=15 TEMP=TEMP-3 ;TEMP=12 TEMP=TEMP*5 ;TEMP=60 TEMP=TEMP/9 ;TEMP=6 TEMP=TEMP MOD 4 ;TEMP=2 TEMP=-TEMP ;TEMP=-2 MOV AL, 11B SHL 5 ;(AL)=01100000B注意:除了加和減運算符可以使用變量或標號外,其它算術(shù)運算符只適用于常量的數(shù)值運算。04 九月 20225.2.4 表達式
18、和運算符一、算術(shù)運算符09 九月 2022二、邏輯運算符有AND、OR、XOR、NOT共四種;只適用于對常量進行邏輯運算,運算是按位進行的;運算符與邏輯運算指令助記符相同,但在語句中的位置不一樣,表達式中的邏輯運算符是在匯編時完成運算的;而邏輯運算指令運算在執(zhí)行指令時進行。例: MOV AL,NOT 10100101B ;(AL)=01011010B MOV AL,11011011B AND 00001111B ;(AL)=00001011B MOV AL,11100001B OR 10000101B ;(AL)=11100101B MOV AL,10111011B XOR 00100100B
19、 ;(AL)=10011111B04 九月 2022二、邏輯運算符09 九月 2022三、關(guān)系運算符 包括EQ、NE、LT、GT、LE、GE共六種;可對常量或同一段內(nèi)的存儲器地址進行比較運算;若條件滿足,運算結(jié)果為真,輸出結(jié)果為全“1”;若不滿足條件,運算結(jié)果為假,輸出結(jié)果為全“0”。 例: MOV BX,10 EQ 1010B ; 10等于1010B為真,(BX)=0FFFFH MOV DX,20H GT 32 ;20H大于32為假,(DX)=004 九月 2022三、關(guān)系運算符09 九月 2022四、數(shù)值返回運算符運算對象必須是存儲器操作數(shù),即變量或標號。(1)SEG運算符:返回該變量或標
20、號所在段的段基址。 例如: MOV AX, SEG VAR 如果變量VAR所在段的段基址為1000H,則該指令執(zhí)行的結(jié)果 等效于 MOV AX,1000H(2)OFFSET運算符:返回該變量或標號所在段內(nèi)的偏移地址。 例如:MOV DI, OFFSET VAR 如果變量VAR在1000H段內(nèi)的偏移地址是100H,則該指令執(zhí)行 的結(jié)果等效于: MOV DI,100H(3)TYPE運算符:返回該變量的類型屬性或者標號的距離屬性。例:V1 DB 1,2,3V2 DW 1020H,3040HV3 DD 12345678HPF LABEL FARPN: MOV AH,TYPE V1 ;等效于MOV AH
21、,1 MOV AL,TYPE V2 ;等效于MOV AL,2 MOV DL,TYPE V3 ;等效于MOV BL,4 MOV DH,TYPE PF ;等效于MOV BH,-204 九月 2022四、數(shù)值返回運算符09 九月 2022屬性與返回數(shù)值的關(guān)系 變量/標號屬性返回數(shù)值字節(jié)變量 BYTE字變量 WORD雙字變量 DWORD三字變量 FWORD四字變量 QWORD十字節(jié)變量 TBYTE1246810標號NEAR標號FAR1FFH2FEH04 九月 2022屬性與返回數(shù)值的關(guān)系 變量/標號屬性返回09 九月 20224LENGTHOF運算符 該運算符加在變量名之前,返回的數(shù)值是變量中所定義的
22、元素個數(shù)。 D1 DW 10H DUP (0),1234H D2 DB 20H DUP (2 DUP(0),1) D3 DQ 1234H, 5678H D4 DB ABCDEFGH D5 DD 12H,34H, ;加一個續(xù)行符,表示一條偽指令占兩行 56H,78H D6 DD 12H,34H ;未加續(xù)行符,則表示這兩行是兩條偽指令 DD 56H,78H MOV AL,LENGTHOF D1 ;(AL)= 11H MOV AL,LENGTHOF D2 ;(AL)= 60H MOV AL,LENGTHOF D3 ;(AL)= 2H MOV AL,LENGTHOF D4 ;(AL)= 8H MOV
23、AL,LENGTHOF D5 ;(AL)= 4H MOV AL,LENGTHOF D6 ;(AL)= 2H04 九月 20224LENGTHOF運算符 該運算09 九月 20225SIZEOF運算符該運算符加在變量名之前,返回的數(shù)值是變量所占的總字節(jié)數(shù),且等于LENGTHOF和TYPE兩個運算符返回值的乘積。例如,對于上例中的變量,SIZEOF的返回值如下所示:MOV AL,SIZEOF D1 ;(AL)= 22H,即20H*2HMOV AL,SIZEOF D2 ;(AL)= 60H,即60H*1HMOV AL,SIZEOF D3 ;(AL)= 10H,即8H*2HMOV AL,SIZEOF
24、D4 ;(AL)= 8H,即8H*1HMOV AL,SIZEOF D5 ;(AL)= 10H,即4H*4HMOV AL,SIZEOF D6 ;(AL)= 8H,即2H*4H04 九月 20225SIZEOF運算符該運算符加在變量名09 九月 2022LENGTH運算符 返回變量中所定義的元素個數(shù),如果變量是用重復(fù)數(shù)據(jù)操作符DUP說明的,則返回DUP前面的數(shù)值;如果沒有DUP說明,則返回的值總是1。例: D1 DW 10H DUP (0) D2 DB 20H DUP (0) D3 DW 1234H,5678H D4 DB ABCDEFGH MOV AL,LENGTH D1 ;(AL)=10H M
25、OV AL,LENGTH D2 ;(AL)=20H MOV AL,LENGTH D3 ;(AL)=1H MOV AL,LENGTH D4 ;(AL)=1HSIZE運算符 返回變量所占的總字節(jié)數(shù),且等于LENGTH和TYPE兩個運算符返回值的乘積。例如,對于上例中的變量D1、D2、D3、D4,SIZE的返回值如下所示:MOV AL,SIZE D1 ;(AL)=20HMOV AL,SIZE D2 ;(AL)=20HMOV AL,SIZE D3 ;(AL)=2HMOV AL,SIZE D4 ;(AL)=1H04 九月 2022LENGTH運算符09 九月 2022五、修改屬性運算符(1)PTR運算符
26、格式: PTR 根據(jù)地址表達式的不同,所賦給的新類型可以是BYTE、WORD、DWORD、FWORD、QWORD、TBTYE、NEAR、FAR等,它們只在所在的指令內(nèi)有效。例: TABLE DB 1,2,3,4,5,6,7,8 ADD WORD PTR DI,100 ;指明目的操作數(shù)為字類型 JMP DWORD PTR BX ;指明為段間轉(zhuǎn)移 MOV EAX, DWORD PTR TABLE ;臨時修改TABLE為雙字類 ;型,(EAX)=04030201H(2)THIS運算符把它后面指定的類型或距離屬性賦給當(dāng)前的變量、標號或地址表達式,但不分配新的存儲單元,往往與偽指令EQU或連用,為當(dāng)前存
27、儲單元定義一個指定類型的變量或標號,類型屬性也可以是BYTE、WORD、DWORD、FWORD、QWORD、TBTYE、NEAR、FAR等。例: DAT EQU THIS WORD POINT EQU THIS FAR第一條語句將變量DAT的類型屬性定義為字,不管DAT原來的類型是什么,從本語句開始,DAT成為字節(jié)變量;第二條語句將標號POINT的距離屬性定義為FAR,不管POINT原來的距離屬性是什么,從本語句開始,POINT成為遠標號。04 九月 2022五、修改屬性運算符09 九月 2022六、其它運算符(1)高低分離運算符HIGH運算符和LOW運算符分別用于從16位運算對象中分離出高字
28、節(jié)和低字節(jié)。從MASM6.0開始引入了HIGHWORD運算符和LOWWORD運算符分別用于從32位符號常量中分離出高字和低字部分。例: MOV AH,HIGH 5678H ;(AL)=56H DATA16 EQU 1234H MOV AL,LOW DATA16 ;(AL)=34H DATA32 EQU 1234FFFFH MOV AX,LOWWROD DATA32 ;(AX)=0FFFFH(2)方括號運算符:運算符中可以是數(shù)組變量的下標或地址表達式,以區(qū)別操作數(shù)和操作數(shù)地址。例:ARRAY DB 1,2,3,4,5 ;ARRAY為數(shù)組變量 MOV AL, ARRAY4 ;”4”為下標,(AL)
29、=5 MOV BX,OFFSET ARRAY ;(BX)=ARRAY的偏移地址 MOV AH,BX ;(AH)=1 MOV DX,WORD PTR ARRAY1 ;(DX)=302H(3)運算符的優(yōu)先級:一般可以用括號來改變運算符的優(yōu)先級別。例: MOV AL,18 OR 5 AND 10 ;AL=18(12H) MOV AL,(18 OR 5) AND 10 ;AL=204 九月 2022六、其它運算符09 九月 2022運算符的優(yōu)先級04 九月 2022運算符的優(yōu)先級09 九月 20225.3 宏匯編語言的偽指令符號定義、變量定義、程序分段定義、過程定義、模塊定義、宏定義、條件匯編、以及格
30、式和列表控制等。5.3.1 段定義和程序說明偽指令具體來說規(guī)定段的起始和結(jié)束指定屬性開始地址邊界段類型 同名段如何結(jié)合在一起有兩種段定義簡化段定義:對MASM5.0以上版本完整段定義:對所有版本04 九月 20225.3 宏匯編語言的偽指令符號定義、變09 九月 2022一、完整分段定義偽指令 1. 段定義偽指令 SEGMENT/ENDS 將程序分成段:代碼段,數(shù)據(jù)段,堆棧段,附加段。 格式: 段名 SEGMENT 定位類型組合屬性類別名 (段體) 段名 ENDS 功能:指出段名和段的各種屬性, 并表示段的開始和結(jié)束位置。段定義由偽操作SEGMENT開始、ENDS結(jié)束。其中: SEGMENT
31、和ENDS 必須成對出現(xiàn), 且語句前必須有段名,段名必須相同。 SEGMENT和ENDS語句之間可以有指令和其他偽指令, 表示存放在該段內(nèi)存的變量、指令或其他偽指令對該段內(nèi)存的處理 程序中可以定義多個段。 程序經(jīng)匯編、連接及裝入內(nèi)存后,段名為一具體的段值。合法標識符,有段基地址和段內(nèi)偏移量兩個屬性,與某個存儲單元相聯(lián)系。04 九月 2022一、完整分段定義偽指令功能:指出段名和段09 九月 2022 (1)定位類型用于告訴鏈接程序,鏈接時(各模塊.obj) 本段首地址的邊界定位方式,常有四種: PARA:段的起始地址必須是16的倍數(shù)(XXXX0H), 這是一種默認方式。 PAGE:段的起始地址
32、必須是256的倍數(shù)(XXX00H), 256字節(jié)為一頁,在頁的起點上。 WORD:段的起始地址必須是偶數(shù)(XX0B)。 BYTE:段的起始地址可以是任何地址。(2) 組合類型 在多模塊(每個模塊有自己的代碼段、數(shù) 據(jù)段、堆棧段)組合時,告訴Link程序本 段與其他模塊中同名段的組合鏈接關(guān)系。04 九月 2022 (1)定位類型 PARA:段的起09 九月 2022 NONE: 本段與其他同名段無組合關(guān)系,并有自己的段起始 地址,這是一種默認方式。 PUBLIC:在滿足定位類型的前提下,LINK程序?qū)⑵渑c其他 模塊中的同名段鄰接在一起,共用一個段地址。 STACK: 同PUBLIC 。鏈接以后作
33、為堆棧段,并自動初始化 SS、SP。若程序中不說明STACK,則必須由用戶 在程序的開始處,自己通過語句設(shè)置SS、SP。 COMMON:各模塊中同名段重疊覆蓋,有著相同的起始地 址。段的長度取決于最長的COMMON段。段的 內(nèi)容為所鏈接的最后一個模塊中COMMON段的 內(nèi)容。 MEMERY:鏈接在其他所有段的后面(高端存儲區(qū) )。若有 多個MEMERY段,則只認第一個,其余按 COMMON處理。04 九月 2022 NONE: 本段與其他同名段無組合09 九月 2022(3)段字屬性在32位80X86微處理器中,新增加了USE屬性說明。對于16位CPU默認的是16位段,即USE 16。而對于匯
34、編32位80X86CPU指令時,它默認采用32位段,即USE 32。但可以使用USE 16指定標準的16位段。若在程序開頭使用了.386偽指令(見簡化段定義偽指令),缺省類型為32位段字長。注意,在禁止用80386的情況下,使用USE選擇項將導(dǎo)致出錯。(4)段類別名屬性類別名可以是任何合法的名字,必須用單引號括起來。在連接處理時,鏈接程序把類別名相同的所有段存放在連續(xù)的存儲區(qū)內(nèi)。典型的類別名如:DATA,STACK,CODE。以上是定位類型、組合類型、段字和類別名四個參數(shù)的說明,各參數(shù)之間用空格分隔。在選用時,可以只選其中一個或兩個參數(shù)項,但不能交換它們之間的順序。04 九月 2022(3)段
35、字屬性09 九月 20222 . 段寄存器說明偽指令 格式:ASSUME 段寄存器:段名,段寄存器:段名, 設(shè)定特定的Sreg指向特點的段,說明源程序中定義的段應(yīng)由 哪一個Sreg去尋址。不如此,匯編程序無法生成目標代碼程序。 ASSUME 并未真正的將段地址裝入相應(yīng)的Sreg。 Sreg的初值還必須由用戶在程序的開始處用MOV指令來設(shè)置(CS除外)。(1)DS和ES的裝入DS和ES的裝入可以通過給寄存器賦初值的指令來完成。但是應(yīng)注意到,由于段寄存器不能用立即數(shù)尋址方式直接傳送,因此裝入段基址必須借助于通用寄存器進行間接傳送。例:CODES SEGMENT ASSUME CS:CODES,DS
36、:DATAS,SS:STACKS,ES:EXTRS START:MOV AX,DATAS MOV DS,AX MOV AX,EXTRS MOV ES,AX CSEG ENDS04 九月 20222 . 段寄存器說明偽指令09 九月 2022(2)SS的裝入一種方法是在SEGMENT語句中,組合類型選用STACK,并在ASSUME語句中,把堆棧用的段指派給段寄存器SS。 STACKS SEGMENT PARA STACK DB 100H DUP (?) STACKS ENDS CODES SEGMENT ASSUME CS:CODES,SS:STACKS 另一種方法是在SEGMENT語句中,組合
37、類型未選用STACK參數(shù),或者在程序中使用另一個堆棧段時,可采用類似于DS和ES的裝入方法,用傳送指令實現(xiàn)對SS的裝入操作。(3)CS和IP的裝入CS和IP的裝入通常是按照結(jié)束偽指令指定的地址來自動完成的。結(jié)束偽指令的格式是: END 起始地址是一個標號或地址表達式,這個地址是程序裝入內(nèi)存后的起始點,它的段基址和偏移量就是CS和IP的內(nèi)容。04 九月 2022(2)SS的裝入09 九月 20223. 組定義偽指令GROUP格式:組名 GROUP 段名,段名將程序中若干不同名的段集合成一個組,并賦予一個組名,使它們都裝在一個64KB的物理段中, 這時組內(nèi)不同類型的段運行時共用一個 Sreg,組內(nèi)
38、各段間的跳轉(zhuǎn)都可以看作段內(nèi)跳轉(zhuǎn)。例:STACKSEG SEGMENT STACK ;定義堆棧段 DB 256 DUP (?) STACKSEG ENDSDATA1 SEGMENT WORD PUBLIC CONST CONS1 DW 100 ;定義數(shù)據(jù)段1DATA1 ENDSDATA2 SEGMENT WORD PUBLIC VARS VAR1 DW ? ;定義數(shù)據(jù)段2DATA2 ENDS04 九月 20223. 組定義偽指令GROUP09 九月 2022DATAGROUP GROUP DATA1,DATA2 ;組合兩個數(shù)據(jù)段,以DATAGROUP為段組名CODESEG SEGMENT PAR
39、A PUBLIC CODE ;定義代碼段 ASSUME CS:CODESEG,DS:DATAGROUP,SS:STACKSEGSTART: MOV AX,DATAGROUP MOV DS,AX ;DS賦初值對該組尋址 MOV AX,CONS1 ;AX=100 MOV VAR1,AX ;VAR=100 MOV AX,OFFSET VAR1 ;AX=2 MOV AX,OFFSET DATA1 ;AX=2 (已分配2個字節(jié)內(nèi)存單元) MOV AX,OFFSET DATA2 ;AX=4 (已分配4個字節(jié)內(nèi)存單元) MOV AX,4C00H INT 21H ;DOS功能調(diào)用,可正常返回到操作系統(tǒng)CODE
40、SEG ENDS END START ;程序結(jié)束04 九月 2022DATAGROUP GROUP DATA09 九月 2022二、簡化分段定義偽指令在MASM 5.0版本以上的宏匯編語言中段的定義可以非常簡單。.MODEL ;定義程序的存儲模式.STACK ;定義堆棧段, 長度缺省為1K字節(jié).CODE ;定義代碼段.DATA ;定義數(shù)據(jù)段.DATA? ;定義數(shù)據(jù)段,但初值不確定.FARDARA ;定義遠調(diào)用數(shù)據(jù)段.FARDARA? ;定義遠調(diào)用數(shù)據(jù)段,但初值不確定.CONST ;定義只讀常數(shù)數(shù)據(jù)段.STARTUP ;程序起始點,并初始化DS、SS.EXIT 0 ;程序結(jié)束點,返回到操作系統(tǒng)0
41、4 九月 2022二、簡化分段定義偽指令09 九月 2022例: .MODEL SMALL ;定義小型內(nèi)存模式.386 ;可以匯編386指令.STACK 100 ;定義堆棧段,長度為100字節(jié).DATA ;數(shù)據(jù)段開始X DD 12345678HY DD 87654321HZ DD ?,?.CODE ;代碼段開始.STARTUP ;程序開始MOV EAX,XMUL YMOV Z,EAXMOV Z+4,EDX.EXIT 0 ;程序結(jié)束,返回, ;相當(dāng)于MOV AX,4C00H和INT 21H兩條指令END ;匯編結(jié)束04 九月 2022例:09 九月 20221定義內(nèi)存模式偽指令 .MODEL 存
42、儲模式 ,語言類型 ,操作系統(tǒng)類型 ,堆棧類型(1)存儲模式: TINY:微型模式,程序中的數(shù)據(jù)和代碼放在同一64K段內(nèi),這也就是后綴為.COM的程序。這種模式是MASM6才引入的。SMALL:小型模式,程序中的代碼放在64KB的數(shù)據(jù)段內(nèi), 數(shù)據(jù)放在64KB代碼的段內(nèi)(包括數(shù)據(jù)段、堆棧段和附加段公用一個段),因而對代碼和數(shù)據(jù)的訪問可通過近程(NEAR)調(diào)用來實現(xiàn)。一般程序默認的都是該模式。MEDIUM:中型模式,程序中的數(shù)據(jù)放在64KB的數(shù)據(jù)段內(nèi),代碼量大于64KB,因而可安排在不同段內(nèi)。這樣,數(shù)據(jù)是近程的,而代碼是遠程的。COMPACT:壓縮模式,程序中的所有代碼放在一個64KB的代碼段內(nèi),
43、而數(shù)據(jù)區(qū)可以大于64KB。這樣,對代碼的訪問是近程的,而數(shù)據(jù)是遠程的。LARGE:大型模式,程序中的數(shù)據(jù)和代碼均大于64KB,但靜態(tài)(常數(shù))數(shù)據(jù)限制在64KB之內(nèi)。對程序和數(shù)據(jù)的訪問默認都是遠程的。HUGE:巨型模式,程序中的數(shù)據(jù)和代碼均大于64KB,靜態(tài)數(shù)據(jù)也可以大于64KB。這樣,對代碼、數(shù)據(jù)和數(shù)組的訪問都是遠程的。FLAT:平展模式,用于創(chuàng)建一個32位的程序,它只能運行在32位80X86CPU上。DOS下不能使用FLAT模式,而編寫32位Windows程序時,必須采用FLAT模式。04 九月 20221定義內(nèi)存模式偽指令TINY:微型模09 九月 2022(2)語言類型:由它來告訴匯編程
44、序?qū)⑹褂檬裁礃拥臉俗R符的命名風(fēng)格、子程序的調(diào)用和返回約定等??墒箙R編語言程序與其它語言程序達到共享的目的。有效的語言類型為:C(C語言)、SYSCALL(系統(tǒng)調(diào)用)、STDCALL(標準調(diào)用)、 Basic(Basic語言)、 Fortran(Fortran語言) 、Pascal(Pascal語言)等。(3)操作系統(tǒng)類型:OS_DOS是當(dāng)前唯一支持的選項值,也是該選項的缺省值。(4)堆棧類型:堆棧類型的值主要影響偽指令.STARTUP所生成的指令序列。該選項有二個可選值:NEARSTACK和FARSTACK。其中:NEARSTACK是該選項的缺省堆棧類型。NEARSTACK堆棧段和數(shù)據(jù)段是同一
45、段;FARSTACK堆棧段和數(shù)據(jù)段是不同的段,且堆棧不在段組DGROUP中。例:.MODEL SMALL, C, OS_DOS, FARSTACK 04 九月 2022(2)語言類型:09 九月 20222處理器選擇偽指令.8086和.8087 可用來匯編8086/8088處理器和8087協(xié)處理器的指令,這是缺省模式。.286、.286C、.286P、.287可用來匯編286系列微處理器的指令。.386、.386C、.386P、.387可用來匯編386系列微處理器的指令。.NO87取消使用協(xié)處理器指令。.486、.486C、.486P可用來匯編486系列微處理器的指令。.586、.586C、.
46、586P可用來匯編Pentium系列微處理器的指令。. 686、.686P可用來匯編Pentium Pro系列微處理器的指令。.MMX可用來匯編MMX指令。 .MMX和.686、.686P是MASM6.12引入的。.K3D可用來匯編AMD處理器的3D指令,是MASM6.13引入的。.XMM可用來匯編SSE指令和SSE2指令,是MASM6.15引入的。注意:80386以上處理器中,如果處理器選擇偽指令放在.MODEL偽指令前面,那么段將定義成32位的段。如果希望處理器使用16位的段,則應(yīng)在.MODEL偽指令后面使用處理器選擇偽指令。04 九月 20222處理器選擇偽指令09 九月 20223段名
47、的缺省名使用簡化的段定義偽指令時,每個段都有一個缺省名。在中內(nèi)存模式和大內(nèi)存模式時,.CODE偽指令表示的缺省段名為name_TEXT,即name是這個段名的可變部分,當(dāng)程序模塊有一個具體名字時,name就表示這個名字。.DATA、.CONST、.DATA?、.STACK定義的段內(nèi)數(shù)據(jù)存放在一個叫DGROUP的段組中,各個段內(nèi)的偏移地址均以這個起始地址為起點,而不依本段內(nèi)的段地址為起點。.FARDATA或.FARDATA?偽指令使用的缺省名在各種模式下可以替換,它們定義的段內(nèi)數(shù)據(jù)不放在任何段中,屬于遠程數(shù)據(jù)。內(nèi)存模式段定義偽指令段名定位組合類別組名Small.CODE.DATA.CONST.D
48、ATA?.STACK_TEXT_DATACONST_BSSSTACKWORDWORDWORDWORDPARAPUBLICPUBLICPUBLICPUBLICSTACKCODEDATACONSTBSSSTACKDGROUPDGROUPDGROUPDGROUP04 九月 20223段名的缺省名內(nèi)存段定義段名定位組合類09 九月 20224.等價名的使用MASM 5.0中規(guī)定了幾個等價名代替真實名。可以用代替簡化段定義偽指令前面的小數(shù)點。CODE代表.CODE定義的段名;FARDATA代表.FARDATA定義的段名;DATA代表.DATA、.DATA?、.CONST和.STACK共享的組段名。例:
49、ASSUME ES:FARDATA ;ES為遠程數(shù)據(jù)段地址 MOV AX,DATA MOV DS,AX ;DS為DGROUP段組段地址 MOV AX,FARDATA MOV ES,AX5.段序定義偽指令MASM可以按照源程序中各個段出現(xiàn)的次序來排列目標文件中各段的先后次序,也可以按照段名的字母順序來排列次序。缺省情況是按照段出現(xiàn)的次序來排列,可以定義段序: .ALHPA:按照字母順序?qū)Χ闻判颉?.SEG:按照段出現(xiàn)的順序?qū)Χ闻判?。完整段定義格式中,默認按此順序。 .DOSSEG:按照DOS定義的標準段序?qū)Χ闻判?,順序?代碼段、數(shù)據(jù)段、堆棧段。采用.MODEL偽指令的簡化段定義格式默認按此順序
50、。04 九月 20224.等價名的使用09 九月 2022三、使用簡化段定義的程序框架(1)EXE標準程序框架匯編語言源程序經(jīng)過匯編和連接后生成可執(zhí)行文件(.exe)。操作系統(tǒng)為程序建立了一個程序段前綴區(qū)PSP,其長度為256個字節(jié),主要用于存放用戶程序的有關(guān)信息,如文件名、文件長度等。而在偏移100H處才裝入程序本身。EXE程序加載要重新定位:1)DS和ES指向PSP段地址,而不是程序的數(shù)據(jù)段和附加段,所以需在程序中根據(jù)實際數(shù)據(jù)段改變DS和ES;2)CS:IP和SS:SP是由連接程序確定的值,指向程序的代碼段和堆棧段。如果不指定堆棧段,則SS=PSP段地址,SP=100H,堆棧段占用PSP中
51、的部分區(qū)域。04 九月 2022三、使用簡化段定義的程序框架09 九月 2022例 .MODEL SMALL ;小內(nèi)存模式 .586 ;可匯編并運行586指令 .STACK 100H ;256字節(jié)堆棧 .DATA MSG DB Welcome$ ;要寫的信息 .CODE .STARTUP MOV DX,OFFSET MSG ;信息存儲區(qū)首地址送DX MOV AH,9H INT 21H ;DOS寫功能調(diào)用,在屏幕顯示變量MSG內(nèi)容 Welcome .EXIT 0 ;返回 END04 九月 2022例 09 九月 2022(2).COM格式的程序框架.COM程序是一種將代碼、數(shù)據(jù)和堆棧段合一的結(jié)構(gòu)緊湊的程序,所有的段都在一個邏輯段內(nèi),不超過64KB。在程序中采用.MODEL TINY模式定義語句即可生成COM結(jié)構(gòu)的程序。COM文件存儲在磁盤上是主存的完全影像,不包含重新定位的加載信息,加載速度更快,占用的磁盤空間更少。COM程序加載后:1)所有段地址都指向PSP的段地址;2)程序執(zhí)行起點是PSP后的第一條指令,既IP=100H;也就是說,COM程序的第一條指令必須是可執(zhí)行指令,即程序的起始執(zhí)行處是程序頭。
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 佳木斯職業(yè)學(xué)院《熱工與熱機》2023-2024學(xué)年第二學(xué)期期末試卷
- 東北師范大學(xué)《液壓與氣動》2023-2024學(xué)年第二學(xué)期期末試卷
- 北京語言大學(xué)《水資源利用》2023-2024學(xué)年第二學(xué)期期末試卷
- 浙江工業(yè)大學(xué)之江學(xué)院《生態(tài)環(huán)境保護基礎(chǔ)(三)》2023-2024學(xué)年第二學(xué)期期末試卷
- 浙江越秀外國語學(xué)院《市場營銷學(xué)概論》2023-2024學(xué)年第二學(xué)期期末試卷
- 中央美術(shù)學(xué)院《課堂教學(xué)技能訓(xùn)練》2023-2024學(xué)年第二學(xué)期期末試卷
- 石家莊理工職業(yè)學(xué)院《災(zāi)害衛(wèi)生學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 長垣烹飪職業(yè)技術(shù)學(xué)院《電工及電子學(xué)(二)》2023-2024學(xué)年第二學(xué)期期末試卷
- 益陽醫(yī)學(xué)高等??茖W(xué)校《開發(fā)技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 天津體育職業(yè)學(xué)院《動力電池及能量管理技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 16.2《登泰山記》課件 2024-2025學(xué)年統(tǒng)編版高中語文必修上冊-9
- 【課件】如何保障我國未來的能源安全
- 2024年深圳科技企業(yè)員工聘用合同3篇
- 結(jié)腸術(shù)后恢復(fù)護理
- 綜藝節(jié)目贊助合同(2024年版)
- 道路運輸企業(yè)主要負責(zé)人和安全生產(chǎn)管理人員安全考核習(xí)題庫(附參考答案)
- 2024東莞市勞動局制定的勞動合同范本
- 2024年四川省公務(wù)員考試《行測》真題及答案解析
- 上海市幼兒園幼小銜接活動指導(dǎo)意見(修訂稿)
- 公務(wù)員2010年國考《申論》真題卷及答案(地市級)
- 2021年6月大學(xué)英語四級考試真題及解析(全三套)
評論
0/150
提交評論