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

下載本文檔

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

文檔簡介

關于匯編語言程序格式第1頁,共80頁,2022年,5月20日,5點16分,星期五主要內(nèi)容匯編語句的格式、源程序結構、匯編語言程序開發(fā)方法匯編語言中的數(shù)值表達式和地址表達式常用偽指令及操作符功能、以及參數(shù)的表達、變量的定義,還有變量和標號的屬性第2頁,共80頁,2022年,5月20日,5點16分,星期五教學要求掌握:(1)匯編語言源程序格式(2)數(shù)據(jù)定義語句(3)段定義語句(4)偽指令語句(5)符號定義語句了解:匯編程序的開發(fā)過程,一些不常用的偽指令,如:地址計數(shù)器$、指定起始位置偽指令ORG、EVEN偽指令等。第3頁,共80頁,2022年,5月20日,5點16分,星期五4.1匯編語言程序開發(fā)

匯編語言程序的開發(fā)必須經(jīng)過編寫源程序、編譯、連接和運行3個主要步驟,而編寫匯編語言源程序要遵守匯編語言的語句格式和程序格式。第4頁,共80頁,2022年,5月20日,5點16分,星期五4.1.1匯編語言語句格式用匯編語言編寫的源程序是由許多語句(又稱匯編指令)組成的。每個語句由1~4個部分組成,它們有兩種格式:執(zhí)行性語句——由硬指令構成的語句,它通常對應一條機器指令:

[標號:]指令助記符[操作數(shù),操作數(shù)][;注釋]說明性語句——由偽指令構成的語句,它通常指示匯編程序如何匯編源程序

[名字]偽指令助記符[參數(shù),參數(shù),…][;注釋]

其中,用方括號括起來的部分,可以有也可以沒有。每部分之間用空格(至少一個)分開,一行最多可有132個字符。第5頁,共80頁,2022年,5月20日,5點16分,星期五標識符

標號和名字是符合匯編語法的用戶自定義的標識符。標識符是用來標識指令或某一存儲單元地址,每個標識符的定義是唯一的??捎上铝凶址M成:字母:A~Z,a~z;數(shù)字:0~9;特殊字符:?、·、@、_、$。

數(shù)字不能作為標識符的第一個字符,而圓點僅能用做第一個字符。標識符最長為31個字符。當標識符后跟冒號時,表示是標號,它代表該行指令的起始地址;當標識符后不帶冒號時,表示變量;偽指令前的標識符不加冒號。

第6頁,共80頁,2022年,5月20日,5點16分,星期五指令助記符指令助記符表示不同操作的指令,可以是8088的指令助記符,也可以是偽指令。第7頁,共80頁,2022年,5月20日,5點16分,星期五操作數(shù)

操作數(shù)是指令執(zhí)行的對象。依指令的要求,可能有一個、兩個或者沒有。如:RET;無操作數(shù)COUNT:INCCX;一個操作數(shù)如果是偽指令,則可能有多個操作數(shù)(參數(shù))。如:COSTDB3,4,5,6,7;5個操作數(shù)MOVAX,[BP+4] ;第二個操作數(shù)為表達式第8頁,共80頁,2022年,5月20日,5點16分,星期五注釋

該項可有可無,是為源程序所加的注釋,用于提高程序的可讀性。使用分號區(qū)分為注釋語句。

第9頁,共80頁,2022年,5月20日,5點16分,星期五4.1.2匯編語言程序格式

程序由一條一條語句(指令)構成,每條語句占一行。匯編語言程序中,語句可以分為3種:指令性語句(指令語句,在第3章已經(jīng)介紹)指示性語句(偽指令語句,在本章4.3節(jié)介紹)宏指令語句(或宏調(diào)用語句,在第6章介紹)第10頁,共80頁,2022年,5月20日,5點16分,星期五匯編語言源程序的組成原則(1)完整的匯編語言源程序由段組成。(2)需獨立運行的程序必須包含一個代碼段,并指示程序執(zhí)行的起始點,一個程序只有一個起始點。(3)所有的可執(zhí)行性語句必須位于某一個代碼段內(nèi),說明性語句可根據(jù)需要位于任一段內(nèi)。(4)通常,程序還需要一個堆棧段。第11頁,共80頁,2022年,5月20日,5點16分,星期五完整段定義格式DATAREASEGMENT;定義數(shù)據(jù)段;數(shù)據(jù)定義語句DATAREAENDS;**************************PROGNAMSEGMENT;定義代碼段;MAINPROCFAR ;主程序ASSUMECS:PROGNAM,DS:DATAREASTART: ;程序起始執(zhí)行地址

