微機原理課件計算機ch_第1頁
微機原理課件計算機ch_第2頁
微機原理課件計算機ch_第3頁
微機原理課件計算機ch_第4頁
微機原理課件計算機ch_第5頁
已閱讀5頁,還剩92頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

微機原理盧偉Email:luwei@Office:大黑樓B705TEL:84706161大連理工大學(xué)自動化系第三章8086微處理器的指令系統(tǒng)3.1指令系統(tǒng)概述3.2尋址方式3.38086指令系統(tǒng)3.3.1數(shù)據(jù)傳送指令3.3.2算術(shù)運算指令3.3.3邏輯運算與移位指令3.3.4串操作指令3.3.5控制轉(zhuǎn)移指令3.3.6處理器控制指令

3.1指令系統(tǒng)概述指令系統(tǒng)是一臺計算機所能識別和執(zhí)行的全部指令的集合。它與微處理器有著密切的關(guān)系,不同的微處理器有不同的指令系統(tǒng)。指令是使計算機執(zhí)行某種特定操作的二進制編碼。指令一般包括兩個部分:操作碼域和地址域。操作碼域存放指令的操作碼,即指明該指令應(yīng)由計算機完成何種操作。地址域確定操作數(shù)的值或地址、操作結(jié)果的地址,有的指令的地址域還指出下一條指令的地址。機器指令:計算機能識別的代碼,機器指令是由二進制數(shù)組成的。例如:ADDCL,BH機器指令為0000001011001111BPUSHAX機器指令為01010000匯編語言:匯編語言是一種符號語言,用助記符表示操作碼,用符號或符號地址表示操作數(shù)或操作數(shù)地址,它與機器指令是一一對應(yīng)的匯編程序:MASM.EXE將匯編語言源程序翻譯成機器語言,即目標(biāo)程序。3.1指令系統(tǒng)概述根據(jù)指令內(nèi)容確定操作數(shù)地址的過程,稱為尋址。根據(jù)尋址方式計算所得到的地址叫做有效地址EA,也就是段內(nèi)偏移地址。有效地址還需要與相應(yīng)的段基地址組合才是20位的物理地址PA,該工作由微處理器來完成。尋址方式在兩種方式下被涉及:操作數(shù)的尋址方式和指令的尋址方式。如果沒有特別說明,尋址方式是指源操作數(shù)的尋址方式。3.2尋址方式1、隱含尋址指令已經(jīng)默認(rèn)對微處理器中的某個寄存器進行操作,不用在指令中指明所使用的寄存器,即隱含了規(guī)定的操作數(shù),這樣的尋址方式稱為隱含尋址。例:DAA指令,只有操作碼,無操作數(shù),但已經(jīng)規(guī)定是對AL中的內(nèi)容進行十進制調(diào)整。3.2尋址方式操作數(shù)尋址2、立即尋址操作數(shù)直接放在指令中。不需要訪問存儲器。操作數(shù)可以是8位的也可以是16位的,有時也稱為立即數(shù)。立即數(shù)只能是源操作數(shù)。例3.1MOVAL,34HMOVAX,1234H需要注意在16位操作時,兩個字節(jié)數(shù)據(jù)的高低位存儲位置。3.2尋址方式3、寄存器尋址

操作數(shù)就放在微處理器的內(nèi)部寄存器中,AX、BX、CX、DX、DI、SI、SP和BP,不需要訪問存儲器。例3.2:INCCXMOVAX,BX若執(zhí)行前(AX)=30A6H,(BX)=69EDH,(CX)=40D9H則執(zhí)行后,(AX)=69EDH,BX內(nèi)容不變,(CX)=40DAH。以上三種尋址方式都是直接在微處理器內(nèi)部獲得數(shù)據(jù),因此操作速度快。

3.2尋址方式4、存儲器尋址

操作數(shù)放在存儲器中,執(zhí)行部件EU計算出存儲器操作數(shù)的偏移量,即有效地址EA。這是一個無符號數(shù),由總線接口部件BIU的地址加法器計算出物理地址,然后執(zhí)行存取該操作數(shù)所需的總線周期。對于8086,有效地址EA有3種成分:(1)位移量(2)基址(3)變址EA=基址+變址+位移量3.2尋址方式(1)直接尋址有效地址由指令直接給出,有效地址只包含8位/16位的位移量。MOVAL,[1234H]默認(rèn)的段寄存器是DS,也可以在指令中使用段超越前綴來指定段寄存器。例3.3:MOVAL,ES:[1234H]有效地址EA=1234H,在指令中直接給出。物理地址PA=(ES)×10HH

3.2尋址方式例3.4MOVAX,[2000H]若(DS)=3000H,則執(zhí)行情況如圖示。直接尋址也可用符號地址。例3.5:MOVAX,VALUE/MOVAX,[VALUE]這里,VALUE就是存放操作數(shù)單元的符號地址。3.2尋址方式存儲器3032000H30000H代碼段AH5032001HAL(AX)=3050H數(shù)據(jù)段例3.4的執(zhí)行過程3.2尋址方式(2)寄存器間接尋址和寄存器相對間接尋址操作數(shù)的地址在對應(yīng)的寄存器中稱為寄存器間接尋址,若還有位移量(disp)則稱為寄存器相對間接尋址。EA取自基址寄存器BX,BP或變址寄存器SI,DI中的一個,操作數(shù)在有效地址對應(yīng)的存儲單元中。即EA=(BX、BP、SI、DI之一)+dispBX用于間接尋址時,默認(rèn)段寄存器為DS,允許段超越BP用于間接尋址時,默認(rèn)段寄存器為SS,允許段超越SI用于間接尋址時,默認(rèn)段寄存器為DS,允許段超越DI用于間接尋址時,只有在串操作指令中,默認(rèn)段寄存器為ES,其余情況默認(rèn)段寄存器均為DS,不允許段超越;

