8086匯編指令-2118086匯編指令-211_第1頁
8086匯編指令-2118086匯編指令-211_第2頁
8086匯編指令-2118086匯編指令-211_第3頁
8086匯編指令-2118086匯編指令-211_第4頁
8086匯編指令-2118086匯編指令-211_第5頁
已閱讀5頁,還剩206頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章80X86指令系統(tǒng)及匯編語言3.1尋址方式3.2指令系統(tǒng)3.380386/80486指令系統(tǒng)

3.1尋址方式

3.1.1操作數(shù)的尋址方式

8086/8088指令中說明操作數(shù)所在地址的尋址方式有以下8種。

1.立即尋址立即尋址方式所提供的操作數(shù)直接包含在指令中。它緊跟在操作碼的后面,與操作碼一起放在代碼段區(qū)域中。圖3.1立即尋址

2.直接尋址直接尋址是指操作數(shù)地址的16位段內(nèi)偏移地址直接包含在指令中,它與操作碼一起存放在代碼段區(qū)域。操作數(shù)一般在數(shù)據(jù)段區(qū)域中,它的地址為數(shù)據(jù)段寄存器CS加上這16位的段內(nèi)偏移地址。例:MOV

AX,DS:其過程如圖3.2所示。指令中的16位段內(nèi)偏移地址的低字節(jié)在前,高字節(jié)在后。圖3.2直接尋址

3.寄存器尋址寄存器尋址是指操作數(shù)包含在CPU的內(nèi)部寄存器中,例如AX、BX、CX、DX、SI、BP、AL、CH等。例:MOVDS,AX其過程如圖3.3所示。寄存器可以是16位寄存器,也可以是8位寄存器。圖3.3寄存器尋址

4.寄存器間接尋址在寄存器間接尋址方式中,操作數(shù)存放在存貯器中,操作數(shù)的16位段內(nèi)偏移地址放在SI、DI、BP、BX這4個寄存器中之一。由于上述4個寄存器所默認的段寄存器不同,這樣又可以分成兩種情況:①若以SI、DI、BX進行間接尋址,則操作數(shù)通常存放在現(xiàn)行數(shù)據(jù)段中。②若以寄存器BP間接尋址,則操作數(shù)存放在堆棧段區(qū)域中。例:MOVAX,[SI]其過程如圖3.4(a)所示。例:MOVAX,[BP]其過程如圖3.4(b)所示。圖3.4寄存器間接尋址

5.寄存器相對尋址在寄存器相對尋址方式中,操作數(shù)存放在存貯器中。操作數(shù)的地址是由段寄存器內(nèi)容加上SI、DI、BX、BP之一的內(nèi)容,再加上由指令中所指出的8位或16位相對地址偏移量而得到的。在一般情況下,若用SI、DI或BX進行相對尋址時,以數(shù)據(jù)段寄存器DS作為地址基準,而用BP尋址時,則以堆棧段寄存器作為地址基準。例:MOVAX,DISP[SI]其過程如圖3.5所示。圖3.5寄存器相對尋址

6.基址、變址尋址在8086/8088中,通常把BX和BP作為基址寄存器,而把SI、DI作為變址寄存器。將這兩種寄存器聯(lián)合起來進行的尋址就稱為基址、變址尋址。這時,操作數(shù)的地址應(yīng)該是段寄存器內(nèi)容加上基址寄存器內(nèi)容(BX或BP內(nèi)容),再加上變址寄存器內(nèi)容(SI或DI內(nèi)容)而得到的。同理,若用BX作為基地址,則操作數(shù)應(yīng)放在數(shù)據(jù)段DS區(qū)域中;若用BP作為基地址,則操作數(shù)應(yīng)放在堆棧段SS區(qū)域中。例:MOVAX,[BX][S1]其過程如圖3.6所示。

7.基址、變址、相對尋址基址、變址、相對尋址方式實際上是第6種尋址方式的擴充。即操作數(shù)的地址是由基址、變址方式得到的地址再加上由指令指明的8位或16位的相對偏移地址而得到的。例:MOVAX,DISP[BX][S1]其過程如圖3.7所示。圖3.6基址、變址尋址圖3.7基址、變址、相對尋址

8.隱含尋址在有些指令的指令碼中,不僅包含有操作碼信息,而且還隱含了操作數(shù)地址的信息。例如乘法指令MUL的指令碼中只需指明一個乘數(shù)的地址,另一個乘數(shù)和積的地址是隱含固定的。這種將操作數(shù)的地址隱含在指令操作碼中的尋址方式稱為隱含尋址。

3.1.2轉(zhuǎn)移地址的尋址方式

1.段內(nèi)相對尋址在段內(nèi)相對尋址方式中,指令應(yīng)指明一個8位或16位的相對地址位移量DISP(有正負符號,用補碼表示)。此時,轉(zhuǎn)移地址應(yīng)該是代碼段寄存器CS內(nèi)容加上指令指針I(yè)P內(nèi)容,再加上相對地址位移量DISP。例:JMPDISP1

其過程如圖3.8所示。圖3.8段內(nèi)相對尋址

2.段內(nèi)間接尋址在段內(nèi)間接尋址方式中,轉(zhuǎn)移地址的段內(nèi)偏移地址要么存放在一個16位的寄存器中,要么存放在存貯器的兩個相鄰單元中。存放偏移地址的寄存器和存貯器的地址將按指令碼中規(guī)定的尋址方式給出。此時,尋址所得到的不是操作數(shù),而是轉(zhuǎn)移地址。例:JMPCX

其過程如圖3.9所示。圖3.9段內(nèi)間接尋址

