第2章匯編語言_第1頁
第2章匯編語言_第2頁
第2章匯編語言_第3頁
第2章匯編語言_第4頁
已閱讀5頁,還剩270頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第2章匯編語言程序設(shè)計語言可分為機(jī)器語言、匯編語言和高級語言三種。

機(jī)器語言是由1和0兩個二進(jìn)制數(shù)碼組成的,是唯一能直接在計算機(jī)上運行的語言。

用一些助記符號來代替用二進(jìn)制碼編寫的程序。這種用助記符來描述指令的語言稱為匯編語言。用匯編語言寫出的程序稱為匯編語言程序。匯編語言程序必須翻譯為二進(jìn)制機(jī)器語言才能送給計算機(jī)執(zhí)行,這個過程稱為匯編。

計算機(jī)不能直接執(zhí)行高級語言,要通過編譯或解釋程序,將其翻譯成為機(jī)器語言,才能被執(zhí)行。常用的高級語言有:C語言、VC、VB等。1第2章匯編語言2.1尋址方式2.2指令系統(tǒng)2.3匯編語言2.4匯編語言程序設(shè)計4.124.1尋址方式2.1.18086/8088指令概述2.1.28086/8088指令尋址方式概述32.1.18086/8088指令概述1.指令:指令是計算機(jī)執(zhí)行某種操作的命令:內(nèi)容包括做什么操作,操作數(shù)的來源,結(jié)果的存放,以及下一條指令的位置等等。2.指令系統(tǒng):計算機(jī)提供給用戶使用的所有指令的集合8086CPU包含133條指令。3.程序:一些指令的有機(jī)結(jié)合,用于完成某種目的。指令格式44.指令格式:操作碼:操作數(shù)操作碼:指計算機(jī)所要執(zhí)行的操作,如:傳送、運算、移位、跳轉(zhuǎn)等操作,是指令中必不可少的組成部分。是一種助記符。操作數(shù):指出在指令執(zhí)行操作過程中所需要的操作數(shù);可以是操作數(shù)本身;可以是操作數(shù)地址或是地址的一部分;可以是指向操作數(shù)地址的指針或其他有關(guān)操作數(shù)的信息。指令一般格式55.指令的一般格式:(1)操作碼字段:在機(jī)器里只需對某種操作確定的二進(jìn)制代碼。通常用指令的第一個字節(jié)表示,不夠可以占第二個字節(jié)中的3位。(2)操作數(shù)字段:①單地址指令的操作只需一個操作數(shù),如加1指令:INCCX。②大多數(shù)運算型指令都需要兩個操作數(shù),如加法指令:ADDAX,BX;運算的結(jié)果送到AX中,AX稱為目的操作數(shù),BX稱為源操作數(shù)。操作數(shù)種類6(3)操作數(shù)的種類①隱含操作數(shù):操作數(shù)被操作助記符隱含著。例:DAA;對壓縮BCD加法結(jié)果進(jìn)行調(diào)整,操作數(shù)隱含在AL中。②立即操作數(shù):操作數(shù)包含在指令中,指令的操作數(shù)字段包含操作數(shù)本身。只能作為源操作數(shù),不能作為目標(biāo)操作數(shù)。例:MOVAL,08H③寄存器操作數(shù):操作數(shù)包含在CPU的一個內(nèi)部寄存器中,指令的操作數(shù)字段為CPU內(nèi)部的一個寄存器名稱。例:INCCX 7④存儲器操作數(shù):操作數(shù)存放在內(nèi)存數(shù)據(jù)區(qū)中,操作數(shù)字段包含著此操作數(shù)地址。

在8086/8088編程中,任何內(nèi)存地址是由兩部分組成:

段基地址:存儲單元所在段的基地址,在程序中一般是隱含的(大部分情況是隱含在數(shù)據(jù)段寄存器DS中);

偏移量:此存儲單元與段基地址的距離,用有效地址EA(EffectiveAddress)表示:

段內(nèi)偏移量為適應(yīng)各種數(shù)據(jù)結(jié)構(gòu)的需要,可以有幾個部分組成,所以也把它稱為有效地址EA。尋址方式不同EA的構(gòu)成不同。

4.1.2尋址方式82.1.28086/8088指令尋址方式尋址:尋找操作數(shù)的過程稱為尋址。尋址方式:尋找操作數(shù)的方法稱為尋址方式。8086/8088有8種尋址方式,可分為三類:1.立即尋址2.寄存器尋址3.存儲器尋址直接尋址寄存器間接尋址基址尋址變址尋址基址加變址尋址相對尋址1立即尋址91.立即尋址操作數(shù)直接出現(xiàn)在指令中,緊跟在操作碼之后,與操作碼一起放在代碼段區(qū)域中。例1:MOVAL,05H指令執(zhí)行后:(AL)=05H例2:MOVAX,3064H指令執(zhí)行后:(AX)=3064H說明10說明:立即數(shù)可以是8位的,也可以是16位的。若是16位的的立即數(shù),則存儲時是高位字節(jié)放在高地址單元,低位字節(jié)放在低地址單元。立即尋址主要用來給寄存器或存儲單元賦初值。用于給寄存器賦值時,無需執(zhí)行總線周期,執(zhí)行速度快。2.寄存器尋址112.寄存器尋址操作數(shù)在指定的寄存器中。對于16位操作數(shù),寄存器可以是AX,BX,CX,DX,SI,DI,SP,BP,CS,DS,ES,SS;對于8位操作數(shù),寄存器可以是AH,AL,BH,BL,CH,CL,DH或DL。這種尋址方式因為操作數(shù)在寄存器中,不需要訪問存儲器,因此運算速度較高。例子12例1:

MOVDS,AX設(shè)指令執(zhí)行前:(AX)=3064H (DS)=1234H指令執(zhí)行后: (DS)=3064H(AX)保持不變。指令執(zhí)行前:指令執(zhí)行后:寄存器尋址方式DS例2:INCCX例3:DECCL3.存儲器尋址133.存儲器尋址操作數(shù)都在內(nèi)存單元中存放,指令中操作數(shù)部分是要進(jìn)行操作數(shù)據(jù)的有效地址EA。EA的組成不同又分為:直接尋址寄存器間接尋址基址尋址變址尋址基址加變址尋址相對尋址(1)直接尋址14(1)直接尋址(Directaddressing)指令中操作數(shù)部分直接給出操作數(shù)的有效地址EA。操作數(shù)一般存放在數(shù)據(jù)段中,即默認(rèn)的段寄存器為DS。必須先求出操作數(shù)的物理地址,然后再訪問存儲器才能取得操作數(shù)。物理地址:PA=16d×(DS)+EA允許數(shù)據(jù)存放在數(shù)據(jù)段以外的其它段中。此時應(yīng)在指令中指定段超越(可以是CS,SS,ES)。例子15例:MOVAX,[3100H]設(shè):(DS)=6000H,(63100H)=3050H

則:(AX)=3050H又如:用符號地址代替數(shù)值地址。

MOVAX,VALUE

或MOVAX,[VALUE]VALUE——有效操作數(shù)單元的 符號地址。如:VALUE在附加段中,則應(yīng)指定段跨越。

MOVAX,ES:VALUE

或MOVAX,ES:[VALUE]直接尋址方式注意16注意:(1)直接尋址方式適用于處理單個變量。(2)直接尋址方式隱含的段寄存器是DS,8086/8088允許段跨越,即允許使用CSSSES作為段寄存器,這時,必須在指令中特別標(biāo)明。

(3)IBMPC機(jī)中規(guī)定雙操作數(shù)指令必須有一個操作數(shù)使用寄存器方式,這就是常常先要把一個變量送到寄存器去的原因。例:要處理某存放在存儲器里的變量,可以用直接尋址方式把變量先取到一個寄存器中再作處理。(2)寄存器間接尋址17(2)寄存器間接尋址方式(Registerindirectaddressing)

操作數(shù)的有效地址EA在寄存器(BP、BX、SI、DI)中

a、若選擇SI、DI、BX作為間接尋址 操作數(shù)一般在現(xiàn)行數(shù)據(jù)段區(qū)域中,用(DS)作為段地址。 即操作數(shù)物理地址為:

物理地址PA=16d×(DS)+(BX)

