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

下載本文檔

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

文檔簡(jiǎn)介

第四章匯編語(yǔ)言程序格式§4.1匯編語(yǔ)言語(yǔ)句種類(lèi)及格式§4.2偽操作§4.4匯編語(yǔ)言的上機(jī)過(guò)程§4.1匯編語(yǔ)言語(yǔ)句種類(lèi)及格式指令語(yǔ)句偽指令語(yǔ)句宏指令一、指令語(yǔ)句使CPU產(chǎn)生動(dòng)作、并在程序執(zhí)行時(shí)才處理的語(yǔ)句,就是第2章學(xué)習(xí)的處理器指令書(shū)寫(xiě)格式

[標(biāo)號(hào):]指令助記符[DEST[,SRC]][;注釋] 標(biāo)號(hào):一條指令的符號(hào)地址??梢允÷?,如有必須以“:”作為結(jié)束標(biāo)志。在程序段或子程序段的第一條指令處可使用標(biāo)號(hào),以在程序需要時(shí)轉(zhuǎn)移到該處時(shí),以標(biāo)號(hào)的形式引用。指令語(yǔ)句—標(biāo)號(hào)的命名標(biāo)號(hào)的命名:根據(jù)用途,由字母、數(shù)字、專(zhuān)用符號(hào)?-$@ 約定:

最長(zhǎng)31個(gè)字符

第一個(gè)字符不能是數(shù)字 ?-$@可出現(xiàn)在標(biāo)號(hào)的任意位置,但?$不能單獨(dú)使用 .只能出現(xiàn)在起始位置 一個(gè)程序中,每個(gè)標(biāo)識(shí)符的定義是唯一的,且不能與任何保留字相同二、偽指令語(yǔ)句(Directive)——不產(chǎn)生CPU動(dòng)作、在程序執(zhí)行前由匯編程序處理的說(shuō)明性語(yǔ)句,例如,數(shù)據(jù)說(shuō)明、變量定義等等偽指令與具體的處理器類(lèi)型無(wú)關(guān),但與匯編程序的版本有關(guān)[名字]偽指令[操作數(shù)][;注釋]偽指令語(yǔ)句—格式說(shuō)明符號(hào)名字段:與標(biāo)號(hào)相區(qū)別,不帶“:”可以是常量名、變量名、過(guò)程名、結(jié)構(gòu)名、記錄名等可視為指令語(yǔ)句中的操作數(shù)(如符號(hào)名就表示一個(gè)常量或存儲(chǔ)地址命名規(guī)則與標(biāo)號(hào)相同偽指令字段:規(guī)定這條語(yǔ)句要求匯編程序完成的具體操作§4.2偽操作一、數(shù)據(jù)定義及存儲(chǔ)器分配偽操作二、表達(dá)式賦值偽操作三、段定義偽操作四、程序開(kāi)始和結(jié)束偽操作五、地址計(jì)數(shù)器及對(duì)準(zhǔn)偽操作六、基數(shù)控制偽操作七、處理器選擇偽操作數(shù)據(jù)是語(yǔ)句中操作數(shù)的基本組成部分一般來(lái)講數(shù)據(jù)具有數(shù)值和屬性?xún)蓚€(gè)特征匯編語(yǔ)言能識(shí)別的數(shù)據(jù)項(xiàng)包括:常數(shù)、變量和標(biāo)號(hào)一、數(shù)據(jù)定義及存儲(chǔ)器分配偽操作變量:代表存儲(chǔ)在某些存儲(chǔ)單元中的數(shù)據(jù),在程序運(yùn)行期間可以修改;對(duì)變量的訪問(wèn)以變量名的形式進(jìn)行;可認(rèn)為變量名為存儲(chǔ)單元的符號(hào)地址變量的定義與預(yù)置 由數(shù)據(jù)定義偽操作完成分配存儲(chǔ)單元起名字賦初值一、數(shù)據(jù)定義偽指令的格式變量名DBDWDDDQ表達(dá)式1,表達(dá)式2,…段屬性(SEG):表示變量存放在哪個(gè)邏輯段中,訪問(wèn)時(shí)要使之成為當(dāng)前段偏移量屬性(OFFSET):表示變量在所屬邏輯段中距起始點(diǎn)的距離類(lèi)型屬性(TYPE):表示變量所占字節(jié)數(shù)一、數(shù)據(jù)定義偽指令(表達(dá)式)數(shù)值表達(dá)式 D1DB12H,34H,56H(D1)=12H,(D1+1)=34H,(D1+2)=56HD2DW1234H,5678H(D2)=1234H,(D2+2)=5678H?表達(dá)式:表示該單元的內(nèi)容任意D3DB?,? ;表示分配2個(gè)字節(jié)D4DW?,? ;表示分配2個(gè)字一、數(shù)據(jù)定義偽指令(表達(dá)式)字符串表達(dá)式STR1DB‘ABCDE’ ;為每個(gè)字符分配1個(gè)單元 STR2DW‘AB’,’CD’ ;為由2個(gè)字符組成的字符串分配2個(gè)單元41H42H43H44H45HSTR142H41H44H43HSTR2一、數(shù)據(jù)定義偽指令(表達(dá)式)帶DUP的表達(dá)式變量名DBDWDDDQ表達(dá)式1DUP(表達(dá)式2) D1DB20HDUP(?) ;預(yù)留20H個(gè)字節(jié),內(nèi)容任意次數(shù)內(nèi)容 D2DB10HDUP(‘ABCD’) ;重復(fù)10H個(gè)‘ABCD’,共占40H字節(jié) D3DW10HDUP(4) ;重復(fù)10H個(gè)字單元,內(nèi)容0004H,共占20H字節(jié)一、數(shù)據(jù)定義偽指令(表達(dá)式)帶DUP的表達(dá)式—DUP操作符可重復(fù)使用 D4DB10HDUP(4DUP(2),7)