;為程序返回DOS設置堆棧值

PUSHDS ;入棧保存原DS段址

SUBAX,AX ;設置偏移地址為0PUSHAX ;入棧保存偏移地址;置DS寄存器為當前數(shù)據(jù)段

MOVAX,DATAREA ;DATAREA段地址

MOVDS,AX ;存入DS寄存器;主程序部分

RET ;返回DOSMAINENDP ;主程序結束;SUB1PROCNEAR;定義子程序;子程序部分SUB1ENDP ;子程序結束;PROGNAMENDS;代碼段結束

;***********************************ENDSTART;匯編結束第12頁,共80頁,2022年,5月20日,5點16分,星期五匯編語言源程序結構特點(1)匯編語言程序通常由若干段組成,段由偽指令SEGMENT與ENDS定義,各段順序任意,段的數(shù)目按需要確定,原則上不受限制。(2)段由若干語句組成,語句以指令為主體而構成。一條語句寫在一行上,書寫時語句的各部分應盡量對齊。(3)匯編語言程序中至少要有一個啟動標號,作為程序開始執(zhí)行時目標代碼的入口地址。啟動標號常用START、BEGIN、MAIN等命名。(4)為增加程序的可讀性,可在匯編語言語句“;”后加上注釋。第13頁,共80頁,2022年,5月20日,5點16分,星期五簡化段定義格式.MODELSMALL ;定義存儲器模型.STACK100H ;定義堆棧段.DATA ;定義數(shù)據(jù)段;數(shù)據(jù)定義語句.CODE ;定義代碼段MAINPROCFARSTART:MOVAX,@DATA ;數(shù)據(jù)段地址

MOVDS,AX ;存入DS寄存器;主程序部分

MOVAX,4C00HINT21H ;返回DOSMAINENDP ;主程序結束

ENDSTART ;匯編結束第14頁,共80頁,2022年,5月20日,5點16分,星期五匯編語言程序開發(fā)過程

在計算機上建立并運行匯編語言程序的基本步驟是:編輯程序、匯編程序、連接程序、運行程序。第15頁,共80頁,2022年,5月20日,5點16分,星期五匯編語言程序上機過程第16頁,共80頁,2022年,5月20日,5點16分,星期五4.2匯編語言的表達式

匯編語句中的數(shù)據(jù)(常數(shù)、變量、標號、地址)都可以用表達式給出,MASM匯編語言允許使用的表達式有兩種:數(shù)值表達式和地址表達式。表達式的運算在匯編階段由匯編程序進行運算并將結果當做操作數(shù)。第17頁,共80頁,2022年,5月20日,5點16分,星期五4.2.1數(shù)值表達式數(shù)值表達式的常用運算符運算符類型運算符號及說明算術運算符+(正)、-(負)、+(加)、-(減)、*(乘)、/(除)、MOD(取余)、SHL(邏輯左移)、SHR(邏輯右移)邏輯運算符AND(與)、OR(或)、XOR(異或)、NOT(非)關系運算符EQ(相等)、NE(不相等)、GT(大于)、LT(小于)、GE(大于等于)、LE(小于等于)第18頁,共80頁,2022年,5月20日,5點16分,星期五常量

常量是指那些在將源程序翻譯成目標程序期間已經(jīng)有確定數(shù)值的量,直接寫在匯編語言語句中,在程序的執(zhí)行過程中,它不可能發(fā)生變化。常量主要用于偽指令語句中給變量賦初值,或者用做機器指令語句中的立即操作數(shù),變址尋址和基址變址尋址中的位移量、比例因子等。

通常用二進制、八進制、十進制或十六進制來書寫常量。當數(shù)字的第一個字符是A~F或a~f時,在字符前應添加一個數(shù)字0,以示和變量的區(qū)別,如10101011B、1234D、1234H、0abcdH、'AB'等都是常量。第19頁,共80頁,2022年,5月20日,5點16分,星期五算術運算符和表達式

