第5章匯編語言程序設(shè)計(jì)_第1頁
第5章匯編語言程序設(shè)計(jì)_第2頁
第5章匯編語言程序設(shè)計(jì)_第3頁
第5章匯編語言程序設(shè)計(jì)_第4頁
第5章匯編語言程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩115頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第五章匯編語言程序設(shè)計(jì)5.1匯編語言語句的類型和組成5.2偽操作命令5.3

DOS系統(tǒng)功能調(diào)用和BIOS中斷調(diào)用5.4匯編語言程序設(shè)計(jì)第五章匯編語言程序設(shè)計(jì)5.1匯編語言語句的類型和組成5.1.1匯編語言語句的類型

在匯編語言中我們不僅要知道指令系統(tǒng),而且還必須了解匯編語言語句的組成和類型,了解匯編語言中的編寫程序的格式以及格式中各個部分的意義,以便我們能夠編寫出正確的源程序。

匯編語言有自身的語法規(guī)則,匯編語言源程序中有3種基本語句:①指令性語句(由CPU指令組成);②指示性語句(偽指令語句)和宏指令語句。指令性語句和指示性語句是最基本的語句,也是最常用的語句。①指令性指令是給CPU的命令,它是由匯編程序翻譯成機(jī)器語言指令,在程序運(yùn)行時由CPU來執(zhí)行,每條指令都對應(yīng)CPU一種特定的操作,例如:算術(shù)運(yùn)算、邏輯運(yùn)算、串操作等;而偽指令是給匯編程序的命令,偽指令不匯編成機(jī)器語言,僅僅在匯編過程中告訴匯編程序應(yīng)如何匯編。在匯編中由匯編程序進(jìn)行處理,例如:定義數(shù)據(jù)分配,定義過程等。②指令性指令匯編以后,每條指令都產(chǎn)生其對應(yīng)的機(jī)器代碼;而偽指令則不產(chǎn)生與之對應(yīng)的機(jī)器代碼。

宏指令是使用者利用上述基本語句自己定義的新的指令。二者的區(qū)別是:例:5個連續(xù)字節(jié)單元的累加DATA SEGMENT ;定義數(shù)據(jù)段D1 DB5DUP(?) ;連續(xù)的字節(jié)單元CC EQU$-D1 ;對單元計(jì)數(shù)SUM DW0 ;為結(jié)果保留一個字DATA ENDS ;數(shù)據(jù)段定義結(jié)束STACKSEGMENTPARASTACK‘STACK’ ;定義堆棧段

DB100DUP(?) ;100字節(jié)的??臻gSTACK ENDS ;堆棧段定義結(jié)束CODE SEGMENT ;定義代碼段ASSUMEDS:DATA,SS:STACK,CS:CODE ;對各段進(jìn)行說明BEGIN:MOVAX,DATA ;DS初始化為DATA MOVDS,AX LEASI,D1 ;預(yù)置源數(shù)據(jù)的指針匯編語言程序結(jié)構(gòu)特點(diǎn)定義存儲單元的數(shù)據(jù)偽指令定義堆棧段定義語句作堆棧用的存儲單元指令

MOVCX,CC+1 ;預(yù)置次數(shù)

CLD;(DF)=0,串指針自動增量

LODSBYTEPTR[SI] ;取一個數(shù)并修改指針

DECCX ;修改次數(shù)

MOVAH,0 ;清AX的高字節(jié)

CLC ;清CF位AGAN:ADCSUM,AX ;累加

LODSBYTEPTR[SI] ;再取數(shù)并修改指針

LOOPAGAN ;控制循環(huán)

MOVAH,4CH ;完成,返回DOS INT21HCODE ENDS ;代碼段結(jié)束

END BEGIN ;整個程序結(jié)束段定義匯編程序結(jié)束

源程序的一般格式代碼段是必需的。每段必須有且僅有一個名字,以SEGMENT定義段的起始,以ENDS定義段的結(jié)束,整個程序結(jié)束后需以END收尾。源程序的一般格式為: 段名1 SEGMENT

語句

語句 段名1 ENDS

段名2 SEGMENT

語句

語句 段名2 ENDS … END (標(biāo)號)匯編語言源程序的結(jié)構(gòu)段名1SEGMENT

語句行

……

語句行段名1ENDS段名2SEGMENT

語句行

……

語句行段名2ENDS……END標(biāo)號或過程名一個源程序由若干段組成,如數(shù)據(jù)段、代碼段、堆棧段等;各段由若干條語句行組成;指令必須放在代碼段中;為了確保程序的執(zhí)行和正確返回,必須借助堆棧段;根據(jù)編程需要確定是否需要數(shù)據(jù)段、附加段。5.1.2匯編語言語句的組成1.指令性語句:即執(zhí)行性語句(指令)包括四部分:[標(biāo)號:]指令操作碼[操作數(shù)][;注釋]例:AGAN:ADCSUM,AX ;累加2.指示性語句:即說明性語句(偽指令),由四部分組成:[名字]偽指令[操作數(shù)][;注釋]例:SUM DW0 ;為結(jié)果保留一個字

匯編語言的語句行

指令性語句

指令,與機(jī)器碼一一對應(yīng)。

指示性語句

偽指令,可以對源程序進(jìn)行指示、說明、定義等。注釋語句

以分號開始,整行均是對程序的注解,增強(qiáng)可讀性。本身不參與匯編,對指令代碼無任何貢獻(xiàn)。匯編語言的語句行構(gòu)成

指令性語句[指令標(biāo)號:]指令助記符[操作數(shù)1[,操作數(shù)2]];注釋

指示性語句——偽指令[名字]偽指令助記符[參數(shù)1[,參數(shù)2,…,參數(shù)n]];注釋匯編語言中的字符集字符

A~Z或a~z

注:匯編源程序中,大小寫字符功能一樣數(shù)字

0~9

注:數(shù)字不用于標(biāo)識符的第一位特殊符號

?、/、%等注:標(biāo)識符中謹(jǐn)慎使用特殊符號1、匯編語句的說明匯編語言中的保留字匯編源程序中標(biāo)識符不能使用的字符串寄存器名例:AX、SP

標(biāo)志符例:CF、TF

指令助記符例:MOV、ADD

偽指令符例:SEGMENT、END

運(yùn)算符例:OFFSET、PTR標(biāo)識符——由編程人員自行定義的、有特殊意義的字符序列。

標(biāo)識符的使用可使用字母、數(shù)字、特殊字符(?@$_)不能使用保留字!符合字符集要求不用數(shù)字開頭,第一個符號最好用字母長度小于32個字符

標(biāo)識符的作用用作段名、過程名、結(jié)構(gòu)名、宏名等的定義用作變量名,數(shù)據(jù)段符號地址的定義用作代碼段標(biāo)號

