匯編語言程序設(shè)計(jì)及上機(jī)指導(dǎo)5匯編語言語法課件_第1頁
匯編語言程序設(shè)計(jì)及上機(jī)指導(dǎo)5匯編語言語法課件_第2頁
匯編語言程序設(shè)計(jì)及上機(jī)指導(dǎo)5匯編語言語法課件_第3頁
匯編語言程序設(shè)計(jì)及上機(jī)指導(dǎo)5匯編語言語法課件_第4頁
匯編語言程序設(shè)計(jì)及上機(jī)指導(dǎo)5匯編語言語法課件_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第5章匯編語言語法【本章提要】本章以Intel系列微處理器的指令系統(tǒng)和宏匯編工具M(jìn)ASM6.X為主體,介紹匯編語言的基本語法和偽指令,實(shí)現(xiàn)簡單的匯編語言程序設(shè)計(jì)?!緦W(xué)習(xí)目標(biāo)】·熟練掌握進(jìn)行匯編語言程序設(shè)計(jì)的基本語法·熟練掌握偽指令以及宏結(jié)構(gòu)的應(yīng)用·熟練掌握利用MASM6.X工具對(duì)程序進(jìn)行匯編的具體方法2023/1/16指令:是可執(zhí)行的,匯編后由相應(yīng)的機(jī)器代碼所取代;偽指令:是不可執(zhí)行的,只是在源程序匯編期間由匯編程序處理的命令,指示匯編程序?yàn)閿?shù)據(jù)分配內(nèi)存空間,或者提供段定義等信息,不產(chǎn)生任何機(jī)器代碼源程序可執(zhí)行文件目標(biāo)模塊文本編輯器匯編程序連接程序調(diào)試程序機(jī)器語言:計(jì)算機(jī)能夠直接識(shí)別與執(zhí)行高級(jí)語言:是完全獨(dú)立于機(jī)器的通用語言,效率低,面向過程、面向?qū)ο螅仨氉g成機(jī)器語言。匯編語言:符號(hào)化語言。用指令的助記符、符號(hào)地址、標(biāo)號(hào)等編寫程序的語言。5.1概述2023/1/165.1.1匯編語言程序的基本概念指令與偽指令的集合構(gòu)成匯編語言語句

.MODELSMALL ;定義內(nèi)存工作模式為小模式

.386;定義指令系統(tǒng)為80386指令集

.STACK ;定義1K個(gè)字節(jié)的堆棧段

.DATA ;數(shù)據(jù)段開始DATA1DD12340000H ;定義第一個(gè)32位數(shù)據(jù)的值為12340000HDATA2DD5678H ;定義第二個(gè)32位數(shù)據(jù)的值為5678HSUMDD? ;定義用來存放前兩個(gè)數(shù)據(jù)之和的第三個(gè)數(shù)據(jù)

.CODE;代碼段開始,數(shù)據(jù)段結(jié)束

.STARTUP ;程序開始

MOVEAX,DATA1 ;取第一個(gè)數(shù)到EAXADDEAX,DATA2 ;求和

MOVSUM,EAX ;保存結(jié)果(12345678H)至SUM.EXIT0 ;程序結(jié)束,正常返回到操作系統(tǒng)

END ;結(jié)束匯編2023/1/16三、保留字寄存器名、指令助記符、偽操作命令、表達(dá)式運(yùn)算符,以及屬性操作符等都是系統(tǒng)專用的保留字。這些保留字是不能用作標(biāo)識(shí)符的。四、語句一條語句一般只占一行,超過一行時(shí)必須用續(xù)行符號(hào)“\”指示兩條語句不能寫在同一行。語句可以有注釋,一般寫在語句之后或單獨(dú)占一行,是以“;”開始的字符串。2023/1/165.2匯編語言的數(shù)據(jù)和表達(dá)式匯編語言能識(shí)別的數(shù)據(jù)是常量、變量和標(biāo)號(hào)。5.2.1常量常量是匯編時(shí)已經(jīng)確定的值,主要用于偽指令中給變量賦值,或作為指令語句中的立即數(shù)或存儲(chǔ)器操作數(shù)的組成部分。一.常量的類型數(shù)據(jù)形式格式×取值范圍舉例注釋二進(jìn)制數(shù)×…×B0~110010011B二進(jìn)制數(shù)以B結(jié)尾八進(jìn)制數(shù)×…×Q0~7123Q八進(jìn)制數(shù)以Q結(jié)尾十進(jìn)制數(shù)×…×D0~9256D,3458十進(jìn)制數(shù)以D結(jié)尾或者缺省十六進(jìn)制數(shù)×…×H0~9A~F0A3H,12345H十六進(jìn)制數(shù)以H結(jié)尾,最前面必須是0~9字符或字符串'×…×'ASCII字符'ABC'兩端必須加’或”2023/1/16二.符號(hào)定義偽指令

