匯編語言程序設(shè)計41~45節(jié)_第1頁
匯編語言程序設(shè)計41~45節(jié)_第2頁
匯編語言程序設(shè)計41~45節(jié)_第3頁
匯編語言程序設(shè)計41~45節(jié)_第4頁
匯編語言程序設(shè)計41~45節(jié)_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第4章匯編語言程序設(shè)計4.1.1匯編語句的種類和格式匯編語句可分為兩種,一種是指令語句,另一種是偽指令語句。匯編程序在對源程序進(jìn)行匯編時,把指令語句翻譯成對應(yīng)的機(jī)器指令,而偽指令被匯編程序直接執(zhí)行。指令語句的格式:

[標(biāo)號:]指令助記符[操作數(shù)[,操作數(shù)]][;注釋]偽指令語句的格式:

[名字]偽指令助記符[操作數(shù)[,操作數(shù)]][;注釋]4.1

匯編語言程序設(shè)計概述分析問題,弄清楚問題的性質(zhì)、目的、已知數(shù)據(jù)、運(yùn)算精度以及速度等方面的要求。確定算法,把實際問題轉(zhuǎn)化為計算機(jī)求解的步驟和方法。繪制程序流程圖。根據(jù)流程圖編寫程序。進(jìn)行靜態(tài)檢查。上機(jī)調(diào)試。4.1.2匯編語言程序設(shè)計一般步驟在匯編語言程序中,有以下四種基本結(jié)構(gòu):順序程序分支程序循環(huán)程序子程序這幾種程序的設(shè)計方法是匯編語言程序設(shè)計的基礎(chǔ)。4.1.3匯編語言程序的基本結(jié)構(gòu)1.常量常量是指那些在匯編源程序翻譯成目標(biāo)程序期間已經(jīng)有確定數(shù)值的量,可分為數(shù)值常量和符號常量。2.數(shù)值表達(dá)式由常量、符號常量以及運(yùn)算符組成,其運(yùn)算結(jié)果為數(shù)值常量。匯編語言允許對常量進(jìn)行三種類型的運(yùn)算:算術(shù)運(yùn)算、邏輯運(yùn)算、關(guān)系運(yùn)算。(1)算術(shù)運(yùn)算符算術(shù)運(yùn)算包括:加(+)、減(-)、乘(*)、除(/)、模除(MOD)。其中,模除(MOD)表示兩整數(shù)相除后取余數(shù)。

4.2.1數(shù)值表達(dá)式

4.2匯編語言的表達(dá)式例4-1已知符號常量NUM=51,求下列指令的匯編結(jié)果(表達(dá)式的值):MOVAX,NUM/9MOVAX,NUMMOD9MOVAX,NUM*5匯編的結(jié)果是:MOVAX,5MOVAX,6MOVAX,255

4.2.1數(shù)值表達(dá)式

(2)邏輯運(yùn)算符和移位運(yùn)算符邏輯運(yùn)算包括:邏輯乘(AND)、邏輯加(OR)、按位加(XOR)和邏輯非(NOT)。邏輯運(yùn)算是按位進(jìn)行的。移位運(yùn)算包括:右移(SHR)和左移(SHL),表示將二進(jìn)制常量右移或左移運(yùn)算符右邊所規(guī)定的位數(shù),所空出的位均補(bǔ)0。

4.2.1數(shù)值表達(dá)式例4-2求下列指令匯編的結(jié)果。MOVAL,4CHSHL2MOVAL,NOT0FFHANDAL,4CHAND0F0HXORAL,4CHXOR0FFH匯編的結(jié)果是:MOVAL,30HMOVAL,0ANDAL,40HXORAL,0B3H

4.2.1數(shù)值表達(dá)式(3)關(guān)系運(yùn)算符關(guān)系運(yùn)算包括:相等(EQ)、不等(NE)、小于(LT)、大于(GT)、小于等于(LE)和大于等于(GE)。它們的運(yùn)算結(jié)果是兩個特殊的常量,若關(guān)系不成立,結(jié)果為0;否則結(jié)果為0FFH或0FFFFH。

4.2.1數(shù)值表達(dá)式例4-3求下列指令匯編的結(jié)果。MOVAL,4CHEQ2MOVAL,4CHGT1匯編的結(jié)果是:MOVAL,0MOVAL,0FFH

4.2.1數(shù)值表達(dá)式

4.2.1數(shù)值表達(dá)式3.變量