標(biāo)識符(標(biāo)號、符號地址、變量名)標(biāo)識符數(shù)據(jù)段中的標(biāo)識符符號地址具有存儲地址值和數(shù)據(jù)類型的特征代碼段中的標(biāo)識符偽指令前的標(biāo)號定義——變量指令前的標(biāo)號定義——標(biāo)號:標(biāo)識符與常量

MOVAL,F8H(AL)=(F8H),從符號地址中取數(shù)

MOVAL,0F8H(AL)=F8H,常數(shù)F8H賦值

常量

整數(shù):必須以數(shù)字開頭!二進(jìn)制數(shù)——以“B”結(jié)尾八進(jìn)制數(shù)——以“O”或“Q”結(jié)尾十進(jìn)制數(shù)——不帶結(jié)尾字母,或以“D”結(jié)尾十六進(jìn)制數(shù)——以“H”結(jié)尾

字符串連續(xù)的字節(jié)單元,每個單元均存放ASCII碼。用包括在單引號中的字母表示(單引號本身不算作字符)。如‘ABCDEF’,對應(yīng)的數(shù)值依次是61H~66H。常量——出現(xiàn)在源程序中指令操作數(shù)的位置,具有固定值的數(shù)值。

變量和標(biāo)號

段基址:該單元所在段的首址,用相應(yīng)的段寄存器值表示(16位)偏移量:該單元在段內(nèi)的偏移量或有效地址,表示與段首地址之間的距離(16位)類型:該單元中存放的數(shù)據(jù)長度類型,可能是字節(jié)(Byte)、字(Word)或雙字(DoubleWord)等,對應(yīng)于類型值1、2、4變量——編程人員為內(nèi)存單元起的名字。有3種屬性:標(biāo)號——編程人員為目標(biāo)地址單元起的名字,對應(yīng)于該指令在代碼段中的存放地址。也有3種屬性,僅類型與變量不同:

類型:標(biāo)號的類型共有遠(yuǎn)(Far)、近(Near)兩種,類型值分別是-2、-12

、表達(dá)式與運(yùn)算符表達(dá)式——由運(yùn)算符和操作數(shù)組成的、具有確定結(jié)果的有意義的序列,可作為指令的操作數(shù)。運(yùn)算符——共有5類:算術(shù)運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符、分析運(yùn)算符、合成運(yùn)算符。操作數(shù)——常量、變量和標(biāo)號等均可參與運(yùn)算。對于地址指針,只能進(jìn)行加/減算術(shù)運(yùn)算。運(yùn)算規(guī)則——表達(dá)式的值由匯編程序在編譯的過程中自動完成計(jì)算,所得確定的運(yùn)算結(jié)果與操作碼一起被編譯成機(jī)器碼。匯編語言的運(yùn)算符算術(shù)運(yùn)算符:+、-、*、/、MOD、SHL、SHR邏輯運(yùn)算符:AND、OR、XOR、NOT關(guān)系運(yùn)算符:EQ、NE、LT、GT、LE、GE分析運(yùn)算符:SEG、OFFSET、TYPE、SIZE、LENGTH綜合運(yùn)算符:PTR、DS:、THIS、SHORT、HIGH、LOW算術(shù)運(yùn)算符數(shù)值表達(dá)式中可使用所有算術(shù)運(yùn)算符地址表達(dá)式僅使用+、-算術(shù)運(yùn)算符算術(shù)運(yùn)算符不影響標(biāo)志位例:完成80H+90H解:MOVAL,80H+90H;使用數(shù)值表達(dá)式

;(AL)=10H、CF=不變

MOVAL,80HADDAL,90H;使用加法指令

;(AL)=10H、CF=1算術(shù)運(yùn)算符的使用若以算術(shù)運(yùn)算表達(dá)式作為源操作數(shù),則整個表達(dá)相當(dāng)于立即數(shù);運(yùn)算結(jié)果(返回值)的長度由目操作數(shù)決定乘、除運(yùn)算不帶符號除法運(yùn)算的返回值為整數(shù)商表達(dá)式的運(yùn)算不影響標(biāo)志位

例:MOVAL,80H+90H相當(dāng)于MOVAL,10H80H+90H=10H由匯編程序完成;指令執(zhí)行后(AL)=10H,各標(biāo)志位不變。邏輯運(yùn)算符AND、OR、XOR、NOT

邏輯指令助記符與邏輯運(yùn)算符形同意不同邏輯指令助記符出現(xiàn)在指令語句的開始

AND

CX,00FFHAND10AEH

邏輯運(yùn)算符出現(xiàn)在指令語句的操作數(shù)段

ANDCX,00FFHAND10AEH

注:等價指令A(yù)NDCX,00AEH邏輯運(yùn)算符的使用若以邏輯運(yùn)算表達(dá)式作為源操作數(shù),則整個表達(dá)相當(dāng)于立即數(shù);運(yùn)算結(jié)果(返回值)的長度由目操作數(shù)決定除NOT之外,均為雙目運(yùn)算符表達(dá)式的運(yùn)算不影響標(biāo)志位

例:ANDCX,1F03HAND72B6H

相當(dāng)于ANDCX,1202H1F03H∧72B6H=1202H由匯編程序完成,各標(biāo)志位不變;CX∧1202H在執(zhí)行過程中完成。關(guān)系運(yùn)算符

EQ

相等關(guān)系

NE

不等關(guān)系

LT

小于關(guān)系

GT

大于關(guān)系

LE

小于等于關(guān)系

GE

大于等于關(guān)系

進(jìn)行關(guān)系判斷時,表達(dá)式中所有的數(shù)均視為無符號數(shù)關(guān)系運(yùn)算符EQ、NE、LT、GT、LE、GE

兩性質(zhì)相同的操作數(shù)的比較若關(guān)系正確為真(T),有全1

操作數(shù)若關(guān)系錯誤為假(F),有全0

操作數(shù)例:MOVBL,(PORTLT5)AND20H若PORT=2,(PORTLT5)=0FFH,為真

原式為MOVBL,20H若PORT=7,(PORTLT5)=00H,為假原式為MOVBL,00H關(guān)系運(yùn)算符的使用

關(guān)系運(yùn)算的返回值

若關(guān)系成立,即為真,返回全1(1個字)若關(guān)系不成立,即為假,返回全0(1個字)

例:MOVBX,(PORTLT5)AND20H

若PORT=2,(PORTLT5)=0FFFFH,為真原式相當(dāng)于MOVBX,0020H

若PORT=7,(PORTLT5)=0000H,為假原式相當(dāng)于

MOVBX,0000H分析運(yùn)算符分析運(yùn)算符(數(shù)值返回運(yùn)算符)的功能

SEG

符號地址段值屬性返回符

OFFSET符號地址偏移量值屬性返回符

TYPE符號地址中數(shù)據(jù)類型屬性返回符

LENGTHDUP重復(fù)次數(shù)返回符

SIZE

變量總字節(jié)數(shù)返回符分析運(yùn)算符

SEG

取變量/標(biāo)號的段基值

OFFSET取變量/標(biāo)號的段內(nèi)偏移量