物理地址PA=16d×(DS)+(SI)

物理地址PA=16d×(DS)+(DI)例子18

例:MOVBX,[DI]設(shè)(DS)=6000H(DI)=2000HPA=62000H(62000H)=50A0H

(BX)=50A0H寄存器間接尋址方式

MOVBX,[DI]b19b、若選擇BP寄存器作為間接尋址操作數(shù)在堆棧段區(qū)域中,用SS寄存器的內(nèi)容作為段地址。

操作數(shù)物理地址:

PA=16d×(SS)+(BP)例:MOVAX,[BP]執(zhí)行前:(SS)=1000H, (BP)=3000H,

PA=13000H,(13000H)=1234H執(zhí)行后:(AX)=1234H

c寄存器間接尋址方式

MOV[BP],AX20c、用SI、DI、BX、BP作為間接尋址允許段跨越

指令中可以指定段跨越前綴來取得其他段中的數(shù)據(jù)。例:MOVES:[DI],AX

物理地址PA=16d×(ES)+(DI)MOVDX,DS:[BP]

物理地址PA=16d×(DS)+(BP)3。4.基址變址尋址21(3、4)基址/變址尋址操作數(shù)的有效地址EA是一個基址或變址寄存器的內(nèi)容和指令中指定的8位或16位位移量(displacement)之和。

其中,BX、BP為基址寄存器;SI、DI為變址寄存器。22操作數(shù)一般在內(nèi)存的數(shù)據(jù)段中,但允許段超越。除有段超越前綴之外,形成物理地址有二種方式:

例子23例:

MOVAX,COUNT[BP]或MOVAX,[COUNT+BP]或MOVAX,COUNT+[BP]COUNT為16位位移量。指令執(zhí)行前:(SS)=5000H, (BP)=3000H, COUNT=2040H, (AX)=1234H指令執(zhí)行后:EA=5040H PA=55040H (55040H)=5548H (AX)=5548H寄存器相對尋址方式MOVAX,COUNT[BP]用途24用途:這種尋址方式可用于表格處理。表格首地址COUNT

修改基址或變址寄存器來取得表格中的值。例:某數(shù)據(jù)表的首地址為COUNT

欲讀取表中第10個數(shù)據(jù),存放到(AL)中。第10個數(shù)據(jù)的有效地址:EA=COUNT+9 MOVSI,09H MOVAL,[SI+COUNT]* 基址(變址)尋址方式也可以使用段超越前綴

MOVDL,ES:STRING[SI]基址加變址25(5)基址加變址尋址方式(Basedindexedaddressing)

操作數(shù)的有效地址EA是一個基址寄存器和一個變址寄存器的內(nèi)容之和,基址寄存器名和變址寄存器名均由指令指定。PA物理地址26除有段超越前綴之外,形成物理地址有二種方式:例子27例:

MOVAX,[BX][SI]或MOVAX,[BX+SI]執(zhí)行指令前:

(DS)=3200H, (BX)=0456H, (SI)=1094H (334EAH)=4567H執(zhí)行指令后:

EA=14EAH PA=334EAH (AX)=4567H基址加變址尋址方式

MOVAX,[BX+SI]用途28用途:這種尋址方式同樣適用于數(shù)組或表格處理。 表格首地址基址寄存器中,

用變址寄存器來訪問數(shù)組中的元素。 二個寄存器都能修改, 所以比基址(或變址)方式更靈。這種尋址方式允許段超越。 使用段超越前綴格式:

MOVAX,ES:[BX][SI]相對尋址方式29(6)相對基址加變址尋址方式(相對尋址方式)

(Relativebasedindexedaddressing)操作數(shù)有效地址EA是一個基址寄存器和一個變址寄存器的內(nèi)容和8位或16位位移量之和。物理地址的形成30除有段超越前綴之外,形成物理地址有二種方式:例子31例:MOVAX,MASK[BX][DI]MOVAX,MASK[BX+DI]MOVAX,[MASX+BX+DI]執(zhí)行指令前:(DS)=3000H(BX)=1346H(DI)=0500HMASK=1234H(32A7AH)=4050H執(zhí)行指令后:EA=2A7AHPA=32A7AH(AX)=4050H相對基址加變址MOVAX,MASK+[BX+DI]用途32用途: 這種尋址方式為堆棧處理提供方便: (BP)

棧頂(一般BP可指向棧頂) 從棧頂?shù)綌?shù)組的首地址可以用位移量表示(MASK).

變址寄存器(SI)或(DI)——指向數(shù)組中某個元素。331.符號:在指令系統(tǒng)中,符號是一個字符串,它由字母字符(A~Z,a~z)、數(shù)字字符(0~9)和特殊字符(?、$、@、_(下劃線))構(gòu)成。首字符不可以是數(shù)字;不能是匯編語言中有特定意義的保留字,如:MOV,AH等符號的字符個數(shù)不大于80,但只有前31個有效;對于字母字符不區(qū)分大小寫;單獨一個?不能作為一個符號。正確的符號:ABCDX1、aBCdx1和abcdx1表示同一符號;$$$1、L123、??459。錯誤的符號:L1、X=CT、34AB,因符號中有空格、有“=”、數(shù)字為首字符。符號、變量和常量三個概念2、3變量、常量342.變量:在匯編語言中,變量是存儲器中一個數(shù)據(jù)或多個數(shù)據(jù)(一個數(shù)據(jù)區(qū))的符號表示,當(dāng)表示數(shù)據(jù)區(qū)時,變量的指針僅指向該數(shù)據(jù)區(qū)的第一個數(shù)據(jù)項。變量的構(gòu)成法同符號。3.常量:常量表示固定的值,通常又分為數(shù)值常量和符號常量。數(shù)值常量就是以值的形式表示常量,如355、46AH等。符號常量就是用符號表示常量,如用TWO表示2,TWO就是符號常量,表示常數(shù)2。4.2指令系統(tǒng)352.2指令系統(tǒng)2.2.1數(shù)據(jù)傳送類2.2.2算術(shù)運算類2.2.3位操作類2.2.4串操作類2.2.5程序控制類2.2.6處理器控制類2.2.7前綴操作類4.2.1362.2.1.數(shù)據(jù)傳送類概述特點:把數(shù)據(jù)從計算機(jī)的一個部位傳送到另一部位傳送類指令中有兩個操作數(shù):源操作數(shù)和目的操作數(shù)源操作數(shù)是指發(fā)送部位的操作數(shù)目的操作數(shù)是指接收部位的操作數(shù)指令操作:將源操作數(shù)的內(nèi)容送到目的操作數(shù),交換指令除外指令分類:數(shù)據(jù)傳送、地址傳送、標(biāo)志傳送、輸入輸出和交換

