《微型計算機(jī)原理與接口技術(shù)》課件第3章_第1頁
《微型計算機(jī)原理與接口技術(shù)》課件第3章_第2頁
《微型計算機(jī)原理與接口技術(shù)》課件第3章_第3頁
《微型計算機(jī)原理與接口技術(shù)》課件第3章_第4頁
《微型計算機(jī)原理與接口技術(shù)》課件第3章_第5頁
已閱讀5頁,還剩128頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

3.1指令系統(tǒng)概述

指令就是微處理器所能執(zhí)行的每一種基本操作的二進(jìn)制的表達(dá)形式。指令是組成程序的基本單位。指令系統(tǒng)是微處理器(CPU)所具有和能執(zhí)行的全部指令的集合,它與微處理器有密切的聯(lián)系,不同的微處理器有不同的指令系統(tǒng),決定著CPU的技術(shù)性能。

8086指令系統(tǒng)是向上兼容的,因此可以處理8085中全部指令的功能。8086采用可變字節(jié)的指令格式,尋址方式多種多樣,能處理8位或16位數(shù)據(jù)。8086指令系統(tǒng)中增加了軟件中斷指令和串操作指令,為多處理機(jī)系統(tǒng)的構(gòu)成奠定了基礎(chǔ)。

8086指令系統(tǒng)共包含92種基本指令,根據(jù)功能可分為6大類:①數(shù)據(jù)傳送類指令;②算術(shù)運(yùn)算類指令;③邏輯運(yùn)算與移位指令;④串操作指令;⑤控制轉(zhuǎn)移指令;⑥處理器控制指令。

3.1.1指令格式

8086指令的一般格式如圖3.1所示。

圖3.18086指令的一般格式指令一般由操作碼和操作數(shù)兩部分構(gòu)成。操作碼指示指令要完成的操作,用助記符表示。助記符是一類具有相同功能的指令操作碼的保留名。操作數(shù)是指令執(zhí)行的對象,可顯式給出也可隱含存在。操作數(shù)有多個時,操作數(shù)之間應(yīng)用逗號隔開。

8086的指令長度為1~7個字節(jié),其中操作碼占用1~2個字節(jié),因此指令的長度主要取決于操作數(shù)的個數(shù)及其尋址方式。根據(jù)操作數(shù)的個數(shù),指令在格式上可分為以下三類:

(1)零操作數(shù)指令。指令只有操作碼,操作數(shù)是隱含的,該類指令的操作對象多為處理器本身。

(2)單操作數(shù)指令。指令中包含操作碼和一個操作數(shù),另一個操作數(shù)隱含存在。

(3)雙操作數(shù)指令。指令中包含操作碼和兩個操作數(shù)。3.1.2指令操作數(shù)類型

根據(jù)操作數(shù)存放位置的不同,8086指令中的操作數(shù)有三種類型:立即數(shù)操作數(shù)、寄存器操作數(shù)和存儲器操作數(shù)。

1.立即數(shù)操作數(shù)

立即數(shù)是有固定數(shù)值的操作數(shù),指令的執(zhí)行對其不產(chǎn)生影響。立即數(shù)操作數(shù)包含在指令中,即操作數(shù)本身直接在指令中給出,并隨指令一起從存儲器中取出參與運(yùn)算。

立即數(shù)操作數(shù)是常數(shù),沒有表示地址的含義,故立即數(shù)操作數(shù)只能作源操作數(shù)。立即數(shù)操作數(shù)可以是8位數(shù)也可以是16位數(shù)。

2.寄存器操作數(shù)

寄存器操作數(shù)是指操作數(shù)在某個寄存器中,指令中給出寄存器的名字。

可以作為寄存器操作數(shù)的包括8086CPU的8個通用寄存器和4個段寄存器,在指令中寄存器操作數(shù)既可作為源操作數(shù)又可作為目的操作數(shù)。

通用寄存器常用來存放數(shù)據(jù)或數(shù)據(jù)所在的存儲器單元的偏移地址,段寄存器常用來存放操作數(shù)的段基址。

3.存儲器操作數(shù)

存儲器操作數(shù)在內(nèi)存中,指令中給出的是操作數(shù)的地址。

存儲器操作數(shù)既可作為源操作數(shù)又可作為目的操作數(shù)。一般情況下,一條指令中的兩個操作數(shù)不允許同時為存儲器操作數(shù)。 3.2尋址方式

所謂尋址方式,是指CPU指令中規(guī)定的獲得操作數(shù)所在地址的方式。

8086指令系統(tǒng)中,根據(jù)指令中操作數(shù)的存放位置不同,將操作數(shù)所在地址的尋址方式分為8類。其中立即數(shù)對應(yīng)的尋址方式為立即尋址;寄存器操作數(shù)對應(yīng)的尋址方式為寄存器尋址;存儲器操作數(shù)對應(yīng)的尋址方式有多種,包括直接尋址、寄存器間接尋址、寄存器相對尋址、基址變址尋址、基址變址相對尋址,另外還有一種隱含尋址。在本節(jié)中討論的尋址方式都是針對源操作數(shù)的。3.2.1立即尋址

立即尋址是指源操作數(shù)為立即數(shù),直接包含在指令中,并緊跟指令操作碼存放于內(nèi)存代碼段中,隨指令一起取出。立即數(shù)可以是8位或者16位數(shù)。例如:

MOVAX,3B13H

該指令表示將16位數(shù)3B13H送入寄存器AX中。立即尋址示意圖如圖3.2所示。圖3.2立即尋址示意圖3.2.2直接尋址

直接尋址是指參加運(yùn)算的數(shù)據(jù)存放于內(nèi)存中,數(shù)據(jù)存放的16位偏移地址在指令中直接給出,并與操作碼一起存放在代碼段中。偏移地址在指令中放在“[]”內(nèi),默認(rèn)數(shù)據(jù)的段基址為數(shù)據(jù)段DS,允許段重設(shè)。例如:

MOVAX,[3B13H]

該指令表示將數(shù)據(jù)段中偏移地址為3B13H和3B14H兩單元的內(nèi)容送入寄存器AX中。該指令對應(yīng)的直接尋址示意圖如圖3.3所示。圖3.3直接尋址示意圖假設(shè)DS=1000H,則參與運(yùn)算的數(shù)據(jù)的物理地址為1000H×16+3B13H=13B13H。

要注意區(qū)別直接尋址和立即尋址。直接尋址中并沒有直接給出操作數(shù),而是給出了操作數(shù)的16位偏移地址。在表現(xiàn)形式上,直接尋址的偏移地址必須加方括號以區(qū)分。在上例中,并不是將3B13H送入AX寄存器中,而是將偏移地址為3B13H的內(nèi)存單元中的內(nèi)容送入AX。

在直接尋址方式中,如不特別說明,操作數(shù)默認(rèn)存放在DS段。若要使用其他寄存器,則需要在指令中用段重設(shè)符號標(biāo)明。例如:

MOVAX,ES:[3B13H]

該指令表示將ES段中偏移地址為3B13H單元的內(nèi)容送入AX寄存器中。3.2.3寄存器尋址