用于給程序中多次出現(xiàn)的同一個(gè)常量或表達(dá)式賦一個(gè)符號(hào)名,也可以為其它符號(hào)名取一個(gè)新名字,并賦給新的類型屬性。(1)EQU偽指令例:FIRSTEQU1;定義常數(shù)

SECONDEQUFIRST*3+8;定義數(shù)值表達(dá)式

ADDR1EQUDS:[EBP+4];定義地址表達(dá)式

DWORDSEQUTHISDWORD;定義下面的字節(jié)變量為雙字類型

BYTESDB10DUP(0)ADDR2EQUWORDPTRBYTES

;重新定義變量BYTES的名字和屬性

START:MOVEAX,EBXGOONEQUFARPTRSTART

;重新定義標(biāo)號(hào)START的名字和屬性

COUNTEQUECX;為ECX重新取名注意:該等值語句只作為符號(hào)定義用,不產(chǎn)生任何目標(biāo)代碼,也不占用存儲(chǔ)單元,并且不能是程序中曾經(jīng)定義過的符號(hào)名。2023/1/165.2.2變量變量的值可以在程序運(yùn)行過程中可隨時(shí)修改,變量名是存放數(shù)據(jù)的存儲(chǔ)單元符號(hào)地址,變量的值為對(duì)應(yīng)存儲(chǔ)單元的內(nèi)容。一.變量的屬性?段屬性(SEG),指變量所在段的段基址。?偏移地址屬性(OFFSET),指變量所在段中的偏移地址,即變量所在地址與段基址之間的字節(jié)距離。?類型屬性(TYPE),指變量占用存儲(chǔ)單元的字節(jié)數(shù)。若占用一個(gè)字節(jié),稱為字節(jié)變量,其類型為BYTE;若占用兩個(gè)字節(jié),稱為字變量,其類型為WORD;若占用四個(gè)字節(jié),稱為雙字變量,其類型為DWORD;若占用六字節(jié),其類型為FWORD;若占用八字節(jié),其類型為QWORD;若占用十字節(jié),其類型為TBYTE。2023/1/16二.變量定義偽指令就是為數(shù)據(jù)分配存儲(chǔ)單元,且對(duì)這個(gè)存儲(chǔ)單元取一個(gè)名字,即變量名。語句的格式如下:[變量名]DB/DW/DD/DF/DQ/DT表達(dá)式1,表達(dá)式2,……變量名是可選的,DB/DW/DD/DF/DQ/DT是偽操作命令必須選用一種,表達(dá)式是賦給變量的初值,常見的有如下幾種:(1)數(shù)值變量定義語句例:D_BYTEDB30H,40HDB50HD_WORDDW1234H,5678HD_DWORDDDD_DWORDD_TBYTEDT?D_FWORDDF1234567890ABHD_QWORDDQ1122334455667788H2023/1/16(2)字符串變量定義語句可以用DB來實(shí)現(xiàn),即為串中的每一個(gè)字符分配一個(gè)字節(jié)存儲(chǔ)單元。字符串必須用引號(hào)括起來,并且不超過256個(gè)字符,它們?cè)趦?nèi)存中自左至右把字符的ASCII碼按地址遞增順序依次存放。例:

STRING1DB'ABCDEFG'用DW也可以定義字符串變量,即給兩個(gè)字符組成的字符串分配兩個(gè)字節(jié)存儲(chǔ)單元,它們?cè)趦?nèi)存中的順序是前一個(gè)字符為高字節(jié),存放在高地址,后一個(gè)字符為低字節(jié),存放在低地址。例:

STRING2DW'AB','CD','EF'2023/1/16三.內(nèi)存定位和定義數(shù)制偽指令(1)ORG偽指令和當(dāng)前位置計(jì)數(shù)器$匯編時(shí)將段名填入段表,同時(shí)為該段配備一個(gè)初值為0的位置計(jì)數(shù)器$。計(jì)數(shù)器依次累計(jì)段內(nèi)語句被匯編后生成的目標(biāo)代碼字節(jié)個(gè)數(shù)。可用ORG偽指令把位置計(jì)數(shù)器$的值設(shè)置成需要的值。在數(shù)據(jù)段中,ORG后面的數(shù)據(jù)定義偽指令就從指定位置進(jìn)行分配單元;在代碼段中,ORG后面的一條指令語句就從指定位置生成目標(biāo)代碼;表達(dá)式的值應(yīng)該是非負(fù)的整數(shù)。例:ORG0F0H;從0F0H開始安排數(shù)據(jù)

ORG$+10H;跳過10H個(gè)字節(jié)后安排數(shù)據(jù)

DW1,$+4,$+4

;100H單元的字值為1,102H單元的字值;為106H,104H單元的字值為108HARRAYDB12,34,56,5DUP(?);定義字節(jié)數(shù)組LENEQU$-ARRAY

;LEN的值為ARRAY變量所占的字節(jié)數(shù)82023/1/16(2)EVEN偽指令