算術運算符如前表中所示。這些運算符和常量、括號可組成數(shù)值表達式

如120HLT100H+3,21HLE21H等。該表達式的計算結果規(guī)定如下:若關系不成立,則該數(shù)值表達式的計算結果為0;否則,其結果為全1。第20頁,共80頁,2022年,5月20日,5點16分,星期五【例】指令中的算術運算MOVAH,2+6MOVCL,33/5MOVDL,23MOD5MOVBL,00001010BSHL4MOVAH,0110BSHR5等效于:MOVAH,08HMOVCL,06HMOVDL,03HMOVBL,10100000BMOVAH,0000B

注意:算術運算的運算對象和運算結果都必須是整數(shù),除法運算的結果只取商,模除運算的結果只取余數(shù)。第21頁,共80頁,2022年,5月20日,5點16分,星期五邏輯運算符和表達式

邏輯運算符如前表中所示。這些邏輯運算符和常量、括號也可組成數(shù)值表達式。

如47HAND0FH,NOT56H。第22頁,共80頁,2022年,5月20日,5點16分,星期五【例】指令中的邏輯運算MOVAL,NOT00110011BMOVBL,11110000BAND10111101BMOVAH,10100000BOR00000101BMOVBH,10101011BXOR10100100B

等效于:MOVAL,11001100BMOVBL,10110000BMOVAH,10100101BMOVBH,00001111B注意:以上語句可以用邏輯運算指令語句來實現(xiàn),但二者的區(qū)別在于:(1)邏輯表達式不影響標志位,邏輯運算指令影響標志位。(2)表達式中的邏輯運算由匯編程序在匯編階段完成,邏輯運算指令由CPU在程序執(zhí)行階段完成。第23頁,共80頁,2022年,5月20日,5點16分,星期五4.2.2地址表達式

地址表達式是計算存儲單元地址的表達式,它可由標號、變量名和由括號括起來的基址或變址寄存器組成。地址表達式的常用運算符運算符類型運算符號及說明分析運算符HIGH(高字節(jié))、LOW(低字節(jié))、SEG(段地址)、OFFSET(偏移量)、TYPE(標識符類型)、LENGTH(變量長度)、SIZE(變量容量)、WIDTH(記錄/記錄字段寬度)、MASK(記錄/記錄字段的屏蔽位)屬性運算符PTR(符號地址)、段操作符、SHORT(短轉向地址)、THIS(指定類型)第24頁,共80頁,2022年,5月20日,5點16分,星期五標號

標號是指在代碼段內(nèi)定義和使用的指令地址。標號是可有可無的,如果有標號,必須和后面的操作項以冒號分隔開來。標號常作為轉移指令的操作數(shù),確定程序轉移的目標地址。標號的3個屬性:(1)段屬性(SEG)(2)偏移屬性(OFFSET)(3)距離屬性(DISTANCE)第25頁,共80頁,2022年,5月20日,5點16分,星期五變量

變量在除代碼段以外的其他段中被定義,用來定義存放在存儲器單元中的數(shù)據(jù)。 經(jīng)過定義的變量有3個屬性:(1)段屬性。定義變量所在段的起始地址(即段基址)。(2)偏移地址屬性。表示變量所在的段內(nèi)偏移地址。此值為一個16位無符號數(shù),它代表從段的起始地址到定義變量的位置之間的字節(jié)數(shù)。(3)類型屬性(TYPE)。表示變量占用存儲單元的字節(jié)數(shù),即所存放數(shù)據(jù)的長度。變量可分別被定義為8位(DB,1個字節(jié))、16位(DW,2個字節(jié))、32位(DD,4個字節(jié))、64位(DQ,8個字節(jié))和80位(DT,10個字節(jié))數(shù)據(jù)。第26頁,共80頁,2022年,5月20日,5點16分,星期五分析運算符和表達式HIGH和LOW運算符。格式:HIGH/LOW表達式功能:選取表達式計算結果的高8位和低8位SEG運算符。格式:SEG變量或標號功能:計算變量或標號的段地址

如:MOVAX,SEGA;將變量A所在段的段地址值送AX

第27頁,共80頁,2022年,5月20日,5點16分,星期五分析運算符和表達式OFFSET運算符。格式:OFFSET變量或標號功能:計算變量或標號的段內(nèi)偏移地址