數(shù)據(jù)傳送類指令371.數(shù)據(jù)傳送指令(3條)(1)數(shù)據(jù)傳送指令(MOV)指令格式:MOVDST,SRC ;DST←SRC指令操作:把一個字節(jié)或一個字操作數(shù)從源傳送到目的地。源操作數(shù)可以是寄存器、段寄存器、存儲器以及立即操作數(shù);目的操作數(shù)可以是寄存器、存儲器和段寄存器數(shù)據(jù)傳送方向:圖4-3。38數(shù)據(jù)傳送方向:圖2-3。注意:立即操作數(shù)、段寄存器CS只能作為源操作數(shù);源、目的操作數(shù)只能有一個是存儲器操作數(shù);立即操作數(shù)不能直接送給段寄存器。段寄存器之間不能傳送數(shù)據(jù)實例39指令實例:MOVAH,BL ;AH←BLMOVBL,254 ;BL←254MOVAX,[BX] ;AH←[BX+1]、AL←[BX]MOV[DI],ES ;[D1+1]←ESH(ES的高8位) ;[DI]←ESL(ES的低8位)MOVDS,AX ;DS←AXMOVCOUNT[DI],AX;COUNT[DI+1]←AH、 ;COUNT[DI]←AL注意事項40使用MOV指令須注意:源、目的操作數(shù)不能同時為存儲器操作數(shù);兩操作數(shù)的類型屬性要一致;操作數(shù)不得出現(xiàn)二義性。下列指令是非法的:MOVAX,BL ;類型不一致。MOVAH,2589 ;類型不一致。MOVCS,AX ;CS不能作為目的操作數(shù)。MOV[SI],[BX];源、目的操作數(shù)都是存儲器操作數(shù)。MOV[BX],1;操作數(shù)1出現(xiàn)二義性,不知是字1還是字節(jié)1。MOVDS,3542H;指令形式錯,立即操作數(shù)不能直接送給段寄存器。非法指令改進(jìn)41非法指令“MOV[BX],1若改為:MOVWORDPTR[BX],1表示把字節(jié)1存入[BX+1][BX]兩個連續(xù)單元(亦稱為字單元)中,或改為:MOVBYTEPTR[BX],1表示把字節(jié)1存入[BX]單元。兩種都是正確的。(2)進(jìn)棧指令42(2)進(jìn)棧指令指令格式:PUSHSRC ;[SP-1]←SRCH,[SP-2]←SRCL,SP←SP-2 SRC為REG16或MEM16或SEGREGPUSHF ;[SP-1]←FLAGH,[SP-2]←FLAGL,SP←SP-2指令操作:該類指令可將16位寄存器、存儲器相鄰兩單元、段寄存器和標(biāo)志寄存器的內(nèi)容壓入堆棧棧頂。該類指令一般僅給出源操作數(shù),且都是字信息,目的操作數(shù)被操作助記符隱含著。而標(biāo)志寄存器的內(nèi)容進(jìn)棧則源和目的都是被操作助記符隱含著。實例43指令實例:MOVAX,5000H ;AX←5000HMOVSS,AX ;SS←AX,設(shè)置堆棧段為5000HMOVSP,1000H;SP←1000H,設(shè)置堆棧指針為

1000HPUSHF ;[SP-1]←FLAGH、

;[SP-2]←FLAGL、SP←SP-2PUSHAX;[SP-1]←AH、[SP-2]←AL、 ;SP←SP-2PUSHDS;[SP-1]←DSH、[SP-2]←DSL、 ;SP←SP-2(3)出棧指令44(3)出棧指令指令格式:POPDST ;DSTL←[SP],DSTH←[SP+1],SP←SP+2 ;DST為REG16或MEM16或SEGREGPOPF ;FLAGL←[SP],F(xiàn)LAGH←[SP+1], ;SP←SP+2指令操作:該類指令可將棧頂內(nèi)容(字信息占兩個單元)彈出送到16位寄存器、段寄存器(不允許是CS)、存儲器相鄰兩單元或標(biāo)志寄存器中。源操作數(shù)被助記符隱含,目的操作數(shù)被顯式給出。它是進(jìn)棧指令的逆操作。實例45指令實例:POPDX ;棧頂內(nèi)容送DXPOP[DI];棧頂內(nèi)容送偏移地址由DI確定的字存儲單元POPF ;棧頂內(nèi)容送FLAG2.地址傳送類指令462.地址傳送類指令8086/8088有三種專門傳送地址的指令:(1)有效地址傳送指令(傳送有效地址到寄存器)(2)地址指針傳送指令1(傳送地址指針進(jìn)入數(shù)據(jù)段)(3)地址指針傳送指令2(傳送地址指針進(jìn)入附加段)(1)47(1)有效地址傳送指令(傳送有效地址到寄存器)指令格式:LEAREG16,MEM指令操作:這里源操作數(shù)必須是存儲器操作數(shù),目的操作數(shù)必須是16位寄存器,指令意義是將源操作數(shù)的偏移地址送任一16位寄存器。該指令通常用來往某個REG16中設(shè)置偏移地址的初值,以便從此地址開始存取多個數(shù)據(jù)。指令實例:LEA DI, BUFF1 ;將變量BUFF1的偏移地址送DILEA BX, DATA[SI] ;將地址表達(dá)式DATA[SI]的 ;偏移地址送BX(2)48(2)地址指針傳送指令1(傳送地址指針進(jìn)入數(shù)據(jù)段)指令格式:LDSREG16,MEM32指令操作:將地址指針(雙字長的存儲器操作數(shù))設(shè)置到DS:REG16,其段地址部分送DS,偏移地址送REG16。這種指令為存取非當(dāng)前數(shù)據(jù)段中的信息作地址準(zhǔn)備。指令實例:LDS SI,[BX];DS←[BX+3][BX+2], SI←[BX+1][BX]。(3)49(3)地址指針傳送指令2(傳送地址指針進(jìn)入附加段)指令格式:LESREG16,MEM32指令操作:該指令除將地址指針的段地址部分送ES外,與LDS類似。指令實例:LESBX,[DI][5];ES←[DI+8][DI+7]BX←[DI+6][DI+5]3.交換類指令503.交換類指令(2條)(1)交換指令指令格式:XCHGDST,SRC ;DST←→SRC指令操作:該指令可實現(xiàn)一個字節(jié)或一個字的源操作數(shù)與目的操作數(shù)的交換。交換能在寄存器之間、寄存器與存儲器之間進(jìn)行。三種具體形式:XCHGREG,REG ;REG←→REGXCHGREG,MEM ;REG←→MEMXCHGMEM,REG ;MEM←→REG實例51指令實例:XCHGAH,CL ;AH←→CLXCHGBFF1,AX ;(BFF1+1、BF1)←→AXXCHGBX,COUNT[SI] ;BX←→(COUNT[SI+1]、COUNT[SI])指令說明:BFF1在本節(jié)為字變量,BFF1+1、BFF1、COUNT[SI+1]、COUNT[SI]分別表示以它們?yōu)槠频刂返拇鎯卧膬?nèi)容。交換指令的使用注意事項同MOV指令。上述數(shù)據(jù)傳送數(shù)指令對標(biāo)志位無影響。(2)換碼指令52(2)換碼指令指令格式:XLATLABELXLAT 指令操作:AL←DS:[BX+AL]換碼指令的兩種格式完全等效。第一種格式中,LABEL表示首地址;第二種也可以用XLATB助記符。在兩種格式中,實際的首地址均在BX寄存器中。實例53指令實例:將首地址為100H的表格緩沖區(qū)中的3號數(shù)據(jù)取出。MOVBX,100HMOVAL,03HXLAT因為AL的內(nèi)容實際上是距離表格首地址的位移量,只有8位,所以表格的最大長度為256,超過256的表格需要采用修改BX和AL的方法才能轉(zhuǎn)換。XLAT指令中沒有顯式指明操作數(shù),而是默認(rèn)是用BX和AL寄存器,這種方法稱為隱含尋址方式。換碼指令常應(yīng)用于掃描碼轉(zhuǎn)換為ASCII碼,數(shù)字0~9轉(zhuǎn)換為7段顯示碼等查表操作。4.輸入輸出類指令544.輸入輸出類指令(2條)(1)輸入指令指令格式:INAL,PORT8 ;字節(jié)輸入:AL←PORT8INAX,PORT8 ;字輸入:AL←PORT8,AH←PORT8+1INAL,DX ;字節(jié)輸入:AL←PORT[DX]INAX,DX ;字輸入:AL←PORT[DX],AH←PORT[DX+1]指令操作:將端口數(shù)據(jù)讀入到AL(字節(jié))或AX(字)。(2)輸出指令55(2)輸出指令指令格式:OUT PORT8,AL ;字節(jié)輸出:PORT8←ALOUTPORT8,AX ;字輸出:PORT8←AL, ;PORT8+1←AHOUTDX,AL ;字節(jié)輸出:PORT[DX]←ALOUTDX,AX ;字輸出:PORT[DX]←AL, ;PORT[DX+1]←AH指令操作:將AL(字節(jié))或AX(字)數(shù)據(jù)寫到端口。使用56輸入輸出類指令使用:

8086用于尋址外設(shè)端口的地址線為16位,共65536個(64K)端口,端口號為0000H~FFFFH。每個端口用于傳送外設(shè)的一個字節(jié)數(shù)據(jù);尋址前256個端口時,輸入輸出指令可以用直接尋址,操作數(shù)PORT8即為端口號,其范圍為00H~FFH;當(dāng)尋址大于256的外設(shè)端口時,只能使用DX寄存器間接尋址,其范圍為0000H~FFFFH;輸入輸出指令還分成用AL進(jìn)行的字節(jié)傳送和用AX進(jìn)行的字傳送。實現(xiàn)字傳送時,AL與PORT8或[DX]端口交換之間傳送,AH與PORT8+1或[DX+1]端口交換之間傳送。字傳送實際上可以用兩條字節(jié)傳送實現(xiàn)。對于CPU,只有輸入IN/輸出OUT指令可以從外設(shè)讀取數(shù)據(jù)和向外設(shè)提供數(shù)據(jù)。4.2.2算術(shù)運算類指令572.2.2算術(shù)運算指令可處理數(shù)據(jù)類型無符號二進(jìn)制數(shù)帶符號二進(jìn)制數(shù)(用補(bǔ)碼形式表示)壓縮BCD數(shù)非壓縮BCD數(shù)例:AL=82H表示130(無符號數(shù))-7EH(帶符號數(shù))82D(壓縮BCD數(shù))1.加法類指令581.加法類指令(三種)(1)不帶進(jìn)位位的加法指令指令格式:ADDDST,SRC;DST←DST+SRC指令操作:目的操作數(shù)與源操作數(shù)相加,結(jié)果送目的操作數(shù)操作數(shù)要求:DST可以是寄存器或存儲器,SRC可以是立即操作數(shù)、寄存器或存儲器,但DST、SRC不能同時為存儲器。形式59ADD指令有五種形式:ADDREG,REG ;REG←REG+REGADDREG,MEM ;REG←REG+MEMADDREG,IMM ;REG←REG+IMMADDMEM,REG ;MEM←MEM+REGADDMEM,IMM ;MEM←MEM+IMM實例60指令實例:ADDAX,BX ;AX←AX+BXADDAL,DATA1[SI] ;AL←AL+DATA1[SI]ADDBX,1000 ;BX←BX+1000ADDWORDPTRDATA1,AX ;(DATA1+1、DATA1)←(DATA1+1、DATA1)+AXADDBFF1[SI],BX ;(BFF1[SI+1]、BFF1[SI])←(BFF1[SI+1]、BFF1[SI])+BX對標(biāo)志位的影響61ADD指令執(zhí)行后對標(biāo)志位的影響:CF*:當(dāng)結(jié)果的最高位(字節(jié)操作時是D7,字操作時為D15)產(chǎn)生進(jìn)位CF=1,否則CF=0。ZF*:結(jié)果為零ZF=1,否則ZF=0。OF*:字節(jié)運算時結(jié)果不在字節(jié)有符號數(shù)的范圍(-128~

+127),字運算時不在字有符號數(shù)的范圍(-32768~+32767)OF=1,否則OF=0。SF*:結(jié)果的最高位是1,SF=1,否則SF=0,即SF總是和結(jié)果的最高位保持一致。PF:結(jié)果低8位的二進(jìn)制位“1”的個數(shù)為偶數(shù),則PF=1,否則PF=0。AF:字節(jié)運算時,D3向D4產(chǎn)生進(jìn)位,AF=1,否則AF=0。例子62(2)帶進(jìn)位加法01100101

1010

0000+)10110111

10011110設(shè)AX=65A0H,BX=B79EH,則指令A(yù)DDBX,AX00011101

0011

1110OF=0CF=1SF=0ZF=0AF=0PF=0BX=1D3EH63(2)帶進(jìn)位位的加法指令指令格式:ADCDST,SRC 指令操作:

DST←DST+SRC+CF該指令與ADD的唯一不同是,除源和目的操作數(shù)相加外,還要加上進(jìn)位位CF的現(xiàn)行值,其五種指令形式與ADD相似,對標(biāo)志位影響同ADD。指令用途:用于多字節(jié)加法運算。

用途舉例64(3)增量指令兩個32位數(shù)相加:可將其中一個加數(shù)放在DX,AX中;另一個加數(shù)放在BX,CX中。DXAXBXCXADDAX,CXADCDX,BX結(jié)果存放在DX,AX中CF65(3)增量指令I(lǐng)NC指令格式:INCDSRC 指令操作:

DSRC←DSRC+1DSRC既表示源操作數(shù),也表示目的操作數(shù)。兩種形式:INCREG;REG←REG+1INCBYTE/WORDPTRMEM;MEM←MEM+1指令用途:主要用于修改偏移地址或計數(shù)次數(shù)。注意66INC指令對進(jìn)位標(biāo)志CF沒有影響,保持該指令執(zhí)行前的狀態(tài)。對其余標(biāo)志位有影響,影響的結(jié)果同ADD。指令實例:ADDAL,0;CF=0MOVAL,0FEH;CF=0INCAL;CF=0INCAL;CF=0說明ADDAL,1CF=167指令說明:INC指令的操作數(shù)只能是寄存器或存儲器。當(dāng)使用存儲器操作數(shù)時,不得出現(xiàn)二義性。例:指令I(lǐng)NC[SI]是非法指令原因:不能確定[SI]是字還是字節(jié)存儲器操作數(shù),出現(xiàn)二義性可改寫為:INCBYTEPTR[SI]

或:INCWORDPTR[SI]2.減法類指令682.減法類指令三種:不帶借位位的減法指令、帶借位位的減法指令和減量指令。指令格式:SUBDST,SRC ;DST←DST-SRCSBBDST,SRC ;DST←DST-SRC-CFDECDSRC ;DSRC←DSRC-1指令說明:這三種指令除進(jìn)行減法外,其指令形式、操作數(shù)、使用注意事項都與相應(yīng)的加法類指令相同。對標(biāo)志位的影響69對標(biāo)志位的影響:SBB/SUB除對CF和AF特殊之外,其余均與ADD相同,DEC指令與INC相同對CF無影響,對其他標(biāo)志位均有影響。例子703.取負(fù)指令例:設(shè)AL=05H,BL=08H,則指令SUBAL,BL[X]補(bǔ)=00000101[Y]補(bǔ)=00001000[-Y]補(bǔ)=11111000求補(bǔ):連同符號位一起求反,加100000101+)111110001111110100SF=1ZF=0PF=0OF=0CF=1AF=1最高位無進(jìn)位,就稱有借位,為1最高位有進(jìn)位,就稱無借位,為0D3向D4位無進(jìn)位,就稱有借位,為1D3向D4位有進(jìn)位,就稱無借位,為0713.取負(fù)指令指令格式:NEGDSRC ;DSRC←0-DSRC指令說明:指令形式、操作數(shù)說明、使用注意事項同INC??筛淖償?shù)的符號,不改變數(shù)的絕對值。執(zhí)行后對標(biāo)志位的影響同SUB。通常指令執(zhí)行后CF一般總是1,除非操作數(shù)的內(nèi)容是零。若DSRC=-128或-32768,操作數(shù)不變,但OF=1。指令實例:NEGAX ;AX←0-(AX);NEGBYTEPTR[SI] ;[SI]←0-[SI]4.算術(shù)比較指令724.算術(shù)比較指令指令格式:CMPDST,SRC指令操作:DST-SRC,按減法影響標(biāo)志位,但兩個操作數(shù)均保持不變。指令說明:指令形式、操作數(shù)說明、使用注意事項、指令執(zhí)行后對標(biāo)志位的影響同SUB。指令用途:用來判斷兩數(shù)的大小關(guān)系。具體規(guī)則731.ZF=1兩數(shù)相等2.無符號數(shù)CF=1DST<SRC0DST>SRC3.帶符號數(shù)SF⊕OF=1DST<SRC0DST>SRC5.乘法類指令745.乘法類指令(1)無符號數(shù)乘法指令(unsignedMULtiply)指令格式:MULSRC指令操作:字節(jié)乘:AX←AL×字節(jié)SRC字乘:DX:AX←AX×字SRC。指令說明75指令說明:SRC只能是寄存器或存儲器操作數(shù),可以是字節(jié)或字。乘法指令的目的操作數(shù)隱含為AL(字節(jié))或AX(字),這取決于SRC的類型屬性。結(jié)果的存放:當(dāng)SRC為字節(jié)操作數(shù)時,結(jié)果存放于AX;當(dāng)SRC為字操作數(shù)時,結(jié)果存放于DX:AX.乘法指令的形式為:MULREG/MEM對標(biāo)志位的影響76乘法指令對標(biāo)志位的影響:指令執(zhí)行后,若結(jié)果的高半部分(字節(jié)相乘時為AH,字相乘時為AX)不為零,則CF=OF=1,否則兩者均為零。當(dāng)CF=OF=1時,標(biāo)志著結(jié)果的高半部分含有結(jié)果的有效位。標(biāo)志位PF、SF、ZF、AF處于隨機(jī)狀態(tài)。指令實例:MULBX ;DX:AX←AX×BXMULWORDPTR[BX];DX:AX←AX×[BX+1、BX]MULBYTEPTR[DI] ;AX←AL×[DI](2)帶符號整數(shù)乘法77(2)帶符號整數(shù)乘法指令指令格式:IMULSRC