3.段間直接尋址在段間直接尋址方式中,指令碼中將直接給出16位的段地址和16位的段內(nèi)偏移地址。例:JMPFARPTRADD1

在執(zhí)行這條段間直接尋址指令時,指令操作碼后的第二個字將賦予代碼段寄存器CS,第一個字將賦予指令指針寄存器IP。最后CS內(nèi)容和IP內(nèi)容相加則得轉(zhuǎn)移地址,如圖3.10所示。圖3.10段間直接尋址

4.段間間接尋址段間間接尋址方式和段內(nèi)間接尋址相似。但是,由于確定轉(zhuǎn)移地址需要32位信息,因此段間間接尋址只適用于存貯器尋址方式。用這種尋址方式可計算出存放轉(zhuǎn)移地址的存貯單元的首地址,與此相鄰的4個單元中,前兩個單元存放16位的段內(nèi)偏移地址,而后兩單元存放的是16位的段地址,如圖3.11所示。例:JMPDWORDPTR[BP][DI]圖3.11段間間接尋址

3.2指令系統(tǒng)

8086/8088的指令系統(tǒng)大致可分為7種類型:·數(shù)據(jù)傳送指令·算數(shù)運算指令·邏輯運算和移位指令·串操作指令·程序控制指令·處理器控制指令·輸入/輸出指令

3.2.1數(shù)據(jù)傳送指令

1.MOV指令

MOVOPRD1,OPRD2

目的源

MOV是操作碼,OPRD1和OPRD2分別是目的操作數(shù)和源操作數(shù)。該指令可把一個字節(jié)或一個字操作數(shù)從源地址傳送到目的地址。源操作數(shù)可以是累加器、寄存器、存貯器以及立即操作數(shù),而目的操作數(shù)可以是累加器、寄存器和存貯器。數(shù)據(jù)傳送方向的示意圖如圖3.12所示。圖3.12MOV的數(shù)據(jù)傳送方向各種數(shù)據(jù)傳送指令例舉如下:①在CPU各內(nèi)部寄存器之間傳送數(shù)據(jù)。

MOVAL,BL;8位數(shù)據(jù)傳送指令(1個字節(jié))MOVAX,DX;16位數(shù)據(jù)傳送指令(1個字)MOVSI,BP;16位數(shù)據(jù)傳送指令(1個字)②立即數(shù)傳送至CPU的通用寄存器(即AX、BX、CX、DX、BP、SP、SI、DI)。

MOVCL,4 ;8位數(shù)據(jù)傳送(1個字節(jié))MOVAX,03FFH ;16位數(shù)據(jù)傳送(1個字)③CPU內(nèi)部寄存器(除了CS和IP以外)與存貯器(所有尋址方式)之間的數(shù)據(jù)傳送,可以傳送一個字節(jié)也可以傳送一個字。

·在CPU的通用寄存器與存貯器之間傳送數(shù)據(jù):

MOVAL,BUFFERMOV[DI],CX·在CPU寄存器與存貯器之間傳送數(shù)據(jù):

MOVDS,DATA[SI+BX]

MOVDEST[BP+D1],ES

使用中需要注意的是:①MOV指令不能在兩個存貯器單元之間進行數(shù)據(jù)直接傳送。②MOV指令不能在兩個段寄存器之間進行數(shù)據(jù)直接傳送。③立即數(shù)不能直接傳送給段寄存器。④目的操作數(shù)不能為CS、IP。

其中,①~③的傳送可用通用寄存器作為中介,用兩條傳送指令完成。例如,為了將在同一個段內(nèi)的偏移地址為AREA1的數(shù)據(jù)傳送到偏移地址為AREA2單元中去,可執(zhí)行以下兩條傳送指令:

MOVAL,AREA1MOVAREA2,AL

例如,為了將立即數(shù)傳送給DS,可執(zhí)行以下兩條傳送指令:

MOVAX,1000HMOVDS,AX例如,將以AREA1為首地址的100個字節(jié)數(shù)據(jù)搬移到以AREA2為首地址的內(nèi)存中,若AREA1和AREA2都在當(dāng)前數(shù)據(jù)段中,可以用帶有循環(huán)控制的數(shù)據(jù)傳送程序來實現(xiàn)。程序如下:

MOVSI,OFFSETAREA1MOVDI,OFFSETAREA2MOVCX,100AGAIN:MOVAL,[SI]MOV[D1],ALINCSIINCDIDECCXJNZAGAIN

2.交換指令

XCHGOPRD1,OPRD2

交換指令把一個字節(jié)或一個字的源操作數(shù)與目的操作數(shù)相交換。這種交換能在通用寄存器與累加器之間、通用寄存器之間、通用寄存器與存貯器之間進行,但是段寄存器不能作為一個操作數(shù)。例如:

XCHGAL,CLXCHGAX,DIXCHGBX,SIXCHGAX,BUFFERXCHGBX,DATA[SI]

3.地址傳送指令

8086/8088有3條地址傳送指令。

(1)LEA指令

LEAOPRD1,OPRD2

該指令把源操作數(shù)OPRD2的地址偏移量傳送至目的操作數(shù)OPRD1中。

(2)LDS指令該指令完成一個地址指針的傳送。

(3)LES指令這條指令除將地址指針的段地址送入ES外,其他操作與LDS的類似。

4.堆棧操作指令堆棧是內(nèi)存中的一個特定區(qū)域,由SS的內(nèi)容和SP的內(nèi)容來決定。堆棧操作具有先入后出的特點。用于堆棧操作的指令主要是:

PUSHOPRD(堆棧壓入指令)POPOPRD(堆棧彈出指令)

堆棧操作指令中的操作數(shù)可以是段寄存器(除CS)的內(nèi)容、16位的通用寄存器(標志寄存器有專門的出入棧指令)以及內(nèi)存的16位字。例如:MOVAX,8000HMOVSS,AXMOVSP,2000HMOVDX,3E4AHPUSHDXPUSHAX當(dāng)執(zhí)行完兩條壓入堆棧的指令時,堆棧中的內(nèi)容如圖3.13所示。壓入堆棧指令PUSHDX的執(zhí)行過程為:①SP-1→SP;②DH→(SP);③SP-1→SP;④DL→(SP)。彈出堆棧指令POPAX的過程與此剛好相反:①(SP)→AL;②SP+1→SP;③(SP)→AH;④SP+1→SP。圖3.13堆棧操作示意圖

5.字節(jié)、字轉(zhuǎn)換指令

CBWCWDCBW指令將AL的符號位(bit7)擴展到整個AH中,即將字節(jié)轉(zhuǎn)換成一個字。例如:

MOVAL,4FHCBW

執(zhí)行后,AX=004FH。

CWD指令將AX的符號位(bit15)擴展到整個DX,即將字轉(zhuǎn)換成雙字。例如:

MOVAX,834EHCWD

執(zhí)行后,DX=FFFFH,DXAX=FFFF834EH。

3.2.2算術(shù)運算指令

8086/8088可提供加、減、乘、除4種基本算術(shù)運算的操作指令。這些指令可實現(xiàn)字節(jié)或字的運算,也可以用于符號數(shù)和無符號數(shù)的運算。

1.加法指令

(1)ADDOPRD1,OPRD2

這條指令完成兩個操作數(shù)相加,結(jié)果送至目的操作數(shù)OPRD1,即:

OPRD1←OPRD1+OPRD2具體地說,該指令可以實現(xiàn)累加器與立即數(shù)、累加器與任一通用寄存器、累加器與存貯單元內(nèi)容相加,其和放回累加器中。例如:

ADDAL,30ADDAX,3000HADDAX,SIADDAL,DATA[BX]該指令也可以實現(xiàn)任一通用寄存器與立即數(shù)、累加器或別的寄存器、存貯單元的內(nèi)容相加,其和放回寄存器中。例如:

ADDBX,3FFHADDSI,AXADDDI,CXADDDX,DATA[BX+SI]該指令還可以實現(xiàn)存貯器操作數(shù)與立即數(shù)、累加器或別的寄存器的內(nèi)容相加,其和放回存貯單元中。例如:

ADDBETA[SI],100ADDBETA[SI],AXADDBETA[SI],DX

這些指令執(zhí)行時,對標志位CF、OF、PF、SF、ZF和AF都會產(chǎn)生影響。

(2)ADC指令這條指令與ADD指令基本相同,只是相加時再加上進位位的當(dāng)前值,即:

OPRD1←OPRD1+OPRD2+CFMOVAX,F(xiàn)IRSTADDAX,SECONDMOVTHIRD,AXMOVAX,F(xiàn)IRST+2ADCAX,SECOND+2MOVTHIRD+2,AX

(3)INCOPRD指令這條指令對指定的操作數(shù)進行加1操作,其操作數(shù)可以是通用寄存器,也可以在內(nèi)存單元中。加1操作時,把操作數(shù)看作為無符號的二進制數(shù)。

INC指令常用于在循環(huán)程序中修改地址指針和循環(huán)次數(shù)等。例如:

INCALINC[SI]

2.減法指令

(1)SUBOPRD1,OPRD2

該指令進行兩個操作數(shù)的相減操作,即:

OPRD1←OPRD1-OPRD2(2)SBB指令該指令與SUB相類似,只是相減時,還應(yīng)減去借位標志CF的當(dāng)前值,即:

OPRD1←OPRD1-OPRD2-CF

(3)DECOPRD指令該指令實現(xiàn)對操作數(shù)的減1操作,所用的操作數(shù)可以是通用寄存器,也可以在內(nèi)存單元中。減1操作時,把操作數(shù)看作為無符號的二進制數(shù)。例如:

DECBXDEC[DI]

4)NEGOPRD

該指令用來對操作數(shù)進行求補操作,即對操作數(shù)按位取反后加1。例如:

NEGALNEGMULRE

(5)CMPOPRD1,OPRD2

該指令為比較指令,與減法指令一樣執(zhí)行OPRD1-OPRD2操作,但相減后不回送結(jié)果,只是根據(jù)相減結(jié)果修改標志位。即:

OPRD1-OPRD2

比較指令可以用于累加器與立即數(shù),累加器與任一通用寄存器或任一內(nèi)存操作數(shù)之間的比較。例如:

CMPAL,100CMPAX,SICMPAX,DATA[BX]該指令也可以用于任一寄存器與立即數(shù)或別的寄存器及任一內(nèi)存操作數(shù)之間的比較,例如:

CMPBX,04FEHCMPDX,DICMPCX,COUNT[BP]該指令還可以用于內(nèi)存操作數(shù)與立即數(shù)及任一寄存器中操作數(shù)之間的比較。例如:

CMPDATA,100CMPCOUNT[SI],AXCMPPOINTER[DI],BX綜上所述,可以歸納出如下結(jié)論:當(dāng)沒有溢出時(OF=0),若SF=0,則AX>BX;若SF=1,則AX<BX。當(dāng)產(chǎn)生溢出時(OF=1),若SF=0,則AX<BX;若SF=1,則AX>BX。用邏輯表達式又可簡化為:若OFSF=0,則AX≥BX;

