第4章1程序設(shè)計基本語法_第1頁
第4章1程序設(shè)計基本語法_第2頁
第4章1程序設(shè)計基本語法_第3頁
第4章1程序設(shè)計基本語法_第4頁
第4章1程序設(shè)計基本語法_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第四章匯編語言程序設(shè)計4.1匯編語言程序設(shè)計概述4.2匯編語言基本語法4.3匯編語言程序設(shè)計4.4BIOS及DOS功能調(diào)用4.5匯編語言程序設(shè)計實例4.1匯編語言程序設(shè)計概述4.1.1程序設(shè)計語言基本概念1.機(jī)器語言(MachineLanguage)機(jī)器語言是一種用二進(jìn)制表示的指令和數(shù)據(jù),是能夠被機(jī)器直接識別的計算機(jī)語言。2.高級語言(HighLevelLanguage)高級語言是一種較接近自然語言的英文語句和數(shù)字表達(dá)式表示的編程語言。3.匯編語言(AssemblyLanguage)匯編語言是一種面向機(jī)器的語言,它采用助記符來表示機(jī)器指令,助記符往往是一組英文縮寫,因此可以方便地進(jìn)行程序編寫、閱讀和修改。4.1.2匯編語言源程序匯編語言源程序是程序員根據(jù)具體問題的算法,用匯編語言的語句編寫的程序文本,通常以.asm作為擴(kuò)展文件名。匯編語言程序設(shè)計中由于開發(fā)環(huán)境支持不同,可以有兩種不同的段定義形式:完整段定義和簡化段定義。采用這兩種定義方式編寫的程序分別被稱完整段程序和簡化段程序。

1.完整段程序結(jié)構(gòu)所謂完整段結(jié)構(gòu),是指匯編語言源程序中使用段定義偽指令對用到的邏輯段分別定義。完整段程序的典型的結(jié)構(gòu)如下:數(shù)據(jù)段名SEGMENT[對齊類型][組合類型][類別]

…… 數(shù)據(jù)段名ENDS 堆棧段名SEGMENT[對齊類型][組合類型][類別]

……

堆棧段名ENDS 代碼段名SEGMENT[對齊類型][組合類型][類別]

ASSUME……START:MOV ……

…… MOVAH,4CH ;返回DOS操作系統(tǒng)

INT21H

……

;子程序代碼代碼段名ENDS ;代碼段定義結(jié)束

END START

【例4.1】將兩個4字節(jié)的十六進(jìn)制數(shù)相加,其結(jié)果保存到第三個4字節(jié)數(shù)中。匯編語言源程序如下:DATASEGMENT ;定義一個名為DATA的段

X DB34H,89H,0FH,02H Y DB88H,96H,0DFH,75H ZDB4DUP(?)DATAENDS ;DATA段定義結(jié)束STAKSEGMENT STACK ;定義一個名為STACK的段

DB100DUP(100)STAKENDS ;STACK段定義結(jié)束CODESEGMENT ;定義一個名為CODE的段

ASSUMECS:CODE,DS:DATA,SS:STAK;對段寄存器地址說明

START:MOVAX,DATA ;初始化段寄存器地址開始

MOVDS,AX MOVAX,STACK MOVSS,AX ;初始化段寄存器地址結(jié)束

MOVCX,4 LEABX,X LEADX,Y LEASI,Z CLC LOOP1:MOVAL,[BX]

ADCAL,[DX] MOV[SI],AL INCBX INCDX INCSI LOOPLOOP1 MOVAH,4CH ;返回DOS操作系統(tǒng)

INT21H CODE ENDS ;CODE段定義結(jié)束

END START ;程序結(jié)束2.簡化段程序結(jié)構(gòu)微軟的宏匯編程序MASM6.11支持簡化段定義的匯編語言源程序。引入簡化段的主要目的是簡化源程序中段描述指令,提高程序編寫效率。簡化段程序的典型結(jié)構(gòu)如下:.MODEL 模式名 ;定義程序模式(SMALL、LARGE等).DATA ;數(shù)據(jù)段定義開始