;重復(fù)10H個(gè)(2,2,2,2,7),共占50H字節(jié)1)變量的屬性:段屬性(SEG)、偏移量屬性(OFFSET)和類(lèi)型屬性對(duì)數(shù)據(jù)定義偽指令前面的變量還要注意它的類(lèi)型屬性問(wèn)題。變量表示該偽指令中的第一個(gè)數(shù)據(jù)項(xiàng)的偏移地址,此外,它還具有一個(gè)類(lèi)型屬性,用來(lái)表示該語(yǔ)句中的每一個(gè)數(shù)據(jù)項(xiàng)的長(zhǎng)度(以字節(jié)為單位表示),因此DB偽指令的類(lèi)型屬性為1,DW為2,DD為4,DQ為8,DT為10。變量表達(dá)式的屬性和變量是相同的。匯編程序可以用這種隱含的類(lèi)型屬性來(lái)確定某些指令是字指令還是字節(jié)指令例:

OPER1DB?,?

OPER2DW?,?

.

.

.

MOVOPER1,0;字節(jié)指令

MOVOPER2,0;字指令

MOVAX,OPER1+1;錯(cuò)誤指令:類(lèi)型不匹配

MOVAL,OPER2;錯(cuò)誤指令:類(lèi)型不匹配

變量表達(dá)式OPER1+1為字節(jié)類(lèi)型屬性

OPER2為字類(lèi)型屬性5、變量和標(biāo)號(hào)的屬性:2)指定操作數(shù)的類(lèi)型屬性:PTR屬性操作符:PTR指定操作數(shù)的類(lèi)型屬性,它優(yōu)先于隱含的類(lèi)型屬性。其格式為:

類(lèi)型PTR變量[±常數(shù)表達(dá)式]其中類(lèi)型可以是BYTE、WORD、DWORD、FWORD、QWORD或TBYTE,這樣變量的類(lèi)型就可以指定了。

例:下例中的兩條MOV指令把OPER1+1的類(lèi)型屬性指定為字,把OPER2的類(lèi)型屬性指定為字節(jié),這樣指令中兩個(gè)操作數(shù)的屬性就一致了,匯編時(shí)就不會(huì)出錯(cuò)了。