用來把段內(nèi)位置計(jì)數(shù)器的值置為偶數(shù)地址邊界對(duì)齊,如果遇到EVEN時(shí)計(jì)數(shù)器$值非偶數(shù),則匯編程序自動(dòng)插入NOP指令(在代碼段中),使其為偶數(shù);或者將$的值加1(數(shù)據(jù)段中)。(3).RADIX偽指令宏匯編默認(rèn)常量基數(shù)都是十進(jìn)制數(shù),可用.RADIX偽命令把缺省基數(shù)改為2~16范圍內(nèi)的任意基數(shù):

.RADIX<表達(dá)式>

其中,表達(dá)式與當(dāng)前基數(shù)無關(guān),一定是十進(jìn)制數(shù)。例:MOVAX,0FFHMOVBX,20.RADIX16MOVCX,0FFMOVDX,20D其中AX和CX寄存器的內(nèi)容相同,BX和DX寄存器內(nèi)容相同。2023/1/165.2.3標(biāo)號(hào)標(biāo)號(hào)之后必須有一個(gè)冒號(hào)(:),標(biāo)號(hào)也可以單占一行。一.標(biāo)號(hào)的屬性

?段屬性(SEG),指標(biāo)號(hào)所在段的段基址。

?偏移地址屬性(OFFSET),指標(biāo)號(hào)所在段中的偏移地址,即標(biāo)號(hào)所在地址與段基址之間的字節(jié)距離。

?距離屬性或類型屬性(TYPE),標(biāo)號(hào)可作為轉(zhuǎn)移和調(diào)用指令的目標(biāo)地址,也可作為過程定義偽指令的過程名。當(dāng)標(biāo)號(hào)只允許作為段內(nèi)轉(zhuǎn)移或調(diào)用指令的目標(biāo)地址時(shí),距離屬性為NEAR;當(dāng)標(biāo)號(hào)作為段間轉(zhuǎn)移或調(diào)用指令的目標(biāo)地址時(shí),距離屬性為FAR。例如:JMPLABEL1;程序跳轉(zhuǎn)到標(biāo)號(hào)LABEL1的位置CALLFARPTRSUBPROGRAM;調(diào)用SUBPROGRAM過程(FAR)LABEL1:┅;LABEL1為段內(nèi)轉(zhuǎn)移標(biāo)號(hào)(距離屬性缺省為NEAR)┅LABEL2:;LABEL2為段內(nèi)轉(zhuǎn)移標(biāo)號(hào),單獨(dú)占一行┅SUBPROGRAMPROCFAR;SUBPROGRAM是屬性為FAR的過程┅RET

標(biāo)號(hào)的距離屬性可用LABEL偽指令加以改變。2023/1/165.2.4表達(dá)式和運(yùn)算符一、算術(shù)運(yùn)算符包括+、-、*、/、MOD、SHL和SHR共七種;+、-、*、/參加運(yùn)算的數(shù)和運(yùn)算結(jié)果均為整數(shù);除法運(yùn)算為整除,而模除的運(yùn)算結(jié)果為余數(shù);左移或右移運(yùn)算符可使二進(jìn)制數(shù)左移或右移若干位,相當(dāng)于二進(jìn)制數(shù)進(jìn)行乘法或除法運(yùn)算。例:TEMP=10+5;TEMP=15TEMP=TEMP-3;TEMP=12TEMP=TEMP*5;TEMP=60TEMP=TEMP/9;TEMP=6TEMP=TEMPMOD4;TEMP=2TEMP=-TEMP;TEMP=-2MOVAL,11BSHL5;(AL)=01100000B注意:除了加和減運(yùn)算符可以使用變量或標(biāo)號(hào)外,其它算術(shù)運(yùn)算符只適用于常量的數(shù)值運(yùn)算。2023/1/16二、邏輯運(yùn)算符有AND、OR、XOR、NOT共四種;只適用于對(duì)常量進(jìn)行邏輯運(yùn)算,運(yùn)算是按位進(jìn)行的;運(yùn)算符與邏輯運(yùn)算指令助記符相同,但在語句中的位置不一樣,表達(dá)式中的邏輯運(yùn)算符是在匯編時(shí)完成運(yùn)算的;而邏輯運(yùn)算指令運(yùn)算在執(zhí)行指令時(shí)進(jìn)行。例:

MOVAL,NOT10100101B;(AL)=01011010BMOVAL,11011011BAND00001111B

;(AL)=00001011BMOVAL,11100001BOR10000101B

;(AL)=11100101BMOVAL,10111011BXOR00100100B

;(AL)=10011111B2023/1/16三、關(guān)系運(yùn)算符

包括EQ、NE、LT、GT、LE、GE共六種;可對(duì)常量或同一段內(nèi)的存儲(chǔ)器地址進(jìn)行比較運(yùn)算;若條件滿足,運(yùn)算結(jié)果為真,輸出結(jié)果為全“1”;若不滿足條件,運(yùn)算結(jié)果為假,輸出結(jié)果為全“0”。例:

MOVBX,10EQ1010B

