8086的尋址方式和指令系統(tǒng)課件_第1頁
8086的尋址方式和指令系統(tǒng)課件_第2頁
8086的尋址方式和指令系統(tǒng)課件_第3頁
8086的尋址方式和指令系統(tǒng)課件_第4頁
8086的尋址方式和指令系統(tǒng)課件_第5頁
已閱讀5頁,還剩102頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

8086的尋址方式和指令系統(tǒng)§3.18086的尋址方式

3.1.1操作數(shù)的尋址方式1.立即數(shù)尋址

在這種尋址方式中,操作數(shù)直接跟在操作碼的后面,參加指令所規(guī)定的操作,并且操作數(shù)與操作碼一起放在代碼段中。這種方式叫立即數(shù)尋址方式。

例:MOVAX,1234H這條指令的功能是:把立即數(shù)1234H送入AX中。

圖3-1立即尋址示意圖2.寄存器尋址如果操作數(shù)就在CPU的內(nèi)部寄存器中,那么寄存器名在指令中給出。這種尋址方式就叫寄存器尋址方式。例:MOVDS,AX圖3-2寄存器尋址示意圖

對(duì)16位操作數(shù)來說,寄存器可以為AX、BX,CX,DX、SI、DI、SP或者BP,對(duì)于8位操作數(shù)來說,寄存器可為AH,AL、BH,BL,CH,CL、DH,DL。

采用寄存器尋址方式的指令在執(zhí)行時(shí),操作就在CPU內(nèi)部進(jìn)行,不需要使用總線周期,因此,執(zhí)行速度快。

3.直接尋址使用直接尋址方式時(shí),數(shù)據(jù)總是在存儲(chǔ)器中,存儲(chǔ)單元的有效地址由指令直接指出,所以直接尋址是對(duì)存儲(chǔ)器進(jìn)行訪問時(shí)可采用的最簡單的方式。假如DS=3000H

例:MOVAX,DS:[2010H]物理地址=DS×16+2010H=3000H×16+2010H=32010H指令功能是將32010H和32011H兩單元的內(nèi)容送到AX中。要注意的是采用直接尋址方式時(shí),如果指令前面沒有用前綴指明操作數(shù)在哪一段,則默認(rèn)為段寄存器是數(shù)據(jù)段寄存器DS。

4.寄存器間接尋址采用寄存器間接尋址方式時(shí),操作數(shù)一定在存儲(chǔ)器中,存儲(chǔ)單元的有效地址由寄存器指出,這些寄存器可以為BX、BP,SI和DI之一,由于上述4個(gè)寄存器所黙認(rèn)的段寄存器不同,這樣又可以分兩種情況:

以SI、DI、BX進(jìn)行間接尋址,則操作數(shù)通常存放在現(xiàn)行數(shù)據(jù)段中。此時(shí)數(shù)據(jù)段寄存器內(nèi)容加上SI、DI、BX中的16位段內(nèi)偏移地址,即得操作數(shù)的地址

例:MOVAX,[SI]

和直接尋址的情況—樣,如果指令前面沒有用前綴指明具體的段寄存器,則尋址時(shí)默認(rèn)的段寄存器通常為DS。如寄存器為BP時(shí),則對(duì)應(yīng)的段寄存器為SS。

②寄存器BP間接尋址,則操作數(shù)存放在堆棧段區(qū)域中。此時(shí)堆棧段寄存器內(nèi)容加上BP中的16位段內(nèi)偏移地址,即得操作數(shù)的地址。假如SS=3000H例:MOVAX,[BP]物理地址=SS×16+BP=30000H+2000H=32000H指令功能是將32000H和32001H兩單元的內(nèi)容送到AX中。

5.寄存器相對(duì)尋址在這種尋址方式中,操作數(shù)存放在存貯器中。操作數(shù)的地址是由段寄存器內(nèi)容加上SI、DI、BX、BP之一的內(nèi)容,再加上由指令所指出的8位或16位相對(duì)地址偏移量而得到的

例:MOVAX,DISP[SI]物理地址=DS×16+SI+DISP=30000H+1000H+0300H=31300H指令功能是將31300H和31301H兩單元的內(nèi)容送到AX中。

6.基址、變址尋址在8086中,通常把BX和BP作為基址寄存器,而把SI、DI作為變址寄存器。將這兩種寄存器聯(lián)合起來進(jìn)行的尋址就稱為基址、變址尋址。這時(shí),操作數(shù)的地址應(yīng)該是段寄存器內(nèi)容×16加上基址寄存器內(nèi)容(BX或BP內(nèi)容),再加上變址寄存器內(nèi)容(SI或DI內(nèi)容)而得到的.例:MOVAX,[BX][SI]物理地址=DS×16+SI+BX=30000H+1000H+3000H=34000H指令功能是將34000H和34001H兩單元的內(nèi)容送到AX中。

例:MOVAX,[BP][SI]物理地址=SS×16+BP+SI=30000H+3000H+1000H=34000H指令功能是將340000H和34001H兩單元的內(nèi)容送到AX中。

例:MOVAX,DISP[BX][SI]物理地址=DS×16+SI+BX+DISP=30000H+1000H+3000H+0300H=34300H指令功能是將34300H和34301H兩單元的內(nèi)容送到AX中。

7.基址、變址相對(duì)尋址這種尋址實(shí)際上是基址、變址尋址的擴(kuò)充。即操作數(shù)的地址是由基址、變址方式得到的地址再加上由指令指明的8位或16位的相對(duì)偏移地址而得到的

3.1.2轉(zhuǎn)移地址的尋址方式1.段內(nèi)直接尋址段內(nèi)直接尋址方式也稱為相對(duì)尋址方式,轉(zhuǎn)移的目標(biāo)地址是當(dāng)前IP內(nèi)容和一個(gè)8位或16位的位移量DISP之和。即物理地址=CS×16+I(xiàn)P+DISP例:JMPDISP圖3-10中,1000H是CPU讀取這條指令的位移量50H后IP的內(nèi)容。所以,該指令使CPU轉(zhuǎn)向31050H去執(zhí)行。

2.段內(nèi)間接尋址這種尋址方式在段內(nèi)進(jìn)行,其轉(zhuǎn)移的目標(biāo)地址是16位寄存器或兩個(gè)相鄰的存儲(chǔ)單元的內(nèi)容,即以寄存器或存儲(chǔ)器單元內(nèi)容來更新IP的內(nèi)容。如圖3-11所示。例:JMPCXJMPWORDPTR[BX]3.段間直接尋址在這種尋址方式中,指令碼中將直接給出16位的段地址和16位的段內(nèi)偏移地址。例:JMPFARPTRDADD14.段間間接尋址這種尋址方式和段內(nèi)間接尋址相似。但是,由于確定轉(zhuǎn)移地址需要32位信息,因此只適用于存貯器尋址方式。用這種尋址方式可計(jì)算出存放轉(zhuǎn)移地址的存貯單元的首地址,與此相鄰的4個(gè)單元中,前兩個(gè)單元存放16位的段內(nèi)偏移地址;而后兩單元存放的是16位的段地址,如圖3-13所示。例:JMPDWORDPTR[BP][DI]8086的指令系統(tǒng)大致可分為6種類型:①數(shù)據(jù)傳送指令②算術(shù)運(yùn)算指令③邏輯運(yùn)算和移位指令④串操作指令⑤程序控制指令⑥處理器控制指令