TYPE取變量/標(biāo)號的類型值

LENGTH

取以DUP定義的變量的重復(fù)次數(shù)

SIZE取以DUP定義的變量的總字節(jié)數(shù)分析運(yùn)算符例:定義數(shù)據(jù)段DATA

如下:從實(shí)際地02000H開始存數(shù)據(jù),即段地址為0200H,段內(nèi)偏移地址從0000H開始

DATASEGMENTVAR1DB20,30VAR2DW2000H,3000HVAR3DD22003300HDATAENDS203000H20H00H30H00H33H00H22H段地址=0200H0000H0002H0006HVAR1VAR2VAR3分析運(yùn)算符SEG和OFFSET應(yīng)用MOVBX,SEGVAR1;(BX)=0200HMOVBX,SEGVAR2;(BX)=0200HMOVBX,SEGVAR3;(BX)=0200HMOVBX,OFFSETVAR1;(BX)=0000HMOVBX,OFFSETVAR2;(BX)=0002HMOVBX,OFFSETVAR3;(BX)=0006H分析運(yùn)算符TYPE的應(yīng)用返回變量數(shù)據(jù)類型所含的字節(jié)數(shù)

MOVBL,TYPEVAR1;(BL)=1MOVBL,TYPEVAR2;(BL)=2MOVBL,TYPEVAR3;(BL)=4

結(jié)構(gòu)名返回結(jié)構(gòu)所含字節(jié)數(shù)過程名返回近、遠(yuǎn)過程屬性表示值(-1,-2)

即:對標(biāo)號,返回標(biāo)號的屬性值

NEAR、FAR標(biāo)號的屬性值分別是-1、-2分析運(yùn)算符LENGTH和SIZE:只對DUP指令有效,否則為1定義數(shù)據(jù)段

DATASEGMENTVAR1DB100DUP(?)

VAR2DW100DUP(?)

DATAENDS指令功能

MOVBX,LENGTHVAR1;(BX)=100MOVBX,LENGTHVAR2;(BX)=100MOVBX,SIZEVAR1;(BX)=100MOVBX,SIZEVAR2;(BX)=200LENGTH和SIZE

已有變量定義

VAR1DW100DUP(?)

VAR2DB?,?,?,?

運(yùn)算符功能

MOVAX,LENGTHVAR1;(AX)=100MOVBX,SIZEVAR1;(BX)=200MOVCX,LENGTHVAR2;(CX)=1MOVDX,SIZEVAR2;(DX)=1設(shè)段的起始地址為02000HDATA SEGMENTDBYTE DB10,10HDWORD DW100,100HDDWORD DD12345678HDQWORD DQ1234567890ABCDEFHDBS DB‘AB’DWS DW‘AB’DWOFF DWOFFSETDWORDDATA ENDS例1:存儲器示意圖例2:DATA SEGMENTARRAY DB2DUP(0,1,2)ARRAY2 DW100DUP(?)ARRAY3 DB20DUP(0,1,4DUP(2),5)0A106400000178563412EFCDAB907856341241424241000102000102:::000102020202050001020202020200DBYTEDWORDDDWORDDBSDWSDQWORDDWOFFARRAYARRAY2100個字ARRAY3綜合運(yùn)算符綜合運(yùn)算符(屬性修改運(yùn)算符)

PTR

存儲器操作數(shù)重新定義類型運(yùn)算符

THIS

存儲器操作數(shù)重新定義類型運(yùn)算符

SHORT

頁內(nèi)跳轉(zhuǎn)運(yùn)算符

HIGH

字?jǐn)?shù)據(jù)中高字節(jié)數(shù)據(jù)分離符

LOW

字?jǐn)?shù)據(jù)中低字節(jié)數(shù)據(jù)分離符

ES:[]

段屬性前綴符PTR運(yùn)算符

PTR的使用

類型PTR變量、內(nèi)存單元或標(biāo)號作用給原有的操作數(shù)重新賦定類型。表達(dá)式結(jié)果返回一個與原有操作數(shù)具有相同的段基址和偏移量、不同類型的新操作數(shù),但并不另分配新的存儲單元!

可用的類型名稱(保留字)變量或內(nèi)存單元——BYTE、WORD、DWORD標(biāo)號——NEAR、FARPTR的應(yīng)用特點(diǎn)(MUL、DIV指令中的應(yīng)用)

MULBYTEPTR[BX];(AX)←(AL)*[BX]⑻MULWORDPTR[BX];(DX)(AX)←(AX)*[BX]⒃DIVBYTEPTR[SI];(AL)←(AX)/[SI]⑻DIVWORDPTR[SI];(AX)←(DX)(AX)/[SI]⒃PTR運(yùn)算符PTR的應(yīng)用特點(diǎn)(JMP指令中的應(yīng)用)

段內(nèi)間接近轉(zhuǎn)移

——CS不變、IP變存儲器中的16位值為段內(nèi)IP目的地址

JMPWORDPTR[BX]JMPWORDPTR[2000H]

段間間接遠(yuǎn)轉(zhuǎn)移

——CS變、IP變存儲器中的32位值為CS:IP目的地址

JMPDWORDPTR[BX]JMPDWORDPTR[2000H]PTR運(yùn)算符綜合運(yùn)算符PTR與THIS的應(yīng)用

PTR—先定義一個變量類型再用PTR

說明一個新的變量類型

VAR1DW2030H定義

VAR2EQUBYTEPTRVAR1說明

THIS—先用

THIS

說明一個變量類型再定義一個新的變量類型

VAR2EQUTHISBYTE

說明

VAR1DW2030H定義

應(yīng)用

MOVAL,VAR2正確MOVAL,VAR1錯誤

MOVAX,VAR1正確MOVAX,VAR2錯誤30H20HVAR1VAR2SHORT運(yùn)算符SHORT的使用

SHORT標(biāo)號作用將已有標(biāo)號說明為短標(biāo)號,以便于條件轉(zhuǎn)移指令使用。應(yīng)用AGAINEQUTHISNEAR ;AGAIN為NEAR標(biāo)號AGAIN:……JBESHORTAGAGIN;低于等于/不高于近轉(zhuǎn)移綜合運(yùn)算符HIGH、LOW的應(yīng)用

HIGH——分離字的高8位字節(jié)

LOW——分離字的低8位字節(jié)

應(yīng)用

MOVAH,BX;指令錯,源、目的操作數(shù)類型不匹配

MOVAH,HIGHBX;(AH)=(BH)

MOVAH,LOWBX;(AH)=(BL)HIGH、LOW運(yùn)算符

HIGH——取得常數(shù)或表達(dá)式(字)的高字節(jié)

LOW——取得常數(shù)或表達(dá)式(字)的低字節(jié)

應(yīng)用