寄存器尋址是指指令中給出的是寄存器,操作數(shù)存放在寄存器中??梢允褂眉拇嫫鲗ぶ贩绞降募拇嫫靼ㄍㄓ脭?shù)據(jù)寄存器(8位或者16位)、地址指針、變址寄存器以及段寄存器。

寄存器尋址方式中,操作數(shù)位于CPU內(nèi)部寄存器中,因此指令執(zhí)行時不需要訪問內(nèi)存就可以取得操作數(shù),指令的執(zhí)行速度很快。例如:

MOVCX,AX

該指令表示將寄存器AX的內(nèi)容送到寄存器CX中,若執(zhí)行前,AX=1234H,CX=3423H,則執(zhí)行后,CX=1234H。寄存器尋址示意圖如圖3.4所示。圖3.4寄存器尋址示意圖

3.2.4寄存器間接尋址

寄存器間接尋址是指指令中出現(xiàn)的是寄存器,該寄存器中存放的是操作數(shù)的有效地址,操作數(shù)存放在存儲器中。

寄存器間接尋址所使用的寄存器分為兩類:

(1)以SI、DI或BX作為間址寄存器,此時操作數(shù)在數(shù)據(jù)段,即段基址在默認(rèn)情況下由DS決定。

(2)以BP作為間址寄存器,此時操作數(shù)在堆棧段,即段基址在默認(rèn)情況下由SS決定。

寄存器間接尋址方式允許段重設(shè),在指令中使用段重設(shè)符即可重設(shè)操作數(shù)所在的段寄存器。為了區(qū)分寄存器間接尋址和寄存器尋址,寄存器間接尋址指令中的寄存器必須用方括號括起來。例如:

MOVAX,[DI]

若已知DS=1000H,DI=2000H,該指令表示將物理地址為1000H×16+2000H=12000H單元和12001H單元的內(nèi)容送入寄存器AX中。寄存器間接尋址示意圖如圖3.5所示,執(zhí)行后AX=5655H。

若操作數(shù)在附加段,上條指令可修改為MOVAX,ES?:?[DI]。圖3.5寄存器間接尋址示意圖3.2.5寄存器相對尋址

寄存器相對尋址是指指令中出現(xiàn)的是間址寄存器和一個8位或者16位的位移量,二者之和作為操作數(shù)的有效地址。操作數(shù)存放在存儲器中,數(shù)據(jù)存放的段由所使用的間址寄存器決定,間址寄存器只能采用BX、BP、SI、DI。例如:

MOVAX,DATA[DI]

若已知DS=1000H,DI=2000H,DATA=0001H,該指令表示將物理地址=1000H×16+2000H+0001H=12001H單元和12002H單元的內(nèi)容送到寄存器AX中。寄存器相對尋址示意圖3.6所示。圖3.6寄存器相對尋址示意圖在匯編語言中,寄存器相對尋址的表示形式有多種,如:

MOVAX,DATA[DI]

MOVAX,[DI]DATA

MOVAX,DATA+[DI]

MOVAX,[DI]+DATA

MOVAX,[DI+DATA]

MOVAX,[DATA+DI]3.2.6基址變址尋址

基址變址尋址是指指令中出現(xiàn)的是一個基址寄存器(BX或BP)和一個變址寄存器(SI或DI),兩個寄存器內(nèi)容之和作為操作數(shù)的有效地址。基址寄存器只能用BX或BP,默認(rèn)情況下對應(yīng)的段寄存器分別為DS和SS。基址變址尋址允許段重設(shè)。例如:

MOVAX,[BX][DI]

若DS=1000H,BX=0810H,DI=0050H,該指令表示將物理地址=1000H×16+0810H+0050H=10860H單元和10861H單元的內(nèi)容送到寄存器AX中。基址變址尋址方式示意圖如圖3.7所示。圖3.7基址變址尋址示意圖3.2.7基址變址相對尋址

基址變址相對尋址是指指令中出現(xiàn)的是一個基址寄存器(BX或BP)、一個變址寄存器(SI或DI)和一個8位或者16位的位移量,三者之和為操作數(shù)的有效地址。操作數(shù)在存儲器中,數(shù)據(jù)存放的段由所使用的基址寄存器決定?;纷冎穼ぶ吩试S段重設(shè)。

例如:

MOVAX,DATA[BX][DI]

若DS=1000H,BX=0810H,DI=0050H,DATA=0001H,該指令表示將物理地址=1000H×16+0810H+0050H+0001H=10861H單元和10862H單元的內(nèi)容送入寄存器AX中?;纷冎废鄬ぶ肥疽鈭D如圖3.8所示。圖3.8基址變址相對尋址示意圖基址變址相對尋址的表示形式有多種:

MOVAX,DATA[BX][DI]

MOVAX,DATA[BX+DI]

MOVAX,[DATA+BX+DI]

MOVAX,[DATD+BX][DI]

MOVAX,[BX]DATA[DI]

在基址變址相對尋址方式中,不允許同時使用兩個基址寄存器或者兩個變址寄存器。3.2.8隱含尋址

有些指令的操作碼不僅包含操作的性質(zhì),還隱含了部分操作數(shù)的地址。例如乘法指令MUL,該指令中只給出乘數(shù)的地址,被乘數(shù)和乘積的地址是隱含且固定的。這種在指令操作碼中隱含操作數(shù)的尋址方式稱為隱含尋址。

3.38086的指令系統(tǒng)

8086指令系統(tǒng)包含133條基本指令,按功能將其分為6類:數(shù)據(jù)傳送指令、算術(shù)運(yùn)算指令、邏輯運(yùn)算和移位指令、串操作指令、程序控制指令、處理器控制指令。

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

數(shù)據(jù)傳送指令是程序中使用最頻繁的一類指令,可以實現(xiàn)數(shù)據(jù)在內(nèi)存、通用寄存器和段寄存器之間的傳送。數(shù)據(jù)傳送指令通常不會對標(biāo)志寄存器FR產(chǎn)生影響。

數(shù)據(jù)傳送指令根據(jù)功能可以分為3類:

(1)通用數(shù)據(jù)傳送指令。

(2)目標(biāo)地址傳送指令。

(3)輸入輸出指令。

1.通用數(shù)據(jù)傳送指令

通用數(shù)據(jù)傳送指令包括一般傳送指令MOV、堆棧操作指令PUSH和POP、數(shù)據(jù)交換指令XCHG和查表轉(zhuǎn)換指令XLAT。

1)一般傳送指令MOV

指令格式:

MOVdest,src;(dest)←(src)

其中,dest為目標(biāo)操作數(shù),src為源操作數(shù)。該指令是將源操作數(shù)的內(nèi)容送入目標(biāo)操作數(shù),同時源操作保持不變。MOV操作相當(dāng)于數(shù)據(jù)的復(fù)制。匯編語言中對于雙操作數(shù)的指令,規(guī)定必須將目標(biāo)操作數(shù)寫在前面,源操作數(shù)寫在后面,兩者之間用逗號隔開。

MOV指令是最普遍、最常用的傳送指令,該指令具有以下特點(diǎn):

(1)既可以傳送字節(jié)操作數(shù)也可以傳送字操作數(shù)。

(2)可以使用3.2節(jié)中所介紹的各種尋址方式。