OPER1DB?,?

OPER2DW?,?

.

.

.

MOVAX,WORDPTROPER1+1

MOVAL,BYTEPTROPER2

LABEL偽指令

LABEL可以使同一個(gè)變量具有不同的類(lèi)型屬性。其格式為:

變量名LABEL類(lèi)型

或標(biāo)號(hào)LABEL類(lèi)型

其中變量的數(shù)據(jù)類(lèi)型可以是BYTE,WORD,DWORD,標(biāo)號(hào)的代碼類(lèi)型可以是NEAR或FAR。例如:

BYTE_ARRAYLABELBYTE

WORD_ARRAYDW50DUP(?)

在50個(gè)字?jǐn)?shù)組中的第一個(gè)字節(jié)的地址賦予兩個(gè)不同類(lèi)型的變量名:字節(jié)類(lèi)型的變量BYTE_ARRAY和字類(lèi)型變量WORD_ARRAY。

在程序中訪問(wèn)數(shù)組單元時(shí),要按指令類(lèi)型來(lái)選擇變量,如下面兩條指令:

MOVWORD_ARRAY+2,0;字指令,

;把該數(shù)組的第3個(gè)和第4個(gè)字節(jié)置0

MOVBYTE_ARRAY+2,0;字節(jié)指令,

;把該數(shù)組的第3個(gè)字節(jié)置0BYTE_ARRAY

WORD_ARRAY

均為變量名,他們具有相同的SEG OFFSET 屬性,但TYPE屬性不同BYTE_A:BYTEWORD_A:WORD標(biāo)號(hào)指令的符號(hào)地址段屬性(SEG)偏移量屬性(OFFSET)距離屬性(Distance類(lèi)型):表示標(biāo)號(hào)的轉(zhuǎn)移特性類(lèi)型: NEAR:本標(biāo)號(hào)只能被標(biāo)號(hào)所在段的指令訪問(wèn)(段內(nèi)轉(zhuǎn) 移、調(diào)用)

FAR:可被其他段的指令訪問(wèn)(段間調(diào)用、轉(zhuǎn)移)標(biāo)號(hào)設(shè)置標(biāo)號(hào)距離屬性的方法

1)隱含方式:在指令語(yǔ)句中使用標(biāo)號(hào)后,其隱含為NEAR屬性

SUB1:MOVAL,30H ;SUB1具有NEAR屬性 ;該方式定義的標(biāo)號(hào)只能具備N(xiāo)EAR屬性標(biāo)號(hào)設(shè)置標(biāo)號(hào)距離屬性的方法

2)用LABEL偽指令賦予標(biāo)號(hào)距離屬性

名稱(chēng)LABEL類(lèi)型SEGOFFSETDistance 標(biāo)識(shí)符標(biāo)號(hào)NEAR/FAR

該偽指令一般與指令語(yǔ)句/數(shù)據(jù)定義偽指令連用,以補(bǔ)充或設(shè)置與值連用的標(biāo)號(hào)/變量的距離/類(lèi)型屬性設(shè)置標(biāo)號(hào)距離屬性的方法(例1)

SUB1: MOVAL,30H標(biāo)識(shí)符SUB1_FAR SUB1 均為指令的符號(hào)地址,他們具有SEG OFFSET 相同的屬性,但Distance屬性不同SUB1_FAR:FARSUB1:NEAR

段內(nèi)轉(zhuǎn)移/調(diào)用:

SUB1

SUB1_FAR LABELFAR

段間轉(zhuǎn)移/調(diào)用:

SUB1_FAR變量的使用—在指令語(yǔ)句中對(duì)已經(jīng)定義的變量直接引用其符號(hào)名DATASEGMENT DA1 DB0FEHDA2 DW52ACHDA3DB10HDUP(?)DA4DW10HDUP(1) …… MOVAL,DA1;AL=FEH MOVBX,DA2;BX=52ACH MOVSI,2 MOVDA3[SI],AL MOVDA4[SI],BX 直接尋址相對(duì)變址尋址FEAC5200010001DA1DA2DA3DA3+1DA3+2DA4DA4+252AC變量的使用—在偽指令語(yǔ)句中DATASEGMENT DA1 DB12HNUM DB75HHARRAYDW20HDUP(0)ADR1DWNUMADR2DDNUM ……DS=21FDH127500210100FDDA1NUMARRAYADR1ADR2000100