如:MOVBX,OFFSETA;將變量A的偏移地址值送BXTYPE運算符。格式:TYPE變量或標號功能:計算變量或標號的類型值第28頁,共80頁,2022年,5月20日,5點16分,星期五分析運算符和表達式LENGTH運算符。格式:LENGTH變量功能:對于使用DUP定義的變量,計算分配給該變量的單元數(shù),其他變量的LENGTH值為1。SIZE運算符。格式:SIZE變量功能:計算分配給該變量的字節(jié)數(shù)。第29頁,共80頁,2022年,5月20日,5點16分,星期五【例】指令中的TYPE運算符A1 DB 21H,42HA2 DW 3412HA3 DD ?ALOP: MOV AL,TYPE A1 MOV BL,TYPE A2 MOV AH,TYPE A3 MOV DL,TYPE ALOP等效于:ALOP: MOV AL,1 MOV BL,2 MOV AH,4 MOV DL,0FFH第30頁,共80頁,2022年,5月20日,5點16分,星期五【例】指令中的LENGTH運算符FEESDW100DUP(0)ARRAYDW1,2,3MOVCX,LENGTHFEESMOVBX,LENGTHARRAY等效于:MOVCX,100MOVBX,1第31頁,共80頁,2022年,5月20日,5點16分,星期五【例】指令中的SIZE運算符FEESDW100DUP(0)ARRAYDW1,2,3TABLEDB'ABCD'MOVCX,SIZEFEESMOVCX,SIZEARRAYMOVCX,SIZETABLE等效于:MOVCX,200MOVCX,2MOVCX,1

注意:當變量為DUP定義且DUP括號內(nèi)為單項數(shù)據(jù)時,下列關系成立:

SIZE=LENGTH*TYPE第32頁,共80頁,2022年,5月20日,5點16分,星期五屬性運算符和表達式屬性運算符又稱修改屬性運算符或合成運算符。屬性運算符在程序運行過程中暫時修改變量或標號的屬性。在程序運行過程中,當需要修改變量或標號的屬性(段屬性、偏移地址屬性和類型屬性)時,可用屬性運算符來實現(xiàn)。第33頁,共80頁,2022年,5月20日,5點16分,星期五PTR運算符格式:類型PTR表達式功能:用來修改變量或標號的類型屬性。例如:F1DB15HF2DW3132HALPHA:MOVAX,WORDPTRF1BETA:MOVBL,BYTEPTRF2第34頁,共80頁,2022年,5月20日,5點16分,星期五段操作運算符段操作運算又稱段超越前綴。段寄存器(CS,DS,ES和SS)后跟一個冒號,稱為修改段屬性運算符,表示后跟的操作數(shù)由指定的段寄存器提供段地址值。例如:MOVAX,ES:[BX];從ES中偏移地址為BX的地址中取出一個字送AXMOV BL,DS:[BP];從DS中偏移地址為BP的地址中取一個字節(jié)送BL第35頁,共80頁,2022年,5月20日,5點16分,星期五SHORT運算符SHORT為短轉向地址說明運算符,它說明轉移指令的目標地址與本指令之間的字節(jié)距離在-128~+127范圍內(nèi),具有短程轉移的屬性。例如:LOOP1:JMPSHORTLOOP2LOOP2:MOVAX,BX表示標號LOOP1與目標標號LOOP2之間的距離小于127個字節(jié)。