;10等于1010B為真,(BX)=0FFFFHMOVDX,20HGT32;20H大于32為假,(DX)=02023/1/16屬性與返回?cái)?shù)值的關(guān)系變量/標(biāo)號(hào)屬性返回?cái)?shù)值

字節(jié)變量BYTE字變量WORD雙字變量DWORD三字變量FWORD四字變量QWORD十字節(jié)變量TBYTE1246810標(biāo)號(hào)NEAR標(biāo)號(hào)FAR–1[FFH]–2[FEH]2023/1/164.LENGTHOF運(yùn)算符該運(yùn)算符加在變量名之前,返回的數(shù)值是變量中所定義的元素個(gè)數(shù)。

D1DW10HDUP(0),1234HD2DB20HDUP(2DUP(0),1)

D3DQ1234H,5678HD4DB‘ABCDEFGH’

D5DD12H,34H,\;加一個(gè)續(xù)行符,表示一條偽指令占兩行

56H,78HD6DD12H,34H;未加續(xù)行符,則表示這兩行是兩條偽指令

DD56H,78HMOVAL,LENGTHOFD1;(AL)=11HMOVAL,LENGTHOFD2;(AL)=60HMOVAL,LENGTHOFD3;(AL)=2HMOVAL,LENGTHOFD4;(AL)=8HMOVAL,LENGTHOFD5;(AL)=4HMOVAL,LENGTHOFD6;(AL)=2H2023/1/165.SIZEOF運(yùn)算符該運(yùn)算符加在變量名之前,返回的數(shù)值是變量所占的總字節(jié)數(shù),且等于LENGTHOF和TYPE兩個(gè)運(yùn)算符返回值的乘積。例如,對(duì)于上例中的變量,SIZEOF的返回值如下所示:MOVAL,SIZEOFD1;(AL)=22H,即20H*2HMOVAL,SIZEOFD2;(AL)=60H,即60H*1HMOVAL,SIZEOFD3;(AL)=10H,即8H*2HMOVAL,SIZEOFD4;(AL)=8H,即8H*1HMOVAL,SIZEOFD5;(AL)=10H,即4H*4HMOVAL,SIZEOFD6;(AL)=8H,即2H*4H2023/1/16五、修改屬性運(yùn)算符(1)PTR運(yùn)算符格式:<類型>PTR<地址表達(dá)式>根據(jù)地址表達(dá)式的不同,所賦給的新類型可以是BYTE、WORD、DWORD、FWORD、QWORD、TBTYE、NEAR、FAR等,它們只在所在的指令內(nèi)有效。例:TABLEDB1,2,3,4,5,6,7,8ADDWORDPTR[DI],100;指明目的操作數(shù)為字類型

JMPDWORDPTR[BX];指明為段間轉(zhuǎn)移

MOVEAX,DWORDPTRTABLE;臨時(shí)修改TABLE為雙字類;型,(EAX)=04030201H(2)THIS運(yùn)算符把它后面指定的類型或距離屬性賦給當(dāng)前的變量、標(biāo)號(hào)或地址表達(dá)式,但不分配新的存儲(chǔ)單元,往往與偽指令EQU或=連用,為當(dāng)前存儲(chǔ)單元定義一個(gè)指定類型的變量或標(biāo)號(hào),類型屬性也可以是BYTE、WORD、DWORD、FWORD、QWORD、TBTYE、NEAR、FAR等。例:DATEQUTHISWORDPOINTEQUTHISFAR第一條語句將變量DAT的類型屬性定義為字,不管DAT原來的類型是什么,從本語句開始,DAT成為字節(jié)變量;第二條語句將標(biāo)號(hào)POINT的距離屬性定義為FAR,不管POINT原來的距離屬性是什么,從本語句開始,POINT成為遠(yuǎn)標(biāo)號(hào)。2023/1/16六、其它運(yùn)算符(1)高低分離運(yùn)算符HIGH運(yùn)算符和LOW運(yùn)算符分別用于從16位運(yùn)算對(duì)象中分離出高字節(jié)和低字節(jié)。從MASM6.0開始引入了HIGHWORD運(yùn)算符和LOWWORD運(yùn)算符分別用于從32位符號(hào)常量中分離出高字和低字部分。例:MOVAH,HIGH5678H;(AL)=56HDATA16EQU1234HMOVAL,LOWDATA16;(AL)=34HDATA32EQU1234FFFFHMOVAX,LOWWRODDATA32;(AX)=0FFFFH(2)方括號(hào)運(yùn)算符:運(yùn)算符中可以是數(shù)組變量的下標(biāo)或地址表達(dá)式,以區(qū)別操作數(shù)和操作數(shù)地址。例:ARRAYDB1,2,3,4,5;ARRAY為數(shù)組變量

MOVAL,ARRAY[4]

;”4”為下標(biāo),(AL)=5MOVBX,OFFSETARRAY;(BX)=ARRAY的偏移地址