MOVAL,HIGH2A3BH;(AL)=2AHMOVAH,LOW2A3BH;(AH)=3BH運(yùn)算符的優(yōu)先級別優(yōu)先級別運(yùn)算符高↑低()LENGTHSIZEPTRTHISOFFSETSEGTYPE段超越前綴HIGHLOW*/MOD+-EQNEGTGELTLENOTANDORXORSHORT

同一表達(dá)式內(nèi)可進(jìn)行多種運(yùn)算沒有括號時,按優(yōu)先級別進(jìn)行運(yùn)算同一優(yōu)先級的運(yùn)算,按從左到右的順序進(jìn)行8086匯編語言運(yùn)算符算術(shù)運(yùn)算符邏輯運(yùn)算符關(guān)系運(yùn)算符分析運(yùn)算符綜合運(yùn)算符+(加)-(減)*(乘)/(除)MOD(求余)SHL(左移)SHR(右移)AND(與)OR(或)XOR(異或)NOT(非)EQ(相等)NE(不相等)LT(小于)GT(大于)LE(小于或等于)GE(大于或等于)SEG(求段基址)OFFSET(求偏移量)TYPE(求變量類型)SIZE(求字節(jié)數(shù))LENGTH(求變量長度)PTR段屬性前綴THISSHORTHIGHLOW5.2偽操作命令數(shù)據(jù)類型定義偽指令段定義偽指令段說明偽指令過程定義偽指令符號定義偽指令EQU及=地址計(jì)數(shù)器偽指令$地址對準(zhǔn)器偽指令ORG數(shù)據(jù)類型定義偽指令DB(DefineByte)——變量為字節(jié)數(shù)據(jù)類型(8位)DW(DefineWord)——變量為字?jǐn)?shù)據(jù)類型(16位)DD

(DefineDWord)——變量為雙字?jǐn)?shù)據(jù)類型(32位)DQ(DefineQWord)

——變量為4字?jǐn)?shù)據(jù)類型(64位)DT(DefineTbyte)

——變量為10字節(jié)數(shù)據(jù)類型(80位)操作數(shù)可以為:(1)數(shù)值表達(dá)式;(2)ASCⅡ碼字符串;(3)地址表達(dá)式;(4)?(只保存內(nèi)存空間,未定義初始值);(5)DUP子句,其格式為:重復(fù)次數(shù)DUP(操作數(shù),…,操作數(shù)),DUP子句可以嵌套。數(shù)據(jù)類型定義偽指令變量定義偽指令的使用使用

[變量名]變量定義偽指令初值(表);為變量賦初值

[變量名]變量定義偽指令? ;保留空間常量、表達(dá)式均可作為初值DB的特殊用法

[變量名]DB字符串例:

DATA1 DW 7C00H DATA2 DD ? DB 3FH,66H,70H,TYPEDATA1 DATA3 DB ‘H72b9&!’DW、DD的特殊應(yīng)用

已有字節(jié)變量的定義:

AVR1DB?

可用DW為16位地址指針賦值:

DWAVRDWAVR1字變量DWAVR的值為AVR1的16位段內(nèi)偏移量

可用DD為32位地址指針賦值:

DDAVRDDAVR1雙字變量DDAVR的值為AVR1的邏輯地址(32位)數(shù)據(jù)類型定義偽指令DB、DW的應(yīng)用特點(diǎn)DATASEGMENTARE1DB20H,30HARE2DW2030HARE3DB‘A’,‘B’ARE4DW‘AB’DATAENDS20H30H30H20H41H42H42H41HARE1ARE2ARE3 ARE4數(shù)據(jù)類型定義偽指令DW、DD用于存儲器地址分配

DW分配16位地址

DWAVRDWOFFSETAVR1

變量DWAVR的類型為16位變量DWAVR的值為變量AVR1的16位偏移地址

DD分配32位地址

DDAVRDDAVR2

變量DDAVR的類型為32位變量DDAVR的值為變量AVR2的32位目標(biāo)地址

變量復(fù)制語句DUP()DUP的使用

[變量名]變量定義偽指令復(fù)制次數(shù)DUP(復(fù)制內(nèi)容)應(yīng)用

VARDW20HDUP(?) ;保留20H個字空間

XA DD3DUP(0) ;將連續(xù)3個雙字單元清0XB DB2DUP(0FFH,?,4,‘4’)TYPEVAR=2LENGTHVAR=20HSIZEVAR=40HTYPEXA=4LENGTHXA=3SIZEXA=12TYPEXB=1LENGTHXB=2SIZEXB=8數(shù)據(jù)類型定義偽指令存儲器地址分配的應(yīng)用DATASEGMENTORG0004HAVR1DW2030HAVR2DB40HDWVRDWOFFSETAVR1DDVRDDAVR2DATAENDS30H20H40H04H00H06H00H00H20HAVR1AVR2DWVRDDVR0004H0006H0007H0009H設(shè)DATA的段首地址為2000H段定義偽指令SEGMENT、ENDS段名標(biāo)識符

SEGMENT

[定位類型][組合類型][‘類別’]

〈段內(nèi)定義〉

段名標(biāo)識符

ENDS

用于對DS、ES、SS、CS段的定義段定義的相關(guān)約定組合類型:表示與其它段的關(guān)系,為連接程序提供信息,可以有6種選擇:定位類型:規(guī)定段的起始邊界,有4種選擇:PAGE:段起始地址的最低8位必須為0。PARA:段起始地址的最低4位必須為0。WORD:段起始地址的最低1位必須為0,即從偶地址開始。BYTE:段起始地址為任意值,即從任何地址開始都行。缺省類型為PARA。NONE:本段與其它段邏輯上不發(fā)生關(guān)系,每段都有自己的基地址(缺省選擇)。PUBLIC:連接程序首先將本段與其它同名同類別的段相鄰地連接在一起,然后為所有這些PUBLIC段指定一個共同的段基址。連接的先后次序由連接命令指定。STACK:與PUBLIC同樣處理,但此段作為堆棧段,SS指向第一個STACK段。COMMON:本段與其它同名同類別段重疊,段基址與最后定義的相同,長度為同名段中最大段的長度。AT表達(dá)式:連接程序把本段裝在表達(dá)式值所指定的段地址(此方式不能指定代碼段)。MEMORY:同PUBLIC連接程序?qū)⒈径味ㄎ辉诒贿B接在一起的其它所有段之上。類別:給各段的名字信息,連接程序?qū)㈩悇e名相同的段組成一個段組用它們共同的名字作為這個段組的名字。類別必須用單引號括起來。段定義的相關(guān)約定例:STACK SEGMENTPARASTACK‘STACK’段說明偽指令A(yù)SSUMEASSUME偽指令僅用在代碼段首行代碼段名SEGMENT[相關(guān)約定]

ASSUMECS:段名,DS:段名,…〈代碼段內(nèi)定義,指令集合〉代碼段名ENDS例:ASSUMEDS:DATA,SS:STACK,CS:CODE過程定義偽指令PROCFAR、ENDP——遠(yuǎn)過程定義偽指令PROCNEAR、ENDP——近過程定義偽指令過程名PROCFAR(NEAR)