…… ;變量定義及數(shù)據(jù)空間預(yù)置.STACK ;堆棧段定義(默認(rèn)1KB空間,可自己定義).CODE ;代碼段定義開始.STARTUP ;代碼段入口標(biāo)志

…… ;程序代碼內(nèi)容.EXIT ;返回DOS操作系統(tǒng)…… ;子程序定義END ;程序結(jié)束從這個典型結(jié)構(gòu)可以看到,簡化段程序與完整段程序的主要區(qū)別在于:簡化段程序中需要聲明使用的存儲模式,以便生成合適的可執(zhí)行文件;完整段程序無此設(shè)置,但需要通過各段定義時選擇參數(shù)來描述段的特性。簡化段程序中所有段定義都使用了專用的保留字偽指令直接標(biāo)識,不再由用戶逐一描述。簡化段程序中程序的起始位置由.STARTUP偽指令指明。簡化段程序中不需要對段寄存器的地址進(jìn)行說明。簡化段程序中不需要對段寄存器進(jìn)行初始化設(shè)置。簡化段程序返回DOS操作系統(tǒng)使用.EXIT偽指令,不需要使用INT21H指令。簡化段程序結(jié)束只需要使用END偽指令即可。

將例4.1中的程序改寫為簡化段程序代碼如下:.MODELSMALL ;聲明存儲模式為SMALL.DATA ;定義數(shù)據(jù)段

X DB34H,89H,0FH,02H Y DB88H,96H,0DFH,75H Z DB4DUP(?).STACK ;定義堆棧段(默認(rèn)1KB大?。?CODE ;定義代碼段.STARTUP ;程序入口

MOVCX,4 LEABX,X LEADX,Y LEASI,Z CLCLOOP1: MOVAL,[BX]

ADCAL,[DX] MOV[SI],AL INCBX INCDX INCSI LOOPLOOP1.EXIT ;返回DOS操作系統(tǒng)

END ;程序結(jié)束1)編輯:用編輯工具編寫匯編語言源程序代碼(.asm文件)2)匯編:用匯編程序MASM對編寫好的源程序代碼進(jìn)行匯編,轉(zhuǎn)換成機(jī)器指令,生成.OBJ目標(biāo)文件。3)連接:用連接工具LINK對已轉(zhuǎn)換的目標(biāo)文件進(jìn)行連接,生成可執(zhí)行.EXE文件。4)調(diào)試運行:在DOS命令狀態(tài)執(zhí)行,觀察運行結(jié)果。如果發(fā)現(xiàn)不正常則找到出錯代碼,重復(fù)步驟①~④,直到結(jié)果正確。4.1.3匯編語言程序開發(fā)過程匯編語言程序是一種符號式的語言程序,因此不能直接提供給計算機(jī)執(zhí)行,需要經(jīng)過匯編轉(zhuǎn)換成機(jī)器語言。而且由于操作系統(tǒng)加載的需要,還要通過連接完成相關(guān)文件結(jié)構(gòu)和重定位信息。匯編程序開發(fā)的基本步驟如下:匯編程序開發(fā)步驟:EXAM.ASMASCII源程序EXAM.OBJ可選EXAM.LSTEXAM.CRF機(jī)器碼目標(biāo)程序

MASM.EXE匯編匯編程序EXAM.EXE

LINK.EXE連接連接程序可執(zhí)行程序4.2匯編語言的基本語法

指令性語句——由指令構(gòu)成 [標(biāo)號:] 操作碼

操作數(shù) [;注釋] 如: START: MOV AX,DATA

指示性語句——由命令(偽指令)構(gòu)成 [名字] 偽指令 [操作數(shù)] [;注釋] 如: DATA SEGMENTAT 2000H DATA ENDS4.2.1匯編語言語句類型及格式4.2.2匯編語言的變量、常量、標(biāo)號和表達(dá)式

