版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第3章匯編語言程序設計
3.1概述一、機器語言、匯編語言和高級語言
1、
機器語言
計算機中指令代碼以二進制編碼表示,這種代碼機器可以識別與執(zhí)行,把這種機器代碼稱為機器語言。用機器語言編寫的程序稱為機器語言程序(或目的程序)。例如下面的機器代碼就是8086CPU的三條機器指令B8H,00H,30H4EH,D8HB9H,14H,00H用機器語言書寫的程序人們不易看懂,也不易記憶。看起來非常的乏味。但是計算機卻非常熟悉它。
3、高級語言
?不依賴具體的機器,面向對象的計算機語言稱為高級語言。如BASIC,C,VB,VC等
?高級語言易記憶,易懂、便于學習與掌握?匯編語言與高級語言的比較匯編語言高級語言
執(zhí)行速度快,占內存小,執(zhí)行速度慢,占內存大,實施控制方便,通用性差通用性好,可移植性強程序設計效率低,依賴機器程序設計效率高,不依賴機器與硬件打交道方便。與硬件打交道不方便。二、匯編程序1、匯編程序是用來將匯編語言程序翻譯成機器代碼的系統(tǒng)(工具)程序。匯編語言源程序匯編語言目標程序文件源程序列表.ASM.OBJ.LST翻譯2、在DOS環(huán)境下建立和運行匯編語言程序的過程匯編語言程序的執(zhí)行過程:編輯程序.ASM文件匯編程序.OBJ文件連接程序.EXE文件Edit等MASMLINK三、調試與運行
1、源文件編輯
任何文本編輯器均可用于編輯匯編語言的源程序。例如dos下的edit,turboC集成環(huán)境的編輯器,Windows下的記事本、寫字板等。匯編語言源程序以ASCII碼形式存放于內存中,擴展名應為.ASM,給源文件命名后可存盤,源程序用大寫、小寫皆可。2、源文件匯編
用Microsoft的宏匯編程序(MASM)任何版本匯編皆可。匯編有下列幾種方式
方式1:在命令提示符下,鍵入MASM?
屏幕上會出現(xiàn)如下提示,按照提示鍵入文件名回車即可。Source[.ASM]:xxx?Object[xxx.OBJ]:?Sourcelisting[nul.LST]:xxx?Crose-reference[nul.CRF]:xxx?
××××××+××××××Bytessymbolspacefree0WarnimgErrors0SeversErrors說明:匯編后生成3個文件,即:目標文件(.OBJ),列表文件(.LST),交叉引用文件(.CRF)。同時告訴程序員匯編有無錯誤(警告錯誤和嚴重錯誤)。無錯,匯編通過;有錯,則修改源程序的錯誤后,再次匯編。
方式2在命令行提示符下鍵入文件名與逗號和分號
C:\MASM>MASMABC;(生成.OBJ文件,不產生.LST和.CRF)C:\MASM>MASMABC,,,;(生成三個文件,名稱為ABC).OBJ文件中的地址操作數(shù)是可浮動的相對地址。.LST文件把源程序與機器代碼(目的程序)都列表,可打印,顯示。.CRF是用來對符號進行前后對照的文件,可了解源程序中符號(或變量)定義或引用情況。4、調試與運行用DEBUG與Codeview軟件都可進行目的代碼級程序的調試,對.EXE文件可直接調入DEBUG中跟蹤調試。有錯誤需對源程序中的語句進行修改,匯編中只能發(fā)現(xiàn)語法和符號等錯誤,不能發(fā)現(xiàn)編程中的邏輯錯誤。Codeview窗口調試工具,使用時請參看有關資料。3.2匯編語言源程序的格式3.2.1分段結構匯編語言程序的結構匯編語言程序也是分段編寫的,每段最長64K。8088匯編語言的源程序是由多個段組成的,一個可執(zhí)行的匯編程序一般至少有一個代碼段,其中包含可執(zhí)行的語句。例:一個簡單的匯編程序05A2001085array1array2DSCSmy_datasegment(數(shù)據(jù)段)again:Moval,[si]array1db05,a2H,00,10H,85HIncsinequ5Cmpal,50array2dbndup(?)Jbenext
my_dataendsMov[di],almy_codesegment(代碼段)Incdi
assumecs:my_codenext:deccxassumeds:my_datajnzagainbegin:movax,my_datamovah,4chmovds,axint21hLeasi,array1
my_codeends
Leadi,array2endbeginMovcx,n指令語句及其格式
?
指令語句即第二章介紹的8086CPU的指令,每一條指令即可構成一指令語句。每一指令都有對應的機器代碼。
?指令語句格式
[標號:]助記符[操作數(shù),…];[注釋]
格式共有四部分:其中標號,操作數(shù),注釋可以是任選項;助記符是必選項,該項在一條語句中不可省略。標號后面一定要跟一個冒號;注釋前一定加一分號。2、偽指令語句及其格式
?偽指令語句不是真正的指令語句,它不產生機器代碼,它是匯編程序要求的,用來指示匯編程序做何種操作,定義代碼段、數(shù)據(jù)段在何處,是否產生列表等。
?偽指令語句格式
[名字]定義符[參數(shù),…,參數(shù)];[注釋]
格式共有四部分:其中名字,參數(shù),注釋可以是任選項;定義符是必選項,該項在一條偽指令語句中不可省略。對于有些語句,名字也是必需的。名字后面不要跟冒號:注釋前一定加一分號;各個參數(shù)之間用,分開。
宏指令語句及其格式宏指令語句:為了書寫方便,把一個重復出現(xiàn)的匯編語句序列用一條指令代替,這種重新定義的指令就稱為宏指令。這種由宏指令組成的語句稱為宏指令語句。宏指令必須先定義,才能被使用,這稱為宏定義;在匯編時,又要把宏指令語句進行宏展開,生成對應的機器代碼。宏指令語句格式將在后面應用中介紹。一般說來,名字項可以是標號或變量。它們都用來表示本語句的符號地址,它是可有可無的,只有當需要用符號地址來訪問該語句時它才需要出現(xiàn)。標號:標號在代碼段中定義,后面跟冒號:,它也可以用LABEL或EQU偽操作來定義。此外它還可以作為過程名定義,這將在以后的章節(jié)中加以說明。標號經常在轉移指令或CALL指令的操作數(shù)字段出現(xiàn),用以表示轉向地址。
標號有三種屬性:段、偏移及類型。
標號實際上是用符號表示的地址(其指令語句的符號地址)。段屬性定義標號的段起始地址,此值必須在一個段寄存器中,而標號的段則總是在CS寄存器中。
偏移屬性:標號的偏移地址是16位無符號數(shù),它代表從段起始地址到定義標號的位置之間的字節(jié)數(shù)。
類型屬性:用來指出該標號是在本段內引用還是在其它段中引用的。如在段內引用的,則稱為NEAR,指針長度為2字節(jié);如在段外引用,則稱為FAR,指針長度為4字節(jié)。
變量:是存放在某些存儲單元中的操作數(shù),變量在除代碼段以外的其他段中定義,后面不跟冒號。它也可以用LABLE或EQU偽操作來定義。變量經常在操作數(shù)字段出現(xiàn)。
所有的變量都有一個固定的地址(用變量名代表),它由段和偏移地址組成;同時還有一個類型,變量的類型屬性定義該變量所保留的字節(jié)數(shù)。如BYTE(1個字節(jié)長)、WORD(2個字節(jié)長)、DWORD(4個字節(jié)長)、DQ(8個字節(jié)長)、DT(10個字節(jié)長),這一點在數(shù)據(jù)定義偽操作中說明。3.2.4操作符
可以是指令、偽指令或宏指令的助記符。3.
2.5操作數(shù):可以是常數(shù)、寄存器名、標號、變量和表達式。1、常數(shù)可以是二進制、十進制、八進制或十六進制數(shù),也可以是字符串。例如
10100101B;二進常數(shù)256D或256;十進常數(shù)356Q或356Q;八進常數(shù)2AFH;十六進常數(shù)0ABCDH;十六進常數(shù),但十六進常數(shù)的第一個字符必須是數(shù)字?!瓵BCD’;字符串常數(shù),匯編后對應為相應的ASCII碼:41H~44H‘1234’;數(shù)字字符串常數(shù),字符串需用單引號‘’,匯編后為31H~34H2、
寄存器8086/8088的寄存器是程序中最常出現(xiàn)的符號,它可分為字節(jié)寄存器和字寄存器,如AX為字寄存器,而AL則為字節(jié)寄存器。只有AX、BX、CX、DX可分為字和字節(jié)寄存器。3.標號
標號實際上是用符號表示的地址(其指令語句的符號地址),因此它也是由段、偏移地址和類型組成,其類型分為段內(NEAR)和段間(FAR)兩種。4.變量變量是存放在某些存儲單元中的操作數(shù),使用有一定意義的符號來代表這些單元。所有的變量都有一個固定的地址(用變量名代表),它由段和偏移地址組成;同時還有一個類型,它可以是字節(jié)(BYTE)、字(WORD)或雙字(DWORD)。在程序中,變量可以使用數(shù)據(jù)定義偽指令進行初始化,見偽指令一節(jié)中的數(shù)據(jù)定義部分。5、表達式表達式是常數(shù)、寄存器、標號、變量與一些操作符相組合的序列,可以有數(shù)字表達式和地址表達式兩種。在匯編期間,匯編程序按照一定的優(yōu)先規(guī)則對表達式進行計算后可得到一個數(shù)值或一個地址。為了能了解表達式的組成,我們先介紹一些常用的運算符。
運算符包括算術、邏輯、關系、分析、綜合五類運算符。見下表表8086匯編語言中的運算符算術運算符邏輯運算符關系運算符分析運算符綜合運算符+(加法)AND(與)EQ(相等)SEG(求段基址)PTR-(減法)OR(或)NE(不相等)OFFSET段屬性前綴*(乘法)XOR(異或)LT(小于)TYPETHIS/(除法)NOT(非)GT(大于)SHORTMOD(求余)LESIZEHIGHSHL(左移)GELENGTHLOWSHR(右移)(1)、算術運算符有7種:+,-,*,/,MOD,SHL,SHR。分別為:加,減,乘,除,模,左移,右移。
說明:
除法返回的是商,而模返回的是余數(shù)。
例如:PIEQU3456/1000;PI=3PIREQU3456MOD1000;PIR=456
SHL,SHR是移位運算,一般在建立屏蔽字時使用。
例如:MSKEQU00110100BMSK1EQUMSKSHL2;低位補2個0,MSK1=11010000BMSK2EQUMSKSHR2;高位補2個0,MSK2=00001101B(2)、邏輯運算符有4種:AND,OR,XOR,NOT
邏輯運算符和邏輯運算指令的區(qū)別:邏輯運算符在匯編時完成邏輯運算,邏輯運算指令在執(zhí)行該指令時完成邏輯運算。例如MSKEQU00110101BMOVAL,4EHANDAL,MSKAND0FH
匯編時計算出MSKAND0FH=05,執(zhí)行第三條指令時AL=04H。例:邏輯運算符運用。
MOVAX,0F00FHAMD253BH;AX=200BH
MOVAC,0F00FHOR253BH;AX=F53FHMOVAC,0F00FHXOR253BH;AX=D534H例INAL,VALOUTVALANDOFEH,AL其中VAL為端口號,OUT指令中的表達式說明當VAL為偶數(shù)時,輸出端口號與輸入端口號相同,而當VAL為奇數(shù)時,則輸出端口號比輸入端口號小1。
(3)關系運算符包括相等:EQ大于:GT不等:NE小于或等于:LE小于:LT大于或等于:GE關系運算結果只有兩個——真、假。
如果關系是真,則結果為0FFH(0FFFFH);如果關系是假,則結果為0。例如:MOVBX,DATA1LT0010HMOVBX,0FFFFH
MOVBX,DATA1LT0010HMOVBX,0當DATA1<0010H時
當DATA1>0010H時
例MOVBX,((VALLT5)AND20)OR((VALGE5)AND30)則當VAL<5時,匯編結果應該是:MOVBX,20否則,匯編結果應該是:MOVBX,30
(4)分析運算符
分析運算在匯編語言程序設計中很重要。
存儲器地址操作數(shù)(變量和標號)具有段、偏移量及類型三種屬性,分析運算符用來分離出一個存儲器地址操作數(shù)的這三種屬性,并用數(shù)值的方法表達出來。它包括:取存儲單元偏移:OFFSET
取存儲單元段:SEG
取類型:TYPE
取字節(jié)數(shù):SIZE
按類型取長度:LENGTH求存儲器地址操作數(shù)的三個屬性求變量的字節(jié)數(shù)和長度SEG與OFFSET分析符分別返回一個變量或標號的段地址和偏移量地址①OFFSET格式為:OFFSETVariable或label匯編程序將回送變量或標號的偏移地址值。例MOVBX,OFFSETOPER_ONE則匯編程序將OPER_ONE的偏移地址作為立即數(shù)回送給指令,而在執(zhí)行時則將該偏移地址裝入BX寄存器中。所以這條指令與指令LEABX,OPER_ONE是等價的。②SEG格式為:SEGVariable或label匯編程序將回送變量或標號的段地址值。例如果DATA_SEG是從存儲器的05000H地址開始的一個數(shù)據(jù)段的段名,OPER1是該段中的一個變量名,則MOVBX,SEGOPER1將把0500H作為立即數(shù)插入指令。實際上由于段地址是由連接程序分配的,所以該立即數(shù)是連接時插入的。執(zhí)行期間則使BX寄存器的內容成為0500H。
③TYPE分析符
返回變量和標號的類型。對于變量:
類型為字節(jié)、字、雙字變量分別返回1,2,4。對于標號:類型為NEAR的標號返回-1(0FFFFH),類型為FAR標號返回-2(0FFFEH)。例ARRAYDW1,2,3則對于指令ADDSI,TYPEARRAY匯編程序將其形成為:ADDSI,2表存儲器操作數(shù)的類型值
存儲器操作數(shù)類型值
字節(jié)數(shù)據(jù)(DB定義)1字型數(shù)據(jù)(DW定義)2雙字數(shù)據(jù)(DD定義)4NEAR指令單元-1FAR指令單元-2
④LENGTH格式為:LENGTHVariable對于變量中使用DUP的情況,匯編程序將回送分配給該變量的單元數(shù)。而對于其他未用DUP說明的情況則回送1。例FEESDW100DUP(0)對于指令MOVCX,LENGTHFEES
匯編程序將使其形成為:MOVCX,100
例ARRAYDW1,2,3對于指令MOVCX,LENGTHARRAY匯編程序將使其形成為:MOVCX,1
例TABLEDB‘ABCD’對于指令MOVCX,LENGTHTABLE匯編程序將使其形成為:MOVCX,l
⑤SIZE格式為:SIZEVariable
匯編程序應回送分配給該變量的字節(jié)數(shù)。但是,此值是LENGTH值和TYPE值的乘積。所以:FEESDW100DUP(0)MOVCX,SIZEFEES將形成為MOVCX,200對于:
ARRAYDW1,2,3
MOVCX,SIZEARRAY將形成為MOVCX,2而TABLEDB‘ABCD’
MOVCX,SIZETABLE將形成為MOVCX,1。LENGTH和SIZE分析符
對于DUP定義的變量:
LENGTH返回的是分配給該變量的元素的個數(shù);SIZE返回的是分配給該變量的元素的字節(jié)數(shù)。例如:BUFDW100DUP(?)MOVCX,LENGTHBUF;CX=100MOVCX,SIZEBUF;CX=200(100×2)
對于其他變量,則返回1(LENGTH),或返回(類型)(SIZE)例如M1DW1,2,3匯編后形成指令:M2DB‘ABCD’MOVBL,LENGTHM1MOVBL,1MOVAL,LENGTHM2MOVAL,1MOVCL,SIZEM1MOVCL,2MOVCH,SIZEM2MOVCH,1例1:設有數(shù)據(jù)段中使用DATA1DB05H,A2H,0,10H,85H則MOVAL,DATA1可將DATA1中的數(shù)傳送到AL中,(AL)=05HMOVAX,SEGDATA1可將DATA1的所在段地址傳到AX中,(AX)=2000HMOVAX,OFFSETDATA1可將DATA1的偏移地址傳入AX中,(AX)=1500H例2:設有數(shù)據(jù)段中使用DATA2DW100DUP(?)定義了100個字單元,則MOVAX,TYPEDATA2;(AX)=2MOVAX,SIZEDATA2;(AX)=200MOVAX,LENGTHDATA2;(AX)=10005A2001085DSCSDATA12000:1500例:分析運算符應用舉例下面定義的數(shù)據(jù)段DATA,設段基址從40000H開始。DATA SEGMENTV1 DB2AH,3FHV2 DW2A3FH,3040HV3 DD12345678H,12ABCDEFHV4 DW20DUP(1)DATA ENDS① MOVAX,SEGV1 ;AX=4000H MOVBX,SEGV2 ;BX=4000H MOVCX,SEGV3 ;CX=4000H② MOVAX,OFFSETV1 ;AX=0 MOVBX,OFFSETV2;BX=2 MOVCX,OFFSETV3 ;CX=62A3F3F2A403078563412EFCDAB1201000100……010040000HV1V2V3V440個字節(jié)③ MOVAX,TYPEV1 ;AX=1 MOVBX,TYPEV2 ;BX=2 MOVCX,TYPEV3 ;CX=4④ MOVAX,LENGTHV4 ;AX=20 MOVBX,SIZEV4 ;BX=40而: MOVAH,LENGTHV1 ;AH=1 MOVAL,SIZEV1 ;AL=1 MOVBH,LENGTHV2 ;BH=1 MOVBL,SIZEV2 ;BL=2 MOVCH,LENGTHV3 ;CH=1 MOVCL,SIZEV3 ;CL=4注:對于形如V1、V2、V3格式定義的變量,運算符LENGTH和SIZE只對DB、DW和DQ定義的多項逗號分開的數(shù)據(jù)項的第一項有效。注意!
上述表達式中運算符的求值的操作不是在程序執(zhí)行的時候完成,而是在對源程序進行匯編(編譯)的時候完成.⑥PTR操作符PTR用于改變變量或標號的原有屬性,PTR本身并不分配存儲單元,僅給已分配的存儲單元賦予新的屬性,保證運算時操作數(shù)類型的匹配。常與類型BYTE、WORD、NEAR、FAR連用。
格式:類型/距離PTR變量或標號例1N1DB15H,36HN2DW1122HLOOP:MOVAX,WORDPTRN1;(AX)=3615HMOVBL,BYTEPTRN2;(BL)=22H例2MOVBYTEPTR[BX],10H;(BX)10HMOVWORDPTR[BX],10H;(BX)0010H
有時指令要求使用PTR操作符。例如用MOV[BX],5指令把立即數(shù)存入BX寄存器內容指定的存儲單元中,但匯編程序不能分清是存入字單元還是字節(jié)單元,此時必須用PTR操作符來說明屬性,應該寫明:
MOVBYTEPTR[BX],5或
MOVWORDPTR[BX],5
則語句MOVAL,DATA2;錯而應為:MOVAL,BYTEPTRDATA205A2001085DSDATA2例:DATA1DB05H,A2H,0,10H,85HDATA2EQUWORDPTRDATA1則DATA2和DATA1的段基址和偏移量均相同,但類型不同,DATA1是BYTE型,而DATA2是WORD型。DATA1⑦THIS操作符格式為THISattribute或type它可以象PTR一樣建立一個指定類型(BYTE、WORD或DWORD)的或指定距離(NEAR或FAR)的地址操作數(shù)。該操作數(shù)的段地址和偏移地址與下一個存儲單元地址相同。例如:FIRST_TYPEEQUTHISBYTEWORD_TABLEDW100DUP(?)此時FIRST_BYTE的偏移地址值和WORD_TABLE完全相同,但它是字節(jié)類型的,而WORD_TABLE則是字類型的。又如:STARTEQUTHISFARMOVCX,100這樣,MOV指令有一個FAR屬性的地址START,這就允許其他段的JMP指令直接跳轉到STAR來。
THIS——用來建立新的存儲器地址操作數(shù),但不分配存儲單元。新的操作數(shù)類型在THIS中指定,而其段地址和偏移量就是匯編時的當前值。用THIS的變量與下一個變量有相同的段基址和偏移量,但兩者類型不同。格式為:
變量/標量EQUTHIS類型例如:V11EQUTHISWORD V1 DB 20H,30H則:變量V11與V1具有相同的段和偏移量,但V11是WORD型變量,而V1是BYTE型變量。例:DATA1SEGMENTWBUFFER EQUTHISWORDBUFFERDB12H,34H,00H,91H
DATA1ENDSCODE1 SEGMENTASSUMECS:CODE1,DS:DATA1START:MOVAX,DATA1MOVDS,AX
MOVAL,BUFFERMOVBX,WBUFFER
……
CODE1ENDSENDSTART12340091DSBUFFERWBUFFERAL=12HBX=3412H⑧段超越操作符格式:段前綴:變量或地址表達式
說明:段寄存器加冒號為段前綴,即CS:,DS:,SS:,ES:。該操作符強迫當前指令的操作數(shù)尋址不按約定的段進行,而由段超越操作符指定的段尋址。例如:MOVAX,ES:[SI];操作數(shù)不按約定的DS段,而指定尋址ES段。⑨SHORT操作符格式:SHORT標號說明:用來告訴匯編器轉移類指令中轉向地址的屬性。轉移的范圍在-128~+127。⑩HIGH和LOW稱為字節(jié)分離操作符,它接收一個數(shù)或地址表達式,HIGH取其高位字節(jié),LOW取其低位字節(jié)。例如:
CONSTEQUOABCDH則MOVAH,HIGHCONST將匯編成MOVAH,0ABH
運算符與操作符的優(yōu)先級優(yōu)先級最高
運算符與操作符優(yōu)先級運算符與操作符1LENGTH,SIZE,(),[],<>.8+,-(雙目:加、減)2(結構字段名運算符)9EQ,NE,LT,GT,GE3:(段寄存器名)10NOT4PTR,OFFSET,SEG,TYPE11AND5HIGH,LOW12OR,XOR6+,-(單目:表示正、負號)13最低SHORT7*,/,MOD,SHL,SHR3.2.6注釋
注釋是用于使程序易于理解的句子,用來表示某行或某段語句的作用或與其它部分的關系,一般寫在某語句的后面或某段的開始處,注釋的前面由“;”前導,表示后面的內容為注釋。如果一行寫不下,換行后也要使用“;”前導。3.3偽指令及其應用
在8086/8088匯編語言中偽指令是用于諸如數(shù)據(jù)定義、存儲區(qū)分配等功能。所謂偽指令是非機器指令,它是在匯編期間進行操作的。3.3.2數(shù)據(jù)定義語句
數(shù)據(jù)定義語句用于為數(shù)據(jù)分配相應的存儲單元。用一個符號名代表一個或一些單元,并可為這個或這些單元提供初始值。定義數(shù)據(jù)的操作符有:
字節(jié)定義——DB(每一數(shù)據(jù)項占一個字節(jié))字定義——DW(每一數(shù)據(jù)項占二個字節(jié))雙字定義——DD(每一數(shù)據(jù)項占四個字節(jié))四字定義——DQ(每一數(shù)據(jù)項占八個字節(jié))十字節(jié)定義——DT(每一數(shù)據(jù)項占十個字節(jié))重復定義——mDUP(n)(重復m次個數(shù)據(jù)n)
與數(shù)據(jù)相聯(lián)系的符號名稱為變量。
數(shù)據(jù)定義語句的格式為:
變量名操作符數(shù)據(jù)項表其中:數(shù)據(jù)項表由逗號分隔的表達式組成。例:通過下列定義,在存儲器中將產生如圖所示的結果,以DATA1到DATA5為例:DATA1DB?;不置初值,為隨 機值DATA2DW1000HDATA3DD3000A455HDATA4DB10,10HDATA5DW100,0240H,0360H
DS隨機001055A400300A10640040026003DATA1DATA2DATA3DATA4DATA5例DATA_BYTEDB10,4,10H
BATA_WORDDW100,100H,-5
DATA_DWDD3x20,OFFFDH
匯編程序可以在匯編期間在存儲器中存入數(shù)據(jù)
例操作數(shù)也可以是字符串,如:
MESSAGEDB‘HELLO’
則存儲器存儲情況如圖4.3(1)所示
而
DB‘AB’和
DW‘AB’的存儲情況則分別如圖4.3(2)和(3)所示。
例4.3操作數(shù)?可以保留存儲空間,但不存入數(shù)據(jù)。
如:
ABCDBO,?,?,?,0
DFFDW?,52,?
經匯編后的存儲情況如圖4.4所示。
操作數(shù)字段還可以使用復制操作符(duplicationoperator)來復制某個(或某些)操作數(shù)。其格式為:
repeat_countDUP(operand,…,operand)其中repeat_count可以是一個表達式,它的值應該是一個正整數(shù),用來指定括號中的操作數(shù)的重復次數(shù)。
例ARRAY1DB2DUP(0,1,2,?)
ARRAY2DB100DUP(?)
匯編后的存儲情況如圖4.5所示。
由圖可見,例中的第一個語句和語句
ARRAY1DB0,1,2,?,0,1,2,?
是等價的。
倒4·5DUP操作可以嵌套,例如
ARRAY3DB100DUP(0,2DUP(1,2),0,3)
則匯編結果如圖4.6所示。
DSEFCDAB907856341243443132414242413433例:DATA6DQ1234567890ABCDEFHDATA7DB‘CD12’,‘AB’DATA8DW‘AB’,’34’DATA6CD12ABBA43
注意:1.用DW語句定義的字符串只允許包含兩個字符,若不是兩個字符,須用DB語句來定義。1:數(shù)據(jù)定義語句在存儲器中占有相應的單元,而EQU只是定義了一個數(shù)據(jù),在匯編后以實際數(shù)據(jù)的形式體現(xiàn)在程序中。也就是說,EQU語句不會占有存儲單元。2:EQU可以用在指令中,而數(shù)據(jù)定義語句不可以。DATA7DATA8例:重復操作符DUP的應用。格式:DB/DW/DD/DQ/DT<表達式>DUP(表達式)其中:DUP左邊的表達式表示重復的次數(shù),右邊的括號中的表達式表示要重復的內容,括號中的表達式可以是:一個問號,表示不置初值,為隨機值;一個數(shù)據(jù)表,將相應單元初始化;例:DATASEGMENTARRAY1DB2DUP(0,1,?)ARRAY2DW100DUP(?)ARRAY3DB20DUP(1,3DUP(2),5)DATAENDS100個空出的字單元0001-0001--……-0102020205…0102020205ARRAY1ARRAY2ARRAY3重復20次共100個字節(jié)例4.7OPER1DB?,?OPER2DW?,??MOVOPER1,0MOVOPER2,0則第一條指令應為字節(jié)指令,而第二條指令則應為字指令。
例4.8OPER1DB1,2OPER2DW1234H,5678H
?MOVAX,OPER1+1。MOVAL,OPER2匯編程序在匯編這一段程序時,能發(fā)現(xiàn)兩條MOV指令的兩個操作數(shù)的類型屬性是不相同的:OPER1+1為字節(jié)類型屬性而AX為字類型屬性;OPER2為字類型屬性而AL為字節(jié)類型屬性。因而匯編程序將指示出錯:這兩條MOV指令中的兩個操作數(shù)的類型不匹配。
3.3.3符號定義偽操作(Symboldefinition)1、賦值語句(EQU)格式:符號名EQU表達式
說明:EQU語句給符號定義一個值或其他符號名,甚至定義一條可執(zhí)行指令等。它把表達式賦給符號名。在程序中,EQU對一個符號名只許定義一次。表達式可以是一個常數(shù),或一個可以求出常數(shù)值的表達式,或一個寄存器名,或一個指令助記符。例如COUNTEQU20;把常數(shù)20賦給COUNTBLOCKEQU$-BUF;把表達式$-BUF的值賦給BLOCK例如:PORTEQU3F8H在程序中可使用MOVDX,PORT則等效于MOVDX,3F8H又如:STAT_PORTEQUPORT+2CNEQUCXBEQUDS:[BP+20]等號語句(=)格式:符號名=表達式說明:此語句的功能與EQU類似,但該語句在一個程序中可以對同一符號名多次再定義。例如A1=10;A1定義為10A1=100;A1重定義為100A1EQU20;出錯,因為A1已定義過,不能再用EQU重新定義。如:X=3Y=6Y=Y*Y-X……MOVAX,Y通過上述操作,最后使Y=33,后面的MOV語句中,當生成目標代碼時將用33取代Y。即MOVAX,21H(33D)3、標號定義偽指令LABEL作用:用來在某一變量或標號的基礎上定義一個新的類型不同的變量或標號。格式:變量名或標號名LABEL類型其中:變量的類型可用BYTE、WORD和DWORD;標號的類型有NEAR和FAR。例:VAR1LABELWORDVAR2DB20DUP(1)變量VAR1與VAR2有相同的段基址和偏移量,但類型不同。又如:L1LABELFARL2:MOVAX,1000H標號L1與L2均為指令MOVAX,1000H的符號地址,但類型不同,L1具有FAR類型,L2卻是NEAR類型。例4.9BYTE_ARRAYLABELBYTEWORD_ARRAYDW50DUP(?)這樣在100個字節(jié)數(shù)組中的第一個字節(jié)的地址賦于二個不同類型的變量名:字節(jié)類型的變量BYTE_ARRAY和字類型變量WORD_ARRAY。指令MOVWORD_ARRAY+2,0把該數(shù)組的第3個和第4個字節(jié)置0,而MOVBYTE_ARRAY+2,0則把該數(shù)組的第3個字節(jié)置0。
定義標號有兩種方法,一種是用冒號定義標號(標號名:),這種方法只能定義NEAR屬性的標號;另一種就是使用LABEL偽指令定義標號,它可以定義NEAR或FAR屬性的標號。例如FIRSTLABELFAR;定義FIRST為FAR標號。其地址為該語句的下一條語句的地址。NEXT:CALLN-STEP;定義NEXT為NEAR屬性的標號。FIRST標號可用于段間轉移,而NEXT標號只能用于段內轉移。LABEL偽指令用于為標號或變量指明或修改類型屬性。4、段定義語句
格式:段名SEGMENT[定位類型][組合類型][‘類別’]
┇段名ENDS說明:
這兩個偽操作總是一起出現(xiàn)。該語句將匯編語言源程序分成,如數(shù)據(jù)段、堆棧段和代碼段。。
段名不能省略,由編程者自己指定段名,兩處段名必須一致。
方括號中的三項是可選項,是賦給段名的屬性。各項順序不能錯,且用空格分開。?[定位類型]表示此段的起始邊界要求,可以是PAGE,PARA,WORD或BYTE之一。它們表示如下的地址要求:
PAGE=××××××××00000000BPARA=××××××××××××0000B(默認值)WORD=×××××××××××××××0BBYTE=××××××××××××××××B它們分別表示以頁、節(jié)、字、字節(jié)為段的地址邊界,若項省略,則默認值為PARA(paragraph)。?[組合類型]用來告訴連接程序(LINK)本段與其他段的關系,分別有六個選項(NONE,PUBLIC,COMMON,AT表達式,STACK,MEMORY)NONE本段與其他段邏輯上沒有關系,每段都有自己的基地址。(默認值)PUBLIC把本段與同名同類別的其他段連接成一個段。COMMON為本段和同名同類型的其他段指定相同的基址。各段會產生覆蓋。AT表達式把本段放在表達式的值所指定的地址上(偏移量按0處理),STACK此段為堆棧段,LINK要求被連接的程序至少有一個STACK段。MEMORY把本段定位在所有其他段之上。?[‘類別’]需用單引號括起來,在幾個模塊連接時才需要,若不準備和其他程序組合,可以不指定類別。5、段尋址語句(ASSUME)由于段名是任意的,匯編程序并不知道哪個段名對應哪個段,所以要用ASSUME偽指令來指明段寄存器與段名之間的關系。ASSUME是匯編時進行操作的,它用于在匯編時告訴匯編器,哪個是數(shù)據(jù)段,哪個是代碼段,哪個是堆棧段。ASSUME偽指令格式:ASSUME段寄存器:段名[,段寄存器:段名,…]其中:段寄存器:為CS、DS、ES、SS之一段名:為程序中由SEGMENT定義的段之名。注意:每一個匯編源程序必須使用ASSUME偽指令,且ASSUME語句應安排在代碼段的開始,但ASSUME偽指令并不實際給段寄存器賦值,必須在程序中用指令的實際操作來給段寄存器賦值,例如:
MOVAX,DATAMOVDS,AX注意:①SEGMENT和ENDS前面必須有標號,而且在相互配對的段,它們前面要使用相同的標號。對于不同的段定義標號,盡管這些標號可以是任意字串,但為了程序的可讀性,應使其有一定的意義。②ASSUME語句可使匯編器知道CS、DS、SS指向哪個段,但它只在匯編時起作用,在運行時CPU并不知道除CS外的其它段地址,所以必須在程序中用指令進行賦值。③首條被執(zhí)行的語句有一個標號,用以標出這個程序的開始執(zhí)行處。(在程序的結尾處使用END后跟這個標號)。例:求出兩個16位數(shù)M1和M2的積
DATA_SEGSEGMENT
M1DW0058HM2DW012AHM3DW?M4DW?
DATA_SEGENDS
STACK_SEGSEGMENT
S_DATADB100DUP(?)TOPEQULENGTHS_DATA
STACK_SEGENDS
CODE_SEGSEGMENT
ASSUMECS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEG
58002A01DSM1M2M3M4START:MOVAX,DATA_SEGMOVDS,AXMOVAX,STACK_SEGMOVSS,AXMOVAX,TOPMOVSP,AXMOVBX,OFFSETM1MOVAX,[BX]MOVDX,0MOVBX,OFFSETM2MUL[BX]MOVBX,OFFSETM3MOV[BX],AX
MOVBX,OFFSETM4MOV[BX],DX
MOVAH,4CHINT21HCODE_SEGENDS
ENDSTART6、過程定義語句PROC/END
和其它程序設計一樣,8086/8088匯編程序設計有過程或子程序的設計方法。8086/8066匯編程序的過程從運行位置上分為近過程(NEAR)和遠過程(FAR),其定義如下:
過程名PROC[NEAR]/FAR……RET過程名ENDP
其中:過程名由編程者任??;該語句的PROC與ENDP必須成對出現(xiàn),過程名前后必須一致。
該語句實際上是定義了一個子程序,該過程可以被其他程序調用。
屬性可以是NEAR或FAR,表示該過程可以被段內調用或段間調用如果在過程定義中沒有寫明是NEAR過程或FAR過程,則匯編器將這個過程默認為NEAR過程。例:
PROC_NAME1PROCFAR……RETPROC_NAME1ENDP
過程和其它程序可定義在同一個段中,也可定義在不同的段中。對過程的調用要使用CALL語句,如:
CALLPROC_NAME1過程內部至少要設置一條返回指令(RET)作為過程的出口。允許過程中設置多條返回指令,即具有多個出口。例如SUBPROGPROCFAR┇主程序如下
┇┇
CODESEGMENTRETF┇ASSUMECS:CODE,DS:DATA
SUBPROGENDP┇┇以上定義了一個名為┇CALLSUBPROG
SUBPROG的過程┇
┇┇CODEENDS
7、結束語句格式:END[表達式]說明:該語句表示整個源程序的結束,它告訴匯編程序匯編任務到此結束。表達式必須是源程序的啟動地址。
如果幾個模塊連接在一起,則只能指定主模塊的啟動地址。其他模塊不能有啟動地址。
如果不使用選擇項表達式,則沒有啟動地址傳遞給LINK。程序就不知道從何處啟動。例如ENDSTART;START為源程序的啟動地址。8、程序計數(shù)器$作用:字符$的值為程序下一個所分配的存儲單元的偏移地址。例:DATA SEGMENTB1DB16DUP(?)A1 DB10H,20H,30HC EQU$-A1DATA ENDS則$-A1=13H-10H=03H102030A19、ORG偽指令
作用:用來指定某條語句或某個變量偏移地址。格式為:ORG數(shù)值表達式則此數(shù)值表達式的值將作為下一條指令語句或變量的偏移地址。例:DATASEGMENT ORG2VAR1 DB2,3,4 ORG $+3;此時$=05HVAR2DW 1234HDATA ENDS0203043412VAR1028VAR2ORG用于指定目標程序存放單元的起始偏移地址,通常寫在第一條源程序的前面,用于指定這段程序的首地址。如使用了:ORG100H則程序執(zhí)行時就從CS:100H處開始執(zhí)行其后面的程序。3.5宏指令及其應用一.宏指令的定義由標號、宏指令和注釋構成。由編程者根據(jù)宏指令定義規(guī)則,將一組指令或偽指令集中定義為一條“宏大”的指令,即可以用一條已定義的宏指令代替多條語句。宏指令定義格式:宏指令名MACRO[<形式參數(shù)1>,<形式參數(shù)2>,…]<語句組>;宏體ENDM其中:宏指令名由編程者任取;形式參數(shù)在調用宏指令時用實在參數(shù)來替代,也可以不設參數(shù)。例:將對某一寄存器的移位操作定義為一個宏指令。(1)SHIFTMACROMOVCL,4 SHLAX,CL ENDM宏指令SHIFT將AX左移4次。(2)SHIFTMACROCNMOVCL,CN SHLAX,CL ENDM則SHIFT4;將AX左移4次。
SHIFT5;將AX左移5次。不設參數(shù)設一個參數(shù)(3)SHIFTMACROCN,RMOVCL,CN SHLR,CL ENDM則SHIFT4,AX;將AX左移4次。
SHIFT2,BX;將BX左移2次。(4)SHIFTMACROCN,R,SDMOVCL,CN S&SDR,CL;用&將參數(shù)標注出來,以便替換 ENDM則SHIFT4,AX,HL;將AX左移4次。
SHIFT2,BX,HR;將BX右移2次。設二個參數(shù)設三個參數(shù)二.宏指令的使用使用宏指令時需要將形式參數(shù)用一一對應的實在參數(shù)替代。當實在參數(shù)個數(shù)多于形式參數(shù),忽略多余的形式參數(shù)。當實在參數(shù)個數(shù)少于形式參數(shù),多余的形式參數(shù)設為空白。宏指令中的參數(shù)可以為:常數(shù)、寄存器、存儲單元名、地址表達式以及指令的助記符或助記符的一部分。例: SHIFT MACROR,CN MOVCL,CN SHLR,CL ENDM DATA SEGMENT X DB08H DATA ENDS CODE SEGMENT ASSUMECS:CODE,DS:DATAMAINPROCFAR PUSHDS MOVAX,0 PUSH AX MOV AX,DATA MOVDS,AX MOVBX,OFFSETX MOVAL,[BX]
SHIFTAL,4 RETMAIN ENDPCODEENDS ENDMAIN四.取消宏指令偽指令PURGE宏指令一經定義,在整個程序中有效,若宏指令名與指令或偽指令助記符相同,則宏指令優(yōu)先級更高。若出現(xiàn)了這種情況,應在一定時取消宏指令,使失效的指令或偽指令恢復功能。格式如下:PURGE<宏指令名1>,<宏指令名2>,…五.定義局部標號偽指令LOCAL
在定義宏指令時,宏體中有可能出現(xiàn)標號。當宏指令多次被調用時,則會出錯。此時,可以用LOCAL偽指令將宏體中的標號定義為局部標號,格式為:
LOCAL標號1,標號2,…例:用一條宏指令完成延時。
DELAY MACROX
LOCAL DELAY1,WAIT1 MOVBL,XDELAY1:MOVCX,2942WAIT1:LOOPWAIT1 DECBL JNZDELAY1 ENDM… DELAY100+ MOVBL,100+??0000:MOVCX,2942
+??0001: LOOP??0001 DELBL JNZ??0000… DELAY10+ MOVBL,10+??0002:MOVCX,2942+??0003:LOOP??0003 DECBL JNZ??0002
注:此程序為.LST文件,以“+“開頭的語句行為宏指令的展開還原部分。4.6匯編語言程序設計基礎
匯編語言程序設計與其它語言的程序設計一樣,都要有良好的數(shù)據(jù)結構和算法,對每個要解決的問題要經過如下步驟:①根據(jù)問題提出相應的算法或邏輯過程;②根據(jù)已確定的算法或邏輯過程畫出程序流程圖,把解題的思路和邏輯順序以圖示的方法表示出來。③分配工作單元和寄存器。當然,在8086/8088匯編程序設計中,由于可用資源相對其它一些CPU和計算機系統(tǒng)較多,所以這項工作也可在程序編制中進行。④編寫程序代碼。
在程序設計中,程序的效率是程序設計好壞的重要指標,特別是在匯編程序設計中,其特點要求我們對程序運行的效率加以重點關注。對于匯編語言程序我們可以考慮以下幾方面作為程序運行效率的衡量標準:①
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中職護理學基礎(護理基礎理論)試題及答案
- 2025年中職(財經應用文實訓)應用文實訓綜合測試試題及答案
- 貴州省黔南布依族苗族自治州2025年八年級上學期期末物理試題附答案
- 中國空間站技術
- 2026年泉州市澤區(qū)臨海實驗幼兒園招聘代課老師、保育員備考題庫及參考答案詳解一套
- 中國石化教學介紹
- 近五年甘肅中考英語試題及答案2025
- 養(yǎng)老院老人生活照顧制度
- 養(yǎng)老院老人健康飲食營養(yǎng)師行為規(guī)范制度
- 養(yǎng)老院入住老人心理健康監(jiān)測制度
- 上海市二級甲等綜合醫(yī)院評審標準(2024版)
- 2024小區(qū)物業(yè)突發(fā)應急處理服務合同協(xié)議書3篇
- 汽車維修業(yè)務接待
- 藥物發(fā)錯藥不良事件分析
- 四川省南充市2023-2024學年五年級上學期語文期末考試試卷(含答案)
- 高速公路工程投標文件施工組織設計(技術標)
- 溝槽開挖應急預案
- DBJ04∕T 398-2019 電動汽車充電基礎設施技術標準
- 供應鏈管理工作計劃與目標
- (正式版)JBT 9229-2024 剪叉式升降工作平臺
- GB/T 15231-2023玻璃纖維增強水泥性能試驗方法
評論
0/150
提交評論