若OFSF=1,則AX<BX。例如,若自BLOCK開始的內(nèi)存緩沖區(qū)中,有100個帶符號的數(shù),希望找到其中最大的一個值,并將它放到MAX單元中。

MOVBX,OFFSETBLOCKMOVAX,[BX]

INCBXINCBXMOVCX,99AGAIN:CMPAX,[BX]

JGNEXTMOVAX,[BX]NEXT:INCBXINCBXDECCXJNEAGAINMOVMAX,AXHLT

3.乘法指令乘法指令分為無符號數(shù)乘法指令和帶符號數(shù)乘法指令兩種。

(1)無符號數(shù)乘法指令MUL

該指令的一般格式為:

MULOPRD;OPRD為源操作數(shù)例:字節(jié)乘以字節(jié)

MOVAL,LSRCBYTE;被乘數(shù)送ALMULRSRCBYTE;結(jié)果存于AX中字乘以字

MOVAX,LSRCWORD;一個字送AXMULRSRCWORD;結(jié)果的高字節(jié)在DX中,低字節(jié)在AX中字節(jié)乘以字

MOVAL,MULBYTE;字節(jié)被乘數(shù)送入ALCBW;AL中字節(jié)轉(zhuǎn)換成AX中的字

MULRSRCWORD

(2)帶符號數(shù)乘法指令I(lǐng)MUL

這是一條帶符號數(shù)的乘法指令,它和MUL一樣可以進行字節(jié)和字節(jié)、字和字的乘法運算。結(jié)果放在AX或DX、AX中。當(dāng)結(jié)果的高半部分不是結(jié)果的低半部分的符號擴展時,標志位CF和OF將置位。該指令的一般格式為:

IMULOPRD

例:字節(jié)乘以字節(jié)

MOVAL,LSRC_BYTE;被乘數(shù)送ALIMULRSRC_BYTE

4.除法指令

8088有兩條除法指令:無符號除法指令和帶符號除法指令。

(1)無符號數(shù)除法指令DIV

執(zhí)行該指令,如果結(jié)果大于寄存器可以保存的值時,則產(chǎn)生0型中斷。例:字除以字節(jié)

MOVAX,NUMERATORWORD;被除數(shù)送AXDIVDIVISORBYTE;商在AL中,余數(shù)在AH中

字節(jié)除以字節(jié)

MOVAL,NUMERATORBYTE;被除數(shù)送A1CBW;AL中的字節(jié)擴展成AX中的字

DIVDIVISORBYTE

字除以字

MOVAX,NUMERATORWORDCWD;把字轉(zhuǎn)換成雙字DX、AXDIVDIVISORWORD;商在AX中,余數(shù)在DX中

(2)帶符號除法指令I(lǐng)DIV

該指令是帶符號的除法指令。執(zhí)行除法后,余數(shù)符號與被除數(shù)相同,其他同DIV指令。

IDIV指令一般格式為:

IDIVOPRD

例:雙倍字長除以字

MOVDX,NUMHIWORD;被除數(shù)高位字送DXMOVAX,NUMLOWORD;被除數(shù)低位字送AXIDIVDIVISORWORD[SI]

5.調(diào)整指令

8088的調(diào)整指令主要用于十進制數(shù)的調(diào)整。

AAA——對AL中ASCII未壓縮的十進制和進行調(diào)整;

AAS——對AL中ASCII未壓縮的十進制差進行調(diào)整;

AAD——在除法指令前對AX中ASCII未壓縮的十進制數(shù)進行調(diào)整;

AAM——對AX中兩個ASCII未壓縮十進制相乘結(jié)果進行調(diào)整;

DAA——對AL中的兩個壓縮十進制數(shù)相加之和進行調(diào)整,得到壓縮十進制和;

DAS——對AL中的兩個壓縮十進制數(shù)相減之差進行調(diào)整,得到壓縮十進制差。

3.2.3邏輯運算和移位指令邏輯運算和移位指令包括邏輯運算、移位和循環(huán)移位指令。

1.邏輯運算指令

(1)NOTOPRD

該指令對操作數(shù)進行求反操作,然后將結(jié)果送回。操作數(shù)可以是寄存器或存貯器的內(nèi)容。該指令對標志位不產(chǎn)生影響。例如:

NOTAL

(2)AND指令該指令對兩個操作數(shù)進行按位相“與”的邏輯運算。即只有參加相與的兩位全為“1”時,相“與”結(jié)果才為“1”;否則相“與”結(jié)果為“0”。相“與”結(jié)果送回。AND指令可以進行字節(jié)操作,也可以進行字操作。

AND指令的一般格式為:

ANDOPRD1,OPRD2例如:ANDAL,0FHANDAX,BXANDSI,BPANDAX,DATA#--WORDANDDX,BUFFER[SI+BX]ANDDATA#--WORD,00FFHANDBLOCK[BP+DI],DX

(3)TEST指令該指令的操作功能與AND指令相同,其結(jié)果將反映在標志位上,但結(jié)果不送回,即TEST指令將不改變操作數(shù)的值。這條指令通常是在不希望改變操作數(shù)的前提下,用來檢測某一位或某幾位的狀態(tài)。

TEST指令的一般格式為:

TESTOPRD,im

;im是立即數(shù)立即數(shù)中哪一位為1,表示要對哪一位進行測試。例如,若要檢測AL中的最低位是否為1,且若為1則轉(zhuǎn)移。在這種情況下可以用如下指令:

TESTAL,01HJNZTHERE…THERE:MOVBL,05H…

(4)OR指令該指令對兩個操作數(shù)進行按位相“或”的邏輯操作,即進行相“或”的兩位中的任一位如果為1時,則相“或”的結(jié)果為1;如果兩位都為0時,其結(jié)果才為0。OR指令操作結(jié)果將送回。OR指令允許對字節(jié)或?qū)ψ诌M行相“或”運算。

OR指令使標志位CF=0,OF=0;相“或”操作的結(jié)果反映在標志位PF、SF和ZF上;對AF標志位未定義。

OR指令的一般格式為:

OROPRD1,OPRD2例如:ORAL,30HORAX,00FFHORBX,SIORBX,DATAWORDORBUFFER[BX],SIORBUFFER[BX+SI],8000H

(5)XOR指令該指令對兩個操作數(shù)進行按位“異或”操作,即進行“異或”操作的兩位值不同時,其結(jié)果為“1”;否則就為0,操作結(jié)果送回。

XOR指令的一般形式為:

XOROPRD1,OPRD2例如:XORAL,0FHXORAX,BXXORDX,SIXORCX,CONNTWORDXORBUFFER[BX],DIXORBUFFER[BX+SI],AX

2.移位指令

8088有3條移位指令:算術(shù)左移和邏輯左移指令SAL/SHLOPRD,m

算術(shù)右移指令SAROPRD,m

邏輯右移指令SHROPRD,m(1)SAL/SHL指令這兩條指令的操作結(jié)果是完全一樣的。每移位一次在右面最低位補一個0,而左面的最高位則移入標志位CF,如圖3.14(a)所示。圖3.14移位指令示意圖

(a)SAL/SHL;(b)SAR;(c)SHR

(2)SAR指令該指令每執(zhí)行一次移位操作,就使操作數(shù)右移一位,但符號位保持不變,而最低位移至標志位CF,如圖3.14(b)所示。

SAR指令影響標志位CF、OF、PF、SF和ZF。右移一位相當(dāng)于除以2,例如:

MOVAL,16SARAL,1 ;執(zhí)行后,AL的內(nèi)容為8(相當(dāng)于 除以2)

(3)SHR指令該指令每執(zhí)行一次移位操作,就使操作數(shù)右移一位,最低位移至標志位CF中。與SAR不同的是,左面的最高位將補0,如圖3.14(c)所示。該指令可以執(zhí)行由m所指定的移位次數(shù)。

3.循環(huán)移位指令

8088有4條循環(huán)移位指令:左循環(huán)移位指令ROLOPRD,m

右循環(huán)移位指令ROROPRD,m

帶進位左循環(huán)移位指令RCLOPRD,m

帶進位右循環(huán)移位指令RCROPRD,m(1)ROL指令該指令每做一次移位,總是將最高位移入進位位CF中,并且還將最高位移入操作數(shù)的最低位,從而構(gòu)成一個環(huán),如圖3.15(a)所示。圖3.15循環(huán)移位指令示意圖

(a)ROL;(b)ROR;(c)RCL;(d)RCR

(2)ROR指令該指令每做一次移位,總是將最低位移入進位標志位CF中,另外,還將最低位移入操作數(shù)的最高位,從而構(gòu)成一個環(huán),如圖3.15(b)所示。當(dāng)規(guī)定的循環(huán)次數(shù)為1時,若循環(huán)移位后,操作數(shù)的最高位和次高位不相等,則標志位CF=1;否則OF=0。這可以用來判別移位前后操作數(shù)的符號是否有改變。該指令只影響CF和OF標志位。(3)RCL指令該指令是把標志位CF包含在內(nèi)的循環(huán)左移指令。(4)RCR指令該指令是把進位標志位CF包含在內(nèi)的右循環(huán)指令。

3.2.4串操作指令

1.MOVS/MOVSB/MOVSW

該類指令是串傳送指令,用于內(nèi)存區(qū)之間字節(jié)串或字串的傳送。串傳送指令的一般格式為:

MOVSOPRD1,OPRD2;OPRD2是源串, OPRD1是目的串

MOVSB;字節(jié)傳送

MOVSW;字傳送

2.CMPS/CMPSB/CMPSW

該類指令是串比較指令,常用于內(nèi)存區(qū)之間的數(shù)據(jù)、字符等的比較。串比較指令的一般格式為

CMPSOPRD1,OPRD2 ;OPRD1是源串, OPRD2是目的串

CMPSB;字節(jié)比較

CMPSW;字比較

3.SCAS/SCASB/SCASW

該類指令是串掃描指令,用于尋找內(nèi)存區(qū)中指定的數(shù)據(jù)和字符。串掃描指令的一般格式為

SCAS

OPRD;OPRD是目的串

SCASB;字節(jié)操作

SCASW;字操作4.LODS/LODSB/LODSW該類指令是串裝入指令。串裝入指令的一般格式為:

LODS

OPRD;OPRD為源串

LODSB;字節(jié)操作

LODSW;字操作5.STOS/STOSB/STOSW該類指令是字串存貯指令。串存貯指令的一般格式為:

STOSOPRD;OPRD為目的串

STOSB;字節(jié)操作

STOSW;字操作

6.REPREP是串指令的前綴。當(dāng)某一條串指令需要多次重復(fù)時,就可以加上該前綴。重復(fù)次數(shù)由CX決定,每重復(fù)執(zhí)行一次,CX內(nèi)容減1,直到CX=0為止。

7.REPE/REPNE

它們是條件重復(fù)前綴。當(dāng)條件滿足時,才重復(fù)執(zhí)行后面的串指令,一旦條件不滿足,重復(fù)就停止。