§3.28086指令系統(tǒng)3.2.1數(shù)據(jù)傳送指令8086有5類傳送指令,以實(shí)現(xiàn)CPU的內(nèi)部寄存器之間、CPU和存儲(chǔ)器之間、CPU和I/O端口之間的數(shù)據(jù)傳送。1.通用傳送指令通用傳送指令中包括最基本的傳送指令MOV,交換指令XCHG,椎棧指令PUSH和POP,字節(jié)、字轉(zhuǎn)換指令CBW和CWD。(1)最基本的傳送指令指令格式:MOVOPRDl,OPRD2執(zhí)行功能:該指令可把一個(gè)字節(jié)或一個(gè)字操作數(shù)從源地址傳送到目的地址中去。OPRD1:可以是累加器、寄存器、存貯器以及立即操作數(shù)OPRD2:可以是累加器、寄存器和存貯器。

圖3-14數(shù)據(jù)傳送方向示意圖

1)在CPU各內(nèi)部寄存器之間傳送數(shù)據(jù)(除代碼段寄存器CS和指令指針I(yè)P以外)。

MOVAL,BL;BL中的8位數(shù)據(jù)送ALMOVDH,CL;CL中的8位數(shù)據(jù)送DHMOVCX,AX;將AX中的16位數(shù)據(jù)送CXMOVBX,DI;將DI中的16位數(shù)據(jù)送BXMOVDS,AX;將AX中的16位數(shù)據(jù)送DSMOVES,AX;將AX中的16位數(shù)據(jù)送ES2)立即數(shù)傳送至CPU的內(nèi)部通用寄存器(即AX、BX、CX、DX、BP、SP、SI、DI),給這些寄存器賦值。

MOV CL,4 ;立即數(shù)8送入CL中MOV AX,03FFH ;將立即數(shù)數(shù)03FFH送入AX中MOV CX,1000H ;將立即數(shù)1000H送入CX中MOV BL,40 ;將立即數(shù)40送BL中MOV SI,057BH ;將立即數(shù)057BH送入SI中3)CPU內(nèi)部寄存器(除了CS和IP以外)與存貯器(所有尋址方式)之間的數(shù)據(jù)傳送,與前述一樣可以傳送一個(gè)字節(jié)也可以傳送一個(gè)字。

MOV AL,BUFFER ;將BUFFER為首地址的一個(gè)單元內(nèi)容送ALMOV AX,[BX] ;BX和BX+1所指的兩個(gè)內(nèi)存單元的內(nèi)容送AXMOV [DI],AX ;累加器的內(nèi)容送DI和DI+1所指的兩個(gè)單元MOV AX,[SI+4] ;將SI+4和SI+4+1所指的兩個(gè)單元內(nèi)容送入AX需要注意的是,MOV指令不能在兩個(gè)存貯器單元之間進(jìn)行數(shù)據(jù)直接傳送。為了實(shí)現(xiàn)存貯器單元之間的數(shù)據(jù)傳送,必須用內(nèi)部寄存器作為中介。

MOVAL,DATAl

MOVDATA2,AL(2)交換指令指令格式:XCHGOPRDl,OPRD2

執(zhí)行功能:交換指令把一個(gè)字節(jié)或一個(gè)字的源操作數(shù)與目的操作數(shù)相交換。

XCHG AL,CL ;累加器低8位和通用寄存器CL之間交換XCHG AX,DI ;累加器AX和通用寄存器DI之間交換XCHG BX,SI ;通用寄存器BX和通用寄存器SI之間交換XCHG AX,BUFFER ;累加器AX和BUFFER為首地址的兩個(gè)單元交換XCHG BX,[SI] ;通用寄存器BX和存儲(chǔ)器SI和SI+1兩個(gè)單元交換(3)堆棧操作指令

PUSHOPRD(壓入堆棧指令)

POPOPRD(彈出堆棧指令)例如:

MOVAX,1234HMOVDX,5678HMOVSP,2000HPUSHAXPUSHDX┇POPDXPOPAX

當(dāng)執(zhí)行完兩條壓入堆棧的指令時(shí),堆棧中的內(nèi)容如圖3-15所示。

①SP-l→SP ;SP=1FFFH ,(SP)←AH②SP-l→SP ;SP=1FFEH ,(SP)←AL③SP-l→SP ;SP=1FFDH ,(SP)←DH④SP-l→SP ;SP=1FFCH ,(SP)←DL每執(zhí)行一條壓入堆棧指令,堆棧地址指針SP減2,壓入堆棧的數(shù)據(jù)放在棧項(xiàng)。

彈出堆棧的過程與此剛好相反,每彈出1個(gè)字,棧頂指針SP的值加2。

①DL←(SP) ;SP+l→SP ,SP=1FFDH②DH←(SP) ;SP+l→SP ,SP=1FFEH③AL←(SP) ;SP+l→SP ,SP=1FFFH④AH←(SP) ;SP+l→SP ,SP=2000H2.地址傳送指令8086有3條地址傳送指令。(1)LEA指令指令格式:LEAOPRDl,OPRD2執(zhí)行功能:該指令把源操作數(shù)OPRD2的地址偏移量傳送至目的操作數(shù)OPRDl中。源操作數(shù)必須是一個(gè)內(nèi)存操作數(shù),目的操作數(shù)必須是一個(gè)16位的通用寄存器。這條指令通常用來建立串指令操作所需的地址指針。

LEABX,DATA

和MOVBX,OFFSETDATA等價(jià)

LEASI,BUFFER

和MOVSI,OFFSETBUFFER等價(jià)

(2)LDS指令該指令完成一個(gè)地址指針的傳送。地址指針包括段地址和地址偏移量。指令執(zhí)行時(shí),將段地址送入DS,地址偏移量送入一個(gè)16位的指針寄存器或變址寄存器。例如:LDSSI,[BX]是把BX所指的32位地址指針的段地址送入DS,偏移地址送入SI。(3)LES指令這條指令除將地址指針的段地址送入ES外,其他操作與LDS的類似。例如:LESDI,[BX]是把BX所指的32位地址指針的段地址送入ES,偏移地址送入DI。

3.輸人輸出指令輸入/輸出指令用來完成累加器(AX/AL)與I/O端口之間的數(shù)據(jù)傳送功能。

執(zhí)行輸入指令時(shí),CPU可以從一個(gè)8位端口讀入一個(gè)字節(jié)到AL中,也可以從兩個(gè)連續(xù)的8位端口讀一個(gè)字到AX中。指令格式:IN累加器,端口地址

