




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
匯編語言程序設計
5.1匯編語言語句的類型和組成5.1.1匯編語言語句的類型
在匯編語言中我們不僅要知道指令系統,而且還必須了解匯編語言語句的組成和類型,了解匯編語言中的編寫程序的格式以及格式中各個部分的意義,以便我們能夠編寫出正確的源程序。
匯編語言有自身的語法規則,匯編語言源程序中有3種基本語句:①指令性語句(由CPU指令組成);②指示性語句(偽指令語句)和宏指令語句。指令性語句和指示性語句是最基本的語句,也是最常用的語句。①指令性指令是給CPU的命令,它是由匯編程序翻譯成機器語言指令,在程序運行時由CPU來執行,每條指令都對應CPU一種特定的操作,例如:算術運算、邏輯運算、串操作等;而偽指令是給匯編程序的命令,偽指令不匯編成機器語言,僅僅在匯編過程中告訴匯編程序應如何匯編。在匯編中由匯編程序進行處理,例如:定義數據分配,定義過程等。
②指令性指令匯編以后,每條指令都產生其對應的機器代碼;而偽指令則不產生與之對應的機器代碼。
③宏指令是使用者利用上述基本語句自己定義的新的指令。二者的區別是:宏定義偽指令如果需要多次使用同一個程序段,可以將這個程序段定義為一個”宏指令”,然后在需要時,可簡單地用宏指令名來代替這個程序段。指令的格式為:<宏指令名>
MACRO
[形參表]
<宏定義體>
ENDM例:兩個數之和的宏定義和宏調用。宏定義為:DADDMACROX,Y,ZMOVAX,XADDAX,YMOVZ,AX
ENDMX、Y、Z是形式參數。調用宏DADD時可寫為:
DADDDATA1,DATA2,SUMDATA1,DATA2,SUM是實際參數,由它們替換定義中的X、Y、Z。宏調用與過程(子程序)調用都是一次定義,多次調用。它們之間的差別是:①執行形式:宏命令偽指令由宏匯編程序在匯編過理中進行處理,而CALL、RET則是由CPU執行的指令。②匯編結果:宏命令偽指令匯編后被展開。③執行速度:宏命令執行速度較快(因無調用轉移)④
占用內存:宏指令簡化了源程序,但不能簡化目標程序,并不節省內存單元。使用過程可以節省代碼占用的內存空間。宏展開:匯編程序會把宏調用按宏定義展開。例如:宏定義為:
DisplayMACROstringLEADX,stringMOVAH,9INT21HENDM
程序中宏調用:
……DISPLAYERROR_MESSAGEDISPLAYEXIT_MESSAGE……
匯編后的結果:(帶有+號的指令為宏展開后的結果)……+LEADX,ERROR_MESSAGE+MOVAH,9+INT21H+LEADX,EXIT_MESSAGE+MOV AH,9+INT21H……例:5個連續字節單元的累加DATA SEGMENT ;定義數據段D1 DB5DUP(?) ;連續的字節單元CC EQU20 ;定義一個常數SUM DW0 ;為結果保留一個字DATA ENDS ;數據段定義結束STACKSEGMENT;定義堆棧段
DB100DUP(?) ;100字節的棧空間STACK ENDS
;堆棧段定義結束CODE SEGMENT ;定義代碼段ASSUMEDS:DATA,SS:STACK,CS:CODE ;對各段進行說明BEGIN:MOVAX,DATA ;DS初始化為DATA MOVDS,AX;MOVAX,SEGDATA LEASI,D1 ;預置源數據的指針匯編語言程序結構特點定義存儲單元的數據偽指令定義堆棧段定義語句作堆棧用的存儲單元指令
MOVCX,CC+1 ;預置次數
CLD;(DF)=0,串指針自動增量
LODSBYTEPTR[SI];取一個數并修改指針,存入AL/AX DECCX ;修改次數
MOVAH,0 ;清AX的高字節
CLC ;清CF位AGAN:ADCSUM,AX ;累加
LODSBYTEPTR[SI] ;再取數并修改指針
LOOPAGAN ;控制循環
MOVAH,4CH ;完成,返回DOS INT21HCODE ENDS ;代碼段結束
END BEGIN ;整個程序結束段定義匯編程序結束
源程序的一般格式代碼段是必需的。每段必須有且僅有一個名字,以SEGMENT定義段的起始,以ENDS定義段的結束,整個程序結束后需以END收尾。源程序的一般格式為: 段名1 SEGMENT
語句
…
語句 段名1 ENDS
段名2 SEGMENT
語句
…
語句 段名2 ENDS … END (標號)匯編語言源程序的結構段名1SEGMENT
語句行
……
語句行段名1ENDS段名2SEGMENT
語句行
……
語句行段名2ENDSCODESEGMENTASSUMEDS:…….START:
……ENDSTART(標號或過程名)一個源程序由若干段組成,如數據段、代碼段、堆棧段等;各段由若干條語句行組成;指令必須放在代碼段中;為了確保程序的執行和正確返回,必須借助堆棧段;根據編程需要確定是否需要數據段、附加段。5.1.2匯編語言語句的組成1.指令性語句:即執行性語句(指令)包括四部分:[標號:]指令操作碼[操作數][;注釋]例:AGAN:ADCSUM,AX ;累加2.指示性語句:即說明性語句(偽指令),由四部分組成:[名字]偽指令[操作數][;注釋]例:SUM DW0 ;為結果保留一個字匯編語言中的字符集字符
A~Z或a~z
注:匯編源程序中,大小寫字符功能一樣數字
0~9注:數字不用于標識符的第一位特殊符號:?、/、%等注:標識符中謹慎使用特殊符號1、匯編語句的說明匯編語言中的保留字匯編源程序中標識符不能使用的字符串寄存器名例:AX、SP
標志符例:CF、TF
指令助記符例:MOV、ADD
偽指令符例:SEGMENT、END
運算符例:OFFSET、PTR
標識符——由編程人員自行定義的、有特殊意義的字符序列。標識符的使用可使用字母、數字、特殊字符(?@$_)不能使用保留字,必須符合字符集要求不用數字開頭,第一個符號最好用字母長度小于32個字符標識符的作用用作段名、過程名、結構名、宏名等的定義用作變量名,數據段符號地址的定義用作代碼段標號標識符(標號、符號地址、變量名)標識符數據段中的標識符符號地址具有存儲地址值和數據類型的特征代碼段中的標識符偽指令前的標號定義——變量指令前的標號定義——標號:標識符與常量
MOVAL,(0F8H);(AL)=(F8H),從符號地址中取數
MOVAL,0F8H;(AL)=F8H,常數F8H賦值
常量
整數:必須以數字開頭!二進制數——以“B”結尾八進制數——以“O”或“Q”結尾十進制數——不帶結尾字母,或以“D”結尾十六進制數——以“H”結尾
字符串連續的字節單元,每個單元均存放ASCII碼。用包括在單引號中的字母表示(單引號本身不算作字符)。如‘ABCDEF’,對應的數值依次是61H~66H。
常量——出現在源程序中指令操作數的位置,具有固定值的數值。
變量和標號
段基址:該單元所在段的首址,用相應的段寄存器值表示(16位)
偏移量:該單元在段內的偏移量或有效地址,表示與段首地址之間的距離(16位)
類型:該單元中存放的數據長度類型,可能是字節(Byte)、字(Word)或雙字(DoubleWord)等,對應于類型值1、2、4變量——編程人員為內存單元起的名字。有3種屬性:標號——編程人員為目標地址單元起的名字,對應于該指令在代碼段中的存放地址。也有3種屬性,僅類型與變量不同:
類型:標號的類型共有遠(Far)、近(Near)兩種.2、表達式與運算符表達式——由運算符和操作數組成的、具有確定結果的有意義的序列,可作為指令的操作數。運算符——共有5類:算術運算符、邏輯運算符、關系運算符、分析運算符、合成運算符。操作數——常量、變量和標號等均可參與運算。對于地址指針,只能進行加/減算術運算。運算規則——表達式的值由匯編程序在編譯的過程中自動完成計算,所得確定的運算結果與操作碼一起被編譯成機器碼。匯編語言的運算符算術運算符:+、-、*、/、MOD(取余)、SHL、SHR邏輯運算符:AND、OR、XOR、NOT關系運算符:EQ(=)、NE(≠)、LT(<)、GT(>)、LE(≤)、GE(≥)分析運算符:SEG(取段基址)、OFFSET(取偏移地址)、TYPE(取變量的字節數)、SIZE(取總字節數)、LENGTH(取單元數)綜合運算符:PTR、DS:、THIS、SHORT、HIGH、LOW算術運算符數值表達式中可使用所有算術運算符地址表達式僅使用+、-算術運算符算術運算符不影響標志位例:完成80H+90H解:MOVAL,80H+90H;使用數值表達式;(AL)=10H、CF=不變
MOVAL,80HADDAL,90H;使用加法指令;(AL)=10H、CF=1算術運算符的使用若以算術運算表達式作為源操作數,則整個表達相當于立即數;運算結果(返回值)的長度主要由目的操作數決定乘、除運算不帶符號除法運算的返回值為整數商表達式的運算不影響標志位
邏輯運算符AND、OR、XOR、NOT
邏輯指令助記符與邏輯運算符形同意不同
邏輯指令助記符出現在指令語句的開始
AND
CX,00FFHAND10AEH
邏輯運算符出現在指令語句的操作數段
ANDCX,00FFHAND10AEH
注:等價指令ANDCX,00AEH邏輯運算符的使用若以邏輯運算表達式作為源操作數,則整個表達相當于立即數;運算結果(返回值)的長度由目操作數決定除NOT之外,均為雙目運算符表達式的運算不影響標志位
例:ANDCX,1F03HAND72B6H
相當于ANDCX,1202H1F03H∧72B6H=1202H由匯編程序完成,各標志位不變;CX∧1202H在執行過程中完成。關系運算符
EQ
相等關系
NE
不等關系
LT
小于關系
GT
大于關系
LE
小于等于關系
GE
大于等于關系
進行關系判斷時,表達式中所有的數均視為無符號數EQ、NE、LT、GT、LE、GE
兩性質相同的操作數的比較若關系正確為真(T),則結果為FFFFH
,即有全1
操作數若關系錯誤為假(F),則結果為0,有全0
操作數例:MOVBL,(PORTLT5)AND20H若PORT=2,(PORTLT5)=0FFH,為真
原式為MOVBL,20H若PORT=7,(PORTLT5)=00H,為假原式為MOVBL,00H分析運算符
SEG取變量/標號的段基值
OFFSET取變量/標號的段內偏移量
TYPE取變量/標號的類型值,即字節數
LENGTH取以DUP定義的變量的重復次數,即DUP定義的單元數,其他情況返回1.SIZE取以DUP定義的變量的總字節數SIZE=LENGTH變量*TYPE變量分析運算符例:定義數據段DATA
如下:從實際地02000H開始存數據,即段地址為0200H,段內偏移地址從0000H開始
DATASEGMENTVAR1DB20,30;(定義2個字節的變量)
VAR2DW2000H,3000HVAR3DD22003300HDATAENDS203000H20H00H30H00H33H00H22H段地址=0200H0000H0002H0006HVAR1VAR2VAR3分析運算符SEG和OFFSET應用MOVBX,SEGVAR1;(BX)=0200HMOVBX,SEGVAR2;(BX)=0200HMOVBX,SEGVAR3;(BX)=0200HMOVBX,OFFSETVAR1;(BX)=0000HMOVBX,OFFSETVAR2;(BX)=0002HMOVBX,OFFSETVAR3;(BX)=0006H分析運算符TYPE的應用
返回變量數據類型所含的字節數
MOVBL,TYPEVAR1;(BL)=1MOVBL,TYPEVAR2;(BL)=2MOVBL,TYPEVAR3;(BL)=4
結構名返回結構所含字節數
過程名返回近、遠過程屬性表示值(-1,-2)
即:對標號,返回標號的屬性值
NEAR、FAR標號的屬性值分別是-1、-2LENGTH和SIZE:只對DUP指令有效,否則為1定義數據段
DATASEGMENTVAR1DB100DUP(?)
VAR2DW100DUP(?)
DATAENDS指令功能
MOVBX,LENGTHVAR1;(BX)=100MOVBX,LENGTHVAR2;(BX)=100MOVBX,SIZEVAR1;(BX)=100MOVBX,SIZEVAR2;(BX)=200
已有變量定義
VAR1DW100DUP(?)
VAR2DB?,?,?,?
運算符功能
MOVAX,LENGTHVAR1;(AX)=100MOVBX,SIZEVAR1;(BX)=200MOVCX,LENGTHVAR2;(CX)=1MOVDX,SIZEVAR2;(DX)=1設段的起始地址為02000HDATA SEGMENTDBYTE DB10,10HDWORD DW100,100HDDWORD DD12345678HDQWORD DQ1234567890ABCDEFHDBS DB‘A’,’B’DWS DW‘AB’DWOFF DWOFFSETDWORDDATA ENDS例:存儲器示意圖例2:DATA SEGMENTARRAY DB2DUP(0,1,2)ARRAY2 DW100DUP(?)ARRAY3 DB20DUP(0,1,4DUP(2),5)0A106400000178563412EFCDAB907856341241424241000102000102:::000102020202050001020202020200DBYTEDWORDDDWORDDBSDWSDQWORDDWOFFARRAYARRAY2100個字ARRAY3綜合運算符綜合運算符(屬性修改運算符)
PTR存儲器操作數重新定義類型運算符
THIS存儲器操作數重新定義類型運算符
SHORT頁內跳轉運算符
HIGH字數據中高字節數據分離符
LOW字數據中低字節數據分離符
ES:[]段屬性前綴符PTR運算符
PTR的使用
類型PTR變量、內存單元或標號
作用:給原有的操作數重新賦定類型。表達式結果返回一個與原有操作數具有相同的段基址和偏移量、不同類型的新操作數,但并不另分配新的存儲單元!
可用的類型名稱(保留字)變量或內存單元——BYTE、WORD、DWORD標號——NEAR、FARPTR的應用特點(MUL、DIV指令中的應用)
MULBYTEPTR[BX]
;(AX)←(AL)*[BX]⑻MULWORDPTR[BX]
;(DX)(AX)←(AX)*[BX]⒃DIVBYTEPTR[SI]
;(AL)←(AX)/[SI]⑻DIVWORDPTR[SI]
;(AX)←(DX)(AX)/[SI]⒃PTR的應用特點(JMP指令中的應用)
段內間接近轉移——CS不變、IP變存儲器中的16位值為段內IP目的地址
JMPWORDPTR[BX]JMPWORDPTR[2000H]
段間間接遠轉移——CS變、IP變存儲器中的32位值為CS:IP目的地址
JMPDWORDPTR[BX]JMPDWORDPTR[2000H]PTR運算符綜合運算符PTR與THIS的應用
PTR—先定義一個變量類型再用PTR說明一個新的變量類型
VAR1DW2030H;定義
VAR2EQUBYTEPTRVAR1;說明
THIS—先用
THIS
說明一個變量類型再定義一個新的變量類型
VAR2EQUTHISBYTEVAR1;說明
VAR1DW2030H;定義
應用
MOVAL,VAR2正確MOVAL,VAR1錯誤
MOVAX,VAR1正確MOVAX,VAR2錯誤30H20HVAR1VAR2SHORT運算符SHORT的使用
SHORT標號作用:將已有標號說明為短標號,以便于條件轉移指令使用。應用AGAINEQUTHISNEAR ;AGAIN為NEAR標號AGAIN:……JBESHORTAGAGIN;低于等于/不高于近轉移綜合運算符HIGH、LOW的應用
HIGH——分離字的高8位字節
LOW——分離字的低8位字節
應用
MOVAH,BX;指令錯,源、目的操作數類型不匹配
MOVAH,HIGHBX;(AH)=(BH)
MOVAH,LOWBX;(AH)=(BL)運算符的優先級別優先級別運算符高↑低()LENGTHSIZEPTRTHISOFFSETSEGTYPE段超越前綴HIGHLOW*/MOD+-EQNEGTGELTLENOTANDORXORSHORT
同一表達式內可進行多種運算沒有括號時,按優先級別進行運算同一優先級的運算,按從左到右的順序進行8086匯編語言運算符算術運算符邏輯運算符關系運算符分析運算符綜合運算符+(加)-(減)*(乘)/(除)MOD(求余)SHL(左移)SHR(右移)AND(與)OR(或)XOR(異或)NOT(非)EQ(相等)NE(不相等)LT(小于)GT(大于)LE(小于或等于)GE(大于或等于)SEG(求段基址)OFFSET(求偏移量)TYPE(求變量類型)SIZE(求字節數)LENGTH(求變量長度)PTR段屬性前綴THISSHORTHIGHLOW5.2偽操作命令數據類型定義偽指令段定義偽指令段說明偽指令過程定義偽指令符號定義偽指令EQU及=地址計數器偽指令$地址對準器偽指令ORG數據類型定義偽指令DB(DefineByte)——變量為字節數據類型(8位)DW(DefineWord)——變量為字數據類型(16位)DD(DefineDWord)——變量為雙字數據類型(32位)DQ(DefineQByte)
——變量為8字節數據類型(64位)DT(DefineTByte)
——變量為10字節數據類型(80位)操作數可以為:(1)數值表達式;(2)ASCⅡ碼字符串;(3)地址表達式;(4)?(只保存內存空間,未定義初始值);(5)DUP子句,其格式為:重復次數DUP(操作數,…,操作數),DUP子句可以嵌套。數據類型定義偽指令變量定義偽指令的使用使用
[變量名]變量定義偽指令初值(表);為變量賦初值
[變量名]變量定義偽指令? ;保留空間常量、表達式均可作為初值DB的特殊用法
[變量名]DB字符串例:
DATA1 DW 7C00H DATA2 DD ? DB 3FH,66H,70H,TYPEDATA1 DATA3 DB ‘H72b9&!’DW、DD的特殊應用
已有字節變量的定義:
AVR1DB?
可用DW為16位地址指針賦值:
DWAVRDWAVR1字變量DWAVR的值為AVR1的16位段內偏移量
可用DD為32位地址指針賦值:
DDAVRDDAVR1雙字變量DDAVR的值為AVR1的邏輯地址(32位)數據類型定義偽指令DB、DW的應用特點DATASEGMENTARE1DB20H,30HARE2DW2030HARE3DB‘A’,‘B’ARE4DW‘AB’DATAENDS20H30H30H20H41H42H42H41HARE1ARE2ARE3 ARE4數據類型定義偽指令DW、DD用于存儲器地址分配
DW分配16位地址
DWAVRDWOFFSETAVR1
變量DWAVR的類型為16位變量DWAVR的值為變量AVR1的16位偏移地址
DD分配32位地址
DDAVRDDAVR2
變量DDAVR的類型為32位變量DDAVR的值為變量AVR2的32位目標地址
變量復制語句DUP()DUP的使用
[變量名]變量定義偽指令復制次數DUP(復制內容)應用
VARDW20HDUP(?) ;保留20H個字空間
XADD3DUP(0);將連續3個雙字單元清0XBDB2DUP(0FFH,?,4,‘4’)TYPEVAR=2LENGTHVAR=20HSIZEVAR=40HTYPEXA=4LENGTHXA=3SIZEXA=12TYPEXB=1LENGTHXB=2SIZEXB=8數據類型定義偽指令存儲器地址分配的應用
DATASEGMENTORG0004HAVR1DW2030HAVR2DB40HDWVRDWOFFSETAVR1DDVRDDAVR2DATAENDS30H20H40H04H00H06H00H00H20HAVR1AVR2DWVRDDVR0004H0006H0007H0009H設DATA的段首地址為2000H段定義偽指令SEGMENT、ENDS段名標識符
SEGMENT[定位類型][組合類型][‘類別’]
〈段內定義〉
段名標識符
ENDS
用于對DS、ES、SS、CS段的定義段定義的相關約定組合類型:表示與其它段的關系,為連接程序提供信息,可以有6種選擇:定位類型:規定段的起始邊界,有4種選擇:PAGE:段起始地址的最低8位必須為0.(頁,1頁=256個字節)PARA:段起始地址的最低4位必須為0。(節,1節=16個字節)WORD:段起始地址的最低1位必須為0,即從偶地址開始。BYTE:段起始地址為任意值,即從任何地址開始都行。缺省類型為PARA。NONE:本段與其它段邏輯上不發生關系,每段都有自己的基地址(缺省選擇)。PUBLIC:連接程序首先將本段與其它同名同類別的段相鄰地連接在一起,然后為所有這些PUBLIC段指定一個共同的段基址。連接的先后次序由連接命令指定。STACK:與PUBLIC同樣處理,但此段作為堆棧段,SS指向第一個STACK段。COMMON:本段與其它同名同類別段重疊,段基址與最后定義的相同,長度為同名段中最大段的長度。AT表達式:連接程序把本段裝在表達式值所指定的段地址(此方式不能指定代碼段)。MEMORY:同PUBLIC連接程序將本段定位在被連接在一起的其它所有段之上。類別:給各段的名字信息,連接程序將類別名相同的段組成一個段組用它們共同的名字作為這個段組的名字。類別必須用單引號括起來。段定義的相關約定例:STACK SEGMENTPARASTACK‘STACK’段說明偽指令ASSUMEASSUME偽指令僅用在代碼段首行代碼段名SEGMENT[相關約定]
ASSUME
CS:段名,DS:段名,…
〈代碼段內定義,指令集合〉代碼段名ENDS例:ASSUMEDS:DATA,SS:STACK,CS:CODE過程定義偽指令PROCFAR、ENDP——遠過程定義偽指令PROCNEAR、ENDP——近過程定義偽指令過程名PROCFAR(NEAR)〈過程指令集合〉
RET過程名ENDP注:過程定義必須在代碼段內
PROCFAR為定義遠過程
PROCNEAR為定義近過程符號定義偽指令的基本形式為:符號名EQU表達式符號名=常數表達式功能:給表達式指定一個等價的符號名。說明:(1)=后的表達式只能是常數,對于字符或字符串,在匯編時按整數處理。(2)
EQU后的表達式可以是數值、字符串,甚至可以是寄存器名、指令的助記符等。(3)EQU不能重復定義,而“=”偽指令可以重復定義,其作用域從定義點到重新定義之前。符號定義偽指令EQU、=符號定義偽指令例DATASEGMENTARE1DB20HARE2EQU
20HARE3DW4142HDATAENDS注:EQU定義的是常量,故不占存儲單元;X=X+1;“=”偽指令可以重復定義;20H42H41HARE1ARE30000H0001H地址計數器偽指令$表示下一個地址變量的偏移地址值
SORTDSEGMENTARRAYDB25,46,3,75,5COUNTEQU$-ARRAYSORTDENDSARRAY的偏移地址值為0000H$的偏移地址值為0005HCOUNT=0005H–0000H=525463755ARRAY0000H0005H$$也稱為程序計數器。表示位置計數器的當前值,它可以在數值表達式中使用。在程序中,“$”出現在表達式里,它的值為程序下一個所能分配的存儲單元的偏移地址。 地址對準器偽指令ORG下一個地址變量的偏移地址值由ORG確定。
DATASEGMENTORG2VAR1DB2,3,4ORG$+3VAR2DW1234HDATAENDS23434H12HVAR1$+3VAR20002H0008H$
ORG是起始位置設定偽指令,用來指出源程序或數據塊的起點。利用ORG偽指令可以改變位置計數器的值。
匯編結束偽指令END的使用
END第一條指令的標號或主過程名作用:表示匯編到此結束位于源程序的最后一行。END之后的語句不會被匯編程序翻譯模塊是一個獨立的匯編單位,即一個獨立的源程序一個大的程序多由數個模塊組成。通過模塊連接偽指令實現多模塊的連接。模塊定義偽指令①:
NAME偽指令格式:NAME模塊名(或標識符)
…END啟動標號匯編程序將以給出的“模塊名”作為模塊的名字。表示以標識符為名的模塊名由NAME開始,到END結束,并指出該模塊的啟動地址,即第一條可執行指令所對應的目標碼地址,以便系統給CS:IP賦值。NAME和END不必像SEGMENT與ENDS,PROC與ENDP那樣首尾對應。NAME語句可以省略;NAME后的模塊名(標識符)也無需與END后的啟動標號一致。EDN用來告訴匯編程序源程序到此為止,而源程序的最后一句應該是END。
程序開始偽指令(自學)②TITLE偽指令(自學)如果程序中沒有NAME偽指令,則也可使用TITLE偽指令。格式:TITLE正文(text)
TITLE偽指令可指定每一頁上打印的標題。同時,若程序中沒有NAME偽指令,則匯編程序將用text中的前6個字符作為模塊名。text最多可有60個字符。
若程序中既無NAME又無TITLE偽指令,則將用源程序名作為模塊名。所以NAME及TITLE偽指令并不是必要的,但一般常使用TITLE,以便在列表文件中能打印出標題來。
EVEN偽操作使下一個字節地址成為偶數。一個字的地址最好從偶地址開始,所以對于字數組為保證其從偶地址開始,可以在它前面用EVEN偽操作來達到此目的。例如:DATA_SEGSEGMENT┇ EVENWORD_ARRAYDW100DUP(?)┇DATA_SEGENDS對準偽指令(自學)格式:名稱LABEL類型格式中的類型有BYTE、WORD、DWORD、結構名、記錄名、NEAR、FAR共7種。前5種是屬于變量的類型,后兩種是屬于標號的類型。格式中的名稱就是語句的名稱,為一標識符,若后面的類型是前5種之一,那么該名稱就是變量名;當類型為后兩種時,該名稱就是標號。我們已經知道,變量與標號除具有類型屬性外,還具有段和偏移地址的屬性,名稱的這兩個屬性就是匯編程序匯編到該語句時語句所在的段和偏移地址。LABEL偽指令(自學)
BARRAYLABELBYTE;AARRAYDW100DUP(?)
上面定義了兩種類型的變量,BARRAY為字節類型,AARRAY為字類型,它們的段和偏移地址屬性完全相同,都是下面保留的100個字空間的首地址。其目的是為了程序中可以對這100個字空間作兩種不同類型的操作。在這一點上,LABEL的作用與前面介紹的PTR操作符的作用相類似。
該偽指令的功能是定義某變量名或標號的類型的。它雖具有段與偏移地址的屬性,但它并不占內存單元。例如:
LABEL偽指令(自學)
在我們的程序中,總會有數據的輸入和輸出。實現數據的輸入與輸出將涉及輸入、輸出設備的管理,而對輸入、輸出設備管理的具體操作是十分繁瑣的,好在系統為我們提供了方便。實際上,無論是用戶程序還是DOS系統本身,都離不開輸入、輸出操作,PCDOS系統將輸入、輸出管理程序編寫成一系列子程序,不僅系統可以使用,用戶也可以像調子程序一樣方便地使用它們。在IBMPC系統中,除了DOS系統中有一組輸入、輸出子程序可供用戶調用外,在系統的ROM中也有一組輸入、輸出管理程序可供用戶使用,這組程序通常稱為ROMBIOS(ROMInput/OutputSystem)。5.3DOS系統功能調用和BIOS中斷調用
調用系統提供的子程序,通常稱為系統功能調用。功能調用的基本方法是采用一條軟中斷指令INTn。所謂軟中斷是以指令的方式產生的中斷,當CPU執行該指令時,就像響應外部中斷一樣的方式轉入中斷處理程序,中斷處理程序結束后又返回到INT指令的下一條指令處。指令中的n為中斷類型號,不同的n將轉入不同的中斷處理程序。所以,系統所提供的處理輸入、輸出的子程序是以中斷處理程序的方式編寫的。關于中斷和如何轉向中斷處理程序以及中斷處理程序的結構,將在第7章中詳細介紹。本節將主要說明與基本輸入、輸出有關的DOS系統功能調用的調用方式及其用途,目的是為程序設計中實現輸入、輸出操作打下基礎。DOS功能調用DOS功能調用類型號中斷功能類型號中斷功能20H程序結束21H請求DOS功能調用22H結束地址23H中止(Ctrl-Break)處理24H關鍵性錯誤處理25H磁盤順序讀26H磁盤順序寫27H程序結束且駐留內存28HDOS內部使用29~2EHDOS內部保留2FHDOS內部使用30~3FHDOS內部保留
DOS系統功能調用主要是由軟中斷指令INT21H實現的,這是一條功能極強的指令。當累加器AH中設置不同的值時,指令將完成不同的功能,我們稱AH中設置的內容為功能號。該指令的功能大體可分為輸入、輸出設備管理、文件管理及目錄管理三個方面。這里,我們主要介紹輸入、輸出設備管理的功能及調用方式,DOS功能調用的其余功能請參閱其他資料。下面給出AH中設置的值與其對應的功能關系。DOS功能調用帶回顯的字符輸入,功能號01H功能:從標準輸入設備(如鍵盤)輸入一個字符,并顯示在標準輸出設備(如CRT)上。如無字符輸入,則等待。入口參數:無返回值:
AL=輸入字符的ASCII碼例:MOVAH,01H ;功能編號
INT21H ;調用
CMPAL,0DH ;輸入字符是回車符嗎?
…字符輸出,功能號02H功能:將一個字符(ASCII碼)輸出到標準輸出設備(如CRT)上入口參數:DL=即將輸出字符的ASCII碼返回值:無例:MOVDL,‘$’;欲輸出一個“$”符號
MOVAH,02H ;功能編號
INT21H ;調用無回顯的字符輸入,功能號08H功能:從標準輸入設備輸入一個字符,不顯示在標準輸出設備上。若無輸入,則等待。入口參數:無返回值:AL=輸入字符的ASCII碼
MOVAH,08H ;功能編號
INT21H ;調用輸出字符串,功能號09H功能:向標準輸出設備輸出以“$”為結束符的字符串(“$”符不顯示),串中不含控制符。入口參數:地址指針DS:DX,指向待輸出的字符串首址返回值:無例:STRDB‘TodayisMonday.$’;即將輸出的字符串
… LDSDX,STR ;DS:DX為指針
MOVAH,09H ;功能編號
INT21H ;調用帶緩沖區的字符串輸入,功能號0AH功能:由用戶提供緩沖區,從標準輸入設備輸入一個以回車符(0DH)結束的字符串并接收在緩沖區內,同時回顯在標準輸出設備上(不顯示回車符)。入口參數:地址指針DS∶DX,指向接收緩沖區的首址。第一個字節為緩沖區的最大字符數,第二個字節為實際讀到的字符數,回車鍵不計。返回值:無例:STRDB20,?,20DUP(?);用戶定義的緩沖區
LENDB? ;實際串長單元
LDSDX,STR ;DS:DX為STR指針
MOVAH,0AH ;功能編號
INT21H;調用
LEASI,STR MOVLEN,[SI+1] ;實際串長取輸入狀態,功能號0BH功能:檢查標準輸入設備(如鍵盤)是否有輸入,結果體現在返回值上。入口參數:無返回值:
(AL)=00;表示無任何輸入
(AL)=0FFH ;表示有任意輸入例:MOVAH,0BH ;功能編號
INT21H ;調用
CMPAL,0FFH ;有按鍵嗎?
JEREADY ;有則轉至READY處程序終止,功能號00H功能:通知DOS程序結束,并釋放所占的內存空間。這是程序退出DOS的方法之一。入口參數:無返回值:無例:MOVAH,00H ;功能編號
INT21H ;調用進程結束,功能號4CH功能:返回DOS或結束進程,并回送一個返回值。入口參數:AL=返回值返回值:無例:MOVAL,01H ;送返回值
MOVAH,4CH ;功能編號
INT21H ;調用置中斷向量,編號25H功能:將某個系統固定的中斷向量(即中斷處理程序的入口地址)設置為用戶自己的中斷處理程序的入口地址。入口參數:AL=將要設置的中斷類型號
DS∶DX=中斷處理程序的段基址∶偏移量返回值:無例:START: ;溢出中斷處理入口
…MOVDS,SEGSTART;以DS:DX指向用戶的中斷入口
MOVDX,OFFSETSTART MOVAL,4 ;置4號中斷
MOVAH,25H ;功能編號
INT21H ;調用取中斷向量,編號35H功能:取系統固定的中斷向量,并存入寄存器保存。入口參數:AL=要取的中斷類型號返回值:ES:BX=系統的中斷向量例:MOVAL,0;取0號(除數為0)中斷向量
MOVAH,35H ;功能編號
INT21H ;調用
PUSHES ;將取得的中斷向量段值入棧
PUSHBX ;段內偏移量入棧
結束用戶程序、返回DOS的方法利用功能調用4CH MOVAH,4CH INT21H利用功能調用00H MOVAH,00H INT21H調用20H號中斷中斷類型號為20H的中斷服務功能是程序結束,所以在程序結束時加上指令
INT20H即可返回。結束用戶程序、返回DOS的方法轉移至0單元源程序進行匯編時,匯編程序會自動在程序段前綴的開始處放上一條INT20H指令,因此在用戶程序結束時只要用無條件轉移指令:
JMP0
即相當于執行了調用20H號中斷,可以返回DOS。此法實際上與前一種方式是一樣的。BIOS提供了訪問主要I/O設備的服務程序。
下面主要介紹顯示器輸出服務和鍵盤輸入服務。(1)INT10H:顯示器輸出INT10H包含了與顯示器有關的功能,可用來設置顯示方式,設置光標大小和位置,顯示字符等。①AH=0AH:顯示字符入口參數:AL=欲顯示字符的ASCII碼。②AH=0EH:顯示字符入口參數:AL=欲顯示字符的ASCII碼。功能:類似于0AH功能,但顯示字符后,光標隨之移動,并可解釋回車,換行和退格等控制符。
BIOS功能調用(2)INT=16H:鍵盤輸入①AH=0:從鍵盤讀一鍵出口參數:AL=ASCII碼,AH=掃描碼。功能:從鍵盤讀入一個鍵后返回,按鍵不顯示在屏幕上。對于無相應ASCII碼的鍵,如功能鍵等,AL返回0。②AH=1:判斷是否有鍵可讀出口參數:若ZF=0,則有鍵可讀,AL=ASCII碼,AH=掃描碼;否則,無鍵可讀。③AH=2:返回變換鍵的當前狀態出口參數:AL=變換鍵的狀態。
BIOS功能調用5.4匯編語言程序設計1.程序具有模塊化結構,清晰易讀,易調試易維護。2.能夠正常運行,結果正確。3.執行速度快。4.占用內存空間小。
對于任何一個編程者來說都想編制出一個高質量的標準化軟件程序,而一個高質量的標準化軟件程序應具備以下特點:5.4.1概述
程序設計一般應按下述步驟進行(對于給定的課題進行程序設計):1.依據設計任務,抽象出描述問題的數學模型。2.確定實現數學模型的算法或求解的具體步驟和方法。3.繪制出程序流程框圖。流程框圖一般包含起始框、執行框、判斷框和終止框,如圖所示。
4.分配存儲空間及工作單元(包括寄存器)。確定數據段、堆棧段、代碼段及附加段在內存中的位置。5.依據流程圖編寫程序6.靜態檢查(檢查指令是否合適,是否有語法和格式錯誤)。7.上機調試。8.程序運行,結果分析。
程序設計是指為計算機編寫的、能夠接受并執行的、且具有實際意義的語句序列。對于匯編語言程序設計,了解指令系統、偽指令及宏指令是最基本的要求,這些內容在前面都已進行了介紹。合理地使用不同的指令進行匯編語言程序的編制僅僅是一個基礎,是編出高質量程序的一個方面。然而程序設計的方法可體現出一個程序設計者的思路及運用指令的水平。5.4.2程序設計方法
程序設計是把解決實際問題的方法轉化為程序。由于實際問題有簡單與復雜之分,因此程序設計就需要根據解決問題的思路,運用一些基本的程序設計方法設計出解決不同問題的程序來。在匯編程序設計過程中,首先對要解決的問題的過程進行具體的描述,這也是編程的準備階段,對于較小的程序可以使用程序流程圖。對于較大的程序可以采用模塊化程序設計方法。無論采用流程圖還是模塊化的方法設計都要使用程序設計的基本程序結構來表現出來。基本的程序結構包括順序結構、分支結構、循環結構及子程序結構。由于不同的問題可采用不同結構設計,因此需要對各種結構形式有所了解,才能找到解決某一問題的最佳程序結構形式。1.基本源程序結構:過程定義法
CODESEGMENTASSUMECS:CODE,DS:DATASTARTPROCFAR;START為過程名
PUSHDSMOVAX,0PUSHAX;DS:00壓棧,保存舊的數據段
MOVAX,DATAMOVDS,AX;置數據段,上述為固定寫法程序正文(指令集合)RET;過程返回
STARTENDP;結束過程定義
CODEENDS;結束代碼段
ENDSTART;結束匯編2.基本源程序結構:主程序定義法CODESEGMENTASSUMECS:CODE,DS:DATAMAIN:MOVAX,DATAMOVDS,AX;程序正文(指令集合)MOVAH,4CH;進程結束
INT21H;
21H號中斷退出
CODEENDS;
結束代碼段
ENDMAIN;結束匯編
3.基本程序設計順序程序設計
指令指針IP值線性增加條件程序設計
IP值受標志位的影響而跳變循環程序設計
IP值受計數器CX中的值不為零而循環
順序結構是一種最簡單的程序設計結構形式。采用這種結構只能完成簡單的任務程序設計。順序結構在任何結構的程序中都會出現,因此說它是基礎。下面舉一個順序結構的程序設計例子,要求完成表達式所規定的操作:Y=X1+X2+X3。首先分析程序設計方法:
①表達式Y=X1+X2+X3的計算過程可采用順序執行的方法來完成:首先讀入數據X1、X2、X3;其次計算X1、X2、X3的和;最后保存結果到指定變量Y中。
②根據計算步驟編寫匯編語言程序:利用偽指令確定存儲器的分配,將X1、X2、X3定義為字變量;按照匯編語言源程序結構要求編寫源程序。順序程序設計
程序如下:DATASEGMENT
DATA1DWX1,X2,X3,?
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATASTART:
MOVAX,DATAMOVDS,AXMOVAX,[DATA1]
ADDAX,[DATA1+2]
ADCAX,[DATA1+4]
MOV[DATA1+6],AXCODEENDSENDSTART順序程序設計
可以看出,上面的源程序是由數據段和代碼段兩部分組成的。在數據段定義了X1、X2、X3為自變量,在運行時應填入具體數值。代碼段確定了各段與段寄存器的關系,并且以計算機的基本操作指令按順序執行的結構形式將計算機操作過程進行描述,從而完成程序設計的最初階段任務。一個源程序的編寫過程還說明不了程序的正確性,必須經過上機調試,才能驗證設計的程序是否符合要求。順序程序設計例試編程對兩個都是雙字節無符號二進制數的加法,結果放入BUF。分析這是一個多字節求和任務,此任務應從低字節開始求和,在進行高字節求和時應考慮低字節的進位位。所以,低字節求和時可以用ADD指令,但高字節求和時應用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,BHLEASI,SUMMOV[SI],AXCODEENDS ENDSTART用查表法求Z=X3定義數據段
DATASEGMENTTABLEDB0,1,8,27,64,125,216XVALDB6YVALDB?DATAENDS0182764125216TABLE定義堆棧段
STACKSEGMENTDB100DUP(?)STACKENDS定義代碼段CODESEGMENTSTARTPROCFARASSUMECS:CODE,DS:DATAMAIN:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXLEABX,TABLEMOVAL,XVALXLATMOVYVAL,ALRETSTARTENDPCODEENDSENDMAIN;標準寫法;程序指令;標準寫法XLAT:換碼指令。指令格式:XLAT功能:用BX指向表的起點,AL為表的索引,執行本指令后,AL為查表得到的信息。
在解決某些實際問題時,解決問題的方法隨著某些條件的不同而不同,將這種在不同條件下處理過程的操作編寫出的程序稱為分支程序。程序中所產生的分支是由條件轉移指令來完成的。匯編語言提供了多種條件轉移指令,可以根據使用不同的轉移指令所產生的結果狀態選擇要轉移的程序段,對問題進行處理。采用分支結構設計的程序,結構清晰、易于閱讀及調試。下面是一個采用分支結構設計的程序例子,要求從鍵盤上輸入字符,若為A~Z,則將其轉換為對應的ASCII碼并顯示;若為0,則結束輸入。分支結構程序設計首先使用程序流程圖將解決問題的思路描述出來,如圖所示。程序如下:ABC1:MOVAH,01H;置鍵盤輸入并回顯
INT21H;系統功能調用
CMPAL,0;輸入字符與0比較
JEABC2;為零結束
CMPAL,‘A’
;判斷是否小于大寫字母A
JLABC1;小于大寫字母A返回重新輸入
CMPAL,‘Z’;判斷是否大于大寫字母ZJGABC1;大于大寫字母Z返回重新輸入
MOVDL,AL;將AL內容送DL,作為輸入參數
MOVAH,02;置顯示輸出
INT21H;將A~Z的字符從顯示器輸出
ABC2:MOVAH,4CH;帶返回碼結束INT21H
INT21H
在匯編語言程序設計中,根據各種條件判斷和比較進行操作,滿足條件去做一種操作,不滿足條件去做另一種操作。每一種操作程序稱為一個分支,一次判斷產生兩個分支,只有一次判斷的稱為單重分支程序。多次判斷產生多個分支,稱為多重分支程序。在匯編語言程序設計中,常常要使用多分支結構。多分支結構相當于一個多路開關,在程序設計中通常是根據某寄存器或某單元的內容進行程序轉移。在設計多分支轉移程序時,如果分支太多,則平均轉移速度太慢。如果用轉移地址表實現多分支轉移,則可以提高平均轉移速度。
實現表達式XYY=1(X>0)0(X=0)-1(X<0)X在-128~+127之間波形圖流程圖數據段定義
DATASEGMENTXDB?YDB?DATAENDS代碼段定義
CODESEGMENTASSUMECS:CODE;DS:DATAMAINPROCNEARPUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AX;標準寫法MOVAL,XCMPAL,128JGEBIGER;X為負數轉BIGERCMPAL,0JEEQUL;X為0轉EQULM
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 上海復旦附中2025屆高二下化學期末綜合測試模擬試題含解析
- 中國有機中間體行業市場調查報告
- 2025-2030年中國靜電檢測儀表項目投資可行性研究分析報告
- 純肉火腿行業深度研究分析報告(2024-2030版)
- 2025年中國紅外耳蝸體溫計行業市場發展監測及投資戰略咨詢報告
- 2025年塑料管道行業市場趨勢分析報告
- 中國豬偽狂犬疫苗行業發展前景預測及投資戰略研究報告
- 2022-2027年中國智能按摩椅行業發展趨勢預測及投資戰略研究報告
- 鎂合金項目可行性報告-圖文
- 代用燃料汽車轉換裝置項目風險評估報告
- 2025-2030年中國臨空經濟行業深度評估及市場研究發展研究報告
- 2025年市場營銷學考試題及答案
- 2025-2030中國婚介網站行業發展趨勢與投資戰略研究報告
- 火災撲救無人機應急預案(3篇)
- 2025-2030年中國中硼硅玻璃行業市場深度調研及競爭格局與投資前景研究報告
- 2025年一級建造師之一建公路工程實務模考模擬試題(全優)
- 2025-2030年中國天然氣液化裝置市場前景趨勢調研及發展戰略研究報告
- 社會治安綜合治理與維穩培訓課件
- 100米課件教學課件
- 廢水拉運服務合同協議
- 足療技師服務意識培訓
評論
0/150
提交評論