(3)可以實現(xiàn)寄存器和寄存器或者存儲器之間的數(shù)據(jù)傳送、立即數(shù)至寄存器或者存儲器的數(shù)據(jù)傳送、寄存器或存儲器和段寄存器之間的數(shù)據(jù)傳送。①寄存器和寄存器之間的數(shù)據(jù)傳送:

MOVAX,CX; 寄存器AX中的內(nèi)容送到寄存器CX

②寄存器和存儲器之間的數(shù)據(jù)傳送:

MOV[1000H],AX;將AX中的內(nèi)容送到數(shù)據(jù)段內(nèi)存單元1000H和1001H中

MOVAX,[DI];將數(shù)據(jù)段中DI所指向的連續(xù)兩個內(nèi)存單元的內(nèi)容送入AX

③立即數(shù)至寄存器的數(shù)據(jù)傳送:

MOVAX,0800H;將0800H送入AX④立即數(shù)至存儲器的數(shù)據(jù)傳送:

MOVBYTEPTR[BX],08H;將08H送入數(shù)據(jù)段BX所指向的內(nèi)存單元中

MOVWORDPTR[BX],0800H;將0800H送入數(shù)據(jù)段BX所指向的連續(xù)兩個內(nèi)存單元中

⑤寄存器與段寄存器之間的數(shù)據(jù)傳送:

MOVAX,DS;將DS的內(nèi)容送入AX

MOVES,BX;將BX的內(nèi)容送入ES中

⑥存儲器和段寄存器之間的數(shù)據(jù)傳送:

MOV[1000H],DS;將DS的內(nèi)容送入數(shù)據(jù)段1000H單元

MOVDS,[DI];將數(shù)據(jù)段DI所指向的連續(xù)兩個內(nèi)存單元的內(nèi)容送入DS

MOV指令對操作數(shù)有如下要求:

(1)指令中目標(biāo)操作數(shù)和源操作數(shù)的字長必須相等,都是字節(jié)操作數(shù)或者字操作數(shù)。

(2)目標(biāo)操作數(shù)不能為立即數(shù)。

(3)源操作數(shù)為立即數(shù)時,目標(biāo)操作數(shù)不能為段寄存器。

(4)兩個操作數(shù)不能同時為存儲器操作數(shù)。

(5)兩個操作數(shù)不能同時為段寄存器。

(6)一般情況下指令指針I(yè)P和代碼段寄存器CS可以作為源操作數(shù),但不能作為目標(biāo)操作數(shù)。

2)堆棧操作指令PUSH和POP

堆棧是按先進(jìn)后出原則在內(nèi)存中開辟的一段特定區(qū)域(見圖3.9),用來存放寄存器或者存儲器中暫時不用但需要保存的數(shù)據(jù)。堆棧在內(nèi)存中的段稱為堆棧段,使用堆棧段寄存器SS。堆棧主要應(yīng)用于子程序調(diào)用、中斷響應(yīng)等操作時的參數(shù)保護(hù)。

指令格式:

入棧操作PUSHsrc

出棧操作POPdest

指令中的操作數(shù)可以是16位的通用寄存器或者段寄存器和存儲器單元。圖3.9堆棧區(qū)示意圖堆??臻g在使用時需要遵循以下原則:

(1)堆棧操作遵循“先進(jìn)后出”的原則。

(2)堆棧的存取每次必須是一個字,即16位數(shù)據(jù),且必須是寄存器或者存儲器操作數(shù)。

(3)用PUSH指令存放數(shù)據(jù)時,總是從高地址向低地址方向增長。

(4)?SS決定堆棧段的位置,堆棧指針SP總是指向棧頂單元。棧頂是當(dāng)前可用堆棧操作指令進(jìn)行數(shù)據(jù)交換的單元。PUSH操作存放操作數(shù)之前SP先減2,POP取出操作數(shù)時,先取出操作數(shù)然后SP加2。堆棧指令的執(zhí)行過程:

(1)入棧指令PUSH。首先將棧頂指針SP內(nèi)容減2,即棧頂指向原來的SP-2的位置,然后將操作數(shù)向低地址方向存放,高8位放在SP+1單元,低8位放在SP單元。

(2)出棧指令POP。首先將SP單元內(nèi)容取出放入操作數(shù)低8位,SP+1內(nèi)容取出放入操作數(shù)的高8位,然后將SP內(nèi)容加2。圖3.10例3.1的示意圖

3)數(shù)據(jù)交換指令XCHG

指令格式:

XCHGOPRD1,OPRD2;(OPRD1)?(OPRD2)

數(shù)據(jù)交換指令的功能是將源地址和目標(biāo)地址中的內(nèi)容互換。

數(shù)據(jù)交換指令對操作數(shù)的要求如下:

(1)兩操作數(shù)的字長必須相等,同為字操作數(shù)或字節(jié)操作數(shù)。

(2)源操作數(shù)和目標(biāo)操作數(shù)可以是寄存器或存儲器操作數(shù),但不能同時為存儲器操作數(shù)。

(3)段寄存器不能作為操作數(shù)。

【例3.2】

設(shè)DS=1000H,DI=2000H,AL=05H,[12000H]=66H,執(zhí)行指令:

XCHG[DI],AL

后,結(jié)果為

[12000H]=05H,AL=66H

4)查表交換指令XLAT

指令格式:

XLAT;將數(shù)據(jù)段中偏移地址為BX+AL所指向單元的內(nèi)容送入AL

XLATsrc_table;src_table表示要查找的表的首地址

【例3.3】

數(shù)據(jù)段中存放有一張十六進(jìn)制數(shù)的ASCII碼轉(zhuǎn)換表(見圖3.11),設(shè)首地址為2000H,查表得出第10個元素“A”的ASCII碼(設(shè)DS?=?4000H)。

MOV BX,2000H ;BX←表首地址

MOV AL,0AH ;AL←序號

XLAT ;查表轉(zhuǎn)換

執(zhí)行結(jié)果為

AL=41H圖3.11ASCII碼轉(zhuǎn)換表

2.目標(biāo)地址傳送指令

該指令用于將源操作數(shù)的地址傳送到目標(biāo)操作數(shù)。

指令格式:

LEAreg16,mem

該指令表示將mem的16位偏移地址送入指定寄存器。該指令要求源操作數(shù)必須是存儲器操作數(shù),目標(biāo)操作數(shù)必須是16位通用寄存器。該指令的執(zhí)行不影響標(biāo)志位。

例如:

LEABX,[DI]

表示將DI所指向單元的地址即DI的內(nèi)容送入BX。例如,若DS=1000H,DI=2000H,[12005H]=30H,[12006H]=40H,則執(zhí)行LEABX,[DI+05H]和MOVBX,[DI+05H]兩條指令后的結(jié)果分別為BX=2005H和BX=4030H。

也可以用MOV指令得到存儲器操作數(shù)的偏移地址,以下兩條指令的執(zhí)行效果相同:

LEABX,BUFFER

MOVBX,OFFSETBUFFER

3.輸入/輸出指令

