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

下載本文檔

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

文檔簡(jiǎn)介

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

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

[標(biāo)號(hào):]指令助記符[操作數(shù),操作數(shù)][;注釋]說(shuō)明性語(yǔ)句——由偽指令構(gòu)成的語(yǔ)句,它通常指示匯編程序如何匯編源程序

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

其中,用方括號(hào)括起來(lái)的部分,可以有也可以沒(méi)有。每部分之間用空格(至少一個(gè))分開(kāi),一行最多可有132個(gè)字符。第5頁(yè),共80頁(yè),2022年,5月20日,5點(diǎn)16分,星期五標(biāo)識(shí)符

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

數(shù)字不能作為標(biāo)識(shí)符的第一個(gè)字符,而圓點(diǎn)僅能用做第一個(gè)字符。標(biāo)識(shí)符最長(zhǎng)為31個(gè)字符。當(dāng)標(biāo)識(shí)符后跟冒號(hào)時(shí),表示是標(biāo)號(hào),它代表該行指令的起始地址;當(dāng)標(biāo)識(shí)符后不帶冒號(hào)時(shí),表示變量;偽指令前的標(biāo)識(shí)符不加冒號(hào)。

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

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

該項(xiàng)可有可無(wú),是為源程序所加的注釋?zhuān)糜谔岣叱绦虻目勺x性。使用分號(hào)區(qū)分為注釋語(yǔ)句。

第9頁(yè),共80頁(yè),2022年,5月20日,5點(diǎn)16分,星期五4.1.2匯編語(yǔ)言程序格式

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

;為程序返回DOS設(shè)置堆棧值

PUSHDS ;入棧保存原DS段址

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

MOVAX,DATAREA ;DATAREA段地址

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

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

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

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

MOVAX,4C00HINT21H ;返回DOSMAINENDP ;主程序結(jié)束

ENDSTART ;匯編結(jié)束第14頁(yè),共80頁(yè),2022年,5月20日,5點(diǎn)16分,星期五匯編語(yǔ)言程序開(kāi)發(fā)過(guò)程

在計(jì)算機(jī)上建立并運(yùn)行匯編語(yǔ)言程序的基本步驟是:編輯程序、匯編程序、連接程序、運(yùn)行程序。第15頁(yè),共80頁(yè),2022年,5月20日,5點(diǎn)16分,星期五匯編語(yǔ)言程序上機(jī)過(guò)程第16頁(yè),共80頁(yè),2022年,5月20日,5點(diǎn)16分,星期五4.2匯編語(yǔ)言的表達(dá)式

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

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

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

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

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

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

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

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

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

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

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

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

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

第27頁(yè),共80頁(yè),2022年,5月20日,5點(diǎn)16分,星期五分析運(yùn)算符和表達(dá)式OFFSET運(yùn)算符。格式:OFFSET變量或標(biāo)號(hào)功能:計(jì)算變量或標(biāo)號(hào)的段內(nèi)偏移地址

如:MOVBX,OFFSETA;將變量A的偏移地址值送BXTYPE運(yùn)算符。格式:TYPE變量或標(biāo)號(hào)功能:計(jì)算變量或標(biāo)號(hào)的類(lèi)型值第28頁(yè),共80頁(yè),2022年,5月20日,5點(diǎn)16分,星期五分析運(yùn)算符和表達(dá)式LENGTH運(yùn)算符。格式:LENGTH變量功能:對(duì)于使用DUP定義的變量,計(jì)算分配給該變量的單元數(shù),其他變量的LENGTH值為1。SIZE運(yùn)算符。格式:SIZE變量功能:計(jì)算分配給該變量的字節(jié)數(shù)。第29頁(yè),共80頁(yè),2022年,5月20日,5點(diǎn)16分,星期五【例】指令中的TYPE運(yùn)算符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頁(yè),共80頁(yè),2022年,5月20日,5點(diǎn)16分,星期五【例】指令中的LENGTH運(yùn)算符FEESDW100DUP(0)ARRAYDW1,2,3MOVCX,LENGTHFEESMOVBX,LENGTHARRAY等效于:MOVCX,100MOVBX,1第31頁(yè),共80頁(yè),2022年,5月20日,5點(diǎn)16分,星期五【例】指令中的SIZE運(yùn)算符FEESDW100DUP(0)ARRAYDW1,2,3TABLEDB'ABCD'MOVCX,SIZEFEESMOVCX,SIZEARRAYMOVCX,SIZETABLE等效于:MOVCX,200MOVCX,2MOVCX,1

注意:當(dāng)變量為DUP定義且DUP括號(hào)內(nèi)為單項(xiàng)數(shù)據(jù)時(shí),下列關(guān)系成立:

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論