REPE指令是相等重復(fù)指令,當(dāng)ZF=1且CX未減到0,串指令重復(fù)執(zhí)行。

REPNE指令是不相等重復(fù)指令,當(dāng)ZF=0且CX未減到0,串指令重復(fù)執(zhí)行。

例:數(shù)據(jù)段中地址BUFFER1開始的字符串,長度為1000字節(jié),將其傳送到附加段中地址BUFFER2開始的數(shù)據(jù)區(qū)。

MOVSI,OFFSETBUFFER1;BUFFER1偏移地址 送SIMOVDI,OFFSETBUFFER2;BUFFER2偏移地址 送DIMOVCX,1000;傳送次數(shù)送CXCLD;使DF=0,SI、DI做加1操作

REPMOVSB;串傳送例:若上例中的BUFFER1和BUFFER2都處于數(shù)據(jù)段,則程序可修改如下:

MOVAX,DSMOVES,AX;使ES=DSLEASI,BLOCK1;源串地址送SILEADI,BLOCK2;目的串地址送DIMOVCX,500;重復(fù)次數(shù)送CXCLD ;使DF=0,SI、DI做加2操作

REPEMOVSW;串傳送例:比較數(shù)據(jù)段中源串SOURCE和附加段中目的串DEST中的500個字節(jié),找出第一個不相同的字節(jié),如果找到,則將SOURCE中的這個數(shù)送AL中。

LEADI,ES:DESTLEASI,SOURCEMOVCX,500CLDREPECMPBJZNEXTMATCH:DECSIMOVAL,BYTEPTR[SI]

NEXT:…

3.2.5程序控制指令程序控制指令主要是指程序轉(zhuǎn)移指令。轉(zhuǎn)移類指令通過改變CS與IP的值或僅改變IP的值,以改變指令執(zhí)行的順序。

1.無條件轉(zhuǎn)移、調(diào)用和返回指令這些指令都將引起程序執(zhí)行順序的改變。轉(zhuǎn)移有段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移之分。所謂段內(nèi)轉(zhuǎn)移是指段地址不變,僅IP發(fā)生改變;而段間轉(zhuǎn)移時,CS和IP均發(fā)生改變。

(1)無條件轉(zhuǎn)移指令JMP

該指令分直接轉(zhuǎn)移和間接轉(zhuǎn)移兩種。直接轉(zhuǎn)移又可分短程(SHORT)、近程(NEAR)和遠程(FAR)3種形式。當(dāng)程序執(zhí)行到JMP指令時,就無條件地轉(zhuǎn)移到指令中所指示的目的地址。該指令的一般格式為JMPOPRD;OPRD是轉(zhuǎn)移的目的地址直接轉(zhuǎn)移的3種形式為:

·短程轉(zhuǎn)移JMPSHORTOPRD

短程轉(zhuǎn)移中目的地址與JMP指令所處地址的距離應(yīng)在-128~+127范圍之內(nèi)。

·近程轉(zhuǎn)移JMPNEARPTROPRD

或JMPOPRD;NEAR可省略

·遠程轉(zhuǎn)移JMPFARPTROPRD

遠程轉(zhuǎn)移是段間的轉(zhuǎn)移,目的地址與JMP指令所在地址不在同一段內(nèi)。執(zhí)行該指令時要修改CS和IP的內(nèi)容。間接轉(zhuǎn)移指令的目的地址可以由存貯器或寄存器給出:

·段內(nèi)間接轉(zhuǎn)移JMPWORDPTROPRD·段間間接轉(zhuǎn)移JMPDWORDPTROPRD

(2)調(diào)用和返回指令

CALL指令用來調(diào)用一個過程,在過程執(zhí)行完后可使用返回指令RET,使程序返回調(diào)用程序繼續(xù)執(zhí)行。由于過程有段間(即遠程FAR)和段內(nèi)調(diào)用(即近程NEAR)之分,所以CALL也有FAR和NEAR之分,RET也分段間和段內(nèi)返回兩種。這由被調(diào)用過程的定義所決定。調(diào)用指令一般格式為:

CALLNEARPTROPRD;段內(nèi)調(diào)用

CALLFARPTROPRD;段間調(diào)用例:近程調(diào)用

;主程序(近程調(diào)用)

…CALLNEARPTRPROAD…

;過程PROAD定義

PROADPROCNEARPUSHAXPUSHCXPUSHSILEASI,ARY

MOVCX,COUNTXORAX,AXNEXT:ADDAX,[SI]

ADDSI,2LOOPNEXTMOVSUM,AXPOPSIPOPCXPOPAXRETPROADENDP例:遠程調(diào)用;主程序(遠程調(diào)用)…CALLFARPTRPROADD…

;過程PROADD定義(遠程調(diào)用過程)PROADDPROCFARPUSHAXPUSHCXPUSHSIPUSHDIMOVSI,[BX]MOVDI,[BX+2]MOVCX,[DI]MOVDI,[BX+4]XORAX,AXNEXT1:ADDAX,[SI]ADDSI,2LOOPNEXT1MOV[DI],AXPOPDIPOPSIPOPCXPOPAXRETPROADDENDP

2.條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令將上一條指令所設(shè)置的某些標志位的狀態(tài)作為測試條件,條件滿足則轉(zhuǎn)向指令中所指示的目的地址。(1)以單個標志位為條件

JOOPRD;溢出轉(zhuǎn)移

JNOOPRD;不溢出轉(zhuǎn)移

JSOPRD;結(jié)果為負轉(zhuǎn)移