DW:定義的存儲(chǔ)單元存放相應(yīng)變量的偏移量DD:定義的存儲(chǔ)單元存放相應(yīng)變量的偏移量和段基值二、地址計(jì)數(shù)器及對(duì)準(zhǔn)偽操作地址計(jì)數(shù)器$:匯編程序在為每條指令或變量分配內(nèi)存時(shí),使用當(dāng)前位置計(jì)數(shù)器來(lái)指示下一指令或數(shù)據(jù)的偏移量,匯編語(yǔ)言允許用戶直接用$來(lái)引用地址計(jì)數(shù)器的值

◆地址計(jì)數(shù)器與對(duì)準(zhǔn)偽操作:地址計(jì)數(shù)器$:例如指令:

JMP$+6

它的轉(zhuǎn)向地址是JMP指令的首地址加上6。當(dāng)$用在指令中時(shí),它表示本條指令的第一個(gè)字節(jié)的地址。在這里,$+6必須是另一條指令的首地址。否則,匯編程序?qū)⒅甘境鲥e(cuò)信息。當(dāng)$用在偽指令的參數(shù)字段時(shí),則和它用在指令中的情況不同,它所表示的是地址計(jì)數(shù)器的當(dāng)前值。例如指令:

ARRAYDW1,2,$+4,3,4,$+4

00H01H00H02H00H

7CH

00H03H00H04H00H

82H

ARRAY007E007800740078H+4=007CH定位偽指令: ORG表達(dá)式 將表達(dá)式的值賦給當(dāng)前位置計(jì)數(shù)器。即該偽指令后的指令或變量以表達(dá)式的值為偏移量例如:SEG1SEGMENTORG10HVAR1DW1234H;VAR1的偏移地址為10hORG20HVAR2DW5678HORG$+8VAR3DW1357HSEG1ENDS

EVEN

使下一指令或變量的偏移量為偶數(shù)例如:ADB‘morning’EVENBDW2DUP(?)五、地址計(jì)數(shù)器及對(duì)準(zhǔn)偽操作(例)DATA SEGMENT ORG30HDB1 DB12H,34H ORG$+20HSTR DB‘ABC’CNT EQU$-STR EVENDW1 DW20HDUP(0)DATA ENDS ……CODE SEGMENT ASSUMECS:CODE,DS:DATA ORG10HSTART:MOVAX,DATA MOVDS,AX ……CODE ENDS ENDSTARTDATA30HDB143HDD1STRDW142H41H00123440H20H30H00三、表達(dá)式賦值偽操作等值語(yǔ)句符號(hào)EQU表達(dá)式;將表達(dá)式的值賦給左邊的符號(hào)EQU是一個(gè)賦值偽操作(偽指令),它給一個(gè)數(shù)據(jù)標(biāo)號(hào)賦于一個(gè)常數(shù)值,但這個(gè)常數(shù)不占用存儲(chǔ)單元。當(dāng)這個(gè)數(shù)據(jù)標(biāo)號(hào)出現(xiàn)在程序中時(shí),匯編程序即用它的常數(shù)值代替數(shù)據(jù)標(biāo)號(hào)。EQU可以在數(shù)據(jù)段之外使用,甚至可用在代碼段中間。在同一程序中,同一符號(hào)不能用EQU重復(fù)定義。表達(dá)式的形式1)常數(shù)或數(shù)值表達(dá)式

CNTEQU5 NUMEQU13+5+4 2)址表達(dá)式

ADR1EQUDS:[BP+14] 3)變量、標(biāo)號(hào)或指令助記符