〈過程指令集合〉

RET過程名ENDP注:過程定義必須在代碼段內(nèi)

PROCFAR為定義遠(yuǎn)過程

PROCNEAR為定義近過程符號定義偽指令EQU、=格式符號EQU

表達(dá)式符號=

表達(dá)式注:符號而非變量,故用EQU、=定義的符號不占用存儲器單元特點(diǎn)

EQU

不能重復(fù)定義

=

可重復(fù)定義,如X=X+1符號定義偽指令的基本形式為:符號名EQU表達(dá)式符號名=常數(shù)表達(dá)式功能:給表達(dá)式指定一個等價的符號名。說明:(1)=后的表達(dá)式只能是常數(shù),對于字符或字符串,在匯編時按整數(shù)處理。(2)

EQU后的表達(dá)式可以是數(shù)值、字符串,甚至可以是寄存器名、指令的助記符等。(3)EQU不能重復(fù)定義,而“=”偽指令可以重復(fù)定義,其作用域從定義點(diǎn)到重新定義之前。符號定義偽指令EQU、=符號定義偽指令例DATASEGMENTARE1DB20HARE2EQU20HARE3DW4142HDATAENDS注:EQU定義的是常量,故不占存儲單元20H42H41HARE1ARE30000H0001H地址計(jì)數(shù)器偽指令$表示下一個地址變量的偏移地址值

SORTDSEGMENTARRAYDB25,46,3,75,5COUNTEQU$-ARRAYSORTDENDSARRAY的偏移地址值為0000H$的偏移地址值為0005HCOUNT=0005H–0000H=525463755ARRAY0000H0005H$

把它稱為程序計(jì)數(shù)器。表示位置計(jì)數(shù)器的當(dāng)前值,它可以在數(shù)值表達(dá)式中使用。在程序中,“$”出現(xiàn)在表達(dá)式里,它的值為程序下一個所能分配的存儲單元的偏移地址。

地址對準(zhǔn)器偽指令ORG下一個地址變量的偏移地址值由ORG確定

DATASEGMENTORG2VAR1DB2,3,4ORG$+3VAR2DW1234HDATAENDS23434H12HVAR1$+3VAR20002H0008H$

ORG是起始位置設(shè)定偽指令,用來指出源程序或數(shù)據(jù)塊的起點(diǎn)。利用ORG偽指令可以改變位置計(jì)數(shù)器的值。

匯編結(jié)束偽指令END的使用

END

第一條指令的標(biāo)號或主過程名作用:表示匯編到此結(jié)束位于源程序的最后一行。END之后的語句不會被匯編程序翻譯在源程序開始處可以用NAME或TITLE為模塊取名字。

①NAME偽指令格式:NAME模塊名匯編程序?qū)⒁越o出的“模塊名”作為模塊的名字。

②TITLE偽指令如果程序中沒有NAME偽指令,則也可使用TITLE偽指令。格式:TITLE正文(text)

TITLE偽指令可指定每一頁上打印的標(biāo)題。同時,若程序中沒有NAME偽指令,則匯編程序?qū)⒂胻ext中的前6個字符作為模塊名。text最多可有60個字符。若程序中既無NAME又無TITLE偽指令,則將用源程序名作為模塊名。所以NAME及TITLE偽指令并不是必要的,但一般常使用TITLE,以便在列表文件中能打印出標(biāo)題來。程序開始偽指令(自學(xué))

EVEN偽操作使下一個字節(jié)地址成為偶數(shù)。一個字的地址最好從偶地址開始,所以對于字?jǐn)?shù)組為保證其從偶地址開始,可以在它前面用EVEN偽操作來達(dá)到此目的。例如:DATA_SEGSEGMENT┇ EVENWORD_ARRAYDW100DUP(?)┇DATA_SEGENDS對準(zhǔn)偽指令格式:名稱LABEL類型格式中的類型有BYTE、WORD、DWORD、結(jié)構(gòu)名、記錄名、NEAR、FAR共7種。前5種是屬于變量的類型,后兩種是屬于標(biāo)號的類型。格式中的名稱就是語句的名稱,為一標(biāo)識符,若后面的類型是前5種之一,那么該名稱就是變量名;當(dāng)類型為后兩種時,該名稱就是標(biāo)號。我們已經(jīng)知道,變量與標(biāo)號除具有類型屬性外,還具有段和偏移地址的屬性,名稱的這兩個屬性就是匯編程序匯編到該語句時語句所在的段和偏移地址。LABEL偽指令

BARRAYLABELBYTE;AARRAYDW100DUP(?)

上面定義了兩種類型的變量,BARRAY為字節(jié)類型,AARRAY為字類型,它們的段和偏移地址屬性完全相同,都是下面保留的100個字空間的首地址。其目的是為了程序中可以對這100個字空間作兩種不同類型的操作。在這一點(diǎn)上,LABEL的作用與前面介紹的PTR操作符的作用相類似。

該偽指令的功能是定義某變量名或標(biāo)號的類型的。它雖具有段與偏移地址的屬性,但它并不占內(nèi)存單元。例如:

LABEL偽指令

在我們的程序中,總會有數(shù)據(jù)的輸入和輸出。實(shí)現(xiàn)數(shù)據(jù)的輸入與輸出將涉及輸入、輸出設(shè)備的管理,而對輸入、輸出設(shè)備管理的具體操作是十分繁瑣的,好在系統(tǒng)為我們提供了方便。實(shí)際上,無論是用戶程序還是DOS系統(tǒng)本身,都離不開輸入、輸出操作,PCDOS系統(tǒng)將輸入、輸出管理程序編寫成一系列子程序,不僅系統(tǒng)可以使用,用戶也可以像調(diào)子程序一樣方便地使用它們。在IBMPC系統(tǒng)中,除了DOS系統(tǒng)中有一組輸入、輸出子程序可供用戶調(diào)用外,在系統(tǒng)的ROM中也有一組輸入、輸出管理程序可供用戶使用,這組程序通常稱為ROMBIOS(ROMInput/OutputSystem)。5.3

DOS系統(tǒng)功能調(diào)用和BIOS中斷調(diào)用

調(diào)用系統(tǒng)提供的子程序,通常稱為系統(tǒng)功能調(diào)用。功能調(diào)用的基本方法是采用一條軟中斷指令I(lǐng)NTn。所謂軟中斷是以指令的方式產(chǎn)生的中斷,當(dāng)CPU執(zhí)行該指令時,就像響應(yīng)外部中斷一樣的方式轉(zhuǎn)入中斷處理程序,中斷處理程序結(jié)束后又返回到INT指令的下一條指令處。指令中的n為中斷類型號,不同的n將轉(zhuǎn)入不同的中斷處理程序。所以,系統(tǒng)所提供的處理輸入、輸出的子程序是以中斷處理程序的方式編寫的。關(guān)于中斷和如何轉(zhuǎn)向中斷處理程序以及中斷處理程序的結(jié)構(gòu),將在第7章中詳細(xì)介紹。本節(jié)將主要說明與基本輸入、輸出有關(guān)的DOS系統(tǒng)功能調(diào)用的調(diào)用方式及其用途,目的是為程序設(shè)計(jì)中實(shí)現(xiàn)輸入、輸出操作打下基礎(chǔ)。