一臺計算機(jī)可以連接多臺外部設(shè)備,如打印機(jī)、顯示器等,CPU需要與這些外設(shè)進(jìn)行數(shù)據(jù)交換,傳送控制命令或者查詢外設(shè)狀態(tài)。8086指令系統(tǒng)有專門用于對輸入/輸出端口進(jìn)行讀/寫的I/O指令,包含IN和OUT兩條指令。

8086的I/O指令中,CPU對外設(shè)端口有兩種尋址方式:直接尋址和寄存器間接尋址。直接尋址方式中的端口地址為8位,因此可尋址的端口地址范圍為0~FFH,共256個端口;寄存器間接尋址方式中的端口地址為16位,因此可尋址的端口地址范圍為0000H~FFFFH,共64K個,這種方式下端口地址只能由DX寄存器給出。3.3.2算術(shù)運(yùn)算指令

1.加法運(yùn)算指令

加法運(yùn)算指令包括普通加法指令A(yù)DD、帶進(jìn)位加法指令A(yù)DC和加1指令I(lǐng)NC。雙操作數(shù)加法指令對操作數(shù)的要求和MOV指令基本相同,但段寄存器不能作為加法指令的操作數(shù)。

1)普通加法指令A(yù)DD

指令格式:

ADDOPRD1,OPRD2;OPRD1←OPRD1+OPRD2

該指令的功能是將源操作數(shù)和目標(biāo)操作數(shù)相加,并將結(jié)果送回目標(biāo)操作數(shù)。該指令的目標(biāo)操作數(shù)可以是8位或16位的寄存器或存儲器操作數(shù),源操作數(shù)可以是8位或16位的立即數(shù)、寄存器或存儲器操作數(shù)。但操作數(shù)不能為段寄存器,也不能同時為存儲器操作數(shù)。進(jìn)行加法運(yùn)算的操作數(shù)既可以是無符號數(shù),也可以是有符號數(shù)。加法指令對全部6個標(biāo)志位均產(chǎn)生影響。

2)帶進(jìn)位加法指令A(yù)DC

指令格式:

ADCOPRD1,OPRD2;OPRD1←OPRD1+

OPRD2+CF

該指令的功能是將源操作數(shù)和目標(biāo)操作數(shù)相加,再加上CF的值,并將結(jié)果送回目標(biāo)操作數(shù)。

該指令對操作數(shù)的要求和對標(biāo)志位的影響都與ADD指令基本相同。

【例3.4】

求兩個無符號雙字123FAB5H+0ABC212AH相加的和。

MOVDX,0123H

MOVAX,0FAB5H

ADDAX,212AH ;先加低字,CF?=?1AX?=?1BDFH

ADCDX,0ABCH ;高字帶進(jìn)位加,CF?=?0DX?=?0BE0H

3)加1指令I(lǐng)NC

指令格式:

INCOPRD;OPRD←OPRD?+?1

該指令的功能是將操作數(shù)加1后的結(jié)果送回該操作數(shù),常用于修改偏移地址和計數(shù)次數(shù)。加1指令的操作數(shù)可以是8位或者16位的寄存器或存儲器操作數(shù),操作數(shù)不能是立即數(shù)或段寄存器。加1指令影響AF、OF、PF、SF和ZF標(biāo)志位,而對CF標(biāo)志位不產(chǎn)生影響。

2.減法運(yùn)算指令

減法運(yùn)算指令包括普通減法指令SUB、考慮借位的減法指令SBB、減1指令DEC、求補(bǔ)指令NEG和比較指令CMP。

1)普通減法指令SUB

指令格式:

SUBOPRD1,OPRD2;OPRD1←OPRD1-OPRD2

該指令的功能是將目標(biāo)操作數(shù)減去源操作數(shù)的結(jié)果送回目標(biāo)操作數(shù)。

該指令對操作數(shù)的要求和對狀態(tài)標(biāo)志位的影響與加法指令A(yù)DD相同。

2)考慮借位的減法指令SBB

指令格式:

SBBOPRD1,OPRD2;OPRD1←OPRD1-OPRD2-CF

該指令的功能是將目標(biāo)操作數(shù)減去源操作數(shù),再減去CF的結(jié)果送到目標(biāo)操作數(shù)。

該指令對操作數(shù)的要求和對狀態(tài)標(biāo)志位的影響都和SUB指令相同。

3)減1指令DEC

指令格式:

DECOPRD;OPRD←OPRD-1

該指令的功能是將操作數(shù)減1后的結(jié)果送回該操作數(shù),常用于在循環(huán)程序中修改循環(huán)次數(shù)。

該指令對操作數(shù)的要求和對狀態(tài)標(biāo)志位的影響與INC指令相同。

4)求補(bǔ)指令NEG

指令格式:

NEGOPRD;OPRD←0-OPRD

該指令的功能是將0減去操作數(shù)的結(jié)果送回該操作數(shù)。

該指令的操作數(shù)可以是寄存器或者存儲器操作數(shù),利用該指令可得到負(fù)數(shù)的絕對值。指令對全部6個狀態(tài)標(biāo)志位均有影響。執(zhí)行該指令后,一般CF?=?1,操作數(shù)為80H或8000H時結(jié)果不變,但OF?=?1,其余情況下OF?=?0。

5)比較指令CMP

指令格式:

CMPOPRD1,OPRD2;OPRD1-OPRD2,但結(jié)果不送回OPRD1

該指令的功能是目標(biāo)操作數(shù)減去源操作數(shù),結(jié)果不送回目標(biāo)操作數(shù),但對6個狀態(tài)標(biāo)志位均有影響。

該指令對操作數(shù)的要求和對狀態(tài)標(biāo)志位的影響與減法指令SUB相同。利用比較指令可以判斷兩個數(shù)的大小關(guān)系,判斷方法為:

(1)判斷兩個操作數(shù)是否相等。若ZF?=?1,則兩個操作數(shù)相等;若ZF?=?0,則兩個操作數(shù)不相等。

(2)判斷兩個操作數(shù)的大小。

①判斷兩個無符號操作數(shù)的大小。若CF?=?1,則目標(biāo)操作數(shù)小于源操作數(shù);若CF?=?0,則目標(biāo)操作數(shù)大于源操作數(shù)。

②判斷兩個帶符號操作數(shù)的大小。當(dāng)兩個操作數(shù)符號相同時,若SF?=?1,則目標(biāo)操作數(shù)小于源操作數(shù);若SF?=?0,則目標(biāo)操作數(shù)大于源操作數(shù)。

當(dāng)兩個操作數(shù)的符號不同時,若OFSF?=?1,則目標(biāo)操作數(shù)小于源操作數(shù);若OFSF?=?0,則目標(biāo)操作數(shù)大于源操作數(shù)。

3.乘法運(yùn)算指令

乘法運(yùn)算指令包括無符號數(shù)乘法指令和有符號數(shù)乘法指令。兩個乘法指令均采用隱含尋址的方式,源操作數(shù)在指令中給出,而目標(biāo)操作數(shù)則隱含在AX或AL中。8位數(shù)乘法的乘積為16位數(shù),存放在AX中;16位數(shù)乘法的乘積為32位數(shù),高位和低位分別存放在DX和AX中。

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

指令格式:

MULOPRD;字節(jié)操作:AX←OPRD×AL