指令操作及說明:該指令除下述兩點外,其余同MUL。SRC為有符號整數(shù):若是字節(jié)數(shù),則范圍為-128~+127;若是字,則范圍為-32768~+32767。相應(yīng)的AL、AX同樣也是有符號整數(shù)。對CF、OF的影響不同。若結(jié)果的高半部分不是低半部分的符號擴(kuò)展,則CF=OF=1,否則為零;通過CF或OF的狀態(tài),能判斷高半部分是否含有結(jié)果的有效位。6.除法類786.除法類指令(1)無符號數(shù)除法指令指令格式:DIVSRC指令操作:字節(jié)除:AL←(AX/字節(jié)SRC)的商;AH←(AX/字節(jié)SRC)的余數(shù);字除:AX←(DX:AX/字SRC)的商DX←(DX:AX/字SRC)的余數(shù)指令說明79指令說明:SRC只能是寄存器或存儲器操作數(shù),可以是字節(jié)或字。被除數(shù)隱含在AX(字節(jié))或DX:AX(字)中,這取決于SRC的類型屬性。結(jié)果的存放:當(dāng)SRC為字節(jié)操作數(shù)時,結(jié)果存放于AX;當(dāng)SRC為字操作數(shù)時,結(jié)果存放于DX、AX.在執(zhí)行除法操作時,若“0”做除數(shù),或商的結(jié)果超出相應(yīng)寄存器的范圍,則將產(chǎn)生0類型除法錯誤中斷。(2)帶符號整數(shù)除法指令80(2)帶符號整數(shù)除法指令指令格式:IDIVSRC

指令操作及說明:該指令除下述兩點外,其余同DIV。SRC為有符號整數(shù):若是字節(jié)數(shù),則范圍為-128~+127;若是字,則范圍為-32768~+32767。當(dāng)兩個等位長度的有符號整數(shù)相除時,在執(zhí)行除法之前,必須用符號擴(kuò)展指令CBW或CWD,以產(chǎn)生雙倍長度的被除數(shù)(若是無符號數(shù),則用MOV指令使AH或DX清0)7.擴(kuò)展類指令817.擴(kuò)展類指令字節(jié)擴(kuò)展指令指令格式:CBW指令操作:是把AL中帶符號數(shù)的符號擴(kuò)展到AH中,即若AL<80H,則AH←00H;若AL>=80H,則AH←FFH。字?jǐn)U展指令指令格式:CWD指令操作:指令意義是把AX中的有符號數(shù)的符號擴(kuò)展到DX中去。即若AX<8000H,則DX←0H;否則DX←FFFFH。用途82擴(kuò)展指令的用途:主要用在IDIV指令的前面,以便把被除數(shù)的符號擴(kuò)展到相應(yīng)的寄存器,使之成為雙倍長度去進(jìn)行除法運算。字節(jié)擴(kuò)展成字也可用在帶符號的字節(jié)乘以字的乘法之前,即把字節(jié)擴(kuò)展成字,然后字乘以字。8.輔助操作類指令838.輔助操作類指令步驟:1.先按二進(jìn)制數(shù)進(jìn)行相應(yīng)的運算,得到中間結(jié)果2.后進(jìn)行十進(jìn)制調(diào)整,得到正確結(jié)果注意:調(diào)整指令,操作數(shù)隱含在累加器中。(1)非壓縮BCD碼加減調(diào)整84(1)非壓縮BCD碼加/減法的調(diào)整指令指令格式:加法調(diào)整指令:AAA減法調(diào)整指令:AAS作用:是將AL中的(AH應(yīng)為“0”)兩個非壓縮BCD碼相加之和/差調(diào)整,得到非壓縮BCD碼的正確和/差送AX。操作:若(AL&0F)>9或AF=1,則AL←AL±6AH←AH±1AF←1AL←AL&0FH(2)壓縮BCD調(diào)整85(2)壓縮BCD碼加/減法的調(diào)整指令指令格式:加法調(diào)整指令:DAA減法調(diào)整指令:DAS指令作用:是將AL中的兩個壓縮BCD碼相加之和調(diào)整,得到壓縮BCD碼正確結(jié)果送AL,若兩者之和大于99,CF為1,表示兩位數(shù)相加有進(jìn)位。操作:若(AL&0F)>9或AF=1,則AL←AL±6;AF←1若AL>9FH或CF=1,則AL←AL±60H;CF←1(3)非壓縮BCD乘法調(diào)整86(3)非壓縮BCD碼乘法調(diào)整指令指令格式:AAM緊跟在MUL指令之后使用,對AL中的內(nèi)容進(jìn)行調(diào)整操作:AH←AL/0AH的商AL←AL/0AH的余數(shù)實質(zhì):將AL中的二進(jìn)制數(shù)轉(zhuǎn)換成非壓縮BCD數(shù),十位放在AH中,個位放在AL中。例子87例子:進(jìn)行十進(jìn)制乘法運算:7×9=?可編程:MOVAL,07HMOVBL,09HMULBLAAM;(AL)=07H;(BL)=09H;(AX)=003FH=63D;(AH)=06H,(AL)=03H執(zhí)行完后,十進(jìn)制乘積以非壓縮BCD碼的形式存放于AX中。(4)非壓縮BCD除法調(diào)整88(4)非壓縮BCD碼的除法調(diào)整指令指令格式:AAD用在DIV之前,先調(diào)整AH、AL中的內(nèi)容,再用除法指令操作:AL←AH×0AH+ALAH←0實質(zhì):將AX中非壓縮BCD碼轉(zhuǎn)換成二進(jìn)制形式存放于AL中。例子89例子:進(jìn)行十進(jìn)制除法運算:73÷2=?可編程:MOVAX,0703HMOVBL,02HAADDIVBL;(AH)=07H,(AL)=03H;(BL)=02H;(AX)=0049H;(AL)=24H商,(AH)=01H(余數(shù))AAMMOVCL,AH;(AH)=03H,(AL)=06H;保存余數(shù)4.2.3位操作類指令901.邏輯運算指令2.移位類指令3.循環(huán)移位類指令2.2.3位操作類指令1.邏輯運算類指令91是按位運算的指令;用途:對目的操作數(shù)中某些位置位、復(fù)位、求反、測試等操作;主要包括AND、OR、XOR、NOT和TEST指令。AND、OR、XOR和TEST都是雙字節(jié)操作指令;NOT是單字節(jié)操作指令,不允許使用立即數(shù)。1.邏輯運算指令邏輯非NOT指令92(1)邏輯非指令指令格式:NOTDSRC指令操作:將DSRC按位求反→DSRC指令說明:指令形式、操作數(shù)及使用注意事項同INC。指令執(zhí)行后對標(biāo)志位無影響,即保持指令執(zhí)行前的狀態(tài)。

指令實例:NOTAX NOTBYTEPTR[BX]邏輯與AND指令93(2)邏輯與指令指令格式:ANDDST,SRC指令操作:DST←DST∧SRC邏輯與的定義:1∧1=1、1∧0=0∧1=0∧0=0注意事項:DST可以是REG、MEM操作數(shù)SRC可以是REG、MEM、IMM影響SF、ZF、PF且OF=CF=0,AF隨機(jī)。用途94用途:屏蔽某些不關(guān)心的位(將這些位置0)保留某些感興趣的位(這些位不變)和“0”相與和“1”相與例如:MOVAL,36HANDAL,0FH作用:將6的ASCII碼轉(zhuǎn)換成與之相對應(yīng)的非壓縮BCD碼的形式。測試指令95(3)測試指令指令格式:TESTDST,SRC指令操作:DST∧SRC指令說明:該指令與AND的唯一區(qū)別是不回送結(jié)果;與CMP的區(qū)別是,TEST指令的目的與源操作數(shù)相與去改變標(biāo)志位,而CMP則是兩者相減去改變標(biāo)志位。TEST常用來檢測某一位或幾位是否滿足某條件。例子96實例:例1TESTAX,0000000000100000B測試AX第五位是否為0例2