MOVAH,[BX];(AH)=1MOVDX,WORDPTRARRAY[1];(DX)=302H(3)運(yùn)算符的優(yōu)先級(jí):一般可以用括號(hào)來改變運(yùn)算符的優(yōu)先級(jí)別。例:MOVAL,18OR5AND10;AL=18(12H)MOVAL,(18OR5)AND10;AL=22023/1/16運(yùn)算符的優(yōu)先級(jí)2023/1/16一、完整分段定義偽指令

1.段定義偽指令

SEGMENT/ENDS——將程序分成段:代碼段,數(shù)據(jù)段,堆棧段,附加段。格式:段名SEGMENT[定位類型][組合屬性][‘類別名’]…

(段體)

段名ENDS

功能:指出段名和段的各種屬性,并表示段的開始和結(jié)束位置。段定義由偽操作SEGMENT開始、ENDS結(jié)束。其中:SEGMENT和ENDS必須成對(duì)出現(xiàn),且語句前必須有段名,段名必須相同。

SEGMENT和ENDS語句之間可以有指令和其他偽指令,

表示存放在該段內(nèi)存的變量、指令或其他偽指令對(duì)該段內(nèi)存的處理程序中可以定義多個(gè)段。程序經(jīng)匯編、連接及裝入內(nèi)存后,段名為一具體的段值。合法標(biāo)識(shí)符,有段基地址和段內(nèi)偏移量兩個(gè)屬性,與某個(gè)存儲(chǔ)單元相聯(lián)系。2023/1/16(1)定位類型——用于告訴鏈接程序,鏈接時(shí)(各模塊.obj)

本段首地址的邊界定位方式,常有四種:①PARA:段的起始地址必須是16的倍數(shù)(XXXX0H),這是一種默認(rèn)方式。②PAGE:段的起始地址必須是256的倍數(shù)(XXX00H),

256字節(jié)為一頁,在頁的起點(diǎn)上。③WORD:段的起始地址必須是偶數(shù)(XX…0B)。④BYTE:段的起始地址可以是任何地址。(2)組合類型——

在多模塊(每個(gè)模塊有自己的代碼段、數(shù)據(jù)段、堆棧段)組合時(shí),告訴Link程序本段與其他模塊中同名段的組合鏈接關(guān)系。2023/1/16①NONE:本段與其他同名段無組合關(guān)系,并有自己的段起始地址,這是一種默認(rèn)方式。②PUBLIC:在滿足定位類型的前提下,LINK程序?qū)⑵渑c其他模塊中的同名段鄰接在一起,共用一個(gè)段地址。③STACK:同PUBLIC。鏈接以后作為堆棧段,并自動(dòng)初始化

SS、SP。若程序中不說明STACK,則必須由用戶在程序的開始處,自己通過語句設(shè)置SS、SP。④

COMMON:各模塊中同名段重疊覆蓋,有著相同的起始地址。段的長度取決于最長的COMMON段。段的內(nèi)容為所鏈接的最后一個(gè)模塊中COMMON段的內(nèi)容。⑤

MEMERY:鏈接在其他所有段的后面(高端存儲(chǔ)區(qū))。若有多個(gè)MEMERY段,則只認(rèn)第一個(gè),其余按

COMMON處理。2023/1/16(3)段字屬性在32位80X86微處理器中,新增加了USE屬性說明。對(duì)于16位CPU默認(rèn)的是16位段,即USE16。而對(duì)于匯編32位80X86CPU指令時(shí),它默認(rèn)采用32位段,即USE32。但可以使用USE16指定標(biāo)準(zhǔn)的16位段。若在程序開頭使用了.386偽指令(見簡化段定義偽指令),缺省類型為32位段字長。注意,在禁止用80386的情況下,使用USE選擇項(xiàng)將導(dǎo)致出錯(cuò)。(4)段類別名屬性類別名可以是任何合法的名字,必須用單引號(hào)括起來。在連接處理時(shí),鏈接程序把類別名相同的所有段存放在連續(xù)的存儲(chǔ)區(qū)內(nèi)。典型的類別名如:‘DATA’,‘STACK’,‘CODE’。以上是定位類型、組合類型、段字和類別名四個(gè)參數(shù)的說明,各參數(shù)之間用空格分隔。在選用時(shí),可以只選其中一個(gè)或兩個(gè)參數(shù)項(xiàng),但不能交換它們之間的順序。2023/1/162.段寄存器說明偽指令

格式:ASSUME