;字操作:DX:AX←OPRD×AX該指令的功能是將源操作數(shù)與AL或AX內(nèi)容相乘的結(jié)果送到AX或DX:AX中。

乘法指令的操作數(shù)可以是8位或者16位的寄存器或存儲器操作數(shù),操作數(shù)不能為立即數(shù)。如果乘積的高半部分不為零,則CF?=?OF?=?1,表示AH或DX中包含有效數(shù)字,否則CF?=?OF?=?0。該指令對其他狀態(tài)標(biāo)志位不產(chǎn)生影響。

【例3.5】

已知AL?=?0FEH,BL?=?0AH,均為無符號數(shù),求AL和BL的乘積。

MULCL

執(zhí)行后,AX?=?09ECH,且CF?=?OF?=?1。

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

指令格式:

IMULOPRD;字節(jié)操作:AX←OPRD×AL

;字操作:DX:AX←OPRD×AX

該指令的功能和對操作數(shù)的要求與MUL指令相同。

如果乘積的高半部分是低半部分的符號位擴(kuò)展,則CF=OF=0,否則CF=OF=1。對其他狀態(tài)標(biāo)志位不產(chǎn)生影響。

【例3.6】

已知AL?=?0FEH,BL?=?0AH,均為有符號數(shù),求AL和BL的乘積。

IMULCL

執(zhí)行后,AX?=?FFECH,且CF?=?OF?=?0。

4.除法運(yùn)算指令

除法運(yùn)算指令包括無符號數(shù)除法指令和有符號數(shù)除法指令。和乘法指令一樣,除法指令的被除數(shù)同樣隱含在AL或AX中,除數(shù)在指令中給出。

除法指令要求被除數(shù)的字長是除數(shù)的兩倍,因此對于8位除數(shù),被除數(shù)為16位,存放在AX中;對于16位除數(shù),被除數(shù)為32位,存放在DX和AX中。

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

指令格式:

DIVOPRD ;字節(jié)操作:AL←AX/OPRD,AH←AX%OPRD

;字操作:AX←DX:AX/OPRD,DX←DX:AX%OPRD

該指令的功能是將AL或AX的內(nèi)容除以源操作數(shù),其結(jié)果送到AX或DX:AX中,其中高位存放余數(shù),低位存放商。

該指令對操作數(shù)的要求和無符號數(shù)乘法指令一樣,對6個狀態(tài)標(biāo)志位均不產(chǎn)生影響。

2)有符號數(shù)除法指令

指令格式:

IDIVOPRD ;字節(jié)操作:AL←AX/OPRD,AH←AX%OPRD

;字操作:AX←DX:AX/OPRD,DX←DX:AX%OPRD

該指令的功能、對操作數(shù)的要求和對狀態(tài)標(biāo)志位的影響均與無符號數(shù)除法指令相同。

5.其他算術(shù)運(yùn)算指令

(1)?DAA指令。

指令格式:

DAA

該指令的功能是將以二進(jìn)制運(yùn)算規(guī)則執(zhí)行后存放在AL中的結(jié)果調(diào)整為壓縮BCD碼。

(2)?AAA指令。

指令格式:

AAA

該指令的功能是對兩個非壓縮BCD碼相加之后存放于AL中的和進(jìn)行調(diào)整,形成正確的擴(kuò)展BCD碼,調(diào)整后的結(jié)果的低位在AL中,高位在AH中。

(3)?DAS指令。

指令格式:

DAS

該指令的功能是對兩個壓縮BCD碼相減后的結(jié)果(在AL中)進(jìn)行調(diào)整,產(chǎn)生正確的壓縮BCD碼。

(4)

AAS指令。

指令格式:

AAS

該指令的功能是對兩個非壓縮BCD碼相減之后的結(jié)果(在AL中)進(jìn)行調(diào)整,形成一個正確的非壓縮BCD碼,調(diào)整后的結(jié)果的低位在AL中,高位在AH中。

(5)?AAM指令。

指令格式:

AAM

該指令的功能是對兩個非壓縮BCD碼相乘的結(jié)果(在AX中)進(jìn)行調(diào)整,得到正確的非壓縮BCD碼,即把AL寄存器的內(nèi)容除以0AH,商放在AH中,余數(shù)放在AL中。

(6)?AAD指令。

指令格式:

AAD

該指令的功能是在除法之前執(zhí)行,將AX中的非壓縮BCD碼(十位數(shù)放在AH中,個位數(shù)放在AL中)調(diào)整為二進(jìn)制數(shù),并將結(jié)果放入AL中。3.3.3邏輯運(yùn)算和移位指令

1.邏輯運(yùn)算指令

邏輯運(yùn)算指令是對8位或者16位的寄存器或者存儲器操作數(shù)按位進(jìn)行操作的指令。8086包含邏輯與AND、邏輯或OR、邏輯異或XOR、邏輯非NOT和測試TEST五條指令。

這五條邏輯運(yùn)算指令除NOT指令外,其余指令對操作數(shù)的要求和MOV指令相同,且這四條指令對狀態(tài)標(biāo)志位的影響均為使CF?=?OF?=?0,AF不定,并影響SF、PF和ZF標(biāo)志位。NOT指令對操作數(shù)的要求和INC指令相同,該指令的執(zhí)行對全部狀態(tài)標(biāo)志位均不產(chǎn)生影響。

1)邏輯與指令A(yù)ND

指令格式:

ANDOPRD1,OPRD2;OPRD1←OPRD1OPRD2

該指令的功能是將目標(biāo)操作數(shù)與源操作數(shù)按位相與后的結(jié)果送回目標(biāo)操作數(shù)。

【例3.7】

已知AL?=?'6',將AL中數(shù)的ASCII碼轉(zhuǎn)換成非壓縮BCD碼。

AND

AL,0FH ;AL?=?06H,屏蔽高4位(高位清0),保留低4位,

;即對應(yīng)位為0則清0,對應(yīng)位為1則不變

【例3.8】

把AL中的小寫字母轉(zhuǎn)換成大寫字母。(A~Z的ASCII碼為41H~5AH;a~z的ASCII碼為61H~7AH)

ANDAL,11011111B

2)邏輯或指令OR

指令格式:

OROPRD1,OPRD2;OPRD1←OPRD1OPRD2

該指令的功能是將目標(biāo)操作數(shù)與源操作數(shù)按位相或的結(jié)果送回目標(biāo)操作數(shù)。

3)邏輯異或指令XOR

指令格式:

XOROPRD1,OPRD2;OPRD1←OPRD1OPRD2

該指令的功能是將目標(biāo)操作數(shù)與源操作數(shù)按位相異或的結(jié)果送回目標(biāo)操作數(shù)。

4)邏輯非指令NOT

指令格式:

NOTOPRD

該指令的功能是將操作數(shù)按位取反后送回該操作數(shù)。

5)測試指令TEST

指令格式:

TESTOPRD1,OPRD2

該指令的功能是將目標(biāo)操作數(shù)與源操作數(shù)相與,結(jié)果不送回目標(biāo)操作數(shù),但影響標(biāo)志位。該指令常用于保持目標(biāo)操作數(shù)不變的情況下,檢測數(shù)據(jù)的某些位為0還是為1。

【例3.9】