變量是一個數(shù)據(jù)存儲單元的名字,即數(shù)據(jù)存放單元地址的符號表示。變量由4.3節(jié)介紹的數(shù)據(jù)定義偽指令定義,也可以用LABEL或EQU偽指令來定義,一般在除代碼段以外的其它段中定義。由于主存是分段使用的,所定義的變量體現(xiàn)出以下三種屬性:(1)段屬性。(2)偏移屬性。(3)類型屬性。

4.2.1數(shù)值表達(dá)式4.標(biāo)號

標(biāo)號是機(jī)器指令語句存放單元地址的符號表示,也可以是過程名。標(biāo)號在代碼段中定義,用于機(jī)器指令之前,并用冒號“:”作為分隔符,它也可以用LABEL或EQU偽指令來定義。由于標(biāo)號代表了指令的符號地址,因此它也有三個屬性:(1)段屬性。(2)偏移屬性。(3)類型屬性。地址表達(dá)式是由變量、標(biāo)號、常量、寄存器(BP、BX、SI、DI)間址的內(nèi)容(用寄存器名加方括號表示)和運(yùn)算符組成。地址表達(dá)式的值一般是偏移地址具有段、偏移地址及類型三個屬性。地址表達(dá)式的運(yùn)算符可以使用數(shù)值表達(dá)式的運(yùn)算符,也可以使用屬性運(yùn)算符和數(shù)值回送操作符。

4.2.2地址表達(dá)式1.數(shù)值回送操作符①取類型算符TYPE格式為:TYPE變量或標(biāo)號如果TYPE后面跟的是變量,則匯編程序?qū)⒒厮驮撟兞款愋偷淖止?jié)數(shù):字節(jié)類型為1,字類型為2,雙字類型為4,4字類型為8,10字節(jié)類型為10。如果是標(biāo)號,則匯編程序?qū)⒒厮痛碓摌?biāo)號類型的數(shù)值:NEAR型為-1(0FFFFH),F(xiàn)AR型為-2(0FFFEH)。

4.2.2地址表達(dá)式②取變量所含的數(shù)據(jù)存儲單元個數(shù)算符LENGTH格式為:LENGTH變量返回利用DUP定義的數(shù)組中元素的個數(shù),即重復(fù)操作符DUP前的整數(shù)n值。如果變量定義語句中沒有使用DUP,則返回1。如果嵌套使用了DUP,則只返回最外層的重復(fù)數(shù)。

4.2.2地址表達(dá)式③取變量所含的數(shù)據(jù)存儲區(qū)大小算符SIZE格式為:SIZE變量它的取值為該變量所占數(shù)據(jù)存儲區(qū)的字節(jié)數(shù)。SIZE算符與LENGTH算符的關(guān)系是:LENGTH變量×TYPE變量,即等于上述兩種算符取值的乘積。

4.2.2地址表達(dá)式④取偏移地址算符OFFSET格式為:OFFSET變量或標(biāo)號它的取值為其后變量或標(biāo)號的偏移地址。⑤取段地址算符SEG格式為:SEG變量或標(biāo)號它的取值為其后變量或標(biāo)號所在段的段地址。

4.2.2地址表達(dá)式2.屬性操作符①類型運(yùn)算符PTR格式為:類型PTR地址表達(dá)式其中類型字段表示所賦予的新的類型屬性,對于變量可以是BYTE、WORD、DWORD,對于標(biāo)號可以是NEAR、FAR。例如指令:MOV[BX],0FFH兩操作數(shù)類型均不明確,應(yīng)寫成:MOV[BX],WORDPTR0FFH

4.2.2地址表達(dá)式②段操作符“:”格式為:段寄存器名:地址表達(dá)式或:段名:地址表達(dá)式③短轉(zhuǎn)移算符SHORT例如:JMPSHORTTAG④定義類型算符THIS格式為:THIS類型⑤字節(jié)分離算符HIGH和LOW格式為:HIGH/LOW常量或地址表達(dá)式

4.2.2地址表達(dá)式運(yùn)算符的優(yōu)先級別,從高到低排列如下:①括號的項。②LENGTH,SIZE。③PTR,OFFSET,SEG,TYPE,THIS及段操作符“:”④HIGH,LOW⑤*,/,MOD,SHL,SHR⑥+,-⑦EQ,NE,LT,LE,GT,GE。⑧邏輯運(yùn)算:NOT,AND,OR,XOR。⑨SHORT。