W0EQUWORDPTRDA_BYTE假定在數(shù)據(jù)段和代碼段中要多次使用一個(gè)數(shù)據(jù)(如5),那么在編程時(shí)凡是用到5的地方都可用數(shù)據(jù)標(biāo)號(hào)CNT來(lái)表示。如果程序想修改這個(gè)數(shù)據(jù),那么只需修改EQU的賦值,而無(wú)須修改程序中其它部分。

等值語(yǔ)句符號(hào)=表達(dá)式;功能與EQU相同,但可重復(fù)定義

CNT=5 NUM=4 …… NUM=NUM+10H CBD=DDA …… CBD=ADD例如,TMPEQU5

TMPEQUTMP+1則是錯(cuò)誤語(yǔ)句,因?yàn)門(mén)MP已賦值為5,就不能再把它定義為其它數(shù)值。

而TMP=5

TMP=TMP+1則是允許使用的,因?yàn)?偽操作允許重復(fù)定義。第一個(gè)語(yǔ)句TMP的值為5,第二個(gè)語(yǔ)句TMP的值就為6了。賦值偽操作"="的作用與EQU類(lèi)似。它們之間的區(qū)別是,EQU偽操作中的標(biāo)號(hào)名是不允許重復(fù)定義的,而=偽操作是允許重復(fù)定義的。表達(dá)式與運(yùn)算符指令中的操作數(shù)可以以表達(dá)式的形式出現(xiàn)常數(shù)變量標(biāo)號(hào) 通過(guò)操作運(yùn)算符連接而成表達(dá)式匯編程序在匯編過(guò)程中計(jì)算表達(dá)式,最終得到一個(gè)數(shù)值程序運(yùn)行之前,就已經(jīng)計(jì)算出了表達(dá)式;所以,程序運(yùn)行速度沒(méi)有變慢,但增強(qiáng)程序的可讀性MASM對(duì)除偽指令外各種匯編時(shí)處理的指令統(tǒng)稱(chēng)為操作符(Operator)運(yùn)算符算術(shù)操作(運(yùn)算)符邏輯操作(運(yùn)算)符關(guān)系操作(運(yùn)算)符數(shù)值返回操作(運(yùn)算)符屬性修改操作(運(yùn)算)符 運(yùn)算符運(yùn)算符—算術(shù)運(yùn)算符+-*/MOD實(shí)現(xiàn)加、減、乘、除、取模、移位的運(yùn)算

MOVAX,3*4+5 ;等價(jià)于MOVAX,17其中MOD也稱(chēng)為取模,它產(chǎn)生除法之后的余數(shù),如19mod7=5加+和減-運(yùn)算符還可以用于地址表達(dá)式除加、減外,其他運(yùn)算符的參數(shù)必須是整數(shù)算術(shù)運(yùn)算符—例NUM =11011011B MOVAL,NUMSHL3 MOVAL,11011000B MOVBL,NUMSHR2 MOVAL,00110110B ADDDL,NUMSHR6 ADDDL,00000011B MOVAL,ARRAY[BX][SI] MOVAL,ARRAY[BX+SI]運(yùn)算符—邏輯運(yùn)算符ANDORXORNOT實(shí)現(xiàn)按位相與、相或、異或、求反的邏輯運(yùn)算

ORAL,03HAND45H 0RAL,01H

MOVAX,NOT0F0H MOVAX,0FF0FH