測試AX中的D15位是1還是0。

TESTAX,8000H ;若D15為1,則ZF=0,否則ZF?=?1

JNC ZERO

2.移位指令

8086指令系統(tǒng)包含非循環(huán)移位指令和循環(huán)移位指令兩大類,操作的對象為8位或16位寄存器操作數(shù)或存儲器操作數(shù)。移動次數(shù)為1位時,移動次數(shù)由指令給出,移動次數(shù)大于1位時需將移動次數(shù)置于CL寄存器中。

1)非循環(huán)移位指令

8086的非循環(huán)移位指令包含四類移位指令:針對無符號數(shù)的邏輯左移指令SHL和邏輯右移指令SHR,針對有符號數(shù)的算術(shù)左移指令SAL和算術(shù)右移指令SAR。

(1)邏輯左移指令SHL和算術(shù)左移指令SAL。

指令格式:

SHLOPRD,1SALOPRD,1

SHLOPRD,CLSALOPRD,CL

該指令的功能是將目標(biāo)操作數(shù)的內(nèi)容左移1位或者CL寄存器指定的位數(shù),移動時左邊的最高位移入CF中,右邊的最低位補(bǔ)零。

若移動次數(shù)為1,移位后如果操作數(shù)的最高位和CF不相同,則OF=1,否則OF?=?0。若移位次數(shù)大于1,則OF值不定。OF=1,對于SHL不表示左移后溢出,對于SAL則表示左移后超過有符號數(shù)的表示范圍。

該指令還影響PF、SF和ZF標(biāo)志位。

【例3.10】

對AX中無符號數(shù)進(jìn)行乘10運(yùn)算(設(shè)無溢出,乘10后仍為一個字)。

分析:AX×10=AX×(8+2)=AX×2+AX×8

MOV BX, AX

SAL BX, 1 ;原數(shù)

×?2

MOV CL, 3

SAL AX, CL ;原數(shù)

×?8

ADD AX, BX ;相加等于原數(shù)×10

(2)邏輯右移指令SHR。

指令格式:

SHROPRD,1

SHROPRD,CL

該指令的功能是將目標(biāo)操作數(shù)的內(nèi)容右移1位或者CL寄存器指定的位數(shù),移動時右邊的最低位移入CF中,左邊的最高位補(bǔ)零。

若移動次數(shù)為1,移位后如果操作數(shù)新的最高位和次高位不相同,則OF?=?1,否則OF?=?0。若移位次數(shù)大于1,則OF值不定。

(3)算術(shù)右移指令SAR。

指令格式:

SAROPRD,1

SAROPRD,CL

該指令的功能是將目標(biāo)操作數(shù)的內(nèi)容右移1位或者CL寄存器指定的位數(shù),移動時右邊的最低位移入CF中,左邊的最高位保持不變。

該指令對CF、PF、SF和ZF四個標(biāo)志位有影響,不影響OF和AF標(biāo)志位。

2)循環(huán)移位指令

8086指令系統(tǒng)包含不帶進(jìn)位標(biāo)志CF的循環(huán)左移指令ROL、不帶進(jìn)位標(biāo)志CF的循環(huán)右移指令ROR、帶進(jìn)位標(biāo)志CF的循環(huán)左移指令RCL和帶進(jìn)位標(biāo)志CF的循環(huán)右移指令RCR。

(1)不帶進(jìn)位標(biāo)志CF的循環(huán)左移指令ROL。

指令格式:

ROLOPRD,1

ROLOPRD,CL該指令的功能是將目標(biāo)操作數(shù)向左循環(huán)移動1位或者CL寄存器指定的位數(shù),左邊最高位移入CF的同時移入右邊最低位,如此循環(huán)。

若移動次數(shù)為1,移位后如果操作數(shù)新的最高位和CF不相同,則OF=1,否則OF=0。若移位次數(shù)大于1,則OF值不定。

(2)不帶進(jìn)位標(biāo)志CF的循環(huán)右移指令ROR。

指令格式:

ROROPRD,1

ROROPRD,CL

該指令的功能是將目標(biāo)操作數(shù)向右循環(huán)移動1位或者CL寄存器指定的位數(shù),右邊最低位移入CF的同時移入左邊最高位,如此循環(huán)。

若移動次數(shù)為1,移位后如果操作數(shù)新的最高位和次高位不相同,則OF?=?1,否則OF?=?0。若移位次數(shù)大于1,則OF值不定。

(3)帶進(jìn)位標(biāo)志CF的循環(huán)左移指令RCL。

指令格式:

RCLOPRD,1

RCLOPRD,CL

該指令的功能是將目標(biāo)操作數(shù)連同進(jìn)位標(biāo)志位CF一起向左循環(huán)移動1位或者CL寄存器指定的位數(shù),左邊最高位移入CF的同時移入右邊最低位,如此循環(huán)。

該指令對標(biāo)志位的影響和ROL指令一樣。

(4)帶進(jìn)位標(biāo)志CF的循環(huán)右移指令RCR。

指令格式:

RCROPRD,1

RCROPRD,CL

該指令的功能是將目標(biāo)操作數(shù)連同進(jìn)位標(biāo)志位CF一起向右循環(huán)移動1位或者CL寄存器指定的位數(shù),右邊最低位移入CF的同時移入左邊最高位,如此循環(huán)。

移位指令的操作如圖3.12所示。圖3.12移位指令的操作

【例3.11】

要求測試AL寄存器中第5位是1還是0。

MOV CL,3

ROL AL,CL

JNC ZERO

3.3.4串操作指令

字符串或者數(shù)據(jù)串是指存儲器中地址連續(xù)的若干單位的字符或數(shù)據(jù)。所謂串操作就是對串中的每個字符或數(shù)據(jù)做同樣的操作。

8086串操作指令包含串傳送指令MOVS、串比較指令CMPS、串掃描指令SCAS、串裝入指令LODS和串存儲指令STOS,這五種串操作指令有以下特點(diǎn):

(1)源串的偏移地址由SI寄存器給出,默認(rèn)段基址在DS段中,允許段重設(shè);目標(biāo)串偏移地址由DI給出,默認(rèn)段基址在ES段中,且不允許段重設(shè)。

(2)串長度放在CX寄存器中。

(3)串操作的地址指針是自動修改的,DF?=?0時,SI和DI向地址增量方向修改;DF?=?1時,SI和DI向地址減量方向修改。每次修改的地址值由指令是對字節(jié)操作還是對字操作決定。

(4)串操作指令可以結(jié)合重復(fù)前綴使用。重復(fù)前綴包括:

無條件重復(fù)前綴REP——重復(fù)執(zhí)行指令規(guī)定的操作直至CX?=?0;

相等/結(jié)果為零時重復(fù)前綴REPE/REPZ——ZF=1且CX≠0時重復(fù)執(zhí)行規(guī)定操作;

不相等/結(jié)果補(bǔ)為零時重復(fù)前綴REPNE/REPNZ——ZF?=?0且CX?≠?0時重復(fù)執(zhí)行規(guī)定操作。

重復(fù)前綴可以實現(xiàn)自動修改串長度CX的值,重復(fù)進(jìn)行指定操作直至CX?=?0或滿足指定條件,程序中加重復(fù)前綴可簡化程序,加快運(yùn)行速度,但是重復(fù)前綴不可單獨(dú)使用。