4.2.2地址表達(dá)式4.3.1數(shù)據(jù)定義的偽指令

語句格式:[變量名]數(shù)據(jù)定義偽指令表達(dá)式1[,表達(dá)式2,...][;注釋]功能:定義一數(shù)據(jù)存儲區(qū),其類型由所使用的數(shù)據(jù)定義偽指令指定。變量名是可選的,需要時由用戶自己命名。它是該數(shù)據(jù)區(qū)的符號地址,也是其中第一個數(shù)據(jù)項的偏移地址。程序可以通過變量名引用其中的數(shù)據(jù)。常用的數(shù)據(jù)定義偽指令有DB(字節(jié))、DW(字)、DD(雙字)、DQ(8字節(jié))、DT(10字節(jié))。

4.3偽指令例4-4畫出以下數(shù)據(jù)定義偽指令定義的數(shù)據(jù)存儲形式。CRDB0DHLFDB0AHDATADW100,100H,-5語句格式:符號名EQU表達(dá)式功能:用來為常量、表達(dá)式以及其它各種符號定義一個等價的符號名,但它并不申請分配存儲單元。1.等價偽指令

4.3.2符號定義的偽指令

用法①:定義一個常量符號。例如:用EQU定義的符號常量:AEQU5BEQUA*3+2用法②:與特殊運(yùn)算符PTR或THIS連用,可以給變量或標(biāo)號定義新的類型屬性并重新命名,但其段屬性和偏移地址屬性不變。例4-5某程序的數(shù)據(jù)段中有如下幾條偽指令語句,試分析各變量的屬性。DATA SEGMENTDDBUF EQUTHISDWORDBUF DB100DUP(?)DWBUF EQUWORDPTRBUFDATA ENDS...FIRSTEQUTHISFAR

4.3.2符號定義的偽指令

用法③:為較復(fù)雜的表達(dá)式及源程序中的任何符號定義一個替換名。例如:MOVEEUQMOVCOUNTEUQCXSUM(X,Y)EUQX+Y則下列指令等價于:MOVEAX,BX;等價于:MOVAX,BXMOVCOUNT,100;等價于:MOVCX,100ADDAX,SUM(30,50);等價于:ADDAX,80

4.3.2符號定義的偽指令

語句格式:符號名=表達(dá)式功能:該語句的功能與EQU語句類似,但有一個區(qū)別:EQU不能重復(fù)定義符號名,而等號語句能對所定義的符號名再重新定義,給它賦予新的值。同一符號多次定義時,以最后一次定義的值為準(zhǔn)。2.等號偽指令

4.3.2符號定義的偽指令

語句格式:變量名或標(biāo)號LABEL類型功能:為當(dāng)前存儲單元定義一個指定類型的變量或標(biāo)號。它的功能與語句“變量名或標(biāo)號EQUTHIS類型”的功能相似。3.定義符號偽指令

4.3.2符號定義的偽指令

語句格式:ORG數(shù)值表達(dá)式功能:將匯編地址計數(shù)器設(shè)置成數(shù)值表達(dá)式的值。例4-6指出下列程序段中變量BUF和NUM的偏移地址是多少?ORG10;設(shè)置$的值為10

BUFDB‘ABCD’;變量BUF的偏移地址為10ORG$+5;$的值增加5NUMDW50;NUM的偏移地址為191.置匯編地址計數(shù)器偽指令ORG

4.3.3其它功能偽指令

偶地址偽指令EVEN的功能是把地址計數(shù)器調(diào)整為偶數(shù)。在匯編數(shù)據(jù)定義語句或指令語句時,如地址計數(shù)器現(xiàn)行位置為奇數(shù),則在匯編的目標(biāo)代碼中自動插入一條無操作指令NOP,如地址計數(shù)器已為偶數(shù),那么匯編程序不作任何操作。EVEN偽指令的使用格式為:

EVEN2.偶地址偽指令EVEN

4.3.3其它功能偽指令

INCLUDE偽指令把指定的文件插入正在匯編的源程序中,作為源程序的一個組成部分。INCLUDE偽指令的使用格式為:INCLUDE源程序文件名3.INCLUDE偽指令

4.3.3其它功能偽指令

PUBLIC偽指令用于定義全局符號,包括標(biāo)號、FAR類型的過程名、變量名、常數(shù)名等。PUBLIC偽指令的使用格式為:

PUBLIC符號1,符號2,……4.PUBLIC偽指令

4.3.3其它功能偽指令

EXTRN偽指令用于告訴匯編程序,本語句說明的這些符號沒有在本程序模塊中定義,是由其它程序模塊定義的,且在定義模塊中用PUBLIC偽指令說明。EXTRN偽指令的使用格式為:

EXTRN符號1:類型,符號2:類型,……5.EXTRN偽指令

4.3.3其它功能偽指令

TITLE偽指令是給程序指定一個標(biāo)題,以便在列表文件中每一頁的第二行都顯示這個標(biāo)題文本。TITLE偽指令使用格式為:TITLE文本6.TITLE偽指令

4.3.3其它功能偽指令

4.3.4匯編語言程序結(jié)構(gòu)例4-7編程實現(xiàn)123+456→SUM單元的功能。要求使用﹒EXE文件結(jié)構(gòu)。匯編源程序1:STSGSEGMENTSTACK‘S’;行1DW32DUP(?);行2STSGENDS;行3DATASEGMENT;行4ADW123;行5BDW456;行6SUMDW?;行7DATAENDS;行8CODESEGMENT;行9MAINPROCFAR;行10ASSUMECS:CODE,DS:DATA,SS:STSG;行11PUSHDS ;行12XORAX,AX ;行13PUSHAX;行14MOVAX,DATA;行15MOVDS,AX ;行16

4.3.4匯編語言程序結(jié)構(gòu)MOVAX,A;行17ADDAX,B ;行18MOVSUM,AX ;行19RET ;行20MAINENDP ;行21CODEENDS;行22ENDMAIN;行234.3.4匯編語言程序結(jié)構(gòu)語句格式:段名SEGMENT[定位方式][組合方式][‘類別’]...段名ENDS功能:定義一個以SEGMENT偽指令開始,以ENDS偽指令結(jié)束,以“段名”命名的存儲器段。

1.段定義偽指令

4.3.4匯編語言程序結(jié)構(gòu)語句格式:ASSUME段寄存器:段名[,段寄存器:段名...]功能:該語句一般出現(xiàn)在代碼段中,且在段的開始出現(xiàn),用來設(shè)定段寄存器與段之間的對應(yīng)關(guān)系。在程序中使用這條語句的話,宏匯編程序就將這些段作為當(dāng)前可訪問的段處理。2.ASSUME偽指令

4.3.4匯編語言程序結(jié)構(gòu)語句格式:過程名PROC屬性

...

過程名ENDP過程名是子程序入口的符號地址,可以是任意合法的字符串。屬性有近屬性(NEAR)和遠(yuǎn)屬性(FAR),段內(nèi)調(diào)用的過程使用NEAR屬性,段間調(diào)用的過程使用FAR屬性。過程是程序的一部分,通常也叫子程序。一個過程可以被其它程序調(diào)用,它的最后一條語句總是返回指令。過程調(diào)用和返回指令可用CALL和RET指令。

3.過程定義偽指令

4.3.4匯編語言程序結(jié)構(gòu)語句格式:END<表達(dá)式>源程序結(jié)束偽指令是源程序的結(jié)束標(biāo)志,匯編程序匯編到該偽指令結(jié)束,通常為源程序的最后一條語句。其中表達(dá)式為可選項。表達(dá)式必須為一存儲器地址,該地址為程序的啟動地址,即該程序在計算機(jī)上運(yùn)行時第一條被執(zhí)行指令的地址。如果不帶表達(dá)式,表明該程序模塊不能單獨運(yùn)行,而作為子模塊讓其它程序調(diào)用。4.程序結(jié)束偽指令

4.3.4匯編語言程序結(jié)構(gòu)初始化后,DS和ES并沒有指向用戶自己的數(shù)據(jù)區(qū),而是指向PSP的段基址。但在用戶程序運(yùn)行過程中,DS應(yīng)指向用戶程序自己的數(shù)據(jù)段以便訪問其中的內(nèi)容,例如上例中訪問A、B和SUM變量。同理,ES也應(yīng)設(shè)置為正確的位置。所以,編程人員應(yīng)在程序中用指令為DS和ES寄存器賦值。因為立即數(shù)不能直接傳送段寄存器,所以用以下語句為DS賦值:MOVAX,DATAMOVDS,AX如果程序中用到了附加段,也要在程序中用同樣的方法為它們賦值。

5.