3.2尋址方式注:IP只能在代碼段中(CS)尋址,SP只能在堆棧段(SS)中尋址。例3.7MOVAX,[BX]若(DS)=2000H,(BX)=1000H則EA=(BX)=1000H物理地址PA=20000HH=21000H,執(zhí)行情況如下圖示。(AX)=(21000H)=5030H3021000H20000HAH5021001HAL(AX)=5030H3.2尋址方式例3.8INCBYTEPTR[BX]EA=(BX)PA=(DS)×10H+(BX)若是寄存器相對間接尋址,則要加上位移量。例3.9INCBYTEPTR[BX+disp]EA=(BX)+dispPA=(DS)×10H+(BX)+disp例3.10MOVAX,COUNT[SI]/MOVAX,[SI]COUNT/MOVAX,[SI+COUNT]若COUNT=3000H,(DS)=3000H(SI)=2000H,則物理地址=35000H,指令執(zhí)行如上圖所示。指令執(zhí)行后(AX)=1234H3435000H30000HAH1235001HAL(AX)=1234H32000H3.2尋址方式(3)基址尋址和基址相對尋址操作數(shù)的地址在基址寄存器BX,BP中稱為基址尋址;若還有位移量,則稱為基址相對尋址。位移量可以是8位或16位。例3.11MOVAX,[BX+disp]使用BX,默認(rèn)段寄存器是DS,而BP則默認(rèn)的段寄存器為SS。EA=(BX)或(BP)+dispPA=(DS)或(SS)×10H+disp3.2尋址方式例3.12MOVAX,COUNT[BX]若(DS)=3000H,(BX)=2000H,COUNT=3000H,(35000H)=1234H則EA=2000HH=5000HPA=30000HH=35000H執(zhí)行該指令后,(AX)=1234H(4)變址尋址和變址相對尋址操作數(shù)的地址在變址寄存器SI、DI中稱為變址尋址;若還有位移量,則稱為變址相對尋址。EA=(SI)或(DI)+disp例3.13MOVAH,[SI+disp]3.2尋址方式(5)基址變址尋址和基址變址相對尋址EA=BX或BP中的基址地址+SI、DI中的變址地址+disp;實際上這種尋址為(3)、(4)兩種尋址的組合。例3.14MOVAX,[BP+DI]此時隱含的段寄存器為SS,若用BX,則隱含的段寄存器為DS.EA=(BX或BP)+(SI或DI)+dispPA=(DS)×10H+(BX)+(SI或DI)+dispPA=(SS)×10H+(BP)+(SI或DI)+disp3.2尋址方式例3.10MOVAX,[BX][DI]若(DS)=2100H,(BX)=0158H,(DI)=0002H,(015AH)=1234H則EA=0158HH=015AHPA=EAH=2115AH指令執(zhí)行后,(AX)=1234H例3.11:MOVAX,[MASK+BX+SI]若(DS)=3000H,(BX)=2000H,(SI)=1000H,MASK=0250H(33250H)=34H,(33251H)=12H則EA=2000HHH=3250HPA=30000HHHH=33250H指令執(zhí)行如下圖所示。執(zhí)行該指令后(AX)=1234H3.2尋址方式低地址高地址CS段操作碼50H02H34H12H34H12HAXDS段3000033250BX025033250+MOVAX,[BX+SI+MASK]DS300002000SI10003.2尋址方式8086采用I/O端口與存儲器獨立編址的方式。訪問I/O端口需要專門指令I(lǐng)N和OUT,通過AX/AL來完成。(1)直接尋址在指令直接給出I/O端口地址,此地址應(yīng)在0-255(0-FFH)之間例如:INAL,20H;從端口地址20H讀入一個字節(jié)(2)間接尋址,寄存器只能用DX由DX給出I/O端口地址,此方式適用端口地址為0-65535(0-FFFFH)之間的任意值。例如:OUTDX,AL3.2尋址方式5、I/O端口尋址