1)串傳送指令MOVS

指令格式:

MOVSOPRD1,OPRD2(格式一)

MOVSB(格式二)

MOVSW(格式三)

格式一是將源串地址中的字節(jié)或字送到目標(biāo)串地址中,源串允許使用段重設(shè)。格式二和格式三兩種格式均隱含了操作數(shù)的地址,使用這兩種格式時,源串和目標(biāo)串必須滿足默認(rèn)要求。串傳送指令可以實現(xiàn)存儲器和存儲器之間的數(shù)據(jù)傳送。該指令的執(zhí)行不影響標(biāo)志位。執(zhí)行操作:

(1)?((DI))←((SI))。

(2)執(zhí)行MOVSB時:(SI)←(SI)?±?1,(DI)←(DI)±1;方向標(biāo)志位DF?=?0時執(zhí)行“+1”,DF?=?1時執(zhí)行“-1”。

(3)執(zhí)行MOVSW時:(SI)←(SI)±2,(DI)←(DI)±2;方向標(biāo)志位DF?=?0時執(zhí)行“+2”,DF?=?1時執(zhí)行“-2”。

源操作數(shù)據(jù)地址由DS:SI指定,目的操作數(shù)地址由ES:DI指定。指令執(zhí)行時,由DF標(biāo)志位控制SI和DI是增大還是減小。

2)串比較指令CMPS

指令格式:

CMPSOPRD1,OPRD2

CMPSB

CMPSW

若配合條件重復(fù)前綴,串比較指令的結(jié)束有兩種情況:一種是不滿足條件前綴要求的條件,另一種是CX?=?0。因此在程序中需要利用ZF標(biāo)志位判斷是哪種結(jié)束情況。執(zhí)行操作:

(1)?((DI))-((SI))。

(2)執(zhí)行CMPSB時:(SI)←(SI)±1,(DI)←(DI)?±?1;方向標(biāo)志位DF?=?0時執(zhí)行“+1”,DF?=?1時執(zhí)行“-1”。

(3)執(zhí)行CMPSW時:(SI)←(SI)?±?2,(DI)←(DI)±2;方向標(biāo)志位DF?=?0時執(zhí)行“+2”,DF?=?1時執(zhí)行“-2”。

指令把由(SI)指向的數(shù)據(jù)段中的一個字節(jié)(或字)與由(DI)指向的附加段中的一個字節(jié)(或字)相減,但不產(chǎn)生運(yùn)算結(jié)果,僅影響狀態(tài)標(biāo)志位CF、PF、ZF、SF、OF,其余與串傳送指令相同。

【例3.14】

比較串長為20的兩個字節(jié)串,找出其中第一個不相等字符的地址并存放在SI、DI;若兩串完全相同,則給SI、DI賦0。

3)串掃描指令SCAS

指令格式:

SCASOPRD;OPRD為目標(biāo)串

SCASB

SCASW

該指令的功能和CMPS指令類似,區(qū)別是SCAS指令是用累加器AL或者AX的內(nèi)容與目標(biāo)串中的字節(jié)或者字進(jìn)行比較,且比較的結(jié)果不改變目標(biāo)操作數(shù),只對標(biāo)志位產(chǎn)生影響。SACS指令常用來搜索一個字符串中的特定關(guān)鍵字。

執(zhí)行操作:

(1)執(zhí)行SCASB時:(AL)-((DI)),(DI)←(DI)?±?1;方向標(biāo)志位DF?=?0時執(zhí)行“+”,DF?=?1時執(zhí)行“-”。

(2)執(zhí)行SCASW時:(AX)-((DI)),(DI)←(DI)?±?2;方向標(biāo)志位DF?=?0時執(zhí)行“+”,DF?=?1時執(zhí)行“-”。

指令把AL(或AX)的內(nèi)容與由(DI)指定的在附加段中的一個字節(jié)(或字)進(jìn)行比較,但不保存結(jié)果,僅影響狀態(tài)標(biāo)志位CF、PF、ZF、SF、OF,其余與串傳送指令相同。

【例3.15】

在首地址為STRING的包含100個字符的字符串中尋找第一個回車符CR,找到后將其地址保留在(ES:DI)中,并在屏幕上顯示字符'Y'。如果字符串中沒有回車符,則在屏幕上顯示字符'N'。

4)串裝入指令LODSB/W

指令格式:

LODSB/WOPRD;OPRD為源串

該指令的功能是把源串的字節(jié)或者字放入累加器AL或者AX中。LODS指令一般不和重復(fù)前綴一起使用,因為重復(fù)一次,AL或者AX中的內(nèi)容就會被新的內(nèi)容覆蓋一次。

執(zhí)行操作:

(1)執(zhí)行LODSB時:(AL)←((SI)),(SI)←(SI)?±?1;方向標(biāo)志位DF?=?0時執(zhí)行“+”,DF?=?1時執(zhí)行“-”。

(2)執(zhí)行LODSW時:(AX)←((SI)),(SI)←(SI)?±?2;方向標(biāo)志位DF?=?0時執(zhí)行“+”,DF?=?1時執(zhí)行“-”。指令把由(SI)指向的數(shù)據(jù)段中某單元的內(nèi)容送到AL或AX中,并根據(jù)方向標(biāo)志位及數(shù)據(jù)類型修改SI的內(nèi)容。該指令的執(zhí)行對標(biāo)志位不產(chǎn)生影響。

5)串存儲指令STOSB/W

指令格式:

STOSB/WOPRD;OPRD為目標(biāo)串

該指令的功能是把累加器AL或者AX的內(nèi)容放入ES:DI指向的存儲器單元中。

執(zhí)行操作:

(1)執(zhí)行STOSB時:((DI))←(AL),(DI)←(DI)?±?1;方向標(biāo)志位DF?=?0時執(zhí)行“+”,DF?=?1時執(zhí)行“-”。

(2)執(zhí)行STOSW時:((DI))←(AX),(DI)←(DI)?±?2;方向標(biāo)志位DF?=?0時執(zhí)行“+”,DF?=?1時執(zhí)行“-”。

該指令把AL或AX的內(nèi)容存入由(DI)指向的附加段的單元中,并根據(jù)DF及數(shù)據(jù)類型修改DI的內(nèi)容。該指令的執(zhí)行對標(biāo)志位不產(chǎn)生影響。

【例3.16】

一個數(shù)據(jù)塊由大寫或小寫的英文字母、數(shù)字和各種其他符號組成,其結(jié)束符是回車符CR,數(shù)據(jù)塊的首地址為BLOCK1。要求將數(shù)據(jù)塊傳送到以BLOCK2為首地址的內(nèi)存區(qū),并將其中的所有英文小寫字母轉(zhuǎn)換成相應(yīng)的大寫字母,其余不變。3.3.5程序控制指令

1.轉(zhuǎn)移指令

轉(zhuǎn)移指令包括無條件轉(zhuǎn)移指令和條件轉(zhuǎn)移指令兩種。

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