MOVBL,55HAND0F0H MOVBL,50H運(yùn)算符—關(guān)系運(yùn)算符EQNEGTLTGELE用于比較和測(cè)試符號(hào)數(shù)值表達(dá)式1 關(guān)系運(yùn)算符表達(dá)式2表達(dá)式為常數(shù)時(shí),按無(wú)符號(hào)數(shù)進(jìn)行比較表達(dá)式為變量(同段內(nèi))時(shí),比較其偏移量MASM用0FFH/0FFFFH(補(bǔ)碼-1)表示條件為真MASM用0000H表示條件為假運(yùn)算符—關(guān)系運(yùn)算符(舉例)MOVAX,0FHEQ1111B ←→MOVAX,0FFFFHMOVBX,0FHNE1111B ←→ MOVBX,0VARDWNUMLT0ABH;當(dāng)已定義的常數(shù)NUM小于ABH時(shí),則VAR←0FFH運(yùn)算符—數(shù)值返回運(yùn)算符操作對(duì)象:存儲(chǔ)器操作數(shù)(變量/標(biāo)號(hào))格式: 運(yùn)算符變量名/標(biāo)號(hào)名SEG名字/標(biāo)號(hào)返回名字或標(biāo)號(hào)的段基值MOVAX,SEGK1OFFSET名字/標(biāo)號(hào)返回名字或標(biāo)號(hào)的段內(nèi)偏移地址MOVSI,OFFSETVAR運(yùn)算符—數(shù)值返回運(yùn)算符TYPE名字/標(biāo)號(hào)返回名字或標(biāo)號(hào)的類(lèi)型屬性,以數(shù)字形式表示類(lèi)型屬性數(shù)字形式變量BYTE1WORD2DWORD4標(biāo)號(hào)NEAR-1FAR-2運(yùn)算符—數(shù)值返回運(yùn)算符(例)V1 DB‘ABCD’V2 DW1234H,5678HV3 DDV2 …… MOVAL,TYPEV1 ;AL=1 MOVCL,TYPEV2 ;CL=2 MOVCH,TYPEV3 ;CH=4

運(yùn)算符—數(shù)值返回運(yùn)算符LENGTH名字/標(biāo)號(hào)只用于變量,且為DUP所定義

如未用DUP定義則返回值為1如使用DUP定義則返回最外層之值運(yùn)算符—數(shù)值返回運(yùn)算符(例)K1 DB10HDUP(0)K2 DB10H,20H,30HK3 DW20HDUP(0,1,2DUP(2))K4 DB‘ABCD’

…… MOVAL,LENGTHK1 ;AL=10HMOVBL,LENGTHK2 ;BL=1MOVCX,LENGTHK3 ;CX=20HMOVDX,LENGTHK4 ;DX=1運(yùn)算符—數(shù)值返回運(yùn)算符SIZE名字 只用于變量,得到重復(fù)定義的變量的數(shù)組元素所占字節(jié)數(shù)=LENGTH*TYPEK1 DB10HDUP(0)K2 DB10H,20H,30HK3 DW20HDUP(0,1,2DUP(2))K4 DB‘ABCD’

…… MOVAL,LENGTHK1 ;AL=10HMOVBL,LENGTHK2 ;BL=1MOVCX,LENGTHK3 ;CX=20HMOVDX,LENGTHK4 ;DX=1MOVAL,SIZEK1 ;AL=10HMOVBL,SIZEK2 ;BL=1MOVCL,SIZEK3 ;CL=40HMOVDL,SIZEK4 ;DL=1 運(yùn)算符—屬性修改運(yùn)算符對(duì)存儲(chǔ)器操作數(shù)(名字/標(biāo)號(hào))的屬性進(jìn)行修改PTR運(yùn)算符 類(lèi)型PTR地址表達(dá)式

該修改是臨時(shí)的,只在當(dāng)前語(yǔ)句有效標(biāo)號(hào):NEAR/FAR變量:BYTE/WORD/DWORD 標(biāo)號(hào)名作為地址指針的R變量名

運(yùn)算符—屬性修改運(yùn)算符(例)DA_BYTE DB20HDUP(0)DA_WORDDW30HDUP(0) …… LEABXDA_WORD LEASI,DA_BYTE