1.變量

當(dāng)存儲單元中的數(shù)據(jù)在程序運行中隨時可以修改時,這個數(shù)據(jù)就可以用變量來定義。為了便于對這個變量的訪問,要給這個變量取一個名字,稱為變量名。

定義變量可以使用數(shù)據(jù)定義偽指令,格式如下:變量名變量定義偽指令初值表例如:VARl DB 12H,34HVAR2 DW 1234H,5678HVAR3 DD 12345678H變量具有以下三個屬性。字節(jié)

DB (8位)一個字節(jié)存貯單元字

DW (16位)二個連續(xù)字節(jié)存貯單元雙字

DD (32位)四個連續(xù)字節(jié)存貯單元雙字

DQ (64位)8個連續(xù)字節(jié)存貯單元雙字

DT (80位)10個連續(xù)字節(jié)存貯單元段屬性:段地址,內(nèi)存地址由段地址加偏移地址構(gòu)成。因此,存放在內(nèi)存中的程序或數(shù)據(jù)都必須屬于某個段才能夠被訪問。

偏移地址:段內(nèi)地址,在定義變量時使用的變量名,就是變量在段中的起始地址。

變量類型:變量所在存貯單元的類型,由偽指令指定。2.常量1)數(shù)值常量:直接用數(shù)字進(jìn)行表示的常量。二進(jìn)制:10000100B、11110001020100B十進(jìn)制:12356D十六進(jìn)制:12ABH、0F56AH(字母打頭必須前面補(bǔ)0,否則將出現(xiàn)語法錯誤。)如:

MOV AX,100D MOV BL,0FAH MOV CL,10101000B

2)字符型常量字符型常量用于表示符號串,常以單引號括起來。如‘HELLOWORLD!’,‘123456’等。單引號中的每個符號都是以ASCII碼的形式表示,并占用一個字節(jié)存儲空間。3)符號常量:符號常量可以被看作是被命名了的一個數(shù)值或其他標(biāo)識符命名規(guī)則: 1)0≤31個ASCII碼字符 2)A~Z、a~z、0~9、?、@、$及下劃線構(gòu)成。 3)?不能單獨作為標(biāo)識符。 4)無獨立的保留字及運算符。合法標(biāo)識符:STA_124$MOV_?@103非法標(biāo)識符:STA+124$MOV?符號常量定義

常量名=/EQU表達(dá)式例如可定義如下符號常量

R =30 PAIEQU3.1415

CC EQU 10001010B 在程序中,可以在任何需要使用圓周率的位置使用PAI這個符號常量來代替3.1415,用R來代替圓的半徑,當(dāng)需要修改程序中圓半徑或圓周率精度時只需要修改R和PAI的常量定義語句即可。從而改善程序的可讀性,便于程序修改和調(diào)試。

“=”可重復(fù)定義

EQU不可重復(fù)定義3.標(biāo)號(標(biāo)識符)

標(biāo)號是指令性語句存放地址的符號表示。有三個屬性,標(biāo)號也有三個屬性,即段地址、偏移地址和距離。常用于指令的轉(zhuǎn)移和子程序調(diào)用。

例如:

MOV CX,10HLOOP1: MOV AL,[SI] ;定義LOOP1標(biāo)號 MOV [DI],AL INC SI INC DI LOOP LOOP1 ;循環(huán)執(zhí)行到LOOP1

標(biāo)號定義方式標(biāo)號名:

機(jī)器指令語句4.表達(dá)式表達(dá)式是操作數(shù)的常見形式。表達(dá)式由常量、變量、標(biāo)號及連接它們的運算符組成。表達(dá)式不會出現(xiàn)在最終的程序代碼中。

MASM匯編程序可以使用兩種表達(dá)式,即數(shù)值表達(dá)式和地址表達(dá)式。1)數(shù)值表達(dá)式數(shù)值表達(dá)式一般是由運算符連接的各種常量所構(gòu)成的表達(dá)式。MASM支持的常量運算符包括算術(shù)運算符、邏輯運算符和關(guān)系運算符。

