版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度美容院員工社會保險繳納合同樣本4篇
- 課題申報參考:面向2035年高等教育布局結(jié)構(gòu)研究
- 民政局2025年離婚協(xié)議書起草與備案流程指導(dǎo)4篇
- 2025年度門頭房屋租賃合同含租賃用途及經(jīng)營方向限制4篇
- 河南省周口中英文學(xué)校高三上學(xué)期期中考試語文試題(含答案)
- 2025年度個人二手房交易反擔(dān)保合同規(guī)范2篇
- 2025年度個人汽車貨運風(fēng)險分擔(dān)合同范本
- 2025年度門禁監(jiān)控設(shè)備生產(chǎn)與銷售合同8篇
- 2025年度水電工程合同履約監(jiān)管承包協(xié)議4篇
- 2025年度木結(jié)構(gòu)建筑綠色施工與環(huán)保驗收合同4篇
- 喬遷新居結(jié)婚典禮主持詞
- 小學(xué)四年級數(shù)學(xué)競賽試題(附答案)
- 魯科版高中化學(xué)必修2全冊教案
- 人口分布 高一地理下學(xué)期人教版 必修第二冊
- 子宮內(nèi)膜異位癥診療指南
- 教案:第三章 公共管理職能(《公共管理學(xué)》課程)
- 諾和關(guān)懷俱樂部對外介紹
- 玩轉(zhuǎn)數(shù)和形課件
- 保定市縣級地圖PPT可編輯矢量行政區(qū)劃(河北省)
- 新蘇教版科學(xué)六年級下冊全冊教案(含反思)
- 天然飲用山泉水項目投資規(guī)劃建設(shè)方案
評論
0/150
提交評論