執(zhí)行輸出指令時(shí),CPU可以將AL中的一個(gè)字節(jié)寫到一個(gè)8位端口中,或者將AX中的一個(gè)字寫到兩個(gè)連續(xù)的8位端口中。指令格式:OUT端口,累加器端口地址的尋址范圍是64K(0000H~FFFFH),若端口地址在00H~FFH之間,可以使用直接尋址方式,否則只能由16位寄存器DX來作間接尋址。

例如:IN AX,20H ;讀20H、21H端口一個(gè)字的數(shù)據(jù)到AX中OUT 22H,AL ;將AL中的數(shù)據(jù)從22H端口輸出MOV DX,210H ;端口地址210H送DXIN AL,DX ;讀210H端口一個(gè)字節(jié)到AL中OUT DX,AX ;將AX中的數(shù)據(jù)從210H端口輸出

3.2.2算術(shù)運(yùn)算指令

8086可提供加、減、乘、除4種基本算術(shù)運(yùn)算的操作指令。這些指令可實(shí)現(xiàn)字節(jié)或字的運(yùn)算,也可以用于符號(hào)數(shù)和無符號(hào)數(shù)的運(yùn)算。進(jìn)行加、減運(yùn)算的源操作數(shù)和目的操作數(shù)的關(guān)系1.加法指令(1)不帶進(jìn)位的加法指令指令格式:ADDOPRDl,OPRD2指令功能:OPRDl←(OPRDl)+(OPRD2)ADD指令兩個(gè)操作數(shù)相加,結(jié)果送至目的操作數(shù)。源操作數(shù)可以是累加器、通用寄存器、存貯器和立即數(shù)。目的操作數(shù)可以是累加器、通用寄存器或存貯器。例如:ADD AL,30 ;AL←(AL)+30ADD AX,1000H ;AX←(AX)+1000HADD BX,3FFH ;BX←(BX)+3FFHADD AX,SI ;AX←(AX)+(SI)ADD SI,AX ;SI←(SI)+(AX)ADD DI,CX ;DI←(DI)+(CX)ADD AL,DATA[BX] ;AL←(AL)+((BX+DATA))ADD DX,DATA[BX+SI] ;DX←(DX)+((BX+SI+DATA))ADD BETA[SI],100 ;(SI+DETA)←((SI+BETA))+100ADD BETA[SI],AX ;(SI+DETA)←((SI+BETA))+(AX)

注意,兩個(gè)存儲(chǔ)器操作不能直接相加,段寄存器也不能參加運(yùn)算。在使用時(shí)還要注意兩個(gè)操作數(shù)類型一致。例如:ADDAX,0CFA8H若指令執(zhí)行前,(AX)=5623H,則指令執(zhí)行后,(AX)=25CBH,且CF=1,OF=0,SF=0,ZF=0,AF=0,PF=1。

這些指令執(zhí)行時(shí),對(duì)標(biāo)志位CF、OF、

SF、ZF和AF都會(huì)產(chǎn)生影響。

(2)帶進(jìn)位的加法指令指令格式:ADCOPRD1,OPRD2指令功能:OPRD1←(OPRD1)+(OPRD2)+CY

這條指令與ADD指令基本相同,只是在對(duì)兩個(gè)操作數(shù)進(jìn)行相加運(yùn)算時(shí)還應(yīng)加上進(jìn)位位的當(dāng)前值,然后再將結(jié)果送至目的操作數(shù)。例如:現(xiàn)有兩個(gè)雙精度字00127546H和00109428H,其中被加數(shù)00127546H存放在DATA1為首的內(nèi)存單元中,加數(shù)00109428H存放在DATA2為首的內(nèi)存單元中。要求結(jié)果存放在DATA3為首的單元中。

MOVAX,DATA1ADDAX,DATA2MOVDATA3,AXMOVAX,DATA1+2ADCAX,DATA2+2MOVDATA3+2,AX該指令對(duì)標(biāo)志位的影響與ADD指令對(duì)標(biāo)志位的影響相同。

(3)INC加1指令指令格式:INCOPRD指令功能:OPRD←(OPRD)+1

這條指令對(duì)指定的操作數(shù)進(jìn)行加1操作,在循環(huán)程序中常用于修改地址指針和循環(huán)次數(shù)等。其操作數(shù)可以是通用寄存器,也可以是存儲(chǔ)器。該指令執(zhí)行結(jié)果對(duì)標(biāo)志位AF、OF、PF、SF和ZF有影響,而對(duì)CF位不產(chǎn)生影響,例如:INCALINCCXINCWORDPTR[SI]INCBYTEPTR[SI+BX]2.減法指令(1)不帶借位的減法指令指令格式:SUBOPRDl,OPRD2

指令功能:OPRD1←(OPRD1)-(OPRD2)該指令用來對(duì)目的操作數(shù)和源操作數(shù)的字或字節(jié)進(jìn)行相減,其結(jié)果存放在目的操作數(shù)。源操作數(shù)OPRD2:可以是累加器、通用寄存器、存儲(chǔ)器、立即數(shù)。目的操作數(shù)OPRD1:可以是累加器、通用寄存器、存儲(chǔ)器。

SUB AL,78H ;AL←(AL)-78HSUB BX,5678H ;BX←(BX)-5678HSUB AX,CX ;AX←(AX)-(CX)

SUB AL,4[SI]

;AL←(AL)-((SI+4))SUB DX,1000H[BX+SI]

;DX←(DX)-((BX+SI+1000H))SUB [SI+5],100 ;(SI+5)←((SI+5))-100SUB [SI+2000H],AX ;(SI+2000H)←((SI+2000H))-(AX)指令執(zhí)行后對(duì)各狀態(tài)標(biāo)志位OF、SF、AF、PF和CF均可產(chǎn)生影響。

(2)帶借位的減法指令指令格式:SBBOPRD1,OPRD2指令功能:OPRD1←(OPRD1)-(OPRD2)-CY該指令與SUB相類似,只不過在兩個(gè)操作數(shù)相減時(shí),還應(yīng)減去借位標(biāo)志CF的當(dāng)前值。這條指令主要用于多字節(jié)的減法運(yùn)算。

該指令對(duì)標(biāo)志位AF、CF、OF、PF、SF和ZF都將產(chǎn)生影響。

(3)DEC減1指令指令格式:DECOPRD指令功能:OPRD←(OPRD)-1

該指令實(shí)現(xiàn)對(duì)操作數(shù)的減1操作,所用的操作數(shù)可以是寄存器的,也可以是存儲(chǔ)器。在相減時(shí),把操作數(shù)看作為無符號(hào)的二進(jìn)制數(shù)。該指令執(zhí)行結(jié)果將影響標(biāo)志位AF、OF、PF、SF和ZF,但對(duì)CF標(biāo)志不產(chǎn)生影響,例如:

DECBLDECCXDECBYTEPTR[SI](4)NEG求補(bǔ)指令指令格式:NEGOPRD指令功能:OPRD←0-(OPRD)該指令用來對(duì)操作數(shù)進(jìn)行求補(bǔ)操作,即用零減去操作數(shù),然后再將結(jié)果送回。相當(dāng)于操作數(shù)求反加1并保存在目的操作數(shù)中。例如:NEGALNEGBYTEPTR[SI]