①算術(shù)運算符包括加(+)、減(-)、乘(*)、除(/)、取模(MOD)、左移(SHL相當(dāng)于除法),右移(SHR相當(dāng)于乘法)等7種運算符。②邏輯運算符包括與(AND)、或(OR)、非(NOT)和異或(XOR)等4種運算符?!襁壿嬤\算符只能對常數(shù)(或相當(dāng)于常數(shù),如數(shù)值表達(dá)式)進(jìn)行運算。如“MOVCX,AXAND10H”是錯誤指令?!襁壿嬤\算符與邏輯運算指令的操作符相同,但出現(xiàn)在指令中的位置不同。邏輯運算指令的操作符出現(xiàn)在指令的助記符部分,而邏輯運算符出現(xiàn)在指令的操作數(shù)部分。如AND DX,7FHAND80H ③關(guān)系運算符包括相等(EQ)、不等NE、小于LT、大于GT、小于或等于LE、大于或等于GE等6種運算符?!耜P(guān)系運算符只能對常數(shù)(或相當(dāng)于常數(shù),如數(shù)值表達(dá)式)進(jìn)行運算,參加運算的兩個數(shù)是無符號數(shù)?!癞?dāng)關(guān)系成立時,其結(jié)果為全1,否則為全0。如MOV DX,10LT100由于10小于100成立,因此,該指令匯編后得到的代碼為MOVDX,0FFFFH。●關(guān)系運算符可以和邏輯運算符組合起來使用。如MOV BX,((VALUELT5)AND20)OR((VALUEGE5)AND30)2)地址表達(dá)式地址表達(dá)式的結(jié)果是一個存儲單元的地址。當(dāng)某個標(biāo)號表示的地址中存放的是數(shù)據(jù)時,稱為變量;當(dāng)該標(biāo)號表示的地址中存放的是指令時,則稱為程序標(biāo)號。如果指令中的操作數(shù)需要用到地址表達(dá)式時,應(yīng)注意其物理意義。比如將兩個地址作乘/除操作就沒有意義,對不同段數(shù)據(jù)的地址相加減當(dāng)然也沒有意義。常用的地址表達(dá)式是標(biāo)號加/減數(shù)字的形式。如: MOVAX,[VAR+10H]