MOVAX,WORDPTRBA_BYTE[10H] ADDBYTEPTRDA_WORD[20H],BL INCBYTEPTR[BX] SUBWORDPTR[SI],30H ANDAX,WORDPTR[BX][SI] JMPFARPTRSUB1運(yùn)算符—THIS運(yùn)算符THIS類(lèi)型名利用THIS說(shuō)明的操作數(shù)具有匯編時(shí)的當(dāng)前邏輯地址,但具有指定的類(lèi)型LABEL偽指令的功能等同于“EQUTHIS”D_BYTE EQUTHISBYTEW_WORD DW20HDUP(0);定義20H字單元,該區(qū)域可按字節(jié)訪問(wèn),也可以按字訪問(wèn)JMP_FAR EQUTHISFARJMP_NEAR:MOVAL,30H運(yùn)算符—HIGH/LOW運(yùn)算符操作對(duì)象:常數(shù)/地址表達(dá)式功能:取其高/低8位

CONSTEQU0ABCDH MOVAH,HIGHCONST ;AH=0ABH 運(yùn)算符的優(yōu)先級(jí)1 ()<>[]·LENGTHSIZEWIDTHMASK2 PTROFFSETSEGTPYETHIS:3 HIGELOW4 */MODSHLSHR5 +-6 EQNEGTLTGELE7 NOT8 AND9 ORXOR10 SHORT建議采用圓括號(hào)“()”顯式表達(dá),它可以極大地提高程序的可閱讀性四、段定義偽操作程序的段結(jié)構(gòu)段定義段尋址(指定當(dāng)前段)段寄存器的裝入◆段定義偽操作:完整的段定義格式datasegment;定義數(shù)據(jù)段…dataends;extrasegment;定義附加段…extraends;codesegment;定義代碼段

assumecs:code,ds:data,es:extrastart:movax,datamovds,ax;段地址段寄存器…codeendsendstartPSPDSESSSCSEXE程序的內(nèi)存映象圖裝入模塊文件頭四、段定義偽操作—完整段定義偽指令段名 SEGMENT定位組合段字'類(lèi)別'

…… ;語(yǔ)句序列段名 ENDS段定義由SEGMENT和ENDS這一對(duì)偽指令實(shí)現(xiàn),SEGMENT偽指令定義一個(gè)邏輯段的開(kāi)始,ENDS偽指令表示一個(gè)段的結(jié)束段定義指令后的4個(gè)關(guān)鍵字用于確定段的各種屬性,堆棧段要采用stack組合類(lèi)型如果不指定,則采用默認(rèn)參數(shù);但如果指定,注意要按照上列次序四、段定義偽操作

—段定位(align)屬性表示對(duì)邏輯段起始邊界的選擇,可為:PAGE 段從一個(gè)頁(yè)邊界開(kāi)始 (XXX00H,256Bytes/Page)

PARA 段節(jié)邊界開(kāi)始(XXXX0H)DWORD 段從一個(gè)4倍數(shù)地址開(kāi)始WORD 段從一個(gè)偶地址開(kāi)始BYTE 段可以從任意單元開(kāi)始完整段定義偽指令的默認(rèn)定位屬性是PARA四、段定義偽操作

—段組合(combine)屬性指定多個(gè)邏輯段之間如何連接與定位,可為: PRIVATE

本段與其他段沒(méi)有連接關(guān)系,這是完整段定義偽指令默認(rèn)的段組合方式 PUBLIC

在滿足定位關(guān)系的前提下,連接程序把本段與所有同名段相鄰地連接在一起,形成新的邏輯段。(可在程序的不同位置及不同的文件中使用段定義語(yǔ)句定義一個(gè)邏輯段) COMMON

產(chǎn)生一覆蓋段,兩個(gè)同名段起始地址相同,用較長(zhǎng)的段覆蓋較短的段四、段定義偽操作

—段組合(combine)屬性STACK

把所有的同類(lèi)別段連接在一起,段基值→SS,且自動(dòng)為SP初始化。在一個(gè)程序中一般應(yīng)該有一個(gè)堆棧段。AT表達(dá)式表示本段定位在表達(dá)式所指示的節(jié)的邊界上

AT0930H表示本段的物理地址從09300H開(kāi)始MEMORY

表示本段定位在所有其它段的最高地址四、段定義偽操作