INAL,80HTESTAL,00101010BJNZNEXT對從端口80H輸入數(shù)據(jù)的第1、3、5位中的數(shù)進(jìn)行測試,若任意一位不等于0則轉(zhuǎn)移到NEXT進(jìn)行程序的執(zhí)行。邏輯或指令97(4)邏輯或指令指令格式:ORDST,SRC指令操作:DST←DST∨SRC邏輯或的定義為1∨1=1∨0=0∨1=1、0∨0=0指令說明:指令形式、操作數(shù)說明、使用注意事項、指令執(zhí)行后對標(biāo)志位的影響同AND。用途98用途:將某些特定的位置1將其余位不變和“1”相或和“0”相或例如:MOVAL,07HORAL,30H作用:將7的非壓縮BCD碼的形式轉(zhuǎn)換成其對應(yīng)的ASCII碼的值。邏輯異或指令99(5)邏輯異或指令指令格式:XORDST,SRC指令操作:DST←DST⊕SRC邏輯異或的定義為1⊕1=0⊕0=0、1⊕0=0⊕1=1指令說明:指令形式、操作數(shù)說明、使用注意事項、指令執(zhí)行后對標(biāo)志位的影響同AND。用途100用途:將某些特定的位求反將其余位不變和“1”相異或和“0”相異或例如:XORAL,AL;AL=00H、CF=0思考:還有哪些指令可以實現(xiàn)AL=0且CF=0?SUBAL,ALANDAL,00HMOVAL,00H;(不能實現(xiàn))MUL00H;(錯)2.移位類指令1012.移位類指令方向右移左移操作算數(shù)邏輯包含4條指令:算數(shù)左移指令算數(shù)右移指令邏輯左移指令邏輯左移指令算數(shù)/邏輯左移指令102(1)算術(shù)/邏輯左移指令指令格式:SAL/SHLDSRC,COUNT指令操作:

算術(shù)左移和邏輯左移操作完全相同。每左移一次低位補(bǔ)零,最高位移入CF,左移COUNT次止。指令說明:DSRC可以是寄存器或存儲器,可以是字節(jié)也可以是字。COUNT指出移位次數(shù),有兩種形式:1、CL。指令有兩種形式:SAL/SHLREG,1/CLSAL/SHLMEM,1/CL算數(shù)右移指令103(2)算術(shù)右移指令指令格式:SARDSRC,COUNT指令操作:

把操作數(shù)DSRC右移COUNT次,每右移一次,都保持符號(最高)位不變,并將最低位移入CF。指令說明:指令形式、操作數(shù)及使用注意事項同SAL。用途:可實現(xiàn)帶符號數(shù)的除法運算,每右移一次相當(dāng)于除以2。邏輯右移指令104(3)邏輯右移指令指令格式:SHRDSRC,COUNT指令操作:把操作數(shù)DSRC右移COUNT次,每右移一次最高(符號)位補(bǔ)零,最低位移入CF。指令說明:指令形式、操作數(shù)及使用注意事項同SAL。用途:可實現(xiàn)無符號數(shù)的除法運算,每右移一次相當(dāng)于除以2。3.循環(huán)移位指令1053.循環(huán)移位指令(1)不通過進(jìn)位的左循環(huán)移位指令指令格式:ROLDSRC,COUNT指令操作:指令意義是把操作數(shù)DSRC循環(huán)左移COUNT次,但CF不包含在循環(huán)中。每左移一次,把最高位移入CF的同時,又移回操作數(shù)的最低位,構(gòu)成操作數(shù)的自身循環(huán)。指令說明:指令形式、操作數(shù)、使用注意事項同SAL。(2)不通過進(jìn)位位的右循環(huán)移位指令106(2)不通過進(jìn)位的右循環(huán)移位指令指令格式:RORDSRC,COUNT指令操作:

指令意義是把操作數(shù)DSRC循環(huán)COUNT次,但CF不包含在循環(huán)的環(huán)中。將操作數(shù)的最低位移入CF的同時,又移回操作數(shù)的最高位,構(gòu)成操作數(shù)的自身循環(huán)。指令說明:指令形式、操作數(shù)和使用注意事項同SAL。(3)通過進(jìn)位位的左循環(huán)移位指令107(3)通過進(jìn)位的循環(huán)左移指令指令格式:RCLDSRC,COUNT指令操作:指令意義是將操作數(shù)DSRC循環(huán)左移COUNT次,且CF包含在循環(huán)的環(huán)中。每左移一次,操作數(shù)的最高位移入CF,而原CF的值移入操作數(shù)的最低位。指令說明:指令形式、操作數(shù)及使用注意事項同SAL。(4)通過進(jìn)位位的右循環(huán)移位指令108(4)通過進(jìn)位的循環(huán)右移指令指令格式:RCRDSRC,COUNT指令操作:指令意義是將操作數(shù)DSRC循環(huán)右移COUNT次,且CF包含在循環(huán)的環(huán)中,每右移一次,操作數(shù)的最低位移入CF,CF的原值移入操作數(shù)的最高位。指令說明:指令形式、操作數(shù)及使用注意事項同SAL。4.2.4串操作類指令109基本指令5條:串傳送指令(MOVS)串存儲指令(STOS)串讀取指令(LODS)串比較指令(CMPS)串掃描指令(SCAS)作用:處理內(nèi)存中連續(xù)存放的數(shù)據(jù)串。2.2.4串操作類指令共同點110共同點(5):1.約定:源串中的元素:用DS:SI尋址(可段超越)目的串中的元素:用ES:DI尋址(不可段超越)2.處理方向根據(jù)DF而定DF=0增址方向操作(CLD)DF=1減址方向操作(STD)3.SI、DI自動修改DF=0SI、DI自動+1/+2DF=1SI、DI自動-1/-24.可加重復(fù)前綴:必須用CX作重復(fù)次數(shù)的計數(shù)器(每執(zhí)行一次操作CX自動減1,直至0則停止串操作)。5.重復(fù)過程可被中斷前綴操作類指令111重復(fù)前綴有三種:REPREPE/REPZREPNE/REPNZ指令格式:重復(fù)前綴只允許用在串操作指令之前,緊接其后的是串操作指令。兩者只可放在同一行,中間用空格隔開,不允許各占一行。如:REPSTOSB2.2.7前綴操作類指令操作和注意112指令操作:重復(fù)前綴將緊接其后的串操作指令重復(fù)執(zhí)行。重復(fù)執(zhí)行期間,可以被中斷,且中斷返回后,繼續(xù)重復(fù)執(zhí)行串操作指令。注意:重復(fù)前綴的重復(fù)次數(shù)隱含在CX寄存器中;先判CX是否等于零,然后決定是否重復(fù);CX=0不再重復(fù);CX≠0繼續(xù)重復(fù);每重復(fù)一次,CX減1。1.REP1131.REP(無條件重復(fù)指令)用途:通常只作為串傳送(MOVS)和串存儲(STOS)指令的前綴。操作步驟:(1)若CX=0則結(jié)束重復(fù)過程,否則(2)CX←CX-1(3)執(zhí)行串操作(4)重復(fù)(1)~(3)的過程2.REPE/REPZ1142.REPE/REPZ用途:REPE和REPZ兩個助記符所進(jìn)行的操作完全相同;可作為串比較(CMPS)和串搜索(SCAS)兩指令的前綴。操作步驟:(1)若CX=0或ZF=0(不相等)則結(jié)束重復(fù)過程(2)~(4)與REP相同3.REPNE/REPNZ1153.REPNE/REPNZ用途:REPNE和REPNZ兩個助記符所進(jìn)行的操作完全相同;可作為串比較(CMPS)和串搜索(SCAS)兩指令的前綴。操作步驟:(1)若CX=0或ZF=1(相等)則結(jié)束重復(fù)過程(2)~(4)與REP相同1.串傳送指令1161.串傳送指令指令格式:(1)MOVS DSTs,SRCsDSTs,SRCs分別是目的串和源串的符號地址(2)MOVSB ;字節(jié)串傳送:ES:[DI]←DS:[SI],SI←SI+/-1,DI←DI+/-1(3)MOVSW ;字串傳送:ES:[DI]←DS:[SI],SI←SI+/-2,DI←DI+/-2預(yù)備工作117執(zhí)行前需要做以下工作:DI←DSTs的有效地址SI←SCRs的有效地址CX←num(操作數(shù)的個數(shù))設(shè)置DF的值(STD可將其置1;CLD可將其清0)功能:將DS:SI指定的源串中的一個字節(jié)/字傳送到由ES:DI指定的目的串中,SI、DI自動修改指令操作:ES:DI←(DS:SI)SI←(SI)±1/2DI←(DI)±1/2例子118例2-6將數(shù)據(jù)段SOURCE指示的100個字節(jié)數(shù)據(jù)傳送到附加段DEST指示的內(nèi)存區(qū)。