段寄存器:段名[,段寄存器:段名,…]①設(shè)定特定的Sreg指向特點(diǎn)的段,說明源程序中定義的段應(yīng)由哪一個(gè)Sreg去尋址。不如此,匯編程序無法生成目標(biāo)代碼程序。②ASSUME并未真正的將段地址裝入相應(yīng)的Sreg。Sreg的初值還必須由用戶在程序的開始處用MOV指令來設(shè)置(CS除外)。(1)DS和ES的裝入DS和ES的裝入可以通過給寄存器賦初值的指令來完成。但是應(yīng)注意到,由于段寄存器不能用立即數(shù)尋址方式直接傳送,因此裝入段基址必須借助于通用寄存器進(jìn)行間接傳送。例:CODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKS,ES:EXTRSSTART:MOVAX,DATASMOVDS,AXMOVAX,EXTRSMOVES,AX┅CSEGENDS2023/1/16(2)SS的裝入一種方法是在SEGMENT語句中,組合類型選用STACK,并在ASSUME語句中,把堆棧用的段指派給段寄存器SS。

STACKSSEGMENTPARASTACKDB100HDUP(?)STACKSENDS┅CODESSEGMENTASSUMECS:CODES,SS:STACKS┅另一種方法是在SEGMENT語句中,組合類型未選用STACK參數(shù),或者在程序中使用另一個(gè)堆棧段時(shí),可采用類似于DS和ES的裝入方法,用傳送指令實(shí)現(xiàn)對(duì)SS的裝入操作。(3)CS和IP的裝入CS和IP的裝入通常是按照結(jié)束偽指令指定的地址來自動(dòng)完成的。結(jié)束偽指令的格式是:END[<起始地址>]起始地址是一個(gè)標(biāo)號(hào)或地址表達(dá)式,這個(gè)地址是程序裝入內(nèi)存后的起始點(diǎn),它的段基址和偏移量就是CS和IP的內(nèi)容。2023/1/163.組定義偽指令GROUP格式:組名GROUP段名[,段名……]將程序中若干不同名的段集合成一個(gè)組,并賦予一個(gè)組名,使它們都裝在一個(gè)64KB的物理段中,這時(shí)組內(nèi)不同類型的段運(yùn)行時(shí)共用一個(gè)Sreg,組內(nèi)各段間的跳轉(zhuǎn)都可以看作段內(nèi)跳轉(zhuǎn)。例:STACKSEGSEGMENTSTACK;定義堆棧段

DB256DUP(?)STACKSEGENDSDATA1SEGMENTWORDPUBLIC'CONST'CONS1DW100;定義數(shù)據(jù)段1DATA1ENDSDATA2SEGMENTWORDPUBLIC'VARS'VAR1DW?;定義數(shù)據(jù)段2DATA2ENDS2023/1/16DATAGROUPGROUPDATA1,DATA2

;組合兩個(gè)數(shù)據(jù)段,以DATAGROUP為段組名CODESEGSEGMENTPARAPUBLIC'CODE';定義代碼段

ASSUMECS:CODESEG,DS:DATAGROUP,SS:STACKSEGSTART:MOVAX,DATAGROUPMOVDS,AX;DS賦初值對(duì)該組尋址

MOVAX,CONS1;AX=100MOVVAR1,AX;VAR=100MOVAX,OFFSETVAR1;AX=2MOVAX,OFFSETDATA1

;AX=2(已分配2個(gè)字節(jié)內(nèi)存單元)MOVAX,OFFSETDATA2

;AX=4(已分配4個(gè)字節(jié)內(nèi)存單元)MOVAX,4C00HINT21H;DOS功能調(diào)用,可正常返回到操作系統(tǒng)CODESEGENDSENDSTART

;程序結(jié)束2023/1/16二、簡化分段定義偽指令在MASM5.0版本以上的宏匯編語言中段的定義可以非常簡單。.MODEL<存儲(chǔ)模式>;定義程序的存儲(chǔ)模式.STACK<長度>;定義堆棧段,長度缺省為1K字節(jié).CODE[<名字>];定義代碼段.DATA;定義數(shù)據(jù)段.DATA?;定義數(shù)據(jù)段,但初值不確定.FARDARA[<名字>];定義遠(yuǎn)調(diào)用數(shù)據(jù)段.FARDARA?[<名字>];定義遠(yuǎn)調(diào)用數(shù)據(jù)段,但初值不確定.CONST;定義只讀常數(shù)數(shù)據(jù)段.STARTUP;程序起始點(diǎn),并初始化DS、SS.EXIT0;程序結(jié)束點(diǎn),返回到操作系統(tǒng)2023/1/16例:

.MODELSMALL;定義小型內(nèi)存模式.386;可以匯編386指令.STACK100;定義堆棧段,長度為100字節(jié).DATA;數(shù)據(jù)段開始XDD12345678HYDD87654321HZDD?,?.CODE;代碼段開始.STARTUP;程序開始MOVEAX,XMULYMOVZ,EAXMOVZ+4,EDX.EXIT0;程序結(jié)束,返回,;相當(dāng)于MOVAX,4C00H和INT21H兩條指令END;匯編結(jié)束2023/1/161.定義內(nèi)存模式偽指令