—段類(lèi)別(class)屬性當(dāng)連接程序組織段時(shí),將所有的同類(lèi)別段相鄰分配段類(lèi)別可以是任意名稱(chēng),但必須位于單引號(hào)中大多數(shù)MASM程序使用'code'、'data'和'stack’來(lái)分別指名代碼段、數(shù)據(jù)段和堆棧段,以保持所有代碼和數(shù)據(jù)的連續(xù)DA1 SEGMENTPARA‘DATA’DD1 DB10DUP(12H)DA1 ENDSSTA1 SEGMENTSTACK‘STACK0’ DW20HDUP(?)STA1 ENDSDA2 SEGMENTPARA‘DATA’DD2 DB20HDUP(13H)DA2 ENDSSTA2 SEGMENTSTACK‘STACK0’ DW30HDUP(?)STA2 ENDSCODE SEGMENT ……CODE ENDSDA11213DA2CODEDD1DD260HSTA1131212STA240H20H10四、段定義偽操作—段尋址指明當(dāng)前段

ASSUME段寄存器名:段名,段寄存器名:段名,……CSDSSSES

已經(jīng)定義的段

在程序運(yùn)行過(guò)程中,可重新設(shè)置當(dāng)前段,也可以刪除原有的設(shè)置

ASSUMEES:NOTHING ;刪除對(duì)ES的設(shè)置 ASSUMENOTHING ;刪除對(duì)所有段的設(shè)置四、段定義偽操作

—段寄存器的裝入ASSUME只說(shuō)明了已哪些段為當(dāng)前段,具體的段基值并沒(méi)有裝入DS與ES的裝入 用ASSUME將DS/ES與相應(yīng)的段建立聯(lián)系后,用數(shù)據(jù)傳送指令

MOV AX,段名

MOV DS/ES,AX四、段定義偽操作

—段寄存器的裝入SS的裝入 在定義段時(shí),用組合類(lèi)型STACK說(shuō)明

STACK1 SEGMENTPARASTACK DW20HDUP(0) STACK1 ENDS CODE SEGEMNT ASSUMECS:CODE,SS:STACK1 ……

SS獲得STACK1的段基值,且SP=40H四、段定義偽操作

—段寄存器的裝入SS的裝入(類(lèi)似于DS/ES的方法)

STACK1 SEGMENT DW40HDUP(0) TOP LABELWORD STACK1 ENDS …… CODE SEGEMNT ASSUMECS:CODE …… MOVAX,STACK1 MOVSS,AX MOVSP,OFFSETTOP ;SP=80H ……

中間不得插入其他指令四、段定義偽操作

—段寄存器的裝入CS的裝入 用結(jié)束偽指令:每個(gè)源程序都必須以END偽指令結(jié)束

END起始地址

功能:標(biāo)志源程序的結(jié)束 指定程序運(yùn)行的起始地址標(biāo)號(hào)表達(dá)式不一定是指令語(yǔ)句四、段定義偽操作

—段寄存器的裝入CS的裝入

CODE SEGEMNT ASSUMECS:CODE,SS:STACK1 START: …… …… ENDSTART

將后面的語(yǔ)句全部略去 將START所對(duì)應(yīng)的程序在內(nèi) 存中的位置裝入CS和IP五、程序開(kāi)始和結(jié)束偽操作開(kāi)始:

NAMEmodul_name

TITLEtext

程序終止和匯編結(jié)束是兩碼事結(jié)束:

END

起始地址六、基數(shù)控制偽操作匯編語(yǔ)言源程序默認(rèn)使用十進(jìn)制,其他用標(biāo)注表示(B,O,H)格式: RADIX表達(dá)式功能:把默認(rèn)的基數(shù)改為2、8、16等 除指定進(jìn)制外,其他加標(biāo)注MOVBX,0FFHMOVBX,178RADIX16MOVBX,0FFMOVBX,178D例:設(shè)x,y,sum均為內(nèi)存單元的符號(hào)地址,編寫(xiě)一源程序?qū)崿F(xiàn)x+y的運(yùn)算,并把結(jié)果存入sum單元。(x,y均為16位數(shù)據(jù))。datasegmentxdw?ydw?sumdw?dataend

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(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)論