第36頁,共80頁,2022年,5月20日,5點16分,星期五THIS運算符格式:變量/標號EQUTHIS類型功能:將變量或標號定義成指定的類型,但并不分配新的存儲單元,其地址與跟在后面的變量的地址相同。例如:GAMAEQUTHISBYTESTARTEQUTHISFAR第37頁,共80頁,2022年,5月20日,5點16分,星期五運算符的優(yōu)先級高級優(yōu)先級運算符號低級1()、<>、[]、LENGTH、SIZE、WIDTH、MASK2段超越前綴運算符(:)、PTR、OFFSET、SEG、TYPE、THIS3HIGH、LOW4+、-(單目)5*、/、MOD、SHL、SHR6+、-(雙目)7EQ、NE、LT、LE、GT、GE8NOT9AND10OR、XOR11SHORT第38頁,共80頁,2022年,5月20日,5點16分,星期五4.3偽指令語句匯編語言最主要的特點是用助記符代替機器指令的操作碼,用符號代替操作數(shù)地址或操作數(shù),這就是匯編語言中的機器指令語句。匯編語言程序中的語句可以由指令、偽指令和宏指令組成。偽指令和指令的區(qū)別是:每一條指令必須生成機器代碼,然后在程序運行期間由CPU來執(zhí)行其操作;而偽指令是在匯編期間由匯編程序執(zhí)行的操作命令,除了數(shù)據(jù)定義及存儲器分配偽指令分配存儲器空間外,其他偽指令不生成目標碼。第39頁,共80頁,2022年,5月20日,5點16分,星期五4.3.1數(shù)據(jù)定義偽指令數(shù)據(jù)定義及存儲器分配偽指令的格式如下:[變量]助記符操作數(shù)[,…,操作數(shù)][;注釋]數(shù)據(jù)定義及存儲器分配偽指令格式中的“變量”是操作數(shù)的符號地址,它是可有可無的,它的作用與指令語句前的標號相同,區(qū)別是變量后面不加冒號。如果語句中有變量,那么匯編程序將操作數(shù)的第一個字節(jié)的偏移地址賦于這個變量?!白⑨尅弊侄斡脕碚f明該偽指令的功能,它也不是必須有的?!爸浄弊侄握f明所用偽指令的助記符。第40頁,共80頁,2022年,5月20日,5點16分,星期五DB偽指令DB(definebyte)偽指令用來定義字節(jié),對其后的每個數(shù)據(jù)都存儲在一個字節(jié)中。DB能定義十進制數(shù)、二進制數(shù)、十六進制數(shù)和ASCII字符,二進制數(shù)和十六進制數(shù)要分別用“B”和“H”表示,ASCII字符用單引號(‘)括起來。例如:COUNTER DB6 DB'A','D',0Dh,'$'TABLE DB1,3,5,7,9,11第41頁,共80頁,2022年,5月20日,5點16分,星期五DW偽指令DW(defineword)偽指令用來定義字,對其后的每個數(shù)據(jù)分配兩個字節(jié)(1個字),數(shù)據(jù)的低8位存儲在低字節(jié)地址中,高8位存儲在高字節(jié)地址中。例如:Word1 DW89H,1909H,-1DW0abcdH,?,0第42頁,共80頁,2022年,5月20日,5點16分,星期五DD偽指令DD(definedoubleword)偽指令用來定義雙字,對其后的每個數(shù)據(jù)分配4個字節(jié)(2個字)。該偽指令同樣將數(shù)據(jù)轉換為十六進制,并根據(jù)低地址存儲低字節(jié),高地址存儲高字節(jié)的規(guī)則來存放數(shù)據(jù)。例如:DW1DD12345678H,?DW2DD0abcd1243H第43頁,共80頁,2022年,5月20日,5點16分,星期五DQ和DT偽指令DQ(definequadword)偽指令用來定義4字,即64位字長的數(shù)據(jù),DQ之后的每個數(shù)據(jù)占用8個字節(jié)(4個字)。DT(definetenbytes)偽指令用來為壓縮的BCD數(shù)據(jù)分配存儲單元,它雖然可以分配10個字節(jié)(5個字),但最多只能輸入18個數(shù)字,要注意的是,數(shù)據(jù)后面不需要加"H"。第44頁,共80頁,2022年,5月20日,5點16分,星期五DUP偽指令DUP(duplicate)偽指令可以按照給定的次數(shù)來復制某個(某些)操作數(shù),用以避免多次輸入同樣一個數(shù)據(jù)。例如,把6個0FFH存入相繼字節(jié)中,可以用下面兩種方法,顯然用DUP的方法更簡便些。DATA1DB0FFH,0FFH,0FFH,0FFH,0FFH,0FFHDATA2DB6DUP(0FFH)第45頁,共80頁,2022年,5月20日,5點16分,星期五DUP偽指令DUP操作一般用來保留數(shù)據(jù)區(qū),如用數(shù)據(jù)定義偽指令“DB64DUP(?)”可為堆棧段保留64個字節(jié)單元。DUP還可以嵌套。例如:T1DB3DUP(0)T2DW2DUP(?)T3DB3DUP(1,2DUP(50H))第46頁,共80頁,2022年,5月20日,5點16分,星期五4.3.2符號定義偽指令匯編語言中所有的變量名、標號名、過程名、指令助記符、寄存器名等統(tǒng)稱為“符號”。這些符號可以用符號定義偽指令來命名或重新命名。第47頁,共80頁,2022年,5月20日,5點16分,星期五等值語句EQU格式:符號EQU表達式功能:將表達式的值賦給EQU左邊的符號。