JNSOPRD;結(jié)果為正轉(zhuǎn)移

JCOPRD;進位轉(zhuǎn)移

JNCOPRD;無進位則轉(zhuǎn)移

JE/JZOPRD;等于或為零轉(zhuǎn)移(2)無符號數(shù)比較JA/JNBEOPRD;高于或不低于等于轉(zhuǎn)移JAE/JNBOPRD;高于等于或不低于轉(zhuǎn)移JB/JNAEOPRD;低于或不高于等于轉(zhuǎn)移JBE/JNAOPRD;低于等于或不高于轉(zhuǎn)移(3)帶符號數(shù)比較JG/JNLEOPRD;大于或不小于等于轉(zhuǎn)移JGE/JNLOPRD;大于等于或不小于轉(zhuǎn)移JL/JNGEOPRD;小于或不大于等于轉(zhuǎn)移JLE/JNGOPRD;小于等于或不大于轉(zhuǎn)移

3.循環(huán)控制指令該類指令的一般格式為:

LOOPOPRD;CX=0循環(huán)

LOOPEOPRD;CX=0且ZF=1循環(huán)

LOOPNEOPRD;CX=0且ZF=0循環(huán)在LOOPE和LOOPNE兩條指令中,只要兩個條件中任一個不滿足,循環(huán)就結(jié)束。例:

SUBDI,BXINCDIMOVCX,DIDECBXNEXT:INCBXCMPBYTEPTR[BX],0LOOPENEXT

4.軟中斷指令及中斷返回指令當(dāng)程序執(zhí)行到中斷指令I(lǐng)NT時,便中斷當(dāng)前程序的執(zhí)行,轉(zhuǎn)向由256個中斷向量所提供的中斷入口地址之一去執(zhí)行。軟中斷指令的一般格式為:

INTOPRD;OPRD可以取00H~FFH中的值

3.2.6處理器控制指令該類指令用來控制處理器與協(xié)處理器之間的交互作用,修改標志寄存器,以及使處理器與外部設(shè)備同步等。

1.標志位操作指令

STC;使CF=1CLC;使CF=0CMC;使CF取反

STD;使DF=1CLD;使DF=0STI;使IF=1CLI;使IF=02.外部同步指令(1)暫停指令HLT(2)空操作指令NOP(3)等待指令WAIT(4)封鎖總線指令LOCK(5)處理器交權(quán)指令ESC3.2.7輸入輸出指令輸入指令的一般格式為:

INACC,PORT

它完成從接口到CPU的輸入操作。輸出指令的一般格式為:

OUTPORT,ACC

它完成從CPU到接口的輸出操作。

1.直接尋址輸入輸出指令中直接給出一個字節(jié)表示的接口地址。由于接口地址用一個字節(jié)表示,故可尋址的接口地址只有256個(00H到FFH)。例如:

INAL,35HOUT44H,AX

2.寄存器間接尋址輸入輸出指令中接口地址由DX的內(nèi)容來決定。由于DX是16位的寄存器,故可尋址的接口地址為64K個(0000H到FFFFH)。例如:

MOVDX,03F8HINAL,DX

表示由接口地址03F8H輸入一個字節(jié)到AL。

3.380386/80486指令系統(tǒng)

3.3.180386的尋址方式

80386的尋址方式分為三大類。

(1)寄存器尋址方式在這種尋址方式,操作數(shù)放在32位、16位或8位的通用寄存器中。

(2)立即數(shù)方式操作數(shù)以立即數(shù)形式出現(xiàn)在指令中。

(3)存貯器尋址方式按照80386系統(tǒng)的存貯器組織方式,邏輯地址由選擇子和偏移量組成。偏移量也稱為有效地址,由4個分量計算得到:

·基址:任何通用寄存器都可作為基址寄存器,其內(nèi)容即為基址。

·位移量:在指令操作碼后面的32位、16位或8位的數(shù)。

·變址:除了ESP寄存器外,任何通用寄存器都可以作為變址寄存器,其內(nèi)容即為變址值。

·比例因子:變址寄存器的值可以乘以一個比例因子,根據(jù)操作數(shù)的長度可為1字節(jié)、2字節(jié)、4字節(jié)或8字節(jié),比例因子相應(yīng)地可為1,2,4或8。由上面4個分量計算有效地址的方法為:

EA=基址+變址×比例因子+位移量圖3.16表示了這種尋址計算方法。

圖3.1680386尋址計算方法按照4個分量組合有效地址的不同方法,可以有下述9種存貯器尋址方式。

(1)直接尋址方式位移量就是操作數(shù)的有效地址,此位移量包含在指令中。例:INCWORDPTR[500][WB];字的有效地址為500(2)寄存器間接尋址方式操作數(shù)的有效地址即基址寄存器的內(nèi)容。例:MOV[ECX],EDX;ECX指出有效地址

(3)基址尋址方式基址寄存器的內(nèi)容和位移量相加形成有效地址。例:MOVECX,[EAX+24];由EAX中內(nèi)容 加24組成有效地址

(4)變址尋址方式變址寄存器的內(nèi)容和位移量相加形成有效地址。例:ADDEAX,[ESI],5;ESI的內(nèi)容加5組成有效地址

(5)帶比例因子的變址尋址方式變址寄存器的內(nèi)容乘以比例因子,再加位移量得到有效地址。例:IMULEBX,[ESI×4],7;ESI的內(nèi)容乘以4再加7形成有效地址