.MODEL存儲(chǔ)模式[,語言類型][,操作系統(tǒng)類型][,堆棧類型](1)存儲(chǔ)模式:①TINY:微型模式,程序中的數(shù)據(jù)和代碼放在同一64K段內(nèi),這也就是后綴為.COM的程序。這種模式是MASM6才引入的。②SMALL:小型模式,程序中的代碼放在64KB的數(shù)據(jù)段內(nèi),數(shù)據(jù)放在64KB代碼的段內(nèi)(包括數(shù)據(jù)段、堆棧段和附加段公用一個(gè)段),因而對(duì)代碼和數(shù)據(jù)的訪問可通過近程(NEAR)調(diào)用來實(shí)現(xiàn)。一般程序默認(rèn)的都是該模式。③MEDIUM:中型模式,程序中的數(shù)據(jù)放在64KB的數(shù)據(jù)段內(nèi),代碼量大于64KB,因而可安排在不同段內(nèi)。這樣,數(shù)據(jù)是近程的,而代碼是遠(yuǎn)程的。④COMPACT:壓縮模式,程序中的所有代碼放在一個(gè)64KB的代碼段內(nèi),而數(shù)據(jù)區(qū)可以大于64KB。這樣,對(duì)代碼的訪問是近程的,而數(shù)據(jù)是遠(yuǎn)程的。⑤LARGE:大型模式,程序中的數(shù)據(jù)和代碼均大于64KB,但靜態(tài)(常數(shù))數(shù)據(jù)限制在64KB之內(nèi)。對(duì)程序和數(shù)據(jù)的訪問默認(rèn)都是遠(yuǎn)程的。⑥HUGE:巨型模式,程序中的數(shù)據(jù)和代碼均大于64KB,靜態(tài)數(shù)據(jù)也可以大于64KB。這樣,對(duì)代碼、數(shù)據(jù)和數(shù)組的訪問都是遠(yuǎn)程的。⑦FLAT:平展模式,用于創(chuàng)建一個(gè)32位的程序,它只能運(yùn)行在32位80X86CPU上。DOS下不能使用FLAT模式,而編寫32位Windows程序時(shí),必須采用FLAT模式。2023/1/16(2)語言類型:由它來告訴匯編程序?qū)⑹褂檬裁礃拥臉?biāo)識(shí)符的命名風(fēng)格、子程序的調(diào)用和返回約定等??墒箙R編語言程序與其它語言程序達(dá)到共享的目的。有效的語言類型為:C(C語言)、SYSCALL(系統(tǒng)調(diào)用)、STDCALL(標(biāo)準(zhǔn)調(diào)用)、Basic(Basic語言)、Fortran(Fortran語言)、Pascal(Pascal語言)等。(3)操作系統(tǒng)類型:OS_DOS是當(dāng)前唯一支持的選項(xiàng)值,也是該選項(xiàng)的缺省值。(4)堆棧類型:堆棧類型的值主要影響偽指令.STARTUP所生成的指令序列。該選項(xiàng)有二個(gè)可選值:NEARSTACK和FARSTACK。其中:NEARSTACK是該選項(xiàng)的缺省堆棧類型。NEARSTACK——堆棧段和數(shù)據(jù)段是同一段;FARSTACK——堆棧段和數(shù)據(jù)段是不同的段,且堆棧不在段組DGROUP中。例:.MODELSMALL,C,OS_DOS,FARSTACK

2023/1/162.處理器選擇偽指令.8086和.8087

可用來匯編8086/8088處理器和8087協(xié)處理器的指令,這是缺省模式。.286、.286C、.286P、.287可用來匯編286系列微處理器的指令。.386、.386C、.386P、.387可用來匯編386系列微處理器的指令。.NO87取消使用協(xié)處理器指令。.486、.486C、.486P可用來匯編486系列微處理器的指令。.586、.586C、.586P可用來匯編Pentium系列微處理器的指令。.686、.686P可用來匯編PentiumPro系列微處理器的指令。.MMX可用來匯編MMX指令。

.MMX和.686、.686P是MASM6.12引入的。.K3D可用來匯編AMD處理器的3D指令,是MASM6.13引入的。.XMM可用來匯編SSE指令和SSE2指令,是MASM6.15引入的。注意:80386以上處理器中,如果處理器選擇偽指令放在.MODEL偽指令前面,那么段將定義成32位的段。如果希望處理器使用16位的段,則應(yīng)在.MODEL偽指令后面使用處理器選擇偽指令。2023/1/163.段名的缺省名使用簡化的段定義偽指令時(shí),每個(gè)段都有一個(gè)缺省名。在中內(nèi)存模式和大內(nèi)存模式時(shí),.CODE偽指令表示的缺省段名為name_TEXT,即name是這個(gè)段名的可變部分,當(dāng)程序模塊有一個(gè)具體名字時(shí),name就表示這個(gè)名字。.DATA、.CONST、.DATA?、.STACK定義的段內(nèi)數(shù)據(jù)存放在一個(gè)叫DGROUP的段組中,各個(gè)段內(nèi)的偏移地址均以這個(gè)起始地址為起點(diǎn),而不依本段內(nèi)的段地址為起點(diǎn)。.FARDATA或.FARDATA?偽指令使用的缺省名在各種模式下可以替換,它們定義的段內(nèi)數(shù)據(jù)不放在任何段中,屬于遠(yuǎn)程數(shù)據(jù)。內(nèi)存模式段定義偽指令段名定位組合類別組名Small.CODE.DATA.CONST.DATA?.STACK_TEXT_DATACONST_BSSSTACKWORDWORDWORDWORDPARAPUBLICPUBLICPUBLICPUBLICSTACK'CODE''DATA''CONST''BSS''STACK'DGROUPDGROUPDGROUPDGROUP2023/1/164.等價(jià)名的使用MASM5.0中規(guī)定了幾個(gè)等價(jià)名代替真實(shí)名。可以用@代替簡化段定義偽指令前面的小數(shù)點(diǎn)。@CODE代表.CODE定義的段名;@FARDATA代表.FARDATA定義的段名;@DATA代表.DATA、.DATA?、.CONST和.STACK共享的組段名。例:ASSUMEES:@FARDATA;ES為遠(yuǎn)程數(shù)據(jù)段地址