LEASI,SOURCELEADI,DESTMOVCX,100CLDAGAIN:MOVSB DECCX JNZAGAINREPMOVSB2.串存儲指令1192.串存儲指令指令格式:(1)STOSB ;字節(jié)串存儲ES:[DI]←AL,DI←DI+/-1(2)STOSW ;字串存儲ES:[DI]←AX,DI←DI+/-2(3)STOS DSTs ;存儲字節(jié)或字串功能:將AL中的字節(jié)或AX中的字存儲到以ES:DI指定的目的串中去,同時自動修改DI的值,指向串的下一個元素。操作&例子120操作:ES:DI←(AL)/(AX)DI←(DI)±1/2例子:將“?!毖b入以AREA為首地址的100個字節(jié)中LEADI,AREAMOVAX,’##’MOVCX,50CLDREPSTOSW3.串讀取指令1213.串讀取指令指令格式:LODSB ;字節(jié)串讀取AL←DS:[SI],SI←SI+/-1LODSW ;字串讀取AX←DS:[SI],SI←SI+/-2LODS SRCs; ;讀取字節(jié)串或字串功能:將DS:SI指定的源串中的元素送到AL/AX中,同時自動修改SI的值,指向串的下一個元素。操作&注意122操作:AL/AX←(DS:SI)SI←(SI)±1/2注意:一般不加重復(fù)前綴4.串比較指令1234.串比較指令指令格式:CMPS SRCs,DSTs ;字節(jié)串或字串比較CMPSB ;字節(jié)串比較DS:[SI]-ES:[DI],SI←SI+/-1,DI←DI+/-1CMPSW ;字串比較DS:[SI]-ES:[DI],SI←SI+/-2,DI←DI+/-2功能&操作124功能:將DS:SI指定的源串中的元素減去由ES:DI指定的目的串中對應(yīng)的元素,同時自動修改SI、DI的值。不回送結(jié)果,只影響標(biāo)志位。操作:(DS:SI)-(ES:DI)SI←(SI)±1/2DI←(DI)±1/2重復(fù)前綴用法125重復(fù)前綴的用法1.REPE/REPZ當(dāng)CX≠0(串未結(jié)束)且ZF=1(相等)時重復(fù)。操作結(jié)束時有兩種情況:CX=0且ZF=1CX≠0(或CX=0)且ZF=02.REPNE/REPNZ當(dāng)CX≠0(串未結(jié)束)且ZF=0(不相等)時重復(fù)。兩串相等兩串不相等5.串掃描指令1265.串掃描指令指令格式:SCASDSTs ;搜索串中的字節(jié)或字元素SCASB ;字節(jié)串掃描AL-ES:[DI],DI←DI+/-1SCASW;字串掃描AX-ES:[DI],DI←DI+/-2功能&操作127功能:把AL/AX中的內(nèi)容減去ES:DI指定的目的串中的元素,同時自動修改DI的值,減的結(jié)果只去影響標(biāo)志位,并不改變目的串元素及累加器的值。

操作:AL/AX-(ES:DI)DI←(DI)±1/2重復(fù)前綴用法128重復(fù)前綴的用法1.REPE/REPZ當(dāng)CX≠0(串未結(jié)束)且關(guān)鍵字=(ES:DI)時繼續(xù)。用于搜索與關(guān)鍵字不同的元素。2.REPNE/REPNZ當(dāng)CX≠0(串未結(jié)束)且關(guān)鍵字≠(ES:DI)時繼續(xù)。用于搜索與關(guān)鍵字相同的元素。4.2.5程序控制類指令129用于控制程序的流程,改變程序的執(zhí)行順序。共同點:執(zhí)行完會修改IP(段內(nèi)轉(zhuǎn)移)或CS(段間轉(zhuǎn)移)的內(nèi)容。包括:調(diào)用返回指令、轉(zhuǎn)移指令、重復(fù)指令、重復(fù)控制指令和中斷指令。程序控制類指令執(zhí)行后不影響標(biāo)志位。

2.2.5程序控制類指令1.轉(zhuǎn)移類指令1301.轉(zhuǎn)移類指令(1)轉(zhuǎn)移的目的地址①改變程序的執(zhí)行順序的兩種方法:一是改變CS(段地址)和IP(偏移地址):段間轉(zhuǎn)移,稱這種轉(zhuǎn)移為遠(yuǎn)(FAR)轉(zhuǎn)移;二是僅改變IP。段內(nèi)轉(zhuǎn)移,稱這種轉(zhuǎn)移為近(NEAR)轉(zhuǎn)移。在段內(nèi)轉(zhuǎn)移中,為進(jìn)一步縮短目的程序的長度,8086/8088又把轉(zhuǎn)移范圍為-128~+127(即:跳轉(zhuǎn)地址的偏移范圍是8bit帶符號二進(jìn)制數(shù)范圍)的轉(zhuǎn)移指令獨立出來,稱之為短(SHORT)轉(zhuǎn)移。

②131②無論是段內(nèi)轉(zhuǎn)移還是段間轉(zhuǎn)移,都有直接轉(zhuǎn)移和間接轉(zhuǎn)移之分。而短轉(zhuǎn)移僅有直接轉(zhuǎn)移的形式。直接轉(zhuǎn)移:轉(zhuǎn)移的目的地址信息直接出現(xiàn)在代碼指令中。間接轉(zhuǎn)移:轉(zhuǎn)移的目的地址信息存儲于某一個變量或某一個16位寄存器中。變量可以是字或者雙字,所以能實現(xiàn)段內(nèi)或段間間接轉(zhuǎn)移;16位寄存器只能實現(xiàn)段內(nèi)間接轉(zhuǎn)移。分無條件轉(zhuǎn)移指令&條件轉(zhuǎn)移指令兩類介紹。