如果操作數(shù)的值為-128(16進(jìn)制數(shù)為80H)或者一32768(16進(jìn)制數(shù)為8000H),,執(zhí)行求補(bǔ)指令后,操作數(shù)沒有變化,但溢出標(biāo)志OF=1。(5)比較指令指令格式:CMPOPRDl,OPRD2指令功能:(OPRD1)-(OPRD2)該指令執(zhí)行減法操作,不保存相減的結(jié)果。指令執(zhí)行后兩操作數(shù)的內(nèi)容不變,但相減的結(jié)果影響標(biāo)志位。在程序設(shè)計(jì)時(shí),比較指令通常為程序的轉(zhuǎn)移提供條件。例如:CMPAX,2000HCMPAL,50HCMPDX,SICMPAX,[BX+SI+10H]比較指令在執(zhí)行時(shí),會(huì)影響標(biāo)志位AF、CF、OF、PF、SF、ZF。

如何利用狀態(tài)標(biāo)志來判斷兩操作數(shù)的關(guān)系呢?下面分三種情況來分析。1)兩個(gè)操作數(shù)相等如果所比較的兩個(gè)操作數(shù)相等時(shí),那么標(biāo)志位ZF=1,所以根據(jù)ZF就可以判斷兩數(shù)是否相等。2)兩個(gè)操作數(shù)不等

兩個(gè)無符號(hào)數(shù)的比較無符號(hào)數(shù)相減時(shí),CF就是借位標(biāo)志。如果CF=0,表示無借位,即被減數(shù)大,減數(shù)小。如果CF=1,表示有借位,即被減數(shù)小,減數(shù)大。兩個(gè)有符號(hào)數(shù)的比較兩個(gè)有符號(hào)的比較時(shí),同符號(hào)數(shù)相比較,相減的結(jié)果不會(huì)超出帶符號(hào)數(shù)的表示范圍,即不會(huì)產(chǎn)生溢出,OF=0;兩個(gè)不同號(hào)的帶符號(hào)數(shù)比較,相減的結(jié)果有可能產(chǎn)生溢出。這時(shí)可以用如下結(jié)論判斷。當(dāng)OF⊕SF=0時(shí),OPRD1>OPRD2。當(dāng)OF⊕SF=1時(shí),OPRD1<OPRD2。CMP AL,0 ;AL和0進(jìn)行比較JGE NEXT ;若AL≥0則轉(zhuǎn)到NEXT執(zhí)行

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

MOV SI,OFFSETBLOCK MOV AL,[SI] INC SI MOV CX,99AGAIN: CMP AL,[SI] JG NEXT MOV AL,[SI]NEXT: INC SI DEC CX JNE AGAIN MOV MAX,AL HLT 3.乘法指令

8086的乘法指令分為無符號(hào)數(shù)乘法指令和帶符號(hào)數(shù)乘法指令兩種。(1)無符號(hào)數(shù)乘法指令MUL指令格式:MULOPRD指令功能:若OPRD為字節(jié)數(shù)據(jù),則執(zhí)行AX←(AL)×(OPRD)

若OPRD為字?jǐn)?shù)據(jù),則執(zhí)行DX、AX←(AX)×(OPRD)

目的操作數(shù)為:AL或AX(隱含給出)源操作數(shù)為:通用寄存器、存儲(chǔ)器。不能為立即數(shù)和段寄存器。MUL指令對(duì)狀態(tài)標(biāo)志CF、OF有影響,SF、ZF、AF、PF不確定。

例如:MULALMULBXMULWORDPRT[SI]要完成14×15可以用下列指令:MOVAL,14MOVCL,15MULCL(2)帶符號(hào)數(shù)乘法指令I(lǐng)MUL指令格式:IMULOPRD指令功能:若OPRD為字節(jié)數(shù)據(jù),則執(zhí)行AX←(AL)×(OPRD)

若OPRD為字?jǐn)?shù)據(jù),則執(zhí)行DX、AX←(AX)×(OPRD)

目的操作數(shù)為:AL或AX(隱含給出)4.除法指令8086有兩條除法指令:無符號(hào)除法指令和帶符號(hào)除法指令。它們都可以進(jìn)行字節(jié)或字除法運(yùn)算,并且規(guī)定,8位除法的被除數(shù)在AX中;16位除法的被除數(shù)在DX與AX中,除數(shù)均由指令指出。對(duì)8位數(shù)除法,商與余數(shù)分別放在AL與AH中,對(duì)16位除法,商與余數(shù)分別放在AX與DX中。(1)無符號(hào)數(shù)除法指令DIV指令格式:DIVOPRD指令功能:OPRD為字節(jié)數(shù)據(jù):AL←(AX)÷(OPRD)商

AH←(AX)÷(OPRD)余數(shù)

OPRD為字?jǐn)?shù)據(jù):AX←(DX)(AX)÷(OPRD)商

DX←(DX)(AX)÷(OPRD)余數(shù)(2)IDIV帶符號(hào)數(shù)除法指令指令格式:IDIVOPRD指令操作:與DIV指令相同,但被除數(shù)、除數(shù)、商、余數(shù)全部均為帶符號(hào)數(shù),且余數(shù)的符號(hào)位同被除數(shù)。即IDIV執(zhí)行后,CF、OF、AF、PF、ZF、SF不確定。用IDIV指令時(shí),如果是一個(gè)雙字除以一個(gè)字,則商的范圍為-32768~32767;如果是一個(gè)字除以一個(gè)字節(jié),則商的范圍為-128~127。運(yùn)算結(jié)果超出了表示范圍,那么會(huì)作為除數(shù)為0的情況來處理,即產(chǎn)生0號(hào)中斷。例如:在存儲(chǔ)器中有X和Y兩個(gè)單元,存有無符號(hào)數(shù),現(xiàn)要求完成X/Y,將商存入Z單元。執(zhí)行的指令如下:MOVAL,XMOVAH,0DIVYMOVZ,AL(3)CBW字節(jié)轉(zhuǎn)換為字指令指令格式:CBW指令功能:AL中的符號(hào)位擴(kuò)展到AH中。若AL中的D7=0,則(AH)=00H;若AL的D7=1,則(AH)=FFH。(4)CWD字轉(zhuǎn)換為雙字指令指令格式:CWD指令功能:AX中的符號(hào)位擴(kuò)展到DX中。若AX中的D15=0,則(DX)=0000H;若AX的D15=1,則(DX)=FFFFH。5.BCD碼調(diào)整指令在計(jì)算機(jī)中,可用4位二進(jìn)制碼來表示一個(gè)十進(jìn)制碼,這種代碼叫BCD碼。當(dāng)然BCD碼只有0~9共10種編碼。

BCD碼有兩類:一類叫壓縮的BCD碼,所謂壓縮,就是用1個(gè)字節(jié)表示2位BCD碼;另一類叫非壓縮的BCD碼,用這類代碼時(shí),1個(gè)字節(jié)只用低4位來表示BCD碼,高4位為0。(1)AAA非壓縮十進(jìn)制數(shù)加法調(diào)整指令指令格式:AAA指令功能:AL←把AL中的和調(diào)整為非組合的BCD碼格式。