VAR+10H為地址表達(dá)式,表示VAR后面10H處的地址值。表達(dá)式中可以使用的運算符有6類,它們是算術(shù)運算符、邏輯運算符、關(guān)系運算符、分析運算符、合成運算符、其它運算符等。當(dāng)多種運算符同時出現(xiàn)于一個表達(dá)式中時,這些運算符將按照一定的優(yōu)先級由高向低排列執(zhí)行。高優(yōu)先級低1括號()和[]2LENGTH,SIZE,WIDTH,MASK3PTR,OFFSET,SEG,TYPE,THIS4*,/,MOD5+,-6EQ,NE,LT,LE,GT,GE7NOT8AND9OR,XOR4.2.3匯編語言程序偽指令(指示性語句)1.變量定義和屬性偽指令1)變量定義指令格式:[變量名]DB/DW/DD/DF/DQ/DT表達(dá)式功能:為變量分配1個字節(jié)/字/雙字/長字/四字/十字節(jié)的存儲單元,并給它們賦值。使用這六個偽指令可以定義數(shù)值、字符串、數(shù)組等。例如:VARB DB 12H ;定義字節(jié)變量VARB為12HVARW DW 1234H ;定義字變量VARW為1234HVARD DD 12345678H ;定義雙字變量VARD為1345678HVARB起始地址+012HVARW起始地址+134H起始地址+212HVARD起始地址+378H起始地址+456H起始地址+534H起始地址+612H定義后VARB、VARW、VARD在內(nèi)存中的地址相對位置如下還可以用變量定義字符串等數(shù)據(jù),如:STRINGA DB “HELLOWORLD!”DATAW DW “AB”,“CD”DATAD DD “WXYZ”它們在內(nèi)存中的相對位置如圖所示。起始地址+0‘H’起始地址+10‘D’起始地址+1‘E’起始地址+11‘!’起始地址+2‘L’起始地址+12‘B’起始地址+3‘L’起始地址+13‘A’起始地址+4‘O’起始地址+14‘D’起始地址+5‘’起始地址+15‘C’起始地址+6‘W’起始地址+16‘Z’起始地址+7‘O’起始地址+17‘Y’起始地址+8‘R’起始地址+18‘X’起始地址+9‘L’起始地址+19‘W’2)使用DUP指令定義變量DUP與變量定義指令配合可以重復(fù)定義數(shù)據(jù)。指令格式:重復(fù)的次數(shù)DUP(重復(fù)定義的內(nèi)容)功能:重復(fù)的次數(shù)用于說明需要定義多少次括號中的重復(fù)定義的內(nèi)容,常用于為變量預(yù)留存儲空間。例如:ST1 DB10DUP(0) ST2 DW2,2DUP(?) ST3 DB2DUP(0,1,2,3) ;定義ST1為10個值為0的字節(jié);定義ST2為1個值2和2個不確定數(shù)值的字型變量;定義ST3為0,1,2,3,0,1,2,3共8個字節(jié)型變量3)變量屬性指令在數(shù)據(jù)定義中變量具有5種屬性,可以用偽指令來獲得變量的相關(guān)屬性信息。這5種屬性分別是:①段屬性格式:SEG變量功能:獲得該變量所在的段地址值。②偏移地址屬性格式:OFFSET變量功能:獲得變量所在段中的偏移地址值。③類型屬性格式:TYPE變量功能:獲得變量定義的類型。類型以字節(jié)的整數(shù)倍表示,字節(jié)型TYPE結(jié)果為1,字型TYPE結(jié)果為2,雙字型TYPE結(jié)果為4,8字節(jié)型TYPE結(jié)果為8,10字節(jié)型TYPE結(jié)果為10。④長度屬性格式:LENGTH變量功能:獲得變量定義的數(shù)據(jù)元素個數(shù)。該指令只有使用DUP定義變量時才能夠得出有效的元素個數(shù),否則將得出長度為1。⑤大小屬性格式:SIZE變量功能:獲得變量定義時占用的內(nèi)存空間大小,以字節(jié)為單位表示。例如: BUF1 DB 1,2,3,4,5 BUF2 DB 5DUP(?)

BUF3 DW 5DUP(?)

BUF4 DW 1,2,3,4,5并設(shè)該數(shù)據(jù)段起始地值為1000H,BUF1起始地址為0,則有指令結(jié)果SEG BUF11000HOFFSET BUF10TYPE BUF11LENGTH BUF11SIZE BUF11(1×1=1)指令結(jié)果SEG BUF21000HOFFSET BUF25TYPE BUF21LENGTH BUF25SIZE BUF25(5×1=5)指令結(jié)果SEG BUF41000HOFFSET BUF420TYPE BUF42LENGTH BUF41SIZE BUF42(1×2=2)指令結(jié)果SEG BUF31000HOFFSET BUF310TYPE BUF32LENGTH BUF35SIZE BUF310(5×2=10)4)變量類型指定指令PTR