DOS功能調(diào)用

DOS功能調(diào)用類型號中斷功能類型號中斷功能20H程序結(jié)束21H請求DOS功能調(diào)用22H結(jié)束地址23H中止(Ctrl-Break)處理24H關(guān)鍵性錯誤處理25H磁盤順序讀26H磁盤順序?qū)?7H程序結(jié)束且駐留內(nèi)存28HDOS內(nèi)部使用29~2EHDOS內(nèi)部保留2FHDOS內(nèi)部使用30~3FHDOS內(nèi)部保留

DOS系統(tǒng)功能調(diào)用主要是由軟中斷指令I(lǐng)NT21H實(shí)現(xiàn)的,這是一條功能極強(qiáng)的指令。當(dāng)累加器AH中設(shè)置不同的值時,指令將完成不同的功能,我們稱AH中設(shè)置的內(nèi)容為功能號。該指令的功能大體可分為輸入、輸出設(shè)備管理、件管理及目錄管理三個方面。這里,我們主要介紹輸入、輸出設(shè)備管理的功能及調(diào)用方式,DOS功能調(diào)用的其余功能請參閱附錄C。

下面給出AH中設(shè)置的值與其對應(yīng)的功能關(guān)系。

DOS功能調(diào)用帶回顯的字符輸入,功能號01H功能:從標(biāo)準(zhǔn)輸入設(shè)備(如鍵盤)輸入一個字符,并顯示在標(biāo)準(zhǔn)輸出設(shè)備(如CRT)上。如無字符輸入,則等待。入口參數(shù):無返回值:

AL=輸入字符的ASCII碼例:MOVAH,01H ;功能編號

INT21H ;調(diào)用

CMPAL,0DH ;輸入字符是回車符嗎?

…字符輸出,功能號02H功能:將一個字符(ASCII碼)輸出到標(biāo)準(zhǔn)輸出設(shè)備(如CRT)上入口參數(shù):DL=即將輸出字符的ASCII碼返回值:無例:MOVDL,‘$’;欲輸出一個“$”符號

MOVAH,02H ;功能編號

INT21H ;調(diào)用無回顯的字符輸入,功能號08H功能:從標(biāo)準(zhǔn)輸入設(shè)備輸入一個字符,不顯示在標(biāo)準(zhǔn)輸出設(shè)備上。若無輸入,則等待。入口參數(shù):無返回值:AL=輸入字符的ASCII碼

MOVAH,08H ;功能編號

INT21H ;調(diào)用輸出字符串,功能號09H功能:向標(biāo)準(zhǔn)輸出設(shè)備輸出以“$”為結(jié)束符的字符串(“$”符不顯示),串中不含控制符入口參數(shù):地址指針DS:DX,指向待輸出的字符串首址返回值:無例:STRDB‘TodayisMonday.$’;即將輸出的字符串

… LDSDX,STR ;DS:DX為指針

MOVAH,09H ;功能編號

INT21H ;調(diào)用帶緩沖區(qū)的字符串輸入,功能號0AH功能:由用戶提供緩沖區(qū),從標(biāo)準(zhǔn)輸入設(shè)備輸入一個以回車符(0DH)結(jié)束的字符串并接收在緩沖區(qū)內(nèi),同時回顯在標(biāo)準(zhǔn)輸出設(shè)備上(不顯示回車符)。入口參數(shù):地址指針DS∶DX,指向接收緩沖區(qū)的首址返回值:無例:STRDB20,?,20DUP(?);用戶定義的緩沖區(qū)

LENDB? ;實(shí)際串長單元

LDSDX,STR ;DS:DX為STR指針

MOVAH,0AH ;功能編號

INT21H ;調(diào)用

LEASI,STR MOVLEN,[SI+1] ;實(shí)際串長取輸入狀態(tài),功能號0BH功能:檢查標(biāo)準(zhǔn)輸入設(shè)備(如鍵盤)是否有輸入,結(jié)果體現(xiàn)在返回值上。入口參數(shù):無返回值:

(AL)=00;表示無任何輸入

(AL)=0FFH ;表示有任意輸入例:MOVAH,0BH ;功能編號

INT21H ;調(diào)用

CMPAL,0FFH ;有按鍵嗎?

JEREADY ;有則轉(zhuǎn)至READY處程序終止,功能號00H功能:通知DOS程序結(jié)束,并釋放所占的內(nèi)存空間。這是程序退出DOS的方法之一。入口參數(shù):無返回值:無例:MOVAH,00H ;功能編號

INT21H ;調(diào)用進(jìn)程結(jié)束,功能號4CH功能:返回DOS或結(jié)束進(jìn)程,并回送一個返回值。入口參數(shù):AL=返回值返回值:無例:MOVAL,01H ;送返回值

MOVAH,4CH ;功能編號

INT21H ;調(diào)用置中斷向量,編號25H功能:將某個系統(tǒng)固定的中斷向量(即中斷處理程序的入口地址)設(shè)置為用戶自己的中斷處理程序的入口地址。入口參數(shù):AL=將要設(shè)置的中斷類型號

DS∶DX=中斷處理程序的段基址∶偏移量返回值:無例:START: ;溢出中斷處理入口

… MOVDS,SEGSTART;以DS:DX指向用戶的中斷入口

MOVDX,OFFSETSTART MOVAL,4 ;置4號中斷

MOVAH,25H ;功能編號

INT21H ;調(diào)用取中斷向量,編號35H功能:取系統(tǒng)固定的中斷向量,并存入寄存器保存。入口參數(shù):AL=要取的中斷類型號返回值:ES:BX=系統(tǒng)的中斷向量例:MOVAL,0;取0號(除數(shù)為0)中斷向量

MOVAH,35H ;功能編號

INT21H ;調(diào)用

PUSHES ;將取得的中斷向量段值入棧

PUSHBX ;段內(nèi)偏移量入棧

結(jié)束用戶程序、返回DOS的方法利用功能調(diào)用4CH MOVAH,4CH INT21H利用功能調(diào)用00H MOVAH,00H INT21H調(diào)用20H號中斷中斷類型號為20H的中斷服務(wù)功能是程序結(jié)束,所以在程序結(jié)束時加上指令

INT20H即可返回。結(jié)束用戶程序、返回DOS的方法轉(zhuǎn)移至0單元源程序進(jìn)行匯編時,匯編程序會自動在程序段前綴的開始處放上一條INT20H指令,因此在用戶程序結(jié)束時只要用無條件轉(zhuǎn)移指令:

JMP0