EQU偽指令的使用可使匯編語言程序簡單明了,便于程序調(diào)試和修改。第48頁,共80頁,2022年,5月20日,5點16分,星期五等值語句EQU(1)用符號名代表常量或表達式。當把一個常量或表達式定義成一個具有一定含義的符號名后,在程序中就可以用該符號名來代表該常量或表達式。例如:NUMBER EQU 100 ;給緩沖區(qū)的長度取一個符號名BUFF_LENEQU NUMBER+2CR EQU 13 ;給“回車”符的ASCII碼定義一個符號名LF EQU 10;給“換行”符的ASCII碼定義一個符號名BUFFER DB NUMBER,?,NUMBERDUP(?) ;用符號名來定義緩沖區(qū)

第49頁,共80頁,2022年,5月20日,5點16分,星期五等值語句EQU(2)用符號名代表字符串。用一個具有一定含義的符號名定義某一個較長的字符串,在隨后的程序中就用該符號名。例如:MOREQU"GoodMorning!"在該定義之后,就可使用符號名GREETING來代表字符串"Howareyou!"。第50頁,共80頁,2022年,5月20日,5點16分,星期五等值語句EQU(3)用符號名代表關鍵字或指令助記符。例如:MOVEEQUMOV;給指令MOV取另一個符號名MOVECOUNTEREQUCX;給寄存器CX取一個叫“計數(shù)器”的符號名上面的定義只是給原來的助記符MOV和CX起了另一個別名,而原來助記符MOV和CX仍然可以使用,所以,可編寫如下語句:MOVEAX,CX;相當于指令:MOVAX,CXMOVCOUNTER,BX;相當于指令:MOVCX,BX第51頁,共80頁,2022年,5月20日,5點16分,星期五等值語句EQU(4)用符號名定義存儲單元的別名。可將一片存儲單元定義為另一個數(shù)據(jù)類型的符號名,有關敘述參見前面的操作符THIS。例如:WORD1EQUTHISWORD ;給后面的字節(jié)存儲單元取一個字屬性的符號名BYTE1DB12h,21hFLAGDW1234HFLAG1EQUbyteptrFLAG ;給FLAG的低字節(jié)取一個字節(jié)屬性的符號名FLAG2EQUbyteptrFLAG+1 ;給FLAG的高字節(jié)取一個字節(jié)屬性的符號名有了上述定義后,可編寫如下語句:MOVAX,WORD1;執(zhí)行后,(AX)=2112HMOVBL,FLAG1;執(zhí)行后,(BL)=34H第52頁,共80頁,2022年,5月20日,5點16分,星期五等值語句EQU

注意:等值語句在匯編時不產(chǎn)生任何目標代碼,也不占用存儲單元。但在同一個程序中,不能對經(jīng)EQU語句定義的符號重新定義。第53頁,共80頁,2022年,5月20日,5點16分,星期五等號語句=格式:符號=表達式 等號語句與EQU語句有同樣的功能,區(qū)別在于等號語句定義的符號允許重新定義,使用更加方便靈活。下列等號語句是有效的。COUNT=5COUNT=COUNT+100第54頁,共80頁,2022年,5月20日,5點16分,星期五LABEL偽指令符號名定義語句LABEL與前面的操作符THIS功能類似,用于定義一個指定的符號名,且該符號名的段地址和偏移量與下面緊跟存儲單元的相應屬性相同,但該符號的類型是新指定的。LABEL語句的一般格式如下:符號名LABEL類型