在匯編程序中,不同類型的數(shù)據(jù)有不同的操作方式,有時定義的某個變量可能在使用時需要以另外一種類型進(jìn)行操作。如定義了變量 VAR1 DB 01H,02H如果程序中有指令MOV [1000H],VAR1,該指令執(zhí)行時會將字節(jié)數(shù)據(jù)01H傳送到偏移地址1000H所在的數(shù)據(jù)段內(nèi)存中,02H則沒有被傳送。如果希望將02H同時傳送,則可用指令:MOV [1000H],WORDPTRVAR12.符號定義偽指令編制源程序時,經(jīng)常把常量、變量、標(biāo)號、表達(dá)式用一個特定符號表示,以提高程序的靈活性和可讀性,這時可以使用符號定義語句。1)用EQU指令定義符號格式:符號EQU表達(dá)式功能:將表達(dá)式的值賦給EQU左邊的符號。表達(dá)式可以是常量、變量、標(biāo)號、數(shù)值或地址表達(dá)式。在程序中使用這里定義的符號名,則在匯編后將代換成表達(dá)式計算的實際數(shù)值。EQU指令定義的符號是不可以被再定義的,除非使用PURGE指令將此定義撤銷后重新定義。

2)用“=”號定義符號格式:符號=表達(dá)式功能:偽指令“=”與EQU指令功能相同,它們的區(qū)別在于等號語句定義的符號允許被修改,使用更加方便靈活。例如:有程序段包含以下兩條指令NUM EQU 20……NUM EQU 30如果沒有使用PURGE指令,則第二條指令“NUMEQU30”匯編時將出現(xiàn)符號重定義錯誤。如果希望繼續(xù)使用該符號名,則應(yīng)改為:NUM EQU20……PURGENUMNUM EQU303.段定義偽指令在匯編語言程序設(shè)計中,需要將存儲器分成若干段。段定義偽指令有SEGMENT、ENDS、ASSUME和ORG等。1)段定義語句格式:段名 SEGMENT[定位類型][,組合類型][,字長][,類別] …… ;(段體) 段名ENDS說明:任何一個邏輯段都是從SEGMENT語句開始,以ENDS語句結(jié)束。偽指令名SEGMENT和ENDS是本語句的關(guān)鍵字,不可以省略,且總是成對出現(xiàn)。語句中段名是必選項,而[定位類][,組合類][,字長][,類別]為可選項。定位類型:段的起始地址邊界PAGE——指定起始地址的低8位是0,稱頁邊界

XXXXXXXXXXXX00000000BPARA——指定起始地址的低4位是0,稱段邊界

XXXXXXXXXXXXXXXX0000BWORD——指定起始地址的低2位是0,稱字邊界

XXXXXXXXXXXXXXXXXX00BBYTE——指定起始地址為任意值。

XXXXXXXXXXXXXXXXXXXXBPARA為缺省方式組合類型:連接程序時設(shè)定本段與其它段的連接方式。(模塊化程序設(shè)計)PUBLIC:同名段依次連接起來,形成連續(xù)的段。COMMON:同名段共用同一段起始地址,相互重疊段的長度,為最長的段的長度。AT 表達(dá)式:定位在表達(dá)式所指定的段地址。(代碼段例外)STACK:同名段構(gòu)成一個連續(xù)的堆棧段,自動初始化SP。MEMORY:表示本段定位在所有段的地址之上,高地址處??杖保∟ONE)不與任何段相連接。各段有獨立段基址。(缺省方式)類別:用單引號括起來的字符串。分類名不超過40個字符,用于控制段的存放次序。MASM將所有分類名相同的邏輯段存放在連續(xù)的存儲空間中。字長:用于定義段中使用的偏移地址和寄存器的字長。只適用于設(shè)置386和486處理器的匯編語句段。有兩種字長選擇:

USE16:段字長為16位,最大段長為64KBUSE32:段字長為32位,最大段長為4GB在指定為386或486匯編程序時,若字長缺省時,默認(rèn)為USE32。2)段分配偽指令(ASSUME)