(6)基址變址尋址方式基址寄存器的內(nèi)容加變址寄存器的內(nèi)容組成有效地址。例:MOVEAX,[ESI][EBX];EBX的內(nèi)容加ESI的內(nèi)容即有效地址

(7)基址加比例因子變址尋址方式變址寄存器的內(nèi)容乘以比例因子,再加上基址寄存器的內(nèi)容作為有效地址。例:MOVECX,[EDI×8][EAX];EDI內(nèi)容乘以8再加EAX內(nèi)容即為有效地址

(8)帶位移量的基址變址尋址方式基址寄存器的內(nèi)容加變址寄存器的內(nèi)容,再加位移量形成有效地址。例:ADDEDX,[ESI][EBP+100H];ESI的內(nèi)容加EBP的內(nèi)容再加100H;即為有效地址

(9)帶位移量的基址比例因子變址方式變址寄存器的內(nèi)容乘以比例因子,再加上基址寄存器的內(nèi)容,又加上位移量,形成有效地址。例:MOVEAX,[EDI×4][EBP+80];EDI的內(nèi)容乘4,加EBP的內(nèi)容,;再加80即有效地址

3.3.2386/486改進的指令

1.MOV指令

32位的源操作數(shù)傳送到32位的目的中,目的與源均可為通用寄存器或存貯器,但不能同時為存貯器,源還可以為32位的立即數(shù)。例:

MOVEAX,EBXMOVDWORDPTR[EBX],345678H

2.堆棧指令(1)PUSH、POP指令

PUSH指令將32位的通用寄存器、存貯器或立即數(shù)壓入堆棧;POP指令則將堆棧指針指示的兩個存貯字彈出給32位的通用寄存器或32位的存貯器。例:

PUSHEAXPUSH12345678HPOPEBXPOPDWORDPTR

另外,8086/8088執(zhí)行PUSHSP指令是將SP減2后的值進棧,而80286/80386執(zhí)行PUSHSP(或PUSHESP)指令時,是將執(zhí)行本指令之前的SP(或ESP)進棧。

(2)立即數(shù)壓棧指令格式:PUSHnnnn

功能:將字立即數(shù)nnnn推進堆棧。

(3)通用寄存器壓棧、彈棧格式:PUSHA

功能:將8個寄存器的內(nèi)容按照AX、CX、DX、BX、SP、BP、SI、DI的先后順序壓入堆棧。格式:POPA

功能:將堆棧頂起始的8個存貯字按順序彈出給DI、SI、BP、SP、BX、DX、CX、AX共8個通用寄存器。

3.XCHG指令

32位的源操作數(shù)與32位的目的操作數(shù)相互交換,目的與源均可為通用寄存器或存貯器,但不能同時為存貯器。

4.加法和減法指令目的與源均可為32位的通用寄存器或存貯器,但不能同時為存貯器,源還可以為32位的立即數(shù)。例:

ADDEAX,EBXADCECX,DWORDPTR[3888H]

SUBEDX,[EAX]

SBBECX,123456H

5.無符號乘法指令源為32位的通用寄存器或存貯器,隱含在EAX中的被乘數(shù)乘以32位的源操作數(shù)產(chǎn)生64位的積,即EAX×源→EDX:EAX。例:MULESI;EAX*ESI→EDX:EAX

6.除法指令源為32位的通用寄存器或存貯器,隱含在EDX:EAX中的64位的被除數(shù)除以32位的源操作數(shù),產(chǎn)生32位的商存入EAX中,余數(shù)存入EDX中。例:

DIVEBX;EDX:EAX/EBX,商→EAX,余數(shù)→EDXIDIVECX;EDX:EAX/ECX,商→EAX,余數(shù)→EDX

7.有符號乘法指令格式1:IMUL源本指令與MUL指令的功能完全相同,但IMUL指令隱含的一個操作數(shù)與源操作數(shù)以及結(jié)果均為有符號數(shù)(補碼形式)。如果結(jié)果的高半部分(在EDX中)僅僅是低一半的符號的擴展,則CF=OF=0,否則CF=OF=1。格式2:IMUL目的,源格式3:IMUL目的,源1,源2

格式2、3與格式1是同一類型指令,但取乘積的長度不同。例:IMULEDX,EBX;EDX×EBX→EDXIMULEBX,4000H;EBX×4000H→EBXIMULECX,EAX,88H;EAX×88H→ECXIMULEDX,DWORDPTR[EBX],3456H;[EBX]×3456H→EDX8.INC、DEC指令操作數(shù)可為32位的通用寄存器或存貯器。例:

INCEDIDECDWORDPTR[EBX+EAX×4]9.比較指令例:

CMPEAX,ESI;EAX-ESICMPEDX,[EBX+1000H]

10.邏輯運算指令目的與源均可擴充為32位的通用寄存器或存貯器,但不得同時為存貯器,源操作數(shù)還可為32位的立即數(shù)。例:

ANDEAX,BCXORECX,[EBX]

XORESI,ESINOTEDXTESTDWORDPTR[1000H],80H

11.移位指令目的可擴充為32位的通用寄存器或存貯器,源可為任一8位的立即數(shù)或CL寄存器。例:

SHLECX,3SHREAX,CLSALDWORDPTR[EBX],CLSARDWORDPTR[EBX+EAX×4],20H

12.串指令

DS:ESI源串,ES:EDI目的串的相應(yīng)功能的雙字操作,ESI和EDI加4或減4,ECX寄存器為計數(shù)器。

13.串輸入指令格式1:[REP]INS目的串,DX

格式2:[REP]INSB

[REP]INSW

[REP]INSD例:

INSM--WORD,DXINSBREPINSBINSW

例:

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論