AH←(AH)+調(diào)整產(chǎn)生的進(jìn)位值。

調(diào)整的步驟如下:①

如AL寄存器的低4位在0~9之間,且AF=0,則跳過第②步,執(zhí)行第③步;②

如AL寄存器的低4位為十六進(jìn)制數(shù)的A~F或AF=1,則AL中的內(nèi)容加6,AH中內(nèi)容加1,并將AF置1;③

清除AL寄存器的高4位;④

AF位的值送CF位。例如:ADDAL,BLAAA指令執(zhí)行前AX=0535H,BL=39H,可見AL和BL中的內(nèi)容分別為5和9的ASCⅡ碼。第一條指令執(zhí)行后,AL=6EH,AF=0;第二條指令進(jìn)行BCD碼調(diào)整的結(jié)果使AX=0604H,AF=1,CF=1。(2)AAS非壓縮十進(jìn)制數(shù)減法調(diào)整指令指令格式:AAS指令功能:AL←把AL中的差調(diào)整為非壓縮的BCD碼格式。

AH←(AH)-調(diào)整產(chǎn)生的借位值。這條指令主要用于SUB或SBB之后,減法指令必須把兩個(gè)非壓縮的BCD碼相減,并把結(jié)果存放在AL寄存器中。

(3)AAM乘法的BCD碼調(diào)整指令指令格式:AAM指令功能:AX←把AL中的積調(diào)整為非壓縮的BCD碼格式。這條指令之前必須執(zhí)行MUL指令把兩個(gè)非組合的BCD碼相乘(此時(shí)要求其高4位為0),結(jié)果放在AL中。本指令的調(diào)整方法是:把AL寄存器的內(nèi)容除以0AH,商放在AH中,余數(shù)保存在AL中。本指令根據(jù)AL寄存器的內(nèi)容設(shè)置條件標(biāo)志SF、ZF、PF,但OF、CF、AF位無定義。(4)AAD除法的BCD碼調(diào)整指令對(duì)BCD碼進(jìn)行除法運(yùn)算時(shí),也要求除數(shù)和被除數(shù)都用非壓縮的BCD碼形式來表示,這是與對(duì)BCD碼乘法的要求類似的地方。這里要特別注意一點(diǎn),對(duì)BCD碼除法運(yùn)算的調(diào)整是在進(jìn)行除法之前,通過對(duì)除數(shù)和被除數(shù)進(jìn)行調(diào)整來實(shí)現(xiàn)的。調(diào)整操作如下:

AL←10×AH+ALAH←0例如:一個(gè)數(shù)據(jù)為65,用非壓縮的BCD碼表示,則AH中為00000110,AL中為00000101,調(diào)整執(zhí)行AAD指令,這條指令將AH中的內(nèi)容乘以10,再加上AL中的內(nèi)容,這樣得到AL的結(jié)果為41H。AH為0。這條指令根據(jù)AL寄存器的結(jié)果設(shè)置SF、ZF和PF,OF、CF和AF無定義。

3.2.3邏輯運(yùn)算和移位指令1.邏輯運(yùn)算指令8086邏輯運(yùn)算指令包括AND(與)、OR(或)、NOT(非)、XOR(異或)指令和TEST(測試)指令。(1)NOT邏輯求反指令指令格式:NOTOPRD指令功能:OPRD←OPRD

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

MOVAL,8FHNOTAL兩條指令執(zhí)行后AL=70H。

(2)AND邏輯“與”指令指令格式:ANDOPRDl,OPRD2指令功能:OPRD1←(OPRD1)∧(OPRD2)

該指令對(duì)兩個(gè)操作數(shù)進(jìn)行按位相“與”的邏輯運(yùn)算。即只有參加相與的兩位全為“1”時(shí),相“與”結(jié)果才為“1”,否則相“與”結(jié)果為“0”。相“與”結(jié)果送回目的操作數(shù)。

AND指令可以進(jìn)行字節(jié)操作,也可以進(jìn)行字操作。目的操作數(shù)OPRDl:可以是累加器,也可以是通用寄存器,也可以是存儲(chǔ)器。源操作數(shù)OPRD2:可以是立即數(shù)、寄存器,也可以是存儲(chǔ)器。

ANDAL,0FHANDAL,0CHANDAX,BXANDAX,DATAANDDX,BUFFER[SI+BX]ANDDATA,00FFHANDBLOCK[BP+DI],DX

某一個(gè)操作數(shù),如果自己與自己相“與”,操作數(shù)不變,但可以使進(jìn)位標(biāo)志位CF清0。

該指令執(zhí)行以后,標(biāo)志位CF=0,OF=0。標(biāo)志位PF、SF、ZF反映操作的結(jié)果,而標(biāo)志位AF未定義。

(3)TEST測試指令指令格式:TESTOPRD,im;im為立即數(shù)指令功能:OPRD1←(OPRD1)∧im該指令的操作功能與AND指令相同,其結(jié)果將反映在標(biāo)志位上,但結(jié)果不送回。利用該指令,可以在不改變?cè)胁僮鲾?shù)的情況下,用來檢測某一位或某幾位是“0”不是“1”。編程時(shí)作為條件轉(zhuǎn)移指令的先行指令。例如:若要檢測AL中的最高位是否為1,且為1時(shí)則轉(zhuǎn)移。在這種情況下可以用如下指令:TESTAL,80HJNZTHERE

┇THERE:MOVBL,05H(4)OR邏輯“或”指令指令格式:OROPRDl,OPRD2指令功能:OPRD1←(OPRD1)∨(OPRD2)

該指令對(duì)兩個(gè)操作數(shù)進(jìn)行按位相“或”的邏輯運(yùn)算。即只要參加相“或”的兩位中任一位為“1”時(shí),相“或”結(jié)果為“1”,如果兩位都為0時(shí),其結(jié)果才為0。

OR指令可以進(jìn)行字節(jié)操作,也可以進(jìn)行字操作。目的操作數(shù)OPRDl:可以是累加器、通用寄存器、也可以是存儲(chǔ)器。源操作數(shù)OPRD2:可以是立即數(shù)、寄存器,也可以是存儲(chǔ)器。

例如:ORAL,80HORAX,05FFHORBX,SIORBX,DATAORBUFFER[BX],SIORBUFFER[BX+SI],8000H(5)XOR邏輯“異或”指令指令格式:XOROPRDl,OPRD2指令功能:OPRD1←(OPRD1)⊕(OPRD2)該指令對(duì)兩個(gè)操作數(shù)進(jìn)行按位相“異或”的邏輯運(yùn)算。即只有參加相“異或”的兩位值不同時(shí),其結(jié)果為“1”;否則就為0。