段寄存器的裝填4.3.4匯編語言程序結(jié)構(gòu)6程序返回操作系統(tǒng)(1)利用PSP中的INT20H返回DOSMAINPROCFAR…PUSHDS

XORAX,AX

PUSHAX

…RETMAINEND4.3.4匯編語言程序結(jié)構(gòu)(2)利用DOS的4CH系統(tǒng)功能調(diào)用返回DOS目前返回DOS通常使用4CH系統(tǒng)功能調(diào)用,這種方法實現(xiàn)起來比較簡單,可用以下語句實現(xiàn):MOVAH,4CHINT21H4.3.4匯編語言程序結(jié)構(gòu)源程序2:STSGSEGMENTSTACK‘S’DW32DUP(?)STSGENDSDATASEGMENTADW123BDW456SUMDW?DATAENDS4.3.4匯編語言程序結(jié)構(gòu)CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STSGSTART:MOVAX,DATA

MOVDS,AXMOVAX,AADDAX,BMOVSUM,AXMOVAH,4CHINT21HCODEENDSENDSTART4.3.4匯編語言程序結(jié)構(gòu)

4.4.1

宏定義定義格式:宏指令名MACRO形式參數(shù)[,形式參數(shù),...]

宏體

ENDM例如:ADD3MACROX,Y,ZADDX,YADDX,ZENDM4.4宏指令

4.4.2

宏調(diào)用宏調(diào)用的格式:宏指令名<實參1,實參2,...>注意宏指令的參數(shù)沒有類型,只是一種符號替換,如果替換后的語句有錯誤,則宏擴(kuò)展時系統(tǒng)會給出提示。4.4.3宏擴(kuò)展宏擴(kuò)展由匯編程序在匯編的過程中在宏調(diào)用的地方用宏體代替宏指令,實參代替形參。例如:已定義了宏指令A(yù)DD3,在源程序中進(jìn)行如下調(diào)用:ADD3AX,BX,CX宏擴(kuò)展后的形式為:+ADDAX,BX+ADDAX,CX符號“+”用于標(biāo)志宏擴(kuò)展的語句。4.4.4宏定義與宏調(diào)用中的參數(shù)1.帶間隔符的實參在宏調(diào)用中,有時實參是一串帶間隔符(如空格、逗號等)的字符串,為了不至于混淆,應(yīng)用尖括號將它們括起來,作為一個實參。例如:STACK0<500DUP(0)>,尖括號的內(nèi)容為一個實參。2.數(shù)字參數(shù)

在某些情況下,需要以實參的值而不是符號本身代替形參,這種參數(shù)的替換稱為數(shù)字參數(shù)的替換。特殊宏操作符%用來將其后的表達(dá)式轉(zhuǎn)換成它所代表的數(shù)值,并將此數(shù)值的ASCII碼字符嵌入到宏擴(kuò)展中。4.4.4宏定義與宏調(diào)用中的參數(shù)3.宏體中的變量與標(biāo)號在某些宏定義中,常常需要定義一些變量或標(biāo)號,當(dāng)這些宏定義在同一程序中多次調(diào)用并進(jìn)行宏擴(kuò)展后,就會出現(xiàn)變量或標(biāo)號重復(fù)定義的錯誤。為了解決這個問題,8086宏匯編語言提供了偽指令LOCAL。語句格式:LOCAL標(biāo)號和變量表功能:在宏擴(kuò)展時,宏匯編程序自動將用LOCAL說明的變量或標(biāo)號表示為唯一的特殊符號(??0000~??FFFFH),從而避免了符號重復(fù)定義的錯誤。LOCAL語句只能作為宏體的第一條語句,它后面即為宏定義的變量和標(biāo)號表。

4.5.1概述4.5系統(tǒng)功能調(diào)用圖4-2系統(tǒng)功能調(diào)用過程

4.5.2常用的輸入/輸出系統(tǒng)功能調(diào)用1.鍵盤輸入(1號調(diào)用)

調(diào)用格式:

MOVAH,1 INT21H功能:等待從鍵盤輸入一個字符并將輸入字符的ASCII碼送入寄存器AL中。2.顯示輸出(2號調(diào)用)

調(diào)用格式:

MOVDL,待顯示字符的ASCII碼

MOVAH,2 INT21H功能:將DL中的字符送顯示器顯示,若DL中為<CTRL>+<Break>的ASCII碼,則從本調(diào)用的執(zhí)行

溫馨提示

  • 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

提交評論