其中,常用的類型有BYTE、WORD、DWORD、NEAR和FAR等。第55頁,共80頁,2022年,5月20日,5點16分,星期五4.3.3段定義偽指令段定義偽指令指示匯編程序如何按段組織程序和使用存儲器。在MASM5.0以上的匯編語言版本中,有完整段定義偽指令和簡化段定義偽指令兩種。第56頁,共80頁,2022年,5月20日,5點16分,星期五完整段定義段定義偽指令主要有SEGMENT/ENDSASSUME。第57頁,共80頁,2022年,5月20日,5點16分,星期五段的定義段名SEGMENT[定位類型][組合類型][類別名]本段語句序列

………段名ENDS本段語句序列第58頁,共80頁,2022年,5月20日,5點16分,星期五定位類型BYTE(字節(jié)):表示本段起始單元可從任一地址開始。WORD(字):表示本段從一個偶字節(jié)地址開始,即段起始單元地址的最后一位二進制數(shù)一定是0,即以0,2,4,6,8,A,C,E結尾。PARA(節(jié)):如果定位類型用戶未選擇,則默認為PARA。它表示本段從一個節(jié)的邊界開始(一節(jié)為16字節(jié))。所以段的起始地址一定能以16整除,最后4位二進制數(shù)一定是0,如09150H,0AB30H等。PAGE(頁):表示本段從一個頁的邊界開始。一頁為256字節(jié),所以段的起始地址一定能以256整除。這樣,段起始地址的最后8位二進制數(shù)一定為0(也即以00H結尾的地址)。第59頁,共80頁,2022年,5月20日,5點16分,星期五組合類型NONE。PUBLICCOMMONSTACKAT表達式MEMORY第60頁,共80頁,2022年,5月20日,5點16分,星期五類別名類別用于表示段的分類。類別名是由程序設計人員自己選定的由任何字符串組成的名字,但是它不能再作為程序中的標號、變量名或其他定義符號。在連接處理時,LINK程序把類別名相同的所有段存放在連續(xù)的存儲區(qū)內(nèi)(如沒有指定組合類型PUBLIC、COMMON時,它們?nèi)匀皇遣煌亩危?。?1頁,共80頁,2022年,5月20日,5點16分,星期五【例】數(shù)據(jù)段的定義實例DATA1 SEGMENTWORD1 DW 1,9078H,?BYTE1 DB 21,'Hello' DD 12345678HDATA1 ENDS第62頁,共80頁,2022年,5月20日,5點16分,星期五【例】代碼段的定義實例CODE1 SEGMENTMOV AX,DATA1 ;把數(shù)據(jù)段DATA1的段值送AXMOV DS,AX ;把AX的值送給DS,即DS存儲數(shù)據(jù)段的段值MOV AX,4C00HINT 21H ;調(diào)用DOS功能,結束程序的運行CODE1 ENDS第63頁,共80頁,2022年,5月20日,5點16分,星期五段寄存器的說明語句在匯編語言源程序中可以定義多個段,每個段都要與一個段寄存器建立一種對應關系。建立這種對應關系的說明語句格式如下:ASSUME段寄存器名:段名[,段寄存器名:段名,……]

其中,段寄存器是CS、DS、ES、SS,段名是在段定義語句說明時的段名。第64頁,共80頁,2022年,5月20日,5點16分,星期五【例】段寄存器的說明實例DATA1SEGMENT ;定義數(shù)據(jù)段DATA1WORD1 DW4231HBYTE1 DB"AAAAFFF"DATA1 ENDSDATA2SEGMENT ;定義數(shù)據(jù)段DATA2WORD2 DW5566HWORD3 DW7878HDATA2 ENDSDATA3SEGMENT ;定義數(shù)據(jù)段DATA3BYTE2 DB?DATA3 ENDSCODE1SEGMENT ;編寫代碼段CODE1ASSUMECS:CODE1,DS:DATA1,ES:DATA2 ;(1)MOVAX,DATA1 ;(2)MOVDS,AX ;(3)MOVAX,DATA2 ;(4)MOVES,AX ;(5)

MOVAX,WORD1 ;訪問段DATA1中的字變量WORD1MOVWORD2,AX ;訪問段DATA2中的字變量WORD2 ASSUMEDS:DATA3,ES:NOTHING ;(6)MOV AX,DATA3MOV DS,AXMOVBL,BYTE2 ;訪問段DATA3中的字節(jié)變量BYTE2