XOR指令可以進(jìn)行字節(jié)操作,也可以進(jìn)行字操作。目的操作數(shù)OPRDl:可以是累加器、通用寄存器,也可以是存儲(chǔ)器。源操作數(shù)OPRD2:可以是立即數(shù)、寄存器,也可以是存儲(chǔ)器。例如:XORAL,0FHXORAX,BXXORCX,[SI+4]XOR10H[BX],CXXOR[BX+SI+5],AX例如:XORAX,AXXORSI,SI指令執(zhí)行后可使AX、SI清零。XOR指令執(zhí)行后,標(biāo)志位CF=0,OF=0,標(biāo)志位PF、SF,ZF將反映“異或”操作的結(jié)果。標(biāo)志AF未定義。2.移位指令(1)SAL/SHL算術(shù)左移和邏輯左移指令指令格式:SAL/SHLOPRD,CL/1指令功能:這兩條指令的操作結(jié)果是完全一樣的,將目的操作數(shù)OPRD中的二進(jìn)制數(shù)向左移動(dòng)1位或CL寄存器中指定的位數(shù)。左移一位時(shí),操作數(shù)的最高位移出送到CF中,同時(shí)最低位送0。目的操作數(shù)可以是8位,也可以16位。目的操作數(shù)OPRD:可以是累加器、寄存器、也可是存儲(chǔ)器。

利用左移1位操作可實(shí)現(xiàn)操作數(shù)乘2的運(yùn)算。例如:SHLAL,1MOVCL,4SHLAL,CL(2)SAR算術(shù)右移指令指令格式:SAROPRD,CL/1

指令功能:將目的操作數(shù)OPRD中的二進(jìn)制數(shù)向右移動(dòng)1位或CL寄存器中指定的位數(shù)。該指令每執(zhí)行一次移位操作,就使操作數(shù)右移一位,但符號(hào)位保持不變,而最低位移至標(biāo)志位CF,目的操作數(shù)可以是8位,也可以16位。

例如:MOVAH,5AHSARAH,1

指令執(zhí)行完后,(AH)=2DH,CF=0(3)SHR邏輯右移指令指令格式:SHROPRD,CL/1

指令功能:將目的操作數(shù)OPRD中的二進(jìn)制數(shù)向右移動(dòng)1位或CL寄存器中指定的位數(shù)。該指令每執(zhí)行一次移位操作,就使操作數(shù)右移一位,左面的最高位將補(bǔ)0,最低位移至標(biāo)志位CF中。目的操作數(shù)可以是8位,也可以16位。

例如:MOVBL,4EH

SHRBL,1

指令執(zhí)行后,(BL)=27H,CF=03.循環(huán)移位指令(1)ROL不帶進(jìn)位的循環(huán)左移指令指令格式:ROLOPRD,CL/1

指令功能:將目的操作數(shù)OPRD中的二進(jìn)制數(shù)向左移動(dòng)1位或CL寄存器中指定的位數(shù)。左移一位時(shí),操作數(shù)的最高位移出送到CF中,同時(shí)送至最低位。目的操作數(shù)可以是8位,也可以16位。

例如:MOVAL,5BHROLAL,1指令執(zhí)行完后,(AL)=B6H,CF=0(2)ROR不帶進(jìn)位的循環(huán)右移指令指令格式:ROROPRD,CL/1

指令功能:將目的操作數(shù)OPRD中的二進(jìn)制數(shù)向右移動(dòng)1位或CL寄存器中指定的位數(shù)。右移一位時(shí),操作數(shù)的最低位移出送到CF中,同時(shí)送至最高位。目的操作數(shù)可以是8位,也可以16位。

例如:MOVAL,6BHROLAL,1

指令執(zhí)行完后,(AL)=B5H,CF=1(3)RCL帶進(jìn)位的循環(huán)左移指令指令格式:RCLOPRD,CL/1

指令功能:將目的操作數(shù)OPRD中的二進(jìn)制數(shù)向左移動(dòng)1位或CL寄存器中指定的位數(shù)。左移一位時(shí),操作數(shù)的最高位移出送到CF中,而原來的CF位送至最低位。目的操作數(shù)可以是8位,也可以16位。

例如:MOVAL,4CHRCLAL,1

指令執(zhí)行后,(AL)=99H,CF=0(4)RCR帶進(jìn)位的循環(huán)右移指令指令格式:RCROPRD,CL/1

指令功能:將目的操作數(shù)OPRD中的二進(jìn)制數(shù)向右移動(dòng)1位或CL寄存器中指定的位數(shù)。右移一位時(shí),操作數(shù)的最低位移出送到CF中,而原來的CF位送至最高位。

例如:MOVAL,5CH

RCRAL,1指令執(zhí)行完后,(AL)=AEH,CF=03.2.4串操作指令

在串操作中,一般假定源串在數(shù)據(jù)段中(DS),用SI作源串地址指針,而目的串在附加段中(ES),用DI作目的串地址指針。在每做一次串操作后,若是對(duì)字節(jié)進(jìn)行操作,則SI和DI的值會(huì)自動(dòng)加1或減l;若是對(duì)字進(jìn)行操作,則SI和DI的值就自動(dòng)加2或減2,是加還是減由DF標(biāo)志寄存器來決定。若DF=0,則SI和DI增量修改;

DF=1,則SI和DI做減量修改。在串操作前可用STD指令使DF位置l,也可以用CLD指令使DF位清0。

1.MOVS串傳送指令指令格式:MOVSOPRD1,OPRD2MOVSB;字節(jié)傳送

MOVSW;字傳送指令功能:(DI)←((SI))字節(jié)操作SI←(SI)

1;DI←(DI)

1;字操作SI←(SI)

2;DI←(DI)

2;

該類指令執(zhí)行時(shí),將把當(dāng)前數(shù)據(jù)段中用SI指針指出的源串的一個(gè)字節(jié)或一個(gè)字傳送到用DI指針指向的附加段的目的地址中去。當(dāng)DF=0且是字節(jié)傳送時(shí),則傳送后SI、DI加1,以使指針指向下一個(gè)地址;當(dāng)DF=0且是字傳送時(shí),則SI、DI加2。若DF=1,則SI、DI減1或減2。2.CMPS串比較指令指令格式:CMPSOPRD1,OPRD2CMPSB;字節(jié)比較

CMPSW;字比較指令功能:((SI))-((DI))字節(jié)操作SI←(SI)

1;DI←(DI)

1;字操作SI←(SI)

2;DI←(DI)

2;

該類指令執(zhí)行時(shí),將當(dāng)前數(shù)據(jù)段由SI所指出的字節(jié)和字同當(dāng)前附加段中由DI所指出的目的串的字節(jié)或字進(jìn)行比較,把比較結(jié)果送標(biāo)志位。該指令對(duì)操作數(shù)不產(chǎn)生影響。

3.SCAS串掃描指令指令格式:SCASOPRD1,OPRD2

SCASB;字節(jié)掃描

SCASW;字掃描指令功能:字節(jié)操作AL-((DI))

DI←(DI)

1;字操作AX-((DI))

DI←(DI)

2;該類指令是串掃描指令,用于尋找內(nèi)存區(qū)中指定的數(shù)據(jù)和字符。指令執(zhí)行時(shí),將AL或AX的值減去附加段中由DI所指定的字節(jié)或字,結(jié)果將改變標(biāo)志位,但不改變操作數(shù)的值。