尋址方式的書寫格式1、在方括號內(nèi)部允許有一個或兩個寄存器的名字,如果一對方括號內(nèi)部有基址寄存器和變址寄存器,使用“+”作為連接。2、在方括號內(nèi)部允許有位移量,使用+或-號作為連接符號。3、在方括號外部允許有位移量,可以在左邊或右邊。MOV AX,[BX+SI+6]MOV AX,[BX+SI]6MOV AX,6[BX+SI]MOV AX,[BX][SI]6MOV AX,[BX+6][SI]3.2尋址方式8086數(shù)據(jù)存儲器尋址方式小結(jié):立即尋址,操作數(shù)直接放在指令中。隱含尋址,指令已經(jīng)隱含了存放操作數(shù)的寄存器寄存器尋址(8個通用寄存器)直接尋址,有效地址由指令直接給出,即有效地址只包含位移量。寄存器間接尋址和寄存器相對間接尋址(BX、BP、SI、DI,位移量)基址尋址和基址相對尋址(BX、BP,位移量)變址尋址和變址相對尋址(SI、DI,位移量)基址變址尋址和基址變址相對尋址(BX、BP,SI、DI,位移量)其中1、2、3兩種不用訪問存儲器。disp可以是8位/16位的有符號數(shù)。3.2尋址方式(1)段內(nèi)直接尋址不改變CS,在IP上加一個位移量,則EA=(IP)+disp例如:JMPNEARPTRPROGIA;段內(nèi)近轉(zhuǎn)移JMPSHORTQUEST;段內(nèi)短轉(zhuǎn)移JMP25H;段內(nèi)短轉(zhuǎn)移,-128~+127JMP1025H;段內(nèi)近轉(zhuǎn)移,-32768~其中PROGIA和QUEST是轉(zhuǎn)向的符號地址,在機器指令中,用位移量來表示。3.2尋址方式指令尋址例3.12:JMPBX;段內(nèi)間接轉(zhuǎn)移(IP)=(BX)JMPWORDPTR[BX+TABLE]若(BX)=1256H,(DS)=2000H,TABLE=20A0H,(232F6H)=3280H則執(zhí)行JMPBX后,(IP)=EA=1256H執(zhí)行JMPWORDPTR[BX+TABLE]后,EA=(BX)+disp=1256H+20A0H=32F6H(IP)=(PA)=(20000H+32F6H)=(232F6H)=3280H(2)段內(nèi)間接尋址轉(zhuǎn)向的有效地址是一個寄存器或一個存儲單元的內(nèi)容。這個寄存器或存儲單元的內(nèi)容可用除立即數(shù)尋址以外的任何一種尋址方式得到。轉(zhuǎn)向的有效地址用來取代IP,這時CS值不變。3.2尋址方式例3.13:JMP3500H:080BH;段間直接轉(zhuǎn)移(CS)=3500H,(IP)=080BH例3.14:JMPFARPTRNEXT_PROG其中NEXT_PROG是轉(zhuǎn)向的符號地址;FARPTR為段間轉(zhuǎn)移的操作符。執(zhí)行該指令后,NEXT_PROG所在段的段地址送CS,NEXT_PROG在該段內(nèi)的偏移量送IP。

(3)段間直接尋址指令中提供了轉(zhuǎn)向的段地址和偏移地址,所以用段地址取代CS,用偏移地址取代IP。3.2尋址方式C1SEGMENT… JMPFARPTRNEXT_PROG…C1ENDSC2SEGMENT…NEXT_PROG:……C2ENDS執(zhí)行JMPFARPTRNEXT_PROG后,C2段的段地址送CS,在C2段內(nèi)NEXT_PROG的偏移量送IP。3.2尋址方式(4)段間間接尋址用存儲器中兩個相繼字的內(nèi)容來取代IP和CS,達到段間轉(zhuǎn)移的目的。低地址中內(nèi)容送IP,高地址中內(nèi)容送CS。例3.15:JMPDWORDPTR[INTERS+BX]其中[INTERS+BX]說明尋址方式為基址相對尋址方式;DWORDPTR是雙字操作符。例3.16:JMPDWORDPTR[BX+DI+ALPHA]這是基址變址相對尋址。EA=(BX)+(DI)+ALPHAPA=(DS)×10H+EA(IP)=(PA);低地址內(nèi)容送IP(CS)=(PA+2);高地址內(nèi)容送CS轉(zhuǎn)移的物理地址是:PA=(CS)×10H+(IP)段間間接轉(zhuǎn)移,目標(biāo)地址存放在PA開始的4個連續(xù)單元中,其中低地址兩個單元放IP內(nèi)容,高地址兩個單元放CS內(nèi)容。3.2尋址方式尋址方式:1.立即尋址MOVAX,1234H2.寄存器尋址MOVAX,BX3.直接尋址 MOVAX,[1234H]4.寄存器間接尋址 MOVAX,[BX]5.基址尋址 MOVAX,[BX+100H]6.變址尋址 MOVAX,[SI+100H]7.基址加變址尋址 MOVAX,[BX+SI+100H]3.38086指令系統(tǒng)操作數(shù)分類立即數(shù)操作數(shù):綠注1:立即數(shù)只能作為源操作數(shù),不能作為目標(biāo)操作數(shù)。注2:不能用一條指令簡單地將立即數(shù)傳送到段寄存器。寄存器操作數(shù):紅注3:有些指令沒有指定使用的寄存器,但實際上隱含這特定的寄存器操作數(shù)。存儲器操作數(shù):藍注4:不允許源操作數(shù)和目標(biāo)操作數(shù)同時為存儲器操作數(shù)。注5:存儲器操作數(shù)的物理地址的計算是將段基地址左移四位加上有效地址EA(偏移地址)得到的。但是段寄存器和有效地址的配對是有規(guī)定的。注6:執(zhí)行速度:寄存器操作數(shù)>立即數(shù)操作數(shù)>存儲器操作數(shù)3.38086指令系統(tǒng)機器碼:在8086系統(tǒng)中,任何一條指令都是以特定的若干個(1~6)字節(jié)的代碼形式存在存儲器的碼段中。同樣的指令(如MOV)由于尋址方式和操作數(shù)的不同,機器碼的長度也不同。執(zhí)行時間:指令的指令時間包括取址、譯碼和執(zhí)行的時間,跟該指令的機器碼的長短沒有直接關(guān)系。