即相當(dāng)于執(zhí)行了調(diào)用20H號中斷,可以返回DOS。此法實(shí)際上與前一種方式是一樣的。BIOS提供了訪問主要I/O設(shè)備的服務(wù)程序。

下面主要介紹顯示器輸出服務(wù)和鍵盤輸入服務(wù)。(1)INT10H:顯示器輸出INT10H包含了與顯示器有關(guān)的功能,可用來設(shè)置顯示方式,設(shè)置光標(biāo)大小和位置,顯示字符等。①AH=0AH:顯示字符入口參數(shù):AL=欲顯示字符的ASCII碼。②AH=0EH:顯示字符入口參數(shù):AL=欲顯示字符的ASCII碼。功能:類似于0AH功能,但顯示字符后,光標(biāo)隨之移動,并可解釋回車,換行和退格等控制符。

BIOS功能調(diào)用(2)INT=16H:鍵盤輸入①AH=0:從鍵盤讀一鍵出口參數(shù):AL=ASCII碼,AH=掃描碼。功能:從鍵盤讀入一個鍵后返回,按鍵不顯示在屏幕上。對于無相應(yīng)ASCII碼的鍵,如功能鍵等,AL返回0。②AH=1:判斷是否有鍵可讀出口參數(shù):若ZF=0,則有鍵可讀,AL=ASCII碼,AH=掃描碼;否則,無鍵可讀。③AH=2:返回變換鍵的當(dāng)前狀態(tài)出口參數(shù):AL=變換鍵的狀態(tài)。

BIOS功能調(diào)用詳見附錄B5.4匯編語言程序設(shè)計(jì)1.程序具有模塊化結(jié)構(gòu),清晰易讀,易調(diào)試易維護(hù)。2.能夠正常運(yùn)行,結(jié)果正確。3.執(zhí)行速度快。4.占用內(nèi)存空間小。

對于任何一個編程者來說都想編制出一個高質(zhì)量的標(biāo)準(zhǔn)化軟件程序,而一個高質(zhì)量的標(biāo)準(zhǔn)化軟件程序應(yīng)具備以下特點(diǎn):5.4.1概述程序設(shè)計(jì)一般應(yīng)按下述步驟進(jìn)行(對于給定的課題進(jìn)行程序設(shè)計(jì)):1.依據(jù)設(shè)計(jì)任務(wù),抽象出描述問題的數(shù)學(xué)模型。2.確定實(shí)現(xiàn)數(shù)學(xué)模型的算法或求解的具體步驟和方法。3.繪制出程序流程框圖。流程框圖一般包含起始框、執(zhí)行框、判斷框和終止框,如圖所示。

4.分配存儲空間及工作單元(包括寄存器)。確定數(shù)據(jù)段、堆棧段、代碼段及附加段在內(nèi)存中的位置。5.依據(jù)流程圖編寫程序6.靜態(tài)檢查(檢查指令是否合適,是否有語法和格式錯誤)。7.上機(jī)調(diào)試。8.程序運(yùn)行,結(jié)果分析。

程序設(shè)計(jì)是指為計(jì)算機(jī)編寫的、能夠接受并執(zhí)行的、且具有實(shí)際意義的語句序列。對于匯編語言程序設(shè)計(jì),了解指令系統(tǒng)、偽指令及宏指令是最基本的要求,這些內(nèi)容在前面都已進(jìn)行了介紹。合理地使用不同的指令進(jìn)行匯編語言程序的編制僅僅是一個基礎(chǔ),是編出高質(zhì)量程序的一個方面。然而程序設(shè)計(jì)的方法可體現(xiàn)出一個程序設(shè)計(jì)者的思路及運(yùn)用指令的水平。5.4.2程序設(shè)計(jì)方法

程序設(shè)計(jì)是把解決實(shí)際問題的方法轉(zhuǎn)化為程序。由于實(shí)際問題有簡單與復(fù)雜之分,因此程序設(shè)計(jì)就需要根據(jù)解決問題的思路,運(yùn)用一些基本的程序設(shè)計(jì)方法設(shè)計(jì)出解決不同問題的程序來。在匯編程序設(shè)計(jì)過程中,首先對要解決的問題的過程進(jìn)行具體的描述,這也是編程的準(zhǔn)備階段,對于較小的程序可以使用程序流程圖。對于較大的程序可以采用模塊化程序設(shè)計(jì)方法。無論采用流程圖還是模塊化的方法設(shè)計(jì)都要使用程序設(shè)計(jì)的基本程序結(jié)構(gòu)來表現(xiàn)出來?;镜某绦蚪Y(jié)構(gòu)包括順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)及子程序結(jié)構(gòu)。由于不同的問題可采用不同結(jié)構(gòu)設(shè)計(jì),因此需要對各種結(jié)構(gòu)形式有所了解,才能找到解決某一問題的最佳程序結(jié)構(gòu)形式。1.

基本源程序結(jié)構(gòu):過程定義法

CODESEGMENTASSUMECS:CODE,DS:DATASTARTPROCFAR;START為過程名

PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AX;上述為固定寫法

程序正文(指令集合)RET;過程返回

STARTENDP;結(jié)束過程定義

CODEENDS;結(jié)束代碼段

ENDSTART;結(jié)束匯編2.基本源程序結(jié)構(gòu):主程序定義法

CODESEGMENTASSUMECS:CODE,DS:DATAMAIN:MOVAX,DATAMOVDS,AX

程序正文(指令集合)

MOVAH,4CHINT21H;21H號中斷退出

CODEENDS;

結(jié)束代碼段

ENDMAIN;結(jié)束匯編

3.

基本程序設(shè)計(jì)順序程序設(shè)計(jì)

指令指針I(yè)P值線性增加條件程序設(shè)計(jì)

IP值受標(biāo)志位的影響而跳變循環(huán)程序設(shè)計(jì)

IP值受計(jì)數(shù)器CX中的值不為零而循環(huán)

順序結(jié)構(gòu)是一種最簡單的程序設(shè)計(jì)結(jié)構(gòu)形式。采用這種結(jié)構(gòu)只能完成簡單的任務(wù)程序設(shè)計(jì)。順序結(jié)構(gòu)在任何結(jié)構(gòu)的程序中都會出現(xiàn),因此說它是基礎(chǔ)。下面舉一個順序結(jié)構(gòu)的程序設(shè)計(jì)例子,要求完成表達(dá)式所規(guī)定的操作:Y=X1+X2+X3。首先分析程序設(shè)計(jì)方法:

①表達(dá)式Y(jié)=X1+X2+X3的計(jì)算過程可采用順序執(zhí)行的方法來完成:首先讀入數(shù)據(jù)X1、X2、X3;其次計(jì)算X1、X2、X3的和;最后保存結(jié)果到指定變量Y中。

②根據(jù)計(jì)算步驟編寫匯編語言程序:利用偽指令確定存儲器的分配,將X1、X2、X3定義為字變量;按照匯編語言源程序結(jié)構(gòu)要求編寫源程序。順序程序設(shè)計(jì)