4.LODS串裝入指令指令格式LODSOPRD1,OPRD2LODSB;字節(jié)傳送

LODSW;字傳送指令功能:字節(jié)操作AL←((SI))

SI←(SI)

1字操作AX←((SI))

SI←(SI)

2

該類指令是字串裝入指令。它將由SI所指定的源串字節(jié)或字裝入到累加器AL或AX中去,并根據(jù)DF的值修改指針SI,以指向下一個(gè)要裝入的字節(jié)或字。

5.STOS串存儲(chǔ)指令指令格式:STOSOPRD1,OPRD2

STOSB;字節(jié)存儲(chǔ)

STOSW;字存儲(chǔ)指令功能:字節(jié)操作((DI))←(AL)

DI←(DI)

1字操作((DI))←AXDI←(DI)

2

該類指令是字串存貯指令。它將AL或AX中的字節(jié)或字存貯到由DI所指定的附加段中去,且根據(jù)DF的值來修改DI的值。6.REP重復(fù)操作前綴它是串指令的前綴。當(dāng)某一條指令需要多次重復(fù)時(shí),就可以加上該前綴。重復(fù)次數(shù)應(yīng)放在寄存器CX中。這樣每重復(fù)執(zhí)行一次,CX內(nèi)容減1,直到CX=0,才停止重復(fù)。7.REPE/PEPZ相等/為零時(shí)重復(fù)操作前綴

它們是條件重復(fù)前綴。當(dāng)條件滿足時(shí),才重復(fù)執(zhí)行后面的串指令,一旦條件不滿足,重復(fù)就停止。REPE/REPZ指令是相等重復(fù)指令,即只要ZF=l,且CX≠0,串指令就重復(fù)執(zhí)行。8.REPNE/PEPNZ不相等/不為零時(shí)重復(fù)操作前綴它們是條件重復(fù)前綴。當(dāng)條件滿足時(shí),才重復(fù)執(zhí)行后面的串指令,一旦條件不滿足,重復(fù)就停止。REPNE/REPNZ指令是不相等重復(fù)指令,即只要ZF=0,且CX≠0,串指令就重復(fù)執(zhí)行。

例如:將1000個(gè)字符的字符串從內(nèi)存的BUFFERl搬移到內(nèi)存的BUFFER2中去。

MOVSI,OFFSETBUFFERl

;BUFFERl偏移地址送SIMOVD1,OFFSETBUFFER2;BUFFER2偏移地址送DIMOVCX,1000;傳送次數(shù)送CXCLDREPEMOVSBUFFER2,BUFFERl

;重復(fù)搬移

注意,上述程序中的BUFFERl應(yīng)處于DS段中,而BUFFER2應(yīng)處于ES段中。

例如:將數(shù)據(jù)段中100個(gè)字的數(shù)據(jù)塊BLOCKl搬移到同一個(gè)數(shù)據(jù)段的BLOCK2中去。

PUSHDSPOPESLEASI,BLOCKlLEAD1,BLOCK2MOVCX,0064HCLDREPEMOVSW

例:比較DEST和SOURCE中的500個(gè)字節(jié),找出第一個(gè)不相同的字節(jié),如果找到,則將SOURCE中的這個(gè)數(shù)送AL中。

CLDLEADI,DESTLEASI,SOURCEMOVCX,500REPECMPSBJCXZNEXTMATCH:DECSIMOVAL,BYTEPTR[SI]3.2.5程序控指令1.JMP無條件轉(zhuǎn)移指令這些指令都將引起程序執(zhí)行順序的改變。轉(zhuǎn)移有段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移之分。所謂段內(nèi)轉(zhuǎn)移是指段地址不變,僅IP發(fā)生改變;而段間轉(zhuǎn)移,CS和IP均發(fā)生改變。(1)段內(nèi)直接短轉(zhuǎn)移指令格式:JMPSHORTLOOP指令功能:IP←(IP)+8位偏移量其中LOOP為轉(zhuǎn)移目標(biāo)地址,可直接使用符號(hào)地址,又稱標(biāo)號(hào)。SHORT為屬性運(yùn)算符,指示匯編程序?qū)⒌刂穮R編成8位偏移量,范圍在-128~+127之內(nèi)。

(2)段內(nèi)直接近轉(zhuǎn)移指令格式:JMPNEARPTRLOOP或JMPLOOPl

;NEAR可省略指令功能:IP←(IP)+16位偏移量其中LOOP為轉(zhuǎn)移目標(biāo)地址,可直接使用符號(hào)地址,又稱標(biāo)號(hào)。NEARPTR為屬性運(yùn)算符,指示匯編程序?qū)⒌刂穮R編成16位偏移量,范圍在64K之內(nèi)。近程轉(zhuǎn)移JMPNEARPTRLOOPl(3)段內(nèi)間接轉(zhuǎn)移指令格式:JMPWORDPTROPRD指令功能:IP←(OPRD地址所對(duì)應(yīng)連續(xù)兩單元的內(nèi)容)OPRD的有效地址由尋址方式?jīng)Q定。OPRD可以為寄存器尋址或存儲(chǔ)器尋址的某一種。如果是寄存器尋址,指令中直接給出寄存器號(hào),寄存器中的內(nèi)容送到IP中;如果是存儲(chǔ)器尋址,按存儲(chǔ)器尋址方式形成的地址所對(duì)應(yīng)的單元內(nèi)容給IP指針??梢灾苯拥卣f,段內(nèi)間接轉(zhuǎn)移,其轉(zhuǎn)移地址在寄存器中或存儲(chǔ)器中。遠(yuǎn)程轉(zhuǎn)移是段間的轉(zhuǎn)移,目的地址與JMP指令所在地址不在同一段內(nèi)。執(zhí)行該指令時(shí)要修改CS和IP的內(nèi)容。例如:

JMPCXJMPWORDPTR[BX](4)段間直接轉(zhuǎn)移指令格式:JMPFARPTRLOOP指令功能:IP←LOOP的偏移地址

CS←LOOP的所在段地址·段間間接轉(zhuǎn)移JMPDWORDPTR[BP]][DI]

該指令指定的雙字指針的第一個(gè)字單元內(nèi)容送入IP,第二個(gè)字單元內(nèi)容送入CS,所定義的單元必定是雙字單元。2.子程序調(diào)用和返回指令(1)段內(nèi)調(diào)用和返回指令1)段內(nèi)直接調(diào)用指令指令格式:CALLOPRD

其中OPRD為被調(diào)用的過程或子程序的首地址。指令功能:SP

(SP)-2,(SP)

(IP)

IP

OPRD對(duì)應(yīng)16位直接地址在程序中,OPRD一般為子程序名,匯編時(shí)匯編成16位的偏移地址。在段內(nèi)直接調(diào)用時(shí),CALL指令首先將當(dāng)前IP內(nèi)容壓入堆棧。把子程序的首地址送IP,從而實(shí)現(xiàn)程序調(diào)用。例如:在主程序中執(zhí)行一條段內(nèi)直接調(diào)用語句,具體調(diào)用形式如下:MAINPROCFARMOVAX,DATAMOVDS,AX