MOV AX,4C00H ;(7)INT 21H ;(8)CODE1 ENDS第65頁,共80頁,2022年,5月20日,5點16分,星期五堆棧段的說明堆棧段是一個特殊的段,在程序中可以定義它,也可以不定義。除了要生成COM型執(zhí)行文件的源程序外,一個完整的源程序一般最好定義堆棧段。如果在程序中不定義堆棧段,那么,操作系統(tǒng)在裝入該執(zhí)行程序時將自動為其指定一個64KB的堆棧段。第66頁,共80頁,2022年,5月20日,5點16分,星期五簡化段定義用完整的段定義格式可以控制段的各種屬性,MASM5.0以后的匯編程序提供了一種簡化的段定義方式,它使定義段更簡單、方便。第67頁,共80頁,2022年,5月20日,5點16分,星期五存儲模型偽指令程序存儲模型偽指令的格式如下:.MODEL存儲模型[,語言類型][,操作系統(tǒng)類型][,堆棧類型]存儲模型功能適用系統(tǒng)Tiny(微型)所有數(shù)據(jù)和代碼都放在一個段內(nèi),其訪問都為NEAR型,整個程序小于或等于64KB,并會產(chǎn)生.COM文件MS-DOSSmall(小型)所有代碼在一個64KB的段內(nèi),所有數(shù)據(jù)在另一個64KB的段內(nèi)(包括數(shù)據(jù)段、堆棧段和附加段)MS-DOSWindowsMedium(中型)所有代碼大于64KB時可放在多個代碼段中,轉移或調(diào)用可為FAR型。所有數(shù)據(jù)限在一個段內(nèi),DS可保持不變MS-DOSWindowsCompact(緊湊型)所有代碼限在一個段內(nèi),轉移或調(diào)用可為NEAR型。數(shù)據(jù)大于64KB時,可放在多個段中MS-DOSWindowsLarge(大型)代碼段和數(shù)據(jù)段都可超過64KB,被放置在有多個段內(nèi),所以數(shù)據(jù)和代碼都是遠訪問MS-DOSWindowsHuge(巨型)單個數(shù)據(jù)項可以超過64KB,其他同Large模型MS-DOSWindowsFlat(平展型)所有代碼和數(shù)據(jù)放置在一個段中,但段地址是32位的,所以整個程序可為4GB。MASM6.0支持該模型OS/2WindowsNT第68頁,共80頁,2022年,5月20日,5點16分,星期五簡化的段偽指令簡化段偽指令功能注釋.CODE[段名]創(chuàng)建一個代碼段段名為可選項,如不給出段名,則采用默認段名。對于多個代碼段的模型,則應為每個代碼段指定段名.DATA創(chuàng)建一個數(shù)據(jù)段段名是:_DATA.DATA?創(chuàng)建無初值變量的數(shù)據(jù)段段名是:_BSS.FARDATA[段名]建立有初值的遠調(diào)用數(shù)據(jù)段可指定段名,如不指定,則將以FAR_DATA命名.FARDATA?[段名]建立無初值的遠調(diào)用數(shù)據(jù)段可指定段名,如不指定,則將以FAR_BSS命名.CONST建立只讀的常量數(shù)據(jù)段段名是CONST.STACK[大小]創(chuàng)建一個堆棧段并指定堆棧段大小段名是STACK。如不指定堆棧段大小,則默認值為1KB第69頁,共80頁,2022年,5月20日,5點16分,星期五與簡化段定義有關的預定義符號@CODE:由.CODE偽指令定義的段名或段組名。@DATA:由.DATA偽指令定義的段名,或由.DATA、.DATA?、.CONST和.STACK所定義的段組名。@STACK:堆棧段的段名或段組名。第70頁,共80頁,2022年,5月20日,5點16分,星期五【例】簡化段定義實例.MODELSMALL.STACK100H;定義堆棧段及其大小.DATA;定義數(shù)據(jù)段.CODE;定義代碼段START:;起始執(zhí)行地址標號MOVAX,@DATA;數(shù)據(jù)段地址MOVDS,AX;存入數(shù)據(jù)段寄存器

MOVAX,4C00HINT21HENDSTART;程序結束第71頁,共80頁,2022年,5月20日,5點16分,星期五其他偽指令除了以上介紹的偽指令之外,還有其他一些

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論