程序如下:PROGRAMDATASEGMENTDATA1DWX1,X2,X3,?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,[DATA1]

ADDAX,[DATA1+2]

ADDAX,[DATA1+4]

MOV[DATA1+6],AXHLTCODEENDSENDSTART順序程序設(shè)計(jì)

可以看出,上面的源程序是由數(shù)據(jù)段和代碼段兩部分組成的。在數(shù)據(jù)段定義了X1、X2、X3為自變量,在運(yùn)行時應(yīng)填入具體數(shù)值。代碼段確定了各段與段寄存器的關(guān)系,并且以計(jì)算機(jī)的基本操作指令按順序執(zhí)行的結(jié)構(gòu)形式將計(jì)算機(jī)操作過程進(jìn)行描述,從而完成程序設(shè)計(jì)的最初階段任務(wù)。一個源程序的編寫過程還說明不了程序的正確性,必須經(jīng)過上機(jī)調(diào)試,才能驗(yàn)證設(shè)計(jì)的程序是否符合要求。順序程序設(shè)計(jì)例試編程對兩個無符號二進(jìn)制數(shù)的加法,結(jié)果放入BUF。分析

這是一個多字節(jié)求和任務(wù),此任務(wù)應(yīng)從低字節(jié)開始求和,在進(jìn)行高字節(jié)求和時應(yīng)考慮低字節(jié)的進(jìn)位位。所以,低字節(jié)求和時可以用ADD指令,但高字節(jié)求和時應(yīng)用ADC指令。流程圖如圖所示。編寫程序如下:DATA SEGMENT AAl DB0C7H,24HAA2 DB0ACH,79HSUM DW2DUP(?)DATA ENDS CODE SEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX LEASI,AA1 LEADI,AA2 MOVAL,[SI] MOVBL,[DI]ADDAL,BLINCSIINCDIMOVAH,[SI]MOVBH,[DI] ADCAH,BH LEASI,SUM MOV[SI],AX HLT CODE ENDS ENDSTART順序程序設(shè)計(jì)用查表法求Z=X3定義數(shù)據(jù)段

DATASEGMENTTABLEDB0,1,8,27,64,125,216XVALDB6YVALDB?DATAENDS0182764125216TABLE定義堆棧段

STACKSEGMENTDB100DUP(?)STACKENDS注:堆棧段一般不定義,由匯編程序自動生成順序程序設(shè)計(jì)定義代碼段CODESEGMENTASSUMECS:CODE,DS:DATASTARTPROCFARPUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXLEABX,TABLEMOVAL,XVALXLATMOVYVAL,ALRETSTARTENDPCODEENDSENDSTART;標(biāo)準(zhǔn)寫法;程序指令;標(biāo)準(zhǔn)寫法

在解決某些實(shí)際問題時,解決問題的方法隨著某些條件的不同而不同,將這種在不同條件下處理過程的操作編寫出的程序稱為分支程序。程序中所產(chǎn)生的分支是由條件轉(zhuǎn)移指令來完成的。匯編語言提供了多種條件轉(zhuǎn)移指令,可以根據(jù)使用不同的轉(zhuǎn)移指令所產(chǎn)生的結(jié)果狀態(tài)選擇要轉(zhuǎn)移的程序段,對問題進(jìn)行處理。采用分支結(jié)構(gòu)設(shè)計(jì)的程序,結(jié)構(gòu)清晰、易于閱讀及調(diào)試。下面是一個采用分支結(jié)構(gòu)設(shè)計(jì)的程序例子,要求從鍵盤上輸入字符,若為A~Z,則將其轉(zhuǎn)換為對應(yīng)的ASCII碼并顯示;若為0,則結(jié)束輸入。條件程序設(shè)計(jì)(分支結(jié)構(gòu)程序設(shè)計(jì))首先使用程序流程圖將解決問題的思路描述出來,如圖所示。程序如下:ABC1:MOVAH,01H;置鍵盤輸入并回顯

INT21H

;系統(tǒng)功能調(diào)用

CMPAL,0

;輸入字符與0比較

JEABC2

;為零結(jié)束

CMPAL,‘A’

;判斷是否小于大寫字母A

JL

ABC1

;小于大寫字母A返回重新輸入

CMPAL,‘Z’;判斷是否大于大寫字母Z

JG

ABC1

;大于大寫字母Z返回重新輸入

MOV

DL,AL;將AL內(nèi)容送DL,作為輸入?yún)?shù)

MOV

AH,02;置顯示輸出

INT21H

;將A~Z的字符從顯示器輸出

ABC2:MOV

AH,4CH

;帶返回碼結(jié)束INT21H

INT21H條件程序設(shè)計(jì)條件程序設(shè)計(jì)在匯編語言程序設(shè)計(jì)中,根據(jù)各種條件判斷和比較進(jìn)行操作,滿足條件去做一種操作,不滿足條件去做另一種操作。每一種操作程序稱為一個分支,一次判斷產(chǎn)生兩個分支,只有一次判斷的稱為單重分支程序。多次判斷產(chǎn)生多個分支,稱為多重分支程序。分支程序結(jié)構(gòu)框圖如圖所示。

在匯編語言程序設(shè)計(jì)中,常常要使用多分支結(jié)構(gòu)。多分支結(jié)構(gòu)相當(dāng)于一個多路開關(guān),在程序設(shè)計(jì)中通常是根據(jù)某寄存器或某單元的內(nèi)容進(jìn)行程序轉(zhuǎn)移。在設(shè)計(jì)多分支轉(zhuǎn)移程序時,如果分支太多,則平均轉(zhuǎn)移速度太慢。如果用轉(zhuǎn)移地址表實(shí)現(xiàn)多分支轉(zhuǎn)移,則可以提高平均轉(zhuǎn)移速度。多分支結(jié)構(gòu)如圖所示。條件程序設(shè)計(jì)條件程序設(shè)計(jì)實(shí)現(xiàn)表達(dá)式XYY=1(X>0)0(X=0)-1(X<0)X在-128~+127之間波形圖條件程序設(shè)計(jì)流程圖條件程序設(shè)計(jì)數(shù)據(jù)段定義

DATASEGMENTXDB?YDB?DATAENDS代碼段定義

CODESEGMENTASSUMECS:CODE;DS:DATAMAINPROCNEARPUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AX;標(biāo)準(zhǔn)寫法條件程序設(shè)計(jì)

MOVAL,XCMPAL,0JGEBIGER;X大于等于0轉(zhuǎn)BIGERMOVAL,0FFH;-1的補(bǔ)碼為FFHMOVY,AL;Y=-1JMPNEXTBIGER:JEEQUL;X等于0轉(zhuǎn)EQULMOVAL,1MOVY,AL;Y=1JMPNEXTEQUL:MOVY,AL;Y=0NEXT:R

溫馨提示

  • 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

提交評論