無條件轉(zhuǎn)移指令是無條件地使程序轉(zhuǎn)移到指定的目標(biāo)地址,執(zhí)行該地址開始的程序段。無條件轉(zhuǎn)移指令按尋找目標(biāo)地址的方式分為直接轉(zhuǎn)移指令和間接轉(zhuǎn)移指令兩種。

(1)段內(nèi)直接轉(zhuǎn)移指令。

指令格式:

JMPLABEL

該指令中LABEL為符號地址,表示指令要轉(zhuǎn)移的目的地。該指令被匯編時,匯編程序會計算JMP的下一條指令到目標(biāo)地址的8位或16位偏移量,對應(yīng)的轉(zhuǎn)移范圍分別為-128~+127字節(jié)和-32?768~+32?767字節(jié)。段內(nèi)轉(zhuǎn)移的標(biāo)號前可加運(yùn)算符NEAR,也可省略。默認(rèn)為段內(nèi)轉(zhuǎn)移。轉(zhuǎn)移后新的IP值為當(dāng)前IP值加上計算出的地址位移量,CS保持不變。

執(zhí)行操作:

(IP)←(EA)=(IP)?+?8位位移量/16位位移量

(2)段內(nèi)間接轉(zhuǎn)移指令。

指令格式:

JMPOPRD

該指令中的操作數(shù)OPRD為16位的寄存器或存儲器操作數(shù),指令執(zhí)行時以寄存器或存儲器單元的內(nèi)容作為轉(zhuǎn)移的目的地址,即新的IP位為寄存器或存儲器單元的內(nèi)容。

執(zhí)行操作:

(IP)←(EA)

(3)段間直接轉(zhuǎn)移指令。

指令格式:

JMPFARLABEL

該指令中利用FAR標(biāo)明其后的標(biāo)號LABEL是一個遠(yuǎn)標(biāo)號,即目標(biāo)地址在另一個代碼段內(nèi),匯編時將根據(jù)LABEL的位置確定新地址,并將段地址送入CS,偏移地址送入IP。

執(zhí)行操作:

(IP)←目標(biāo)地址的段內(nèi)偏移地址

(CS)←目標(biāo)地址所在段的段地址

(4)段間間接轉(zhuǎn)移指令。

指令格式:

JMPOPRD

執(zhí)行操作:

(IP)←(EA)

(CS)←(EA+2)

該指令中操作數(shù)OPRD為32位的存儲器操作數(shù)。其中EA由目標(biāo)地址的尋址方式確定,它可以使用除立即數(shù)及寄存器方式以外的任何存儲器尋址方式。根據(jù)尋址方式求出EA后,把指定存儲單元的字內(nèi)容送到IP寄存器,并把下一個字的內(nèi)容送到CS寄存器,即將OPRD指定的4個單元的內(nèi)容送入CS和IP。

2)條件轉(zhuǎn)移指令

8086指令系統(tǒng)有18條條件轉(zhuǎn)移指令,如表3.1所示。這些轉(zhuǎn)移指令都是根據(jù)前一條指令執(zhí)行后標(biāo)志位的狀態(tài)來決定是否轉(zhuǎn)移的。全部的條件轉(zhuǎn)移指令都是直接尋址方式的短轉(zhuǎn)移指令,即新的IP值在當(dāng)前IP值的-127~+128字節(jié)范圍內(nèi)。表3.1條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令是根據(jù)狀態(tài)標(biāo)志位的狀態(tài)決定是否跳轉(zhuǎn)的,因此在程序中,條件轉(zhuǎn)移指令的前一條指令應(yīng)是能夠?qū)?biāo)志位產(chǎn)生影響的指令。

【例3.17】

在DATA開始的存儲區(qū)中存放了100個16位帶符號數(shù),找出其中最大和最小的數(shù)分別存入以MAX和MIN為首地址的內(nèi)存單元。

程序如下:

2.循環(huán)控制指令

循環(huán)控制指令是指在程序中控制循環(huán)的指令,能夠控制轉(zhuǎn)向的目標(biāo)地址是在當(dāng)前IP的?-128~+127字節(jié)范圍內(nèi)。使用時循環(huán)次數(shù)須存放在CX寄存器中。8086的循環(huán)控制指令有LOOP、LOOPZ(LOOPE)和LOOPNZ(LOOPNE)三條。

1)?LOOP指令

指令格式:

LOOPLABEL

測試條件:

(CX)≠0該指令中的LABEL為一個近地址標(biāo)號。執(zhí)行時先將CX的內(nèi)容減1,再判斷CX的值。若CX0,則程序轉(zhuǎn)移到目標(biāo)地址繼續(xù)循環(huán);若CX?=?0,則退出循環(huán)程序,執(zhí)行下一條指令。在功能上,LOOP相當(dāng)于下述兩條指令的組合:

DECCX

JNZNEXT

2)?LOOPZ(或LOOPE)指令

指令格式:

LOOPZLABEL

LOOPELABEL

測試條件:

ZF?=?1且(CX)?≠?0

該指令執(zhí)行時先將CX的內(nèi)容減1,然后再根據(jù)CX和ZF的值來決定是否繼續(xù)循環(huán)。若CX≠0且ZF=1,則程序轉(zhuǎn)移到目標(biāo)地址繼續(xù)循環(huán);若CX=0或者ZF=0,則退出循環(huán),執(zhí)行下一條指令。

3)?LOOPNZ(或LOOPNE)指令

指令格式:

LOOPNZLABEL

LOOPNELABEL

測試條件:

ZF?=?0且(CX)?≠?0

該指令與LOOPZ指令功能相似,兩者的區(qū)別是該指令循環(huán)條件與LOOPZ指令相反,即執(zhí)行時先將CX的內(nèi)容減1,然后再根據(jù)CX和ZF的值來決定是否繼續(xù)循環(huán)。若CX≠0且ZF=0,則程序轉(zhuǎn)移到目標(biāo)地址繼續(xù)循環(huán);若CX=0或者ZF=1,則退出循環(huán),執(zhí)行下一條指令。這三條指令的執(zhí)行步驟是:

(1)?(CX)←(CX)-1;

(2)檢查是否滿足測試條件,如滿足則進(jìn)行(IP)←(IP)+D8的符號地址跳轉(zhuǎn)。

3.過程調(diào)用指令

為了節(jié)省內(nèi)存空間,通常將程序中常用到的具有相同功能、會多次反復(fù)出現(xiàn)的程序段獨(dú)立出來,形成一個模塊,稱為子程序。需要使用該模塊功能時則用主程序直接調(diào)用子程序,完成對應(yīng)功能后,返回主程序繼續(xù)執(zhí)行,這一過程就稱為過程的調(diào)用和返回。

1)調(diào)用指令CALL

調(diào)用指令CALL在執(zhí)行時,CPU自動將主程序下一條指令的地址入棧保護(hù),然后將子程序的入口地址送到CS和IP,實現(xiàn)程序轉(zhuǎn)入子程序執(zhí)行。根據(jù)子程序的存放位置,調(diào)用指令有四種形式:段內(nèi)直接調(diào)用、段內(nèi)間接調(diào)用、段間直接調(diào)用和段間間接調(diào)用。

(1)段內(nèi)直接調(diào)用。

指令格式

溫馨提示

  • 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

提交評論