指令機器碼字節(jié)數(shù)時鐘數(shù)MOVAL,15HB0H15H24MOVAX,BX8BHC3H223.38086指令系統(tǒng)1數(shù)據(jù)傳送指令(1)MOV指令MOVdest,src ;(dest)(src)1)源操作數(shù)可以是8/16位的立即數(shù)、寄存器操作數(shù)、內(nèi)存操作數(shù)。目標(biāo)操作數(shù)不允許為立即數(shù),其余同源操作數(shù)。源、目的操作數(shù)不能同時為內(nèi)存操作數(shù)。2)源、目的操作數(shù)類型必須匹配:MOVBYTEPTR[BX],12H3)不能向段寄存器寫立即數(shù):MOVAX,2000;MOVDS,AX4)以CS為目標(biāo)的一切傳送指令都是非法的。3.38086指令系統(tǒng)通用傳送指令(2)堆棧操作指令PUSHsrc;(SP)(SP)-2;((SP)+1:(SP))(src)進棧指令,先調(diào)整堆棧指針,再把源操作數(shù)壓棧。如:PUSHAXPOPdest ;(dest)((SP)+1:(SP));(SP)(SP)+2出棧指令,先將棧頂2字節(jié)送目標(biāo)操作數(shù),再調(diào)整堆棧指針。如:POPAX注1:堆棧指令指對字進行操作,不對字節(jié)進行操作,一般成對使用。注2:堆棧主要應(yīng)用于子程序調(diào)用、中斷的現(xiàn)場保護和恢復(fù)及參數(shù)傳遞等。3.38086指令系統(tǒng)低地址高地址12H34H34H12HAX堆棧段SSSP指向棧頂SP-1SP-1PUSHAX3.38086指令系統(tǒng)低地址高地址12H34H34H12HAX堆棧段SSSP指向棧頂SP+1SP+1POPAX3.38086指令系統(tǒng)(3)交換指令XCHGdest,src ;(dest)(src)交換指令,源、目不能同為內(nèi)存操作數(shù),只能在寄存器之間、寄存器和存儲器之間交換,段寄存器不能作為一個操作數(shù)進行交換。如:XCHGAX,[SIH]3.38086指令系統(tǒng)(4)XLAT查表指令XLATsrc_table /XLAT ;(AL)((BX)+(AL))查表指令,用來取表中某指定數(shù)的值。執(zhí)行指令前:序號AL表首址BX執(zhí)行指令后:AL表中序號對應(yīng)的字節(jié)內(nèi)容例:TABLEDB48,49,50,51,52,53,54,55,56,57MOVBX,OFFSETTABLEMOVAL,5XLATTABLE執(zhí)行后AL=533.38086指令系統(tǒng)完成累加器和I/O端口之間的數(shù)據(jù)傳送(1)INacc,port;(acc)(port)端口號為8位時,直接尋址,最多可訪問256個端口例:INAL,60H(將60H口地址的字節(jié)送給AL)INAX,60H(將60H口地址的字送給AX)端口地址為16位時,間接尋址,端口地址必須放在DX寄存器中,最多可訪問65536個端口。例:MOVDX,3DAHINAL,DX;將3DAH口地址的字節(jié)送給AL(2)OUTport,acc;(port)(acc)例:MOVDX,3DAHOUTDX,AX輸入輸出指令3.38086指令系統(tǒng)LEAreg16,mem16有效地址傳送指令,源操作數(shù)為內(nèi)存操作數(shù),將內(nèi)存單元的有效地址(而不是內(nèi)容)傳送到目標(biāo)寄存器。例:LEASI,AREA1MOVSI,OFFSETAREA1LDS/LESreg16,mem32指針傳送指令,將傳送一個32位目標(biāo)指針(包含一個段地址和一個段內(nèi)偏移量),從源操作數(shù)(內(nèi)存操作數(shù))傳送至一對目的寄存器。其中段地址送至DS(ES),偏移量送至指定的16位寄存器中,通常是指針寄存器或者變址寄存器。例:LDSSI,[0100H]34H12HCDHABHDS:100H目標(biāo)地址傳送指令3.38086指令系統(tǒng)LAHF不影響標(biāo)志位SAHF影響標(biāo)志寄存器低8位PUSHFPOPF16位標(biāo)志寄存器進棧/出棧指令數(shù)據(jù)傳送指令中,除SAHF和POPF外,都不影響標(biāo)志寄存器的內(nèi)容。SZAPCODITAHFLAGLAHF/SAHF3.38086指令系統(tǒng)標(biāo)志傳送指令2算術(shù)運算指令8086指令系統(tǒng)算術(shù)運算指令一共20條加法ADD減法SUBADCSBBINCDECAAANEGDAACMP除法DIVAASIDIVDASAAD乘法MULCBWIMULCWDAAM3.38086指令系統(tǒng)運算數(shù)據(jù)格式和對標(biāo)志位的影響數(shù)據(jù)類型類型字節(jié)字不帶符號的二進制數(shù)0-2550~65535帶符號的二進制數(shù)(補碼)-128-127-32768~32767不帶符號的壓縮十進制數(shù)0-990~9999不帶符號的非壓縮十進制數(shù)0-90~993.38086指令系統(tǒng)運算數(shù)據(jù)格式和對標(biāo)志位的影響對標(biāo)志位的影響:所有算術(shù)運算指令都影響狀態(tài)標(biāo)志CF、PF、AF、ZF、SF和OF。①當(dāng)無符號數(shù)運算結(jié)果溢出時,CF=1。②當(dāng)有符號數(shù)運算產(chǎn)生溢出時,OF=1。③當(dāng)運算結(jié)果中低8位有偶數(shù)個1或0個1,則PF=1。④若加法時第3位給第4位進位,或減法時第3位從第4位借位,則AF=1。⑤若運算結(jié)果為0,則ZF=1。⑥若運算結(jié)果為負數(shù),則SF=1。3.38086指令系統(tǒng)ADDdest,src ;(dest)(dest)+(src)加法指令:ADDAL,27HADCdest,src ;(dest)(dest)+(src)+(CF)帶進位位加法指令,主要用來實現(xiàn)多字節(jié)的加法運算。例:做4個字節(jié)的加法運算,兩個數(shù)放在SI和DI開始的存儲單元當(dāng)中。MOVAX,[SI]ADD[DI],AXMOVAX,[SI+2]ADC[DI+2],AX;注意要用帶進位的加法運算指令以上兩條指令影響A,C,O,P,S,Z6個標(biāo)志位。注意帶進位位加法中的進位位的值是上一條運算指令產(chǎn)生的結(jié)果。3.38086指令系統(tǒng)加法運算指令例3.20:ADDWORDPTR[BX+106BH],1234H(CS)=1000H,(IP)=0300H,(DS)=2000H,(BX)=1200H3.38086指令系統(tǒng)INCdest ;(dest)(dest)+1自加1指令,影響A,O,P,S,Z5個標(biāo)志位AAA加法的ASCII調(diào)整指令,它不能單獨使用,總是跟在加法指令后,對在AL中的由兩個非壓縮的BCD碼相加的結(jié)果進行校正,結(jié)果仍以非壓縮BCD碼的形式存放,個位在AL,十位在AH。DAA加法的十進制調(diào)整指令,它不能單獨使用,總是跟在加法指令后,對在AL中的由兩個壓縮的BCD碼相加的結(jié)果進行校正,產(chǎn)生一個正確的BCD碼的和。3.38086指令系統(tǒng)AAA指令的具體算法如下:IF(ALAND0FH)>9OR(AF=1)THENAL=AL+6AH=AH+1AF=1AL=ALANDOFHCF=1ELSEAF=0CF=0ENDIF3.38086指令系統(tǒng)DAA指令的算法如下:IF(ALAND0FH)>9OR(AF=1)THENAL=AL+6AF=1ENDIFIF(AL>9FH)OR(CF=1)THENAL=AL+60HCF=1ENDIF3.38086指令系統(tǒng)例3.21:求6+7(非壓縮十進制數(shù))指令如下:MOV AL,06MOV BL,07ADD AL,BLAAA00000110+00000111(AL)=00001101因為(AL)>9,要調(diào)整+00000110(AL)=00010011(AH)=1,(AL)=ALAND0FH=033.38086指令系統(tǒng)例3.22:求48+29(壓縮的十進制數(shù))程序如下:MOV AL,48HADD AL,29HDAA01001000+0010100101110001AF=1調(diào)整+0000011001110111例3.23:上例中若是非壓縮的十進制數(shù),兩個數(shù)放在存儲單元UP1、UP2中,運算結(jié)果放在DX中,則設(shè)(UP1)=08,(UP2)=09,(UP1+1)=04,(UP2+1)=02,這里UP1、UP2是存儲單元的符號地址,編程計算48+29。3.38086指令系統(tǒng)SUBdest,src;(dest)(dest)-(src)減法指令:SUBAL,65HSBBdest,src;(dest)(dest)-(src)-(CF)帶借位位減法指令以上兩條指令影響A,C,O,P,S,Z6個標(biāo)志位。DECdest;(dest)(dest)-1自減1指令,影響A,O,P,S,Z5個標(biāo)志位AAS減法的ASCII調(diào)整指令,對在AL中的由兩個非壓縮的BCD碼相減的結(jié)果進行校正,結(jié)果仍以非壓縮BCD碼的形式存放,個位在AL,十位在AH。DAS減法的十進制調(diào)整指令,對在AL中的由兩個壓縮的BCD碼相減的結(jié)果進行校正,產(chǎn)生一個正確的BCD碼的差。減法運算指令3.38086指令系統(tǒng)AAS指令的具體算法如下:IF(ALAND0FH)>9OR(AF=1)THENAL=AL-6AH=AH-1AF=1AL=ALANDOFHCF=1ELSEAF=0CF=0ENDIF3.38086指令系統(tǒng)DAS指令的算法如下:IF(ALAND0FH)>9OR(AF=1)THENAL=AL-6AF=1ENDIFIF(AL>9FH)OR(CF=1)THENAL=AL-60HCF=1ENDIF3.38086指令系統(tǒng)例3.24:若(AL)=9AH,執(zhí)行指令SUBAL,65H后,各標(biāo)志位的值?9AH-65H=9AH+(-65H),這里9AH本身是負數(shù)補碼[-65H]補=10011011=9BH100110109AH+100110119BH100110101可以根據(jù)以前講過的溢出判斷方法來判斷是否溢出。次高位無進位,最高位有進位,所以O(shè)F=1,SF=0,ZF=0,AF=1,PF=1,CF=1,運算結(jié)果溢出。需要修正,修正辦法是將符號位變成1,則結(jié)果變成10110101,此數(shù)是補碼,其原碼為11001011,真值是-75=-4BH。實際上,9AH=(10011010)補,其真值是-102,65H=101-102-101=-203=(-128)+(-75),其中-128舍去3.38086指令系統(tǒng)例3.25:求7231-2958(壓縮十進制數(shù))程序:MOVAL,31H0011000131 SUBAL,58H-0101100058 DAS11011001AF=1CF=1 MOVBL,AL-01100110 MOVAL,72H01110011結(jié)果73SBBAL,29H0111001072 DAS-00000001減CF MOVBH,AL01110001結(jié)果存放在BX中,-0010100129(BX)=427301001000AF=1-0000011001000010結(jié)果42CMPdest,src ;(dest)-(src)比較指令。完成兩個操作數(shù)相減,結(jié)果反映在標(biāo)志位上,但不送回結(jié)果。用于比較兩個操作數(shù)的大小關(guān)系。(1)若任意兩個數(shù)CMPA,BZF=0A<>B(JNZ不等轉(zhuǎn)移)ZF=1A=B(JZ相等轉(zhuǎn)移)(2)若兩個數(shù)都是無符號數(shù)CF=0A≥B(JNC)CF=1A<B(JC) (3)若兩個數(shù)都是同符號數(shù)SF=0A≥B(JNS)SF=1A<B(JS)(4)若兩個數(shù)是任意帶符號數(shù)SF⊕OF=0A≥B(JNL)SF⊕OF=1A<B(JL)3.38086指令系統(tǒng)例3.26:比較54與24的大小54-24=54+(-24)[-24]補=11101000,[54]補=0011011000110110+11101000100011110OF=0,SF=0,則目的>源,即54>24例3.27:比較24與54的大小24-54=24+(-54)00011000+1100101011100010OF=0,SF=1,則目的〈源,即24〈543.38086指令系統(tǒng)求補指令:NEGdest求補是把操作數(shù)按位求反后,在最低位加1。即0FFFFH-(dest)+1(dest)例3.27:若(BX)=6780H,執(zhí)行NEGBX后,BX)=?0000H-6780HFFFFH-6780H+119880H=0000-6780H=9880H執(zhí)行指令后,(BX)=9880H,是-6780的補碼CF=1,OF=0,ZF=0,PF=0,AF=0,SF=1即對求補得到-6780的補碼3.38086指令系統(tǒng)MULsrc;無符號數(shù)乘法指令只影響標(biāo)志位OF和CF,其他狀態(tài)標(biāo)志在執(zhí)行MUL指令后無定義。若運算結(jié)果高字節(jié)(或高字)有效,則OF=1,CF=1。字節(jié)型乘法,一個乘數(shù)在AL中,在指令中給出另一個乘數(shù),結(jié)果放在AX中;字型乘法,一個乘數(shù)在AX中,指令中給出另一個乘數(shù),結(jié)果為雙字,高16位在DX中,低16位在AX中。IMULsrc;有符號數(shù)乘法指令功能上和MUL類似,只是要求兩個乘數(shù)必須是有符號數(shù)。AAM;乘法的ASCII碼調(diào)整指令不能單獨使用,只能用在MUL指令后。對兩個非壓縮的BCD碼相乘的結(jié)果進行調(diào)整,其結(jié)果也是一個非壓縮的BCD碼。調(diào)整算法:AH=AL/10AL=ALMOD10乘法沒有十進制調(diào)整指令3.38086指令系統(tǒng)乘法運算指令例3.28:MULBL指令執(zhí)行前:AL=B4H=180,BL=11H=17指令執(zhí)行后:AX=0BF4H=3060例3.29:IMULBL指令執(zhí)行前:AL=B4H=-76,BL=11H=17指令執(zhí)行,先將AL的符號去掉,即76=4CH,先進行4CH×11H=050CH。再進行符號處理,正負得負,即乘積應(yīng)該是負數(shù),因此將結(jié)果050CH求補碼:[050CH]求補=FAF4H,真值為-1292指令執(zhí)行后,AX=FAF4H,(-76)×17=-1292。3.38086指令系統(tǒng)DIVsrc:無符號數(shù)除法指令8位除法:AX/src的商在AL中,AX/src的余數(shù)在AH中16位除法:(DX,AX)/src的商在AX中,余數(shù)在DXIDIV源:有符號數(shù)除法指令在功能上與DIV相類似,差別是IDIV指令執(zhí)行時,要將除數(shù)和被除數(shù)看成符號數(shù)。AAD:除法的ASCII調(diào)整指令不能單獨使用,只能用在DIV指令前。對非壓縮的BCD碼除法運算的調(diào)整,是在進行除法運算之前,通過對除數(shù)和被除數(shù)進行調(diào)整來實現(xiàn)的。調(diào)整算法:AL=AH*10+ALAH=0;除法也沒有十進制調(diào)整指令CBW:將AL中字節(jié)的符號位擴展到AH中,成為字CWD:將AX中字的符號位擴展到DX中,成為雙字除法運算指令3.38086指令系統(tǒng)例3.30:DIV BL指令執(zhí)行前,AX=0400H,BL=B4H,即AX為無符號數(shù)1024,BL為無符號數(shù)180。指令執(zhí)行后,AH=7CH(余數(shù)),AL=05H(商)例3.31:IDIV BL指令執(zhí)行前,AX=0400H,BL=B4H(補碼),AX為有符號數(shù),而BL為有符號數(shù)-76。指令執(zhí)行,先將BL=B4H求補,[B4H]求補=4CH=76,正數(shù)除以負數(shù),商為負數(shù),必須對除法結(jié)果的商求補:(0DH)求補=F3H,其真值為-13;余數(shù)為24H=36D。3.38086指令系統(tǒng)位操作指令A(yù)NDdest,src;按位與指令,(dest)(dest)&(src)ORdest,src;按位或指令,(dest)(dest)∧(src)XORdest,src;按位異或指令,(dest)(dest)⊕(src)NOTdest;取反指令,字節(jié)求反(dest)FFH-(dest)字求反(dest)FFFFH-(dest)TESTdest,src;測試指令(dest)&(src)與AND指令類似,只是不改變目的操作數(shù)的內(nèi)容,僅影響標(biāo)志位。3.38086指令系統(tǒng)3邏輯運算指令xxxxxxxx(BL)000011110F0000xxxx結(jié)果ANDxxxxxxxx(BL)000011110Fxxxx1111結(jié)果ORxxxxxxxx(BL)000011110Fxxxxxxxx結(jié)果XORAND主要用于將二進制數(shù)的某些位清0;OR主要用于將二進制數(shù)的某些位置1;XOR主要用于將二進制數(shù)的某些位求反位操作的用途3.38086指令系統(tǒng)例3.32:要求屏蔽一字節(jié)中的高4位(所謂屏蔽,就是將屏蔽位清0),可用ANDAL,0FH來實現(xiàn)。指令執(zhí)行前AL=39H指令執(zhí)行后AL=09H例3.33:ORAL,80H,使AL中內(nèi)容的最高位置1,其余位不變。指令執(zhí)行前AL=2BH指令執(zhí)行后AL=ABH例3.34:使寄存器清零,可以執(zhí)行XORAX,AX,自己與自己異或,結(jié)果為0,若AX=1ADEH,執(zhí)行該指令后,AX=0000H。3.38086指令系統(tǒng)移位指令SHL/SALdest,計數(shù);邏輯和算術(shù)左移指令SHRdest,計數(shù);邏輯右移指令SARdest,計數(shù);算術(shù)右移指令ROLdest,計數(shù);不帶進位循環(huán)左移指令RORdest,計數(shù);不帶進位循環(huán)右移指令RCLdest,計數(shù);帶進位循環(huán)左移指令RCRdest,計數(shù);帶進位循環(huán)右移指令3.38086指令系統(tǒng)3.38086指令系統(tǒng)注意以下幾點:8086移位指令中的計數(shù)是指移位次數(shù),若該次數(shù)為1可直接寫在指令中。如:SHRAL,1若要移位多次,其次數(shù)必須放在CL寄存器中。如:MOVCL,4 SHRAL,CL;AL的內(nèi)容邏輯右移4次移位指令常用來做乘以2或除以2的操作SHL、SAL用來乘以2SHR、SAR用來除以23.38086指令系統(tǒng)例3.34:用以下程序來完成X*10。 SAL AL,1 ;X*2 MOV BL,AL ;暫存 SAL AL,1 ;X*4 SAL AL,1 ;X*8 ADD AL,BL ;X*10例3.35:將一個四字節(jié)數(shù)整個左移一位。 SAL FIRST_WORD,1RCL SECOND_WORD,13.38086指令系統(tǒng)串操作指令對字節(jié)串或字串進行每次一個元素(字節(jié)或字)的操作,被處理的串長度可達64K字節(jié)。串操作指令使用隱含尋址方式,源串地址為DS:SI,目的串地址為ES:DI,待處理串的長度放在CX中。串操作的重復(fù)前綴包括:REP;REPE/REPZ;REPNE/REPNZ;串操作SI和DI的增長方向由DF標(biāo)志給出,DF=0地址增量,DF=1地址減量。3.38086指令系統(tǒng)4串操作指令MOVSB/MOVSW串傳送指令將一個字節(jié)/字從DS:SIES:DI執(zhí)行指令前要先將源串首地址DS:SI目標(biāo)串首地址ES:DI完成操作后自動修改SI、DI,使其指向串的下一個元素。串操作方向由CLD和STD指令設(shè)置 CLD地址遞增方向(DF=0) STD地址遞減方向(DF=1)REPMOVSB/REPMOVSW帶有重復(fù)操作前綴的串傳送指令在執(zhí)行此操作前,需要先將串的長度存入CX寄存器,每處理完一個元素自動使CX-1,直到CX=0才結(jié)束串傳送,完成整個串的傳送。3.38086指令系統(tǒng)MOVSI,OFFSETS1MOVDI,OFFSETS2MOVCX,18 ;CLDAGAIN:MOVSB DECCX JNZAGAIN ……S1DB‘Thisisastring!$’S2DB18DUP(0)REPMOVSB3.38086指令系統(tǒng)REPMOVSB;REP是無條件重復(fù)DS=1000H,SI=2000H,ES=3000H,DI=1020H,CX=0064H,DF=03.38086指令系統(tǒng)串比較指令[REPZ/REPNZ]CMPSB[REPZ/REPNZ]CMPSW比較DS:SI所指的字節(jié)/字和ES:DI所指的字節(jié)/字比較之后自動修改地址指針。REPZ表示相等重復(fù),即(CX)≠0且(ZF)=1繼續(xù)比較;REPNZ表示不等重復(fù),即(CX)≠0且(ZF)=0繼續(xù)比較;比較指令前通常加重復(fù)前綴REPZ/REPE,從而當(dāng)發(fā)現(xiàn)兩個串不同時結(jié)束比較。3.38086指令系統(tǒng)例: MOV SI,OFFSETS1 MOV DI,OFFSETS2 MOV CX,xx REPZ CMPSB ;相等(Z=1)重復(fù) JNZ Not_EqualEqual : ……Not_Equal: …...3.38086指令系統(tǒng)串掃描指令[REPZ/REPNZ]SCASB[REPZ/REPNZ]SCASW在首地址為ES:DI的串中搜索某個關(guān)鍵字(字節(jié)/字),該關(guān)鍵字必須放在AX或AL中。指令前通常加重復(fù)前綴REPNZ/REPNE,從而當(dāng)發(fā)現(xiàn)待搜索的元素時結(jié)束搜索。3.38086指令系統(tǒng)例: MOVDI,OFFSETString MOVCX,xx MOVAL,‘h’ REPNZSCASB;不等(Z=0)重復(fù) JNZNot_FoundFound: ……Not_Found: ……3.38086指令系統(tǒng)串裝入指令LODSBLODSW將地址為DS:SI的一個字節(jié)/字裝入AL/AX。串裝入指令沒有重復(fù)前綴。例: MOVSI,OFFSETString MOVCX,xx MOVAH,2NextChar:LODSB MOVDL,AL INT21 LOOPNextChar3.38086指令系統(tǒng)串送存指令[REP]STOSB[REP]STOSW將AL/AX的值存入地址為ES:DI的內(nèi)存單元。利用重復(fù)前綴REP,可以建立一個取值相同的數(shù)據(jù)串。例:CLDLEADI,[0400H]MOVCX,128XORAX,AXREPSTOSW;ES:[0400H]開始的256個字節(jié)清03.38086指令系統(tǒng)串傳送MOVSB/BW:將源串(DS:SI)目的串(ES:DI),SI和DI自動加1/2或減1/2。串比較CMPSB/W:將源串(DS:SI)和目的串(ES:DI)比較,不影響內(nèi)容,SI和DI自動加1/2或減1/2。串掃描SCASB/W:將關(guān)鍵字AL(AX),和目的串(ES:DI)的內(nèi)容比較,SI不變,DI自動加1/2或減1/2。串裝入LODSB/W:將源串(DS:SI)AL(AX),SI自動加1/2或減1/2,DI不變。串存儲STOSB/W:將AL(AX)目的串(ES:DI),SI不變,DI自動加1/2或減1/2。3.38086指令系統(tǒng)例3.36:將1000H開始的10個字節(jié)移動到2000H開始的單元MOVSI,1000H;置源操作數(shù)起始地址MOVDI,2000H;置目的操作數(shù)起始地址MOVAX,DS;將DS和ES段統(tǒng)一,比PUSHDSMOVES,AX;POPES要快MOVCX,0AH;初始化CX為10,移動10個字節(jié)CLD ;使DF=0,使地址作增量變化REPMOVSB;(ES:DI)←(DS:SI),SI←SI+1,;(DI)←(DI)+1INT3 ;斷點指令3.38086指令系統(tǒng)例3.37:將1000H開始的10個字節(jié)移動到1002H開始的單元去。MOVCX,0AHSTDMOVSI,1009H ;1000H+9MOVDI,100BH ;1002H+9PUSHDSPOPESREPMOVSBINT33.38086指令系統(tǒng)段內(nèi)轉(zhuǎn)移是通過將目標(biāo)偏移地址傳送給指令指針寄存器IP來實現(xiàn)。段間轉(zhuǎn)移不僅要將目標(biāo)的地址的偏移地址送到IP中,而且要將目標(biāo)地址的段地址送到段寄存器CS中。直接轉(zhuǎn)移是將目標(biāo)地址偏移量直接放在指令中。間接轉(zhuǎn)移是將目標(biāo)地址偏移量放在寄存器或存儲器中。相對轉(zhuǎn)移:轉(zhuǎn)移目標(biāo)地址是相對于該指令而言。一般在同一段內(nèi),所有段內(nèi)轉(zhuǎn)移都是相對轉(zhuǎn)移。絕對轉(zhuǎn)移:a段內(nèi)間接轉(zhuǎn)移,CS不變,IP值放在寄存器或存儲器中。b段間直接轉(zhuǎn)移,新的CS和IP值,指令給出全部兩個16位數(shù)。c段間間接轉(zhuǎn)移,目標(biāo)地址的CS和IP都放在存儲器的4個連續(xù)單元中,前2個是偏移地址,后2個是段基址。3.38086指令系統(tǒng)5控制轉(zhuǎn)移指令當(dāng)程序發(fā)生轉(zhuǎn)移時,CS和IP的值可由指令指定。段間轉(zhuǎn)移或段間調(diào)用可用FAR表示段內(nèi)轉(zhuǎn)移(-32768—32767)或段內(nèi)調(diào)用可用NEAR表示若短距離內(nèi)的轉(zhuǎn)移(-128-127),稱為短轉(zhuǎn)移,用SHORT表示

3.38086指令系統(tǒng)JMP;無條件轉(zhuǎn)移指令例:JMP1025H ;段內(nèi)直接轉(zhuǎn)移JMP25H ;段內(nèi)直接短轉(zhuǎn)移JMPBX ;段內(nèi)間接轉(zhuǎn)移JMP3500H:080BH;段間直接轉(zhuǎn)移JMPDWORDPTR[BX+010AH];段間間接轉(zhuǎn)移,目標(biāo)地址存;放在DS段從BX+010AH開始;的4個存儲單元中3.38086指令系統(tǒng)JMPSHORTOPR;段內(nèi)直接短轉(zhuǎn)移;(IP)←(IP)+8位位移量JMPNEARPTROPR;段內(nèi)直接近轉(zhuǎn)移;(IP)←(IP)+16位位移量JMPWORDPTROPR;段內(nèi)間接近轉(zhuǎn)移;

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論