MOVAX,@DATAMOVDS,AX;DS為DGROUP段組段地址

MOVAX,@FARDATAMOVES,AX5.段序定義偽指令MASM可以按照源程序中各個(gè)段出現(xiàn)的次序來排列目標(biāo)文件中各段的先后次序,也可以按照段名的字母順序來排列次序。缺省情況是按照段出現(xiàn)的次序來排列,可以定義段序:①.ALHPA:按照字母順序?qū)Χ闻判?。?SEG:按照段出現(xiàn)的順序?qū)Χ闻判?。完整段定義格式中,默認(rèn)按此順序。③.DOSSEG:按照DOS定義的標(biāo)準(zhǔn)段序?qū)Χ闻判?,順序?yàn)?代碼段、數(shù)據(jù)段、堆棧段。采用.MODEL偽指令的簡化段定義格式默認(rèn)按此順序。2023/1/16三、使用簡化段定義的程序框架(1)EXE標(biāo)準(zhǔn)程序框架匯編語言源程序經(jīng)過匯編和連接后生成可執(zhí)行文件(.exe)。操作系統(tǒng)為程序建立了一個(gè)程序段前綴區(qū)PSP,其長度為256個(gè)字節(jié),主要用于存放用戶程序的有關(guān)信息,如文件名、文件長度等。而在偏移100H處才裝入程序本身。EXE程序加載要重新定位:1)DS和ES指向PSP段地址,而不是程序的數(shù)據(jù)段和附加段,所以需在程序中根據(jù)實(shí)際數(shù)據(jù)段改變DS和ES;2)CS:IP和SS:SP是由連接程序確定的值,指向程序的代碼段和堆棧段。如果不指定堆棧段,則SS=PSP段地址,SP=100H,堆棧段占用PSP中的部分區(qū)域。2023/1/16例

.MODELSMALL;小內(nèi)存模式

.586;可匯編并運(yùn)行586指令

.STACK100H;256字節(jié)堆棧

.DATA

MSGDB'Welcome$';要寫的信息

.CODE.STARTUP

MOVDX,OFFSETMSG;信息存儲(chǔ)區(qū)首地址送DXMOVAH,9HINT21H;DOS寫功能調(diào)用,在屏幕顯示變量MSG內(nèi)容'Welcome’.EXIT0;返回

END2023/1/16(2).COM格式的程序框架.COM程序是一種將代碼、數(shù)據(jù)和堆棧段合一的結(jié)構(gòu)緊湊的程序,所有的段都在一個(gè)邏輯段內(nèi),不超過64KB。在程序中采用.MODELTINY模式定義語句即可生成COM結(jié)構(gòu)的程序。COM文件存儲(chǔ)在磁盤上是主存的完全影像,不包含重新定位的加載信息,加載速度更快,占用的磁盤空間更少。COM程序加載后:1)所有段地址都指向PSP的段地址;2)程序執(zhí)行起點(diǎn)是PSP后的第一條指令,既IP=100H;也就是說,COM程序的第一條指令必須是可執(zhí)行指令,即程序的起始執(zhí)行處是程序頭。3)堆棧區(qū)設(shè)在段尾(通常為FFFEH),棧底的內(nèi)容置為0000字。2023/1/16例子

.MODELTINY;采用微型模式.CODE;只有一個(gè)段,沒有數(shù)據(jù)段和附加段.STARTUP;等效于ORG100H,匯編程序自動(dòng)產(chǎn)生MOVDX,OFFSETSTRING1;顯示提示信息MOVAH,9INT21HMOVAH,01H;等待按鍵INT21HMOVDX,OFFSETSTRING2;顯示結(jié)束信息MOVAH,9INT21H.EXIT0STRING1DB'PRESSANYKEYTOCONTINUE!$'STRING2DB10,13,'PROGRAMRUNCOMPLETE!$'END2023/

溫馨提示

  • 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)論