(2)無條件轉(zhuǎn)移指令132(2)無條件轉(zhuǎn)移指令JMP指令格式:JMPNEAR標(biāo)號/FAR標(biāo)號/SHORT標(biāo)號JMPREG16/MEM16/MEM32指令操作:程序運行中遇到無條件轉(zhuǎn)移指令,將轉(zhuǎn)向目的地址,并取出指令繼續(xù)執(zhí)行。當(dāng)JMP的操作數(shù)為NEAR、SHORT標(biāo)號時,屬于段內(nèi)直接轉(zhuǎn)移;為FAR標(biāo)號時,屬于段間直接轉(zhuǎn)移;為REG16、MEM16時,屬于段內(nèi)間接轉(zhuǎn)移;為MEM32時,屬于段間間接轉(zhuǎn)移。實例133例1:JMPNEARPTRLOOP1 段內(nèi)直接轉(zhuǎn)移,其轉(zhuǎn)移范圍稱為段內(nèi)的任何位置。例2:JMPSHORTLOOP1段內(nèi)短轉(zhuǎn)移。例3:JMPFARPTRLOOP1段間直接轉(zhuǎn)移,可轉(zhuǎn)移到程序的任何位置。在指令執(zhí)行時,用LOOP1的段地址和偏移地址取代當(dāng)前的CS和IP。實例134例4:JMPCX 段內(nèi)間接轉(zhuǎn)移,可轉(zhuǎn)移到段內(nèi)的任何位置。執(zhí)行指令時用CX內(nèi)容取代當(dāng)前的IP,CS不變。JMPWORDPTR[BX]段內(nèi)間接轉(zhuǎn)移,可轉(zhuǎn)移到段內(nèi)任何位置。執(zhí)行指令時,用DS:[BX]指向的字的內(nèi)容取代IP,CS不變。JMPDWORDPTR[SI]段間間接轉(zhuǎn)移,執(zhí)行指令時,用DS:[SI]指向的雙字內(nèi)容,低地址字內(nèi)容取代IP,高地址字內(nèi)容取代CS。(3)條件轉(zhuǎn)移指令135(3)條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令,是執(zhí)行該指令時,根據(jù)標(biāo)志寄存器的狀態(tài)決定是否發(fā)生控制轉(zhuǎn)移。條件轉(zhuǎn)移指令共16種,有的有多個指令助記符。所有條件轉(zhuǎn)移指令都是段內(nèi)短轉(zhuǎn)移指令,它屬于相對轉(zhuǎn)移,故適用于可重定位的程序。指令格式:JccSHORT標(biāo)號J表示轉(zhuǎn)移,cc:成立的條件;若條件成立則進(jìn)行轉(zhuǎn)移,否則執(zhí)行下一條指令。分類136可分為三類:A)僅取決于某一個標(biāo)志位的條件轉(zhuǎn)移指令;B)用于有符號數(shù)比較的條件轉(zhuǎn)移指令;C)用于無符號數(shù)比較的條件轉(zhuǎn)移指令。A)137A)僅取決于某一個標(biāo)志位的條件轉(zhuǎn)移指令:JE/JZ SHORT標(biāo)號 ;當(dāng)ZF=1時轉(zhuǎn)移JNE/JNZ SHORT標(biāo)號 ;當(dāng)ZF=0時轉(zhuǎn)移JCSHORT標(biāo)號 ;當(dāng)CF=1時轉(zhuǎn)移JNCSHORT標(biāo)號 ;當(dāng)CF=0時轉(zhuǎn)移JP/JPE SHORT標(biāo)號 ;當(dāng)PF=1時轉(zhuǎn)移JNP/JPO SHORT標(biāo)號 ;當(dāng)PF=0時轉(zhuǎn)移JO SHORT標(biāo)號 ;當(dāng)OF=1時轉(zhuǎn)移JNO SHORT標(biāo)號 ;當(dāng)OF=0時轉(zhuǎn)移JS SHORT標(biāo)號 ;當(dāng)SF=1時轉(zhuǎn)移JNS SHORT標(biāo)號 ;當(dāng)SF=0時轉(zhuǎn)移B)138B)用于有符號數(shù)比較的條件轉(zhuǎn)移指令:JL/JNGE SHORT標(biāo)號 ;當(dāng)OF≠SF且ZF=0JNL/JGE SHORT標(biāo)號 ;當(dāng)OF=SF或ZF=1JLE/JNG SHORT標(biāo)號 ;當(dāng)OF≠SF或ZF=1JNLE/JG SHORT標(biāo)號 ;當(dāng)OF=SF且ZF=0C)用于無符號數(shù)比較的條件轉(zhuǎn)移指令:JB/JNAE/JC SHORT標(biāo)號 ;當(dāng)CF=1且ZF=0JNB/JAE/JNC SHORT標(biāo)號 ;當(dāng)CF=0或ZF=1JNA/JBE SHORT標(biāo)號 ;當(dāng)CF=1或ZF=1JA/JNBE SHORT標(biāo)號 ;當(dāng)CF=0且ZF=0例子139指令實例:例4-8設(shè)X、Y為字無符號數(shù),編程求得Z=|X-Y|。 MOV AX,X ;取數(shù)據(jù)X SUB AX,Y ;計算X-Y JNC NEXT ;如果無借位,則|X-Y|=X-Y,轉(zhuǎn)到保存結(jié)果

NEG AX ;如果有借位,則|X-Y|=-(X-Y)NEXT:MOV Z,AX2.重復(fù)控制類指令1402.重復(fù)控制類指令用于循環(huán)程序的控制與修改,重復(fù)控制指令不影響標(biāo)志位。共有四條:

(1)LOOP指令:指令格式:LOOP 短標(biāo)號指令操作:CX←CX-1判斷CX中的內(nèi)容:若CX≠0則轉(zhuǎn)移到短標(biāo)號所指向的語句執(zhí)行,否則順序執(zhí)行程序。使用注意事項:在使用LOOP指令前,必須設(shè)置CX寄存器為重復(fù)次數(shù)一條LOOP指令相當(dāng)于DECCX和JNZ短標(biāo)號的組合。(2)141(2)LOOPZ/LOOPE指令:指令格式:LOOPZ/LOOPE 短標(biāo)號;指令操作:CX←CX-1判斷CX和ZF若CX≠0且ZF=1,則轉(zhuǎn)移到短標(biāo)號所指向語句執(zhí)行;否則順序執(zhí)行程序,其他同LOOP。(3)142(3)LOOPNZ/LOOPNE指令:指令格式:LOOPNZ/LOOPNE 短標(biāo)號指令操作:CX←CX-1判斷CX和ZF若CX≠0且ZF=0,則轉(zhuǎn)移到短標(biāo)號所指向語句執(zhí)行;否則順序執(zhí)行程序,其他同LOOP。(4)143(4)JCXZ指令:指令格式:JCXZ 短標(biāo)號;指令操作:先判斷CX的內(nèi)容,若CX=0,則轉(zhuǎn)移到短標(biāo)號所指向語句執(zhí)行;否則順序執(zhí)行程序。3.中斷指令1443.中斷指令(3條)(1)INT指令:指令格式:INT n n為中斷類型號,是0~255之間的整數(shù)。功能:用于保存現(xiàn)場,轉(zhuǎn)到中斷服務(wù)子程序保存現(xiàn)場的順序:標(biāo)志寄存器FLAG進(jìn)棧清除標(biāo)志位TF、IF;CS、IP進(jìn)棧;通過n*4從中斷向量表中獲得中斷向量;低字送IP,高字送CS。實例145①除法運算中,除數(shù)近乎為0,產(chǎn)生類型號為0的中斷②在屏幕上顯示一個字符或從鍵盤上輸入一個字符,都會引起中斷。中斷實質(zhì):調(diào)用事先設(shè)計好的中斷服務(wù)子程序,完成中斷的響應(yīng)。例:將字符’5’顯示在當(dāng)前光標(biāo)處執(zhí)行前:把功能號送入AH中,入口參數(shù)放入指定的寄存器中MOVAH,02HMOVDL,’5’INT21H;系統(tǒng)功能調(diào)用(2)INTO指令146(2)INTO指令:指令格式:INTO

;溢出則中斷功能:當(dāng)發(fā)生溢出時,產(chǎn)生該中斷,對應(yīng)n=4。(3)IRET指令:指令格式:IRET 功能:用于恢復(fù)現(xiàn)場,返回到斷點處。恢復(fù)現(xiàn)場的順序先將棧頂字出棧送IP,再將新棧頂字出棧送CS,最后將新棧頂字出棧送FLAG。說明:通常INT和IRET是成對出現(xiàn)的,IRET是中斷服務(wù)子程序的最后一條可執(zhí)行語句。4.子程序調(diào)用指令1474.子程序調(diào)用、返回指令(1)調(diào)用指令--CALL指令格式:CALLSRCSRC有兩種形式:子程序(過程)名,稱直接調(diào)用子程序地址放在REG/MEM中,稱間接調(diào)用子程序的位置兩種情況:與主程序在同一個代碼段中,稱段內(nèi)調(diào)用與主程序不在同一個代碼段中,稱段間調(diào)用有四種指令格式指令格式148指令格式:有4種指令格式①

CALLLABEL ;直接段內(nèi)調(diào)用SP←SP-2,SS:[SP]←IPIP←LABEL(子程序名)偏移地址②

CALLREG16/MEM16;間接段內(nèi)調(diào)用SP←SP-2,SS:[SP]←IP IP←[REG16/MEM16]③④149③CALLFARPTRLABEL;直接段間調(diào)用

SP←SP-2,SS:[SP]←CS;SP←SP-2,SS:[SP]←IP;IP←LABEL偏

溫馨提示

  • 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

提交評論