段分配偽指令用來完成邏輯段與段寄存器的分配。格式:ASSUME段寄存器:段名[,段寄存器:段名,…]功能:說明源程序中定義的邏輯段由哪個段寄存器去尋址。段寄存器可以是CS,SS,DS,ES,F(xiàn)S或GS。ASSUME是偽指令,是語言中的關(guān)鍵字,不可省缺;段寄存器名后面須有冒號。如果分配的段名不止一個,則應(yīng)用逗號分開。段名應(yīng)是用SEGMENT/ENDS偽指令定義過的段名。ASSUME語句放在代碼段內(nèi),作為代碼段的第一條指令。DATA SEGMENT ;定義一個名為DATA的邏輯段VAR1DB 00H,11H,22H,33H;定義一個變量名為VAR1DATA ENDS ;邏輯段DATA結(jié)束STAK SEGMENTSTACK ;定義一個名為STAK的堆棧段DW 100 DUP(0) ;定義段長度為200字節(jié)STAK ENDS ;STAK段結(jié)束 CODE SEGMENT ;定義一個名為CODE的邏輯段ASSUMECS:CODE,DS:DATA,SS:STAK ;對各段進(jìn)行段寄存器分配START:

…… ;CODE段內(nèi)程序CODE ENDS 3)段寄存器的裝入ASSUME語句只能在邏輯段和段寄存器之間建立聯(lián)系,不能將各段的段基值裝入對應(yīng)的段寄存器,段基值的裝入需要通過其他途徑完成。CS的裝入CS和IP用于指向程序中即將執(zhí)行的指令地址,由匯編程序負(fù)責(zé)裝入,但需要在編程時在代碼段第一行加入一個標(biāo)號,并在最后一行用END偽指令結(jié)束該標(biāo)號。例:CODE SEGMENT ;定義邏輯段CODEASSUMECS:CODE,…… ;分配段寄存器START: ;定義標(biāo)號START ……CODEENDS ;CODE段結(jié)束END START

;定義標(biāo)號START結(jié)束

DS、ES的裝入DS、ES段寄存器的裝入方式相同,即直接將段基址通過通用寄存器存入段寄存器即可。例如:DATAl SEGMENT ;定義邏輯段DATA1 ……DATAl ENDSDATA2 SEGMENT ;定義邏輯段DATA2 ……DATA2 ENDSCODE SEGMENT ;定義邏輯段CODEASSUMECS:CODE,DS:DATAl,ES:DATA2;分配段寄存器START: ;CODE段值將自動存入CSMOV AX,DATAl MOV DS,AX ;將DATA1段基址裝入DSMOV AX,DATA2 MOV ES,AX ;將DATA2段基址裝入ES ……CODE ENDS ……SS段寄存器的裝入SS段寄存器的裝入有兩種方法。①在段定義時將組合類型項定義為“STACK”,并在ASSUME語句中,將堆棧段分配給段寄存器SS。匯編后該堆棧段的基址將自動裝入到SS寄存器中。例如:SACK SEGMENT STACKDW 100 DUP(?)SACK ENDSCODE SEGMENTASSUME CS:CODE,SS:SACK;自動裝入SS,SP……②如果在段定義偽指令的組合類型中未選用“STACK”參數(shù),則可用程序?qū)崿F(xiàn)對SS和SP的裝入。例如:SACK2 SEGMENT DW 100 DUP(?) TOP LEBELWORDSACK2 ENDSCODESEGMENTASSUME CS:CODE,SS:SACK2 ……MOV AX,SACK2MOV SS,AX ;裝入SSMOV SP,OFFSETTOP ;裝入SP……4.過程定義偽指令在程序設(shè)計中,常把具有一定功能的程序段設(shè)計成一個子程序,或稱為過程。過程定義偽指令的格式如下:過程名PROC (NEAR/FAR) …… RET ……過程名ENDP其中過程名不可省缺,過程的開始(PROC)和結(jié)束(ENDP)應(yīng)使用同一個過程名。5.其它偽指令