┇CALLDISPLAY

DISPLAYPROCNEAR

PUSHAX

PUSHBX

RET2)段內(nèi)間接調(diào)用指令指令格式:CALLOPRD

其中OPRD為被調(diào)用的過程或子程序的首地址。指令功能:段內(nèi)調(diào)用SP

(SP)-2,(SP)

(IP)

IP

寄存器或存儲(chǔ)器所對(duì)應(yīng)的16位數(shù)據(jù)指令執(zhí)行后,把16位通用寄存器或存儲(chǔ)單元中的內(nèi)容送入IP中,CS保持不變。例如:CALLWORDPTR[SI]CALLBX3)段內(nèi)返回指令指令格式:RET

指令功能:IP←((SP+1),(SP))

SP←(SP)+2RET指令是子程序返回的主要指令,與調(diào)用指令配合使用。(2)段間調(diào)用與返回指令

1)

段間直接調(diào)用指令指令格式:CALLOPRD

指令功能:SP

(SP)-2

((SP)+1,(SP))

(CS)

SP

(SP)-2,(SP)

(IP)

IP

OPRD所在段的直接地址

CS

直接地址所在的段例如:以下程序的代碼段CODE1中有一條調(diào)用指令CALLFARPTRWANG,而WANG為代碼段CODE2中的子程序,程序的框架結(jié)構(gòu)如下:

CODE1SEGMENT

┇CALLFARPTRWANG

┇CODE1ENDSCODE2SEGMENT

┇WANGPROCFAR

┇WANGENDPRETCODE2ENDS1)

段間間接調(diào)用指令格式:CALLOPRD指令功能:SP

(SP)-2

((SP)+1,(SP))

(CS)SP

(SP)-2

(SP)+1,(SP)

(IP)

IP

OPRD所在存儲(chǔ)單元的前兩個(gè)單元的內(nèi)容

CS

OPRD所在存儲(chǔ)單元的后兩個(gè)單元的內(nèi)容例如:CALLDWORDPTR[BX]2)

段間返回指令指令格式:RET指令功能:IP←((SP+1),(SP))

SP←(SP)+2CS←((SP+1),(SP))SP←(SP)+2即連續(xù)執(zhí)行兩次出棧操作,首先彈出的送入IP中,第二次彈出的送入CS中。

3.條件轉(zhuǎn)移指令

8086有18條不同的條件轉(zhuǎn)移指令。它們根據(jù)標(biāo)志寄存器中各標(biāo)志位的狀態(tài),決定程序是否進(jìn)行轉(zhuǎn)移。條件轉(zhuǎn)移指令的目的地址必須在現(xiàn)行的代碼段(CS)內(nèi),并且以當(dāng)前指針寄存器IP內(nèi)容為基準(zhǔn),其位移必須在-128~+127的范圍之內(nèi)。因此條件轉(zhuǎn)移指令的范圍是有限的,不像JMP指令那樣可以轉(zhuǎn)移到內(nèi)存的任何一個(gè)位置上。指令類型指令格式指令功能測試條件無條件轉(zhuǎn)移JMP目標(biāo)標(biāo)號(hào)CALL過程名RET無條件轉(zhuǎn)移過程調(diào)用過程返回

條件轉(zhuǎn)移對(duì)無符號(hào)數(shù)JA/JNBE目標(biāo)標(biāo)號(hào)JAE/JNB目標(biāo)標(biāo)號(hào)JB/JNAE目標(biāo)標(biāo)號(hào)JBE/JNA目標(biāo)標(biāo)號(hào)高于/不低于也不等于轉(zhuǎn)移高于或等于/不低于轉(zhuǎn)移低于/不高于也不等于轉(zhuǎn)移低于或等于/不高于轉(zhuǎn)移CF=0且ZF=0CF=0或ZF=1CF=1且ZF=0CF=1或ZF=1對(duì)帶符號(hào)數(shù)JG/JNLE目標(biāo)標(biāo)號(hào)JGE/JNL目標(biāo)標(biāo)號(hào)JL/JNGE目標(biāo)標(biāo)號(hào)JLE/JNG目標(biāo)標(biāo)號(hào)大于/不小于也不等于轉(zhuǎn)移大于或等于/不小于轉(zhuǎn)移小于/不大于也不等于轉(zhuǎn)移小于或等于/不大于轉(zhuǎn)移ZF=0且OF⊕SF=0OF⊕SF=0或ZF=1OF⊕SF=1或ZF=0OF⊕SF=1或ZF=1單標(biāo)志JC

目標(biāo)標(biāo)號(hào)JNC

目標(biāo)標(biāo)號(hào)JE/JZ

目標(biāo)標(biāo)號(hào)JNE/JNZ目標(biāo)標(biāo)號(hào)進(jìn)位位為1轉(zhuǎn)移進(jìn)位位為0轉(zhuǎn)移等于/結(jié)果為0轉(zhuǎn)移不等于/結(jié)果不為0轉(zhuǎn)移CF=1CF=0ZF=1ZF=0位條件轉(zhuǎn)移JO

目標(biāo)標(biāo)號(hào)JNO

目標(biāo)標(biāo)號(hào)JNP/JNO目標(biāo)標(biāo)號(hào)JP/JO

目標(biāo)標(biāo)號(hào)JNS

目標(biāo)標(biāo)號(hào)JS

目標(biāo)標(biāo)號(hào)溢出轉(zhuǎn)移不溢出轉(zhuǎn)移奇偶位為0/奇偶位為奇轉(zhuǎn)移奇偶位為1/奇偶位為偶轉(zhuǎn)移符號(hào)標(biāo)志位為0轉(zhuǎn)移符號(hào)標(biāo)志位為1轉(zhuǎn)移

循環(huán)控制LOOP目標(biāo)標(biāo)號(hào)LOOPE/LOOPZ目標(biāo)標(biāo)號(hào)LOOPNE/LOOPNZ目標(biāo)標(biāo)號(hào)JCXZ目標(biāo)標(biāo)號(hào)循環(huán)等于/結(jié)果為0循環(huán)不等于/結(jié)果不為0循環(huán)CX內(nèi)容為0轉(zhuǎn)移

中斷INT中斷類型INTOIRET中斷溢出時(shí)中斷中斷返回

4.循環(huán)控制指令這類指令用于控制程序的循環(huán),其控制轉(zhuǎn)向的目的地址是在以當(dāng)前IP內(nèi)容為中心的-128~127的范圍內(nèi)。這類指令用CX作計(jì)數(shù)器,每執(zhí)行一次指令,CX內(nèi)容減1,直到減為0,循環(huán)才結(jié)束。(1)指令格式:LOOPOPRD指令功能:CX←(CX)-1若CX≠0循環(huán)。(2)指令格式:LOOPNEOPRD

指令功能:CX←(CX)-1若CX≠0且ZF=0循環(huán)。(3)指令格式:LOOPEOPRD指令功能:CX←(CX)-1若CX≠0且ZF=l循環(huán)。在LOOPE和

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論