1)LABEL偽指令LABEL偽指令用于給已定義的變量或標(biāo)號取一個別名,并可重新定義它的類型或距離屬性。LABEL偽指令的格式如下:名稱LABEL類型/距離例如:別名功能VARB LABEL BYTEVARW DW 1234H,5678H例如:改變調(diào)用距離FNEXT LABEL FARNEXT:MOV AX,[DX]2)屬性指定操作偽指令(THIS)格式: THIS類型THIS偽指令可以用來給一個地址中的數(shù)據(jù)定義新的類型。例如:VARB EQU THIS BYTEVARW DW 1234H,5678H3)定位偽指令(ORG)和當(dāng)前位置計數(shù)器($)在匯編程序時,為了指示程序中指令或數(shù)據(jù)在相應(yīng)段中的偏移地址,可使用定位偽指令和當(dāng)前位置計數(shù)器。①定位偽指令ORG 格式: ORG表達(dá)式例如: DATA SEGMENT ORG 10H VAR1 DB00H,10H,20H,30H

②當(dāng)前位置計數(shù)器$在匯編程序時,用$可以表示當(dāng)前位置計數(shù)器的現(xiàn)行值,方便程序編寫和地址計算。例如:DATA SEGMENTSTRING1 DB “BCDEFGHIACDFEB”COUNT=$-STING1DATA ENDS匯編時匯編程序?qū)⒆詣油瓿蒀OUNT的計算,得到STRING1串的長度。4)END偽指令END偽指令作為匯編語言源程序的結(jié)束語句,一般放在源程序的最后一行。一個程序模塊只允許有一個END語句。格式: END標(biāo)號名稱4.2.4匯編語言程序簡化段偽指令1)內(nèi)存模式語句(.MODEL)格式:.MODEL模式類型功能:指定數(shù)據(jù)和代碼允許使用的長度。模式類型也稱為內(nèi)存模式、尋址模式,它表示如何在內(nèi)存中為程序、數(shù)據(jù)、堆棧等分配空間并存取它們。有7種模式類型TINY:微模式。所有數(shù)據(jù)及代碼放在同一個物理段中,數(shù)據(jù)訪問都為NEAR類型,整個程序小于64KB,生成的可執(zhí)行文件擴(kuò)展名為,只在DOS操作系統(tǒng)下使用。SMALL:小模式。所有數(shù)據(jù)放在一個64KB的物理段中(包括數(shù)據(jù)和堆棧),所有代碼則放在另一個64KB的物理段中。MEDIUM:中模式。所有數(shù)據(jù)放在一個64KB的物理段中,代碼超過64KB時可以放在多個物理段中,程序中轉(zhuǎn)移或調(diào)用類型可以為FAR型。COMPACT:緊湊模式或壓縮模式。所有代碼放在一個64KB的物理段中,程序中的轉(zhuǎn)移或調(diào)用類型為NEAR。數(shù)據(jù)超過64KB時可以放在多個物理段中。LARGE:大模式。代碼和數(shù)據(jù)都可以超過64KB,可放在多個物理段中,數(shù)據(jù)和代碼都可以是遠(yuǎn)程訪問類型。HUGE:巨模式。數(shù)據(jù)段中單個數(shù)據(jù)項的大小可以超過64KB,代碼段允許超過64KB,即有多個代碼段和數(shù)據(jù)段,都允許遠(yuǎn)程訪問。FLAT:平面模式。所有代碼和數(shù)據(jù)被放在一個段中,但段內(nèi)地址不再是16位,而是32位,所以整個程序可達(dá)4GB大小。MASM6.0以上匯編程序支持,可以在WINDOWS操作系統(tǒng)下使用。2)段定義語句簡化段程序的段定義語句用偽指令方式定義不同類型的段,段不需要使用ENDS指令結(jié)束,由下一段定義開始或程序結(jié)束來表示。①代碼段定義格式:.CODE[段名]功能:表明其下面的指令是代碼段部分。段名用于區(qū)分不同的代碼段,省略情況下默認(rèn)段名為_TEXT。②數(shù)據(jù)段定義格式:.DATA[段名]/.DATA?[段名]/.CONST[段名]功能:表明其下面內(nèi)容是數(shù)據(jù)段定義的變量或存儲空間預(yù)留。一個源程序中可以有多個“.DATA”定義的

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論