微機(jī)原理及應(yīng)用 課件 第3章 80868088指令系統(tǒng)_第1頁
微機(jī)原理及應(yīng)用 課件 第3章 80868088指令系統(tǒng)_第2頁
微機(jī)原理及應(yīng)用 課件 第3章 80868088指令系統(tǒng)_第3頁
微機(jī)原理及應(yīng)用 課件 第3章 80868088指令系統(tǒng)_第4頁
微機(jī)原理及應(yīng)用 課件 第3章 80868088指令系統(tǒng)_第5頁
已閱讀5頁,還剩104頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

微機(jī)原理及應(yīng)用第3章8086/8088指令系統(tǒng)

理解指令系統(tǒng)基本概念掌握指令系統(tǒng)涉及到的各種尋址方式

掌握六大類指令的功能和使用方法學(xué)習(xí)目標(biāo):3.1概述返回3.1.1指令的基本構(gòu)成3.1.2指令的執(zhí)行時(shí)間3.1概述指令是控制計(jì)算機(jī)完成指定操作,并且能夠被計(jì)算機(jī)所識(shí)別的命令。計(jì)算機(jī)所能識(shí)別的所有指令的集合稱作指令系統(tǒng),不同系列計(jì)算機(jī)(或者說不同的微處理器)有著不同的指令系統(tǒng)。指令系統(tǒng)定義了計(jì)算機(jī)硬件所能完成的基本操作,其功能的強(qiáng)弱在一定程度上決定了硬件系統(tǒng)性能的高低。與上一代微處理器的指令系統(tǒng)相比,8086/8088指令系統(tǒng)的功能有了很大擴(kuò)充,主要表現(xiàn)在:1)有8個(gè)通用寄存器均可作累加器使用。2)可進(jìn)行字節(jié)或字的處理。3)有重復(fù)指令和乘除運(yùn)算指令。4)擴(kuò)充了條件轉(zhuǎn)移,移位/循環(huán)指令。5)可進(jìn)行有符號(hào)數(shù)的運(yùn)算。6)有軟中斷和協(xié)調(diào)多處理器工作的指令。3.1概述按照功能可將8086/8088CPU的指令系統(tǒng)劃分為六大類,見表3-1。

3.1概述3.1.1指令的基本構(gòu)成

一條指令通常由兩部分組成,如圖3-1所示。第一部分為操作碼(也稱指令碼,指令助記符),這一部分是指令中必須存在的部分。必要時(shí),可在操作碼的前面加上前綴。第二部分是操作數(shù),即指令操作的對(duì)象。有些指令不需要操作數(shù),此時(shí)指令只由操作碼組成;有些指令只需要一個(gè)操作數(shù);有些指令則需要兩個(gè)操作數(shù),這時(shí)必須用逗號(hào)將兩個(gè)操作數(shù)分開。

1.指令的一般格式

3.1.1指令的基本構(gòu)成

根據(jù)操作數(shù)的個(gè)數(shù),指令在格式上具有以下3種形式。(1)零操作數(shù)指令。指令在形式上只有一個(gè)操作碼。這類指令操作的對(duì)象通常是處理器本身,如指令“HLT”。(2)單操作數(shù)指令。指令在形式上只有一個(gè)操作數(shù),如指令“INCCX”。(3)雙操作數(shù)指令。指令在形式上有兩個(gè)操作數(shù),這兩個(gè)操作數(shù)必須用逗號(hào)分開,分別表示目標(biāo)操作數(shù)(也稱目的操作數(shù))和源操作數(shù),格式如圖3-1所示。如指令“MOVAX,2000H”,其中AX表示目標(biāo)操作數(shù),2000H表示源操作數(shù)。3.1.1指令的基本構(gòu)成

2.指令中的操作數(shù)類型

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

立即數(shù)是指具有固定數(shù)值的操作數(shù),即常數(shù),在程序執(zhí)行過程中不會(huì)發(fā)生變化。

需要注意的是立即數(shù)操作數(shù)在指令中只能用作源操作數(shù)。(2)寄存器操作數(shù)8086/8088CPU的8個(gè)通用寄存器和4個(gè)段寄存器可以作為指令中的寄存器操作數(shù),它們都可以作為源操作數(shù)。除了代碼段寄存器CS,其他的寄存器也可以作為目標(biāo)操作數(shù)。

通用寄存器通常用來存放參加運(yùn)算的數(shù)據(jù)或者數(shù)據(jù)所在存儲(chǔ)器單元的偏移地址。段寄存器用來存放當(dāng)前操作數(shù)的段地址。

(3)存儲(chǔ)器操作數(shù)存儲(chǔ)器操作數(shù)是指參加運(yùn)算的操作數(shù)存放在存儲(chǔ)單元當(dāng)中。3.1.1指令的基本構(gòu)成

3.段重設(shè)

8086/8088對(duì)段寄存器使用的約定和允許段重設(shè)的情況見表3-2。

3.1.2指令執(zhí)行時(shí)間

一條指令的執(zhí)行時(shí)間包括:取指令、取操作數(shù)、執(zhí)行指令及傳送結(jié)果等幾個(gè)部分,單位用時(shí)鐘周期數(shù)表示。不同指令的執(zhí)行時(shí)間有較大的差別。

寄存器操作數(shù)的指令執(zhí)行速度最快,其次是立即數(shù)操作數(shù)指令,存儲(chǔ)器操作數(shù)指令的執(zhí)行速度最慢。這是由于寄存器在CPU內(nèi)部,執(zhí)行指令時(shí),CPU的執(zhí)行單元可以直接從CPU內(nèi)部的寄存器中獲取操作數(shù),不需訪問內(nèi)存,因此執(zhí)行速度很快;對(duì)于立即數(shù)操作數(shù),由于立即數(shù)操作數(shù)是指令的一部分,因此它位于總線接口單元的指令隊(duì)列中,執(zhí)行指令時(shí)也不需要訪問內(nèi)存,因此執(zhí)行速度也比較快;而存儲(chǔ)器操作數(shù)位于內(nèi)存單元中,為了獲取操作數(shù),首先要由總線接口單元計(jì)算出該操作數(shù)所在的20位物理地址,由于對(duì)內(nèi)存進(jìn)行了訪問,因此相對(duì)前兩類操作數(shù)指令而言,存儲(chǔ)器操作數(shù)指令的執(zhí)行速度最慢。3.2尋址方式返回3.2.1立即尋址3.2.2寄存器尋址3.2.3直接尋址3.2.4寄存器間接尋址3.2.5寄存器相對(duì)尋址3.2.6基址—變址尋址3.2.7基址—變址相對(duì)尋址3.2.8隱含尋址3.2.1立即尋址立即尋址

方式只針對(duì)源操作數(shù)。立即尋址的作用是對(duì)寄存器或內(nèi)存單元賦初值。立即尋址需要注意的幾點(diǎn):1)立即尋址只針對(duì)源操作數(shù),目標(biāo)操作數(shù)不能是立即數(shù)。例如指令“MOV1234H,AX”是一條錯(cuò)誤的指令。2)8086/8088系統(tǒng)中,立即數(shù)可以是8位的或16位的整數(shù)。對(duì)于16位的立即數(shù),它嚴(yán)格按照“高高低低”的原則進(jìn)行存儲(chǔ),即低8位在低地址單元中存放,高8位在高地址單元中存放。3.2.1立即尋址【例3.1】指令“MOVAX,1234H”表示將16位立即數(shù)1234H送入累加寄AX中,指令執(zhí)行后,AH=12H,AL=34H。指令執(zhí)行過程如圖3-2所示。3.2.2

寄存器尋址在寄存器尋址方式下,指令的操作數(shù)位于CPU的內(nèi)部寄存器中。這些寄存器可以是8位的通用寄存器,也可以是16位的通用寄存器,還可以是地址指針、變址寄存器以及段寄存器。寄存器尋址指令的操作數(shù)既可以是源操作數(shù),也可以是目標(biāo)操作數(shù),指令中直接給出寄存器名稱?!纠?.2】指令“MOVAX,BX”表示將BX中的內(nèi)容放入AX中。指令執(zhí)行前AX=1122H,BX=3344H,則指令執(zhí)行后,BX的內(nèi)容保持不變,AX=3344H,指令的執(zhí)行過程如圖3-3所示。3.2.3

直接尋址直接尋址方式表示操作數(shù)存放在內(nèi)存單元中,存放的地址由指令直接給出,即指令中的操作數(shù)是存儲(chǔ)器操作數(shù)。由于操作數(shù)的地址直接給出而不需要經(jīng)過某種變換,所以稱這種尋址方式稱為直接尋址方式。直接尋址需要注意的幾點(diǎn):1)在程序中,直接尋址的地址要寫在方括號(hào)“[]”內(nèi)。2)在直接尋址中,指令操作數(shù)字段中存放的是操作數(shù)的16位偏移地址EA,操作數(shù)的物理地址由其所在段的寄存器內(nèi)容左移4位與指令中給出的偏移地址EA相加形成。3)如果沒有特殊說明,直接尋址的操作數(shù)一般在內(nèi)存的數(shù)據(jù)段中,即隱含的段寄存器是DS。但是8086/8088也允許段重設(shè)此時(shí)需要在指令中要用段重設(shè)符號(hào)加以聲明。方法是在有關(guān)操作數(shù)的前面寫上段寄存器的名字,再加上冒號(hào)。3.2.3

直接尋址【例3.4】指令“MOVAX,[1234H]”表示將數(shù)據(jù)段中的偏移地址為1234H、1235H兩個(gè)單元中的內(nèi)容送到累加器AX中。該指令是字操作,高地址單元的內(nèi)容送到累加器的高8位AH,低地址單元的內(nèi)容送到累加器的低8位AL。假設(shè)DS=3000H,則所尋找的操作數(shù)的物理地址為DS×10H+1234H=31234H指令的執(zhí)行情況如圖3-4所示。3.2.4寄存器間接尋址寄存器間接尋址與寄存器尋址的根本不同在于寄存器所表達(dá)的內(nèi)容不同。寄存器間接尋址是用寄存器的內(nèi)容表示操作數(shù)的偏移地址,而寄存器尋址是用寄存器的內(nèi)容表示操作數(shù)本身。寄存器間接尋址指令中的操作數(shù)在存儲(chǔ)單元中,用于存放操作數(shù)偏移地址的寄存器只能是BX、BP、SI或者DI四個(gè)寄存器之一,因此它們也簡(jiǎn)稱為間址寄存器或地址寄存器。默認(rèn)情況下,選擇SI、DI、BX作為間址寄存器時(shí),操作數(shù)在數(shù)據(jù)段,段地址由DS決定;選擇BP作為間址寄存器時(shí),則操作數(shù)在堆棧段,段地址由SS決定??梢远沃卦O(shè)。3.2.4寄存器間接尋址【例3.5】選擇SI、DI、BX作間址寄存器,則操作數(shù)的物理地址為DS×10H+EA=DS×10H+(BX、SI、DI之一)如果DS=1000H,SI=2000H,則執(zhí)行指令“MOVAX,[SI]”,計(jì)算得存儲(chǔ)單元物理地址:DS×10H+SI=12000H。具體執(zhí)行過程如圖3-5所示。執(zhí)行結(jié)果:AX=2211H。3.2.4寄存器間接尋址【例3.6】選擇BP作間址寄存器,則操作數(shù)的物理地址為SS×10H+EA=SS×10H+BP若SS=1000H,

BP=3000H,

AX=2211H,執(zhí)行指令MOV[BP],

AX計(jì)算存儲(chǔ)單元物理地址:SS×10H+BP=13000H執(zhí)行過程如圖3-6所示。3.2.5

寄存器相對(duì)尋址在寄存器相對(duì)尋址中,操作數(shù)在內(nèi)存中的偏移地址由間址寄存器的內(nèi)容加上指令中給出的位移量組成。這個(gè)位移量可以是8位的,也可以是16位的。因?yàn)槲灰屏靠梢钥醋饕粋€(gè)相對(duì)值,所以把這種帶有位移量的寄存器間接尋址稱為寄存器相對(duì)尋址。

計(jì)算偏移地址的方法如下:3.2.5

寄存器相對(duì)尋址【例3.7】指令“MOVAX,DATA[BX]”的尋址過程實(shí)例。設(shè)DS=1000H,BX=2000H,DATA=0005H,則操作數(shù)所在的物理地址=DS×10H+BX+DATA=10000H+2000H+0005H=12005H。執(zhí)行結(jié)果:AX=3344H。執(zhí)行過程如圖3-7所示。3.2.6基址—變址尋址基址—變址尋址方式由一個(gè)基址寄存器的內(nèi)容和一個(gè)變址寄存器的內(nèi)容相加而形成操作數(shù)的偏移地址。在基址—變址尋址方式中,通常把BX和BP看作是基址寄存器,把SI和DI看作變址寄存器。而段寄存器則根據(jù)所使用的基址寄存器而定:若用BX作為基地址,則操作數(shù)在數(shù)據(jù)段區(qū)域,段地址由DS決定;若用BP作為基地址,則操作數(shù)在堆棧段區(qū)域,段地址由SS決定,但允許段重設(shè)。注意:使用基址—變址尋址方式時(shí),不允許將兩個(gè)基址寄存器或兩個(gè)變址寄存器組合在一起使用,即指令中不允許同時(shí)出現(xiàn)兩個(gè)基址寄存器或兩個(gè)變址寄存器;也不允許出現(xiàn)其他的寄存器。3.2.6基址—變址尋址【例3.9】指令“MOVAX,[BX][SI]”的尋址過程如圖3-8所示。設(shè)DS=1000H,BX=2000H,SI=1000H,則操作數(shù)的物理地址=DS×10H+BX+SI=10000H+2000H+1000H=13000H。指令執(zhí)行后,AL=(13000H)=77H,AH=(13001H)=88H,即AX=8877H。3.2.7

基址—變址相對(duì)尋址基址—變址相對(duì)尋址方式實(shí)際上是基址—變址尋址方式的擴(kuò)充。指令中規(guī)定了一個(gè)基址寄存器(BX和BP兩者之一)和一個(gè)變址寄存器(SI和DI兩者之一),同時(shí)還給出一個(gè)8位或16位的位移量,將三者的內(nèi)容相加得到操作數(shù)的有效地址。同樣地,基址—變址相對(duì)尋址指令不允許同時(shí)出現(xiàn)兩個(gè)基址寄存器或者兩個(gè)變址寄存器;也不允許出現(xiàn)其他寄存器。

3.2.7

基址—變址相對(duì)尋址【例3.10】指令“MOVAX,DATA[DI][BX]”的尋址過程示例。

假設(shè)DS=8000H,BX=2000H,DI=1000H,DATA=200H。

由于使用的基址寄存器是BX,且沒有進(jìn)行段重設(shè),所以該指令操作數(shù)的物理地址是:

DS×10H+BX+DI+DATA=80000H+2000H+1000H+200H=83200H。由于是字操作,所以該指令把地址為83200H的兩個(gè)連續(xù)存儲(chǔ)單元的內(nèi)容送到AX。

執(zhí)行結(jié)果:AX=6655H。

指令執(zhí)行過程如圖3-9所示。

3.2.8隱含尋址有的指令操作碼中,不僅包含操作碼的性質(zhì),還隱含了部分操作數(shù)的地址,這種將一個(gè)操作數(shù)隱含在指令碼中的尋址方式稱為隱含尋址。如指令“MULBL”的功能是把AL中的內(nèi)容與BL中的內(nèi)容相乘,乘積送到AX寄存器,這條指令隱含了被乘數(shù)AL及乘積AX。由于隱含尋址指令的操作數(shù)實(shí)質(zhì)上也是位于CPU內(nèi)部的寄存器中,所以有的教材把這種尋址方式歸結(jié)為寄存器尋址。3.38086/8088指令系統(tǒng)返回3.3.1數(shù)據(jù)傳送指令3.3.2算術(shù)運(yùn)算指令3.3.3邏輯運(yùn)算和移位指令3.3.4串操作指令3.3.5程序控制指令3.3.6處理器控制指令3.3.1數(shù)據(jù)傳送指令1.通用數(shù)據(jù)傳送指令

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

(1)一般傳送指令MOV

指令格式:MOVDST,

SRC;DST←SRC指令功能:將源操作數(shù)SRC的內(nèi)容傳送到目標(biāo)操作數(shù)DST中。1)指令特點(diǎn)①既可以傳送字節(jié)操作數(shù),也可以傳送字操作數(shù)。一次傳送的數(shù)到底是字節(jié)還是字取決于指令中涉及的寄存器是8位還是16位。②可以使用3.2節(jié)討論過的各種尋址方式。3.3.1數(shù)據(jù)傳送指令2)指令實(shí)現(xiàn)的操作

①寄存器與寄存器、寄存器與段寄存器之間的傳送,如:MOVBX,SI

MOVDS,AX

②寄存器與存儲(chǔ)器之間的傳送,如:MOV[1000H],DX

MOVAX,[1200H]

MOVAH,[1200H]

③立即數(shù)到寄存器、立即數(shù)到存儲(chǔ)單元,如:MOV[1000H],10H

MOVAX,1020H

④存儲(chǔ)器與段寄存器之間的傳送,如:

MOVDS,[1020H]3.3.1數(shù)據(jù)傳送指令3)指令對(duì)操作數(shù)的要求

①M(fèi)OV指令中兩個(gè)操作數(shù)字長(zhǎng)必須相同,可同為字節(jié)或字操作數(shù),這決定于寄存器是8位還是16位,也取決于立即數(shù)的形式。②兩個(gè)操作數(shù)不能同時(shí)為存儲(chǔ)器操作數(shù)或段寄存器。

③立即數(shù)不能傳送到段寄存器中。④一般情況下,段寄存器CS和指令指針寄存器IP不能作目標(biāo)操作數(shù),只能為源操作數(shù)。

⑤雖然許多指令的執(zhí)行都對(duì)狀態(tài)寄存器FLAGS的標(biāo)志位產(chǎn)生影響,但通常情況下,F(xiàn)LAGS整體不作為操作數(shù)。3.3.1數(shù)據(jù)傳送指令(2)堆棧操作指令

1)堆棧的概念

堆棧實(shí)際上是內(nèi)存中的一個(gè)特定內(nèi)存區(qū)域,在這個(gè)特定內(nèi)存區(qū)域里有其規(guī)定的操作原則,即先進(jìn)后出。8086/8088指令系統(tǒng)提供了專用的堆棧操作指令,即壓入堆棧指令(壓棧指令)PUSH和彈出堆棧指令(出棧指令)POP。

堆棧操作必須遵循以下原則:①堆棧操作必須是字操作,而且堆棧指令中的操作數(shù)只能是寄存器操作數(shù)或存儲(chǔ)器操作數(shù),不能是立即數(shù)。

3.3.1數(shù)據(jù)傳送指令②堆棧段在內(nèi)存的位置由堆棧段寄存器SS決定,SP寄存器作為堆棧的指針,其始終指向棧頂所在存儲(chǔ)單元;由于對(duì)堆棧的操作按“先進(jìn)后出”的原則進(jìn)行,因此堆棧只有一個(gè)出入口,這個(gè)出入口就是棧頂,即SP所指的位置,而棧底是固定不變的。堆棧區(qū)示意圖如圖3-10所示。③向堆棧中存放數(shù)據(jù)(壓棧操作)時(shí),總是從高地址向低地址方向變化,此時(shí),SP的值變??;從堆棧中取數(shù)據(jù)出棧操作)時(shí),總是從低地址向高地址方向變化,SP的值變大。由于只能是字操作,SP的變化量是2的倍數(shù)。3.3.1數(shù)據(jù)傳送指令2)堆棧操作指令

堆棧操作指令共有兩條,分別是壓入堆棧指令(壓棧指令)PUSH和彈出堆棧指令(出棧指令)POP。其格式是:

PUSHSRC

POPDST指令中的操作數(shù)SRC和DST必須為16位的字操作數(shù),它們可以是:①16位的通用寄存器或段寄存器(CS除外,PUSHCS指令是合法的,而POPCS指令是非法的);②存儲(chǔ)器單元(地址連續(xù)的兩個(gè)儲(chǔ)存單元)。

3.3.1數(shù)據(jù)傳送指令3)堆棧操作指令的執(zhí)行過程

①壓棧指令執(zhí)行過程壓棧指令“PUSHOPRD”是將指令中指定的字操作數(shù)壓入堆棧,指令的執(zhí)行過程為:

OPRD的高字節(jié)→(SP-1)

OPRD的低字節(jié)→(SP-2)

SP-2→SP②出棧指令執(zhí)行過程

出棧指令“POPOPRD”是將當(dāng)前棧頂?shù)囊粋€(gè)字送到指令指定的目標(biāo)地址,指令的執(zhí)行過程為:

(SP)→OPRD的低字節(jié)

(SP+1)→OPRD的高字節(jié)

SP+2→SP3.3.1數(shù)據(jù)傳送指令4)堆棧操作注意事項(xiàng)

①堆棧棧頂隱含尋址,這個(gè)操作數(shù)就是SP指示的棧頂存儲(chǔ)單元。堆棧操作指令的操作數(shù)不能是立即數(shù)。對(duì)于操作數(shù)是段寄存器的情況,需要注意代碼段寄存器CS。CS寄存器可進(jìn)棧,但不能隨意彈出一個(gè)數(shù)據(jù)到CS。②堆棧操作總是以字為單位進(jìn)行,不允許對(duì)字節(jié)或者雙字進(jìn)行操作。

③在使用堆棧操作保存多個(gè)寄存器內(nèi)容和恢復(fù)多個(gè)寄存器時(shí),要按“先進(jìn)后出”原則來組織進(jìn)棧和出棧的順序。保存數(shù)據(jù)入棧順序和恢復(fù)數(shù)據(jù)出棧次序相反。

④堆棧的容量有限,一般而言,進(jìn)棧和出棧要成對(duì)出現(xiàn),否則將有數(shù)據(jù)殘留在堆棧中,時(shí)間一長(zhǎng),堆棧會(huì)滿的。3.3.1數(shù)據(jù)傳送指令(3)交換指令XCHG

指令格式:XCHGDST,SRC;交換DST與SRC的內(nèi)容

指令功能:交換指令XCHG(Exchange)使得源操作數(shù)和目標(biāo)操作數(shù)的內(nèi)容進(jìn)行了交換。注意事項(xiàng):

①源操作數(shù)和目標(biāo)操作數(shù)可以是寄存器和存儲(chǔ)器,但不能同時(shí)為存儲(chǔ)器;

②段寄存器和立即數(shù)不能作為操作數(shù)來使用;

③源操作數(shù)和目標(biāo)操作數(shù)的字長(zhǎng)必須一致,可以是字交換,也可以是字節(jié)交換;

④CS和IP不能作為操作數(shù)。3.3.1數(shù)據(jù)傳送指令(4)查表指令XLAT

XLAT是一條字節(jié)的查表轉(zhuǎn)換指令,該指令可以根據(jù)表中元素的序號(hào)查出表中相應(yīng)元素的內(nèi)容。

該指令有默認(rèn)的寄存器,因此,在執(zhí)行該指令之前,需要進(jìn)行相應(yīng)的設(shè)置,即表設(shè)置。首先,將表的首地址(偏移地址)送到寄存器BX,然后,將要查找的元素的序號(hào)送至寄存器AL。執(zhí)行XLAT指令后,表中指定序號(hào)的元素送至寄存器AL中。由于要查找的內(nèi)容放在AL中,所以該指令必須是字節(jié)操作。

指令格式為:

XLAT;將偏移地址為BX+AL所指單元的內(nèi)容送到AL中

或者XLATSCR_TABLE;SCR_TABLE表示要查找的表的首地址3.3.1數(shù)據(jù)傳送指令2.輸入/輸出(I/O)指令

輸入/輸出指令是專門面向輸入/輸出端口進(jìn)行讀寫的指令,即用來完成累加器(AX或AL)與I/O端口之間的數(shù)據(jù)傳送功能。輸入/輸出指令共有兩條,分別是輸入指令I(lǐng)N和輸出指令OUT。輸入/輸出指令也稱為累加器專用傳送指令。在輸入/輸出指令中,有兩種尋址方式:1)直接尋址方式

I/O端口地址為8位,端口地址范圍為0~FFH。端口地址以8位立即數(shù)方式在指令中直接給出。2)寄存器間接尋址方式

端口地址為16位,端口地址范圍為0~FFFFH。在寄存器間接尋址方式下,端口地址放到DX中。3.3.1數(shù)據(jù)傳送指令(1)輸入指令I(lǐng)N

指令格式為:

IN累加器,PORT;直接尋址,PORT為8位立即數(shù)

IN累加器,DX;間接尋址,16位端口地址由DX給出

指令功能:將指定端口中的內(nèi)容送到累加器AX/AL中。(2)輸出指令OUT

指令格式為:

OUTPORT,累加器;直接尋址,PORT為8位立即數(shù)

OUTDX,累加器;間接尋址,16位端口地址由DX給出

指令功能:把AL或AX中的內(nèi)容輸出到指定端口。3.3.1數(shù)據(jù)傳送指令3.目標(biāo)地址傳送指令

(1)取偏移地址指令LEA。指令格式為:LEAreg16,mem;reg16表16位的寄存器,mem表存儲(chǔ)器操作數(shù)指令功能:把源操作數(shù)存儲(chǔ)器操作數(shù)mem的16位偏移地址送到指定的寄存器中。該指令需要注意以下兩點(diǎn):①源操作數(shù)必須是存儲(chǔ)器操作數(shù);②目標(biāo)操作數(shù)必須是一個(gè)16位的通用寄存器。由于寄存器常用來作為地址指針,因此最好選用四個(gè)間址寄存器。3.3.1數(shù)據(jù)傳送指令(2)遠(yuǎn)地址傳送指令LDS指令格式:LDSreg16,mem32指令功能:完成一個(gè)地址指針的傳送。地址指針有4個(gè)字節(jié),其中,前2個(gè)字節(jié)作為偏移量送入一個(gè)指定的16位基址寄存器或變址寄存器,后2個(gè)字節(jié)作為段地址送入數(shù)據(jù)段寄存器DS中。要求:源操作數(shù)必須是存儲(chǔ)單元操作數(shù),mem32表示存儲(chǔ)器單元中連續(xù)4個(gè)單元(32位)的首地址;目標(biāo)操作數(shù)必須是寄存器,可以是基址寄存器或變址寄存器(BX,BP,SI,DI)。(3)遠(yuǎn)地址傳送指令LES

LES與LDS功能類似,不同的是,兩個(gè)高地址單元中給出的段地址是送向ES寄存器。

3.3.1數(shù)據(jù)傳送指令4.標(biāo)志位傳送指令標(biāo)志寄存器存取操作的指令共有4條,指令的操作數(shù)均采用隱含方式。(1)讀取標(biāo)志指令LAHF指令格式:LAHF指令功能:將標(biāo)志寄存器中的SF、ZF、AF、PF和CF即標(biāo)志寄存器的低8位)傳送至AH寄存器的指定位,空位沒有定義,該指令對(duì)標(biāo)志位沒有影響。(2)設(shè)置標(biāo)志指令SAHF

指令格式:SAHF

指令功能:將寄存器AH的指定位,送至標(biāo)志寄存器的SF、ZF、AF、PF和CF位(即標(biāo)志寄存器的低8位)。根據(jù)AH的內(nèi)容,影響上述標(biāo)志位,對(duì)OF、DF和IF無影響。

3.3.1數(shù)據(jù)傳送指令(3)標(biāo)志寄存器進(jìn)棧指令PUSHF

指令格式:PUSHF

指令功能:將16位標(biāo)志寄存器FLAGS的內(nèi)容壓入堆棧,同時(shí)修改堆棧棧頂指針,不影響標(biāo)志位。

FLAGS高字節(jié)→(SP?1)

FLAGS低字節(jié)→(SP?2)

SP?2→SP(4)標(biāo)志寄存器出棧POPF

指令格式:POPF

指令功能:將棧頂16位的字?jǐn)?shù)據(jù)彈出送回標(biāo)志寄存器FLAGS中,同時(shí)修改堆棧棧頂指針,影響標(biāo)志位。

(SP)→FLAGS低字節(jié)

(SP+1)→FLAGS高字節(jié)

SP+2→SP3.3.2算術(shù)運(yùn)算指令算術(shù)運(yùn)算指令包括加法運(yùn)算指令、減法運(yùn)算指令、乘法運(yùn)算指令、除法運(yùn)算指令、十進(jìn)制調(diào)整指令和字位擴(kuò)展指令。算術(shù)運(yùn)算指令對(duì)操作數(shù)的要求類似于數(shù)據(jù)傳送類指令。算術(shù)運(yùn)算指令大都對(duì)標(biāo)志位有影響,不同的指令影響不同,加法和減法指令將根據(jù)運(yùn)算結(jié)果修改大部分標(biāo)志位,但加1和減1指令不影響進(jìn)位標(biāo)志(CF)。乘法指令將改變CF和OF標(biāo)志位,除法指令使大部分標(biāo)志位狀態(tài)不確定,字位擴(kuò)展指令(CBW、CWD)對(duì)標(biāo)志位沒有影響。3.3.2算術(shù)運(yùn)算指令1.加法運(yùn)算指令

加法運(yùn)算指令有3條:普通加法指令A(yù)DD、帶進(jìn)位位加法指令A(yù)DC和加1指令I(lǐng)NC。(1)普通加法指令A(yù)DD指令格式:ADDOPRD1,OPRD2。指令功能:將源操作數(shù)和目標(biāo)操作數(shù)相加,結(jié)果保留在目標(biāo)操作數(shù)中。加法指令影響標(biāo)志寄存器的標(biāo)志位。源操作數(shù)和目標(biāo)操作數(shù)均可以是8位的,也可以是16位的;可以是有符號(hào)數(shù),也可以是無符號(hào)數(shù);可以是寄存器操作數(shù)或存儲(chǔ)器操作數(shù)。源操作數(shù)也可以是立即數(shù),但需要注意以下兩點(diǎn):①目標(biāo)操作數(shù)和源操作數(shù)不能同時(shí)為存儲(chǔ)器。②不能對(duì)段寄存器進(jìn)行算術(shù)運(yùn)算。3.3.2算術(shù)運(yùn)算指令(2)帶進(jìn)位的加法指令A(yù)DC

指令格式:ADCOPRD1,OPRD2

指令功能:帶進(jìn)位加法指令的操作過程與ADD指令基本相同,唯一不同的是進(jìn)位標(biāo)志CF的原狀態(tài)一起參與加法運(yùn)算,待運(yùn)算結(jié)束后CF將重新根據(jù)結(jié)果置成新的狀態(tài),即OPRD1+OPRD2+CF→OPRD1這條指令對(duì)標(biāo)志位的影響與ADD相同,即對(duì)全部6個(gè)狀態(tài)標(biāo)志位都會(huì)產(chǎn)生影響。

帶進(jìn)位加法指令主要用于多字節(jié)數(shù)據(jù)的加法運(yùn)算。如果低字節(jié)相加時(shí)產(chǎn)生進(jìn)位,則在下一次高字節(jié)相加時(shí)將這個(gè)進(jìn)位加進(jìn)去。3.3.2算術(shù)運(yùn)算指令(3)加1指令I(lǐng)NC

指令格式:INCOPRD

指令功能:OPRD←OPRD+1。完成對(duì)指定的操作數(shù)OPRD加1,然后返回此操作數(shù);此指令主要用于在循環(huán)程序中修改地址指針和循環(huán)次數(shù)等。

該操作數(shù)可以是8位或16位的通用寄存器和存儲(chǔ)器,但不能是段寄存器和立即數(shù)。指令

將影響大多數(shù)標(biāo)志位,如SF、ZF、AF、DF、OF,但對(duì)進(jìn)位標(biāo)志(CF)沒有影響。

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

8086/8088CPU指令系統(tǒng)共有5條減法指令,它們分別是普通減法指令,即不考慮借位的減法指令SUB、考慮借位減法指令SBB、減1指令DEC、求補(bǔ)指令NEG以及比較指令CMP。2.減法指令(1)不考慮借位的減法指令SUB

指令格式:SUBOPRD1,OPRD2;OPRD1是被減數(shù),OPRD2是減數(shù)

指令功能:OPRD1←OPRD1?OPRD2。完成兩個(gè)操作數(shù)相減,是用目標(biāo)操作數(shù)減去源操作數(shù),并將結(jié)果存放到目標(biāo)操作數(shù)所在的地址中。

該指令對(duì)操作數(shù)的要求和ADD指令一樣,對(duì)標(biāo)志位CF、DF、PF、SF、ZF和AF都有影響。3.3.2算術(shù)運(yùn)算指令(2)考慮借位的減法指令SBB

指令格式:SBBOPRD1,OPRD2

指令功能:OPRD1←OPRD1?OPRD2?CF

對(duì)操作數(shù)的要求和對(duì)狀態(tài)標(biāo)志位的影響和SUB指令完全一樣。

本指令主要用于多字節(jié)的減法運(yùn)算。(3)減1指令DEC

指令格式:DECOPRD;OPRD←OPRD?1

指令功能:將目標(biāo)操作數(shù)減1,回送目標(biāo)操作數(shù)。

本指令對(duì)操作數(shù)的要求和對(duì)狀態(tài)標(biāo)志位的影響和INC指令完全一樣,操作數(shù)可以是字節(jié)或字類型的寄存器(段寄存器除外),也可以是存儲(chǔ)器;指令將影響大多數(shù)標(biāo)志位,如SF、ZF、AF、DF、OF,但對(duì)進(jìn)位標(biāo)志CF沒有影響。

3.3.2算術(shù)運(yùn)算指令(4)求補(bǔ)指令NEG

指令格式:NEGOPRD;OPRD←0?OPRD

指令功能:用“0”減去目標(biāo)操作數(shù)OPRD,結(jié)果回送目標(biāo)操作數(shù)OPRD所在地址處。由于0?OPRD=0FFFFH(或者0FFH)?OPRD+1,相當(dāng)于把操作數(shù)按位求反后末位加1,因此該指令稱為求補(bǔ)操作。該指令操作數(shù)可以是8位或16位的通用寄存器或者存儲(chǔ)器操作數(shù)。

NEG指令對(duì)標(biāo)志寄存器中的6個(gè)狀態(tài)標(biāo)志均有影響。

(5)比較指令CMP

指令格式:CMPOPRD1,OPRD2。

指令功能:將目標(biāo)操作數(shù)與源操作數(shù)相減,運(yùn)算結(jié)果不送回目標(biāo)操作數(shù),運(yùn)算結(jié)果只影響標(biāo)志位。

CMP指令的源操作數(shù)可以是立即數(shù)、寄存器或者存儲(chǔ)器,目標(biāo)操作數(shù)只能是寄存器或者存儲(chǔ)器。3.3.2算術(shù)運(yùn)算指令比較指令主要用于比較兩個(gè)數(shù)之間的關(guān)系。在比較指令之后,根據(jù)ZF標(biāo)志即可對(duì)兩者進(jìn)行比較。

1)相等的比較:如果ZF=1,則兩個(gè)操作數(shù)相等,否則兩個(gè)操作數(shù)不相等。

2)大小的比較:

①兩個(gè)無符號(hào)數(shù)進(jìn)行比較,則可以根據(jù)CF標(biāo)志的狀態(tài)判斷兩數(shù)大小。若結(jié)果沒有產(chǎn)生借位(CF=0),則被減數(shù)大于減數(shù);若產(chǎn)生了借位(即CF=1),則被減數(shù)小于減數(shù)。

②兩個(gè)有符號(hào)數(shù)的比較:當(dāng)OF⊕

SF=0時(shí),被減數(shù)大于減數(shù);當(dāng)OF⊕SF=1時(shí),被減數(shù)小于減數(shù)。

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

乘法指令包括無符號(hào)乘法指令MUL和有符號(hào)乘法指令I(lǐng)MUL。乘法指令采用隱含尋址方式,隱含的操作數(shù)是目標(biāo)操作數(shù),目標(biāo)操作數(shù)實(shí)際存在于AX與DX中,而源操作數(shù)由指令直接給出。

乘法指令可以完成字節(jié)與字節(jié)的相乘或者字與字的相乘。如果是字節(jié)與字節(jié)相乘,則乘積為字,結(jié)果存放在AX中;如果是字與字相乘,則乘積為雙字,結(jié)果存放在DX和AX中,其中DX用于存放乘積的高位字,AX用于存放乘積的低位字。3.3.2算術(shù)運(yùn)算指令(1)無符號(hào)乘法指令MUL

指令格式:MULOPRD;OPRD為源操作數(shù)

無符號(hào)乘法指令MUL的操作數(shù)是無符號(hào)數(shù),可以完成字節(jié)與字節(jié)相乘、字與字相乘,且默認(rèn)的操作數(shù)放在AL或AX中,而源操作數(shù)由指令給出。指令操作過程如下:

字節(jié)乘法:AX←OPRD×AL

字乘法:DX:AX←OPRD×AX

源操作數(shù)不能為立即數(shù),且應(yīng)滿足無符號(hào)數(shù)的表示范圍。該指令對(duì)標(biāo)志位有影響。當(dāng)乘積的高半部分(在字節(jié)相乘時(shí)為AH,在字相乘時(shí)為DX)不為零時(shí),則CF=OF=1,代表AH或DX中包含乘積的有效數(shù)字;否則CF=OF=0。該指令對(duì)其他標(biāo)志均無定義。3.3.2算術(shù)運(yùn)算指令(2)有符號(hào)數(shù)乘法指令I(lǐng)MUL

指令格式:IMULOPRD;OPRD為源操作數(shù)

與MUL指令不同之處有:

①要求兩個(gè)相乘的數(shù)必須為有符號(hào)數(shù)。

②當(dāng)乘積的高半部分是低半部分的符號(hào)位的擴(kuò)展時(shí),則CF=OF=0;否則CF=OF=1。

③源操作數(shù)應(yīng)滿足有符號(hào)數(shù)的表示范圍。

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

除法指令包括無符號(hào)數(shù)除法指令DIV和有符號(hào)數(shù)除法指令I(lǐng)DIV。采用隱含尋址方式,隱含的是被除數(shù),而除數(shù)由指令給出,要求除數(shù)不能是立即數(shù)。

除法指令要求:除數(shù)的位數(shù)為被除數(shù)位數(shù)的一半,指令格式中給出的是除數(shù),要根據(jù)除數(shù)的位數(shù)來決定被除數(shù)的位數(shù)。當(dāng)被除數(shù)為16位時(shí),除數(shù)為8位,得到8位的商放在AL中,8位的余數(shù)放在AH中;當(dāng)被除數(shù)為32位時(shí),除數(shù)為16位,得到的商放在AX中,余數(shù)放在DX中。(1)無符號(hào)數(shù)除法指令DIV

指令格式:DIVOPRD

源操作數(shù)可以是8位或16位的寄存器或存儲(chǔ)單元,但不能是立即數(shù)。3.3.2算術(shù)運(yùn)算指令(2)有符號(hào)數(shù)除法IDIV

指令格式:IDIVOPRD

該指令執(zhí)行過程同DIV指令,但I(xiàn)DIV指令認(rèn)為操作數(shù)的最高位為符號(hào)位,除法運(yùn)算的結(jié)果商的最高位也為符號(hào)位。

注意:

①該指令對(duì)6個(gè)標(biāo)志位均無影響。

②用IDIV指令后,一個(gè)雙字除以字,則商的范圍為?32768~+32767;一個(gè)字除以字節(jié),則商的范圍為?128~+127;如果運(yùn)算結(jié)果超出了上述范圍,會(huì)作為除數(shù)為0的情況來處理,即產(chǎn)生0號(hào)中斷,而不是使OF置1。

③當(dāng)被除數(shù)的長(zhǎng)度不夠除數(shù)長(zhǎng)度的兩倍時(shí),必須對(duì)被除數(shù)進(jìn)行擴(kuò)展。3.3.2算術(shù)運(yùn)算指令5.BCD碼運(yùn)算調(diào)整指令

調(diào)整指令均采用隱含尋址方式,隱含的操作數(shù)是AL或AH,一般不單獨(dú)使用,而是與加、減、乘、除指令配合使用,實(shí)現(xiàn)BCD碼的算術(shù)運(yùn)算。

BCD碼有兩類:壓縮的BCD碼,就是1個(gè)字節(jié)表示2位BCD碼;非壓縮的BCD碼,就是1個(gè)字節(jié)表示1位BCD碼,此時(shí)只用低4位來表示,高4位為0。

BCD碼運(yùn)算采用的方法:利用對(duì)普通二進(jìn)制數(shù)的運(yùn)算指令算出結(jié)果,再用專門指令對(duì)結(jié)果進(jìn)行調(diào)整。

3.3.2算術(shù)運(yùn)算指令1)壓縮BCD碼加法調(diào)整指令DAA

指令格式:DAA

指令功能:對(duì)兩個(gè)壓縮BCD碼相加后的和進(jìn)行調(diào)整,調(diào)整前,運(yùn)算結(jié)果必須保存到AL中。

調(diào)整方法:

①若AL中的低4位>9或AF=1,則AL+06H→AL,并使AF=1。

②若AL中的高4位>9或CF=1,則AL+60H→AL,并使CF=1。

DAA指令會(huì)影響標(biāo)志位AF、CF、PF、SF、ZF,但不影響OF。

(1)加法調(diào)整指令3.3.2算術(shù)運(yùn)算指令2)非壓縮BCD碼加法調(diào)整指令A(yù)AA

指令格式:AAA

指令功能:對(duì)兩個(gè)非壓縮BCD碼相加后的和進(jìn)行調(diào)整,調(diào)整前,運(yùn)算結(jié)果必須保存到AL中。與DAA的不同之處:調(diào)整后的結(jié)果,其低位在AL中,高位在AH中。

調(diào)整方法:

①若AL中的低4位>9或AF=1,則AL+06H→AL;AH+1→AH,且AF=1。

②屏蔽AL的高4位,且AF→CF。

AAA指令會(huì)影響標(biāo)志位AF和CF。

3.3.2算術(shù)運(yùn)算指令1)壓縮BCD碼減法調(diào)整指令DAS

指令格式:DAS

指令功能:對(duì)兩個(gè)壓縮BCD碼相減后的結(jié)果進(jìn)行調(diào)整,調(diào)整前,運(yùn)算結(jié)果必須保存到AL中。

調(diào)整方法:

①若AL中的低4位>9或AF=1,則AL-06H→AL,并使AF=1。

②若AL中的高4位>9或CF=1,則AL-60H→AL,并使CF=1。

DAS指令會(huì)影響標(biāo)志位AF、CF、PF、SF、ZF,不影響OF。

(2)減法調(diào)整指令3.3.2算術(shù)運(yùn)算指令2)非壓縮BCD碼減法調(diào)整指令A(yù)AS

指令格式:AAS

指令功能:對(duì)兩個(gè)非壓縮BCD碼相減后的和進(jìn)行調(diào)整,調(diào)整前,運(yùn)算結(jié)果必須保存到AL中。

與DAS的不同之處:調(diào)整后的結(jié)果,其低位在AL中,高位在AH中。調(diào)整方法:

①若(AL)中的低4位>9或AF=1,則(AL)-06H→(AL);(AH)-1→(AH),且AF=1。

②屏蔽AL的高4位,且AF→CF。

AAS指令會(huì)影響標(biāo)志位AF和CF。

3.3.2算術(shù)運(yùn)算指令(3)乘法調(diào)整指令A(yù)AM

指令格式:AAM

指令功能:對(duì)兩個(gè)非壓縮BCD碼相乘的結(jié)果進(jìn)行調(diào)整,調(diào)整前,運(yùn)算結(jié)果必須保存到AX中。

操作方法:把AL寄存器的內(nèi)容除以0AH,商放到AH中,余數(shù)放到AL中。

說明:

①對(duì)BCD碼進(jìn)行乘法運(yùn)算時(shí),要求乘數(shù)和被乘數(shù)都必須是非壓縮的BCD碼,否則結(jié)果將無法調(diào)整。

②BCD碼是作為無符號(hào)數(shù)來看待,所以相乘時(shí)用MUL指令,而不用IMUL指令。

③AAM指令必須緊跟在乘法指令MUL之后。

④AAM指令會(huì)影響標(biāo)志位SF、ZF、PF。3.3.2算術(shù)運(yùn)算指令(4)除法調(diào)整指令A(yù)AD

指令格式:AAD

指令功能:對(duì)兩個(gè)非壓縮BCD碼相除的結(jié)果進(jìn)行調(diào)整。它與其他的調(diào)整指令不同,它是在除法運(yùn)算前進(jìn)行相應(yīng)的調(diào)整操作。

具體操作:將AH中的高位十進(jìn)制數(shù)乘以10,與AL中的低位十進(jìn)制數(shù)相加,并使AH中的內(nèi)容清零,結(jié)果保留在AL中,即

AH×10+AL→AL,0→AH

說明:

①對(duì)BCD碼進(jìn)行除法運(yùn)算時(shí),要求除數(shù)和被除數(shù)都用非組合的BCD碼來表示。

②AAD指令是在除法指令DIV之前,對(duì)除數(shù)和被除數(shù)進(jìn)行調(diào)整。

③AAD指令會(huì)影響標(biāo)志位SF、ZF、PF。3.3.2算術(shù)運(yùn)算指令6.字位擴(kuò)展指令

(1)字節(jié)擴(kuò)展指令CBW

指令格式:CBW

指令功能:將AL中的字節(jié)擴(kuò)展為字,并存放到AX中。

(2)字?jǐn)U展指令CWD

指令格式:CBW

指令功能:將AX中一個(gè)字?jǐn)U展為雙字,結(jié)果存放到DX:AX中,其中DX用來存放擴(kuò)展的高16位。

字位擴(kuò)展指令的擴(kuò)展原則:

對(duì)于無符號(hào)數(shù)來說,只需將擴(kuò)展的高位補(bǔ)零;對(duì)于有符號(hào)數(shù)來說,將符號(hào)位擴(kuò)展至整個(gè)高位。3.3.3

邏輯運(yùn)算和移位指令邏輯運(yùn)算和移位指令對(duì)8位或16位寄存器或存儲(chǔ)器單元中的內(nèi)容按位進(jìn)行邏輯運(yùn)算或移位操作,包括邏輯運(yùn)算指令和移位指令,移位指令又分為非循環(huán)移位指令和循環(huán)移位指令。

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

8086/8088CPU的邏輯運(yùn)算指令有AND(邏輯“與”)、TEST(測(cè)試)、OR(邏輯“或”)、XOR(邏輯“異或”)和NOT(邏輯“非”)五條指令。以上五條邏輯指令中,唯有NOT指令對(duì)所有標(biāo)志位不產(chǎn)生影響,其余四條指令對(duì)標(biāo)志位的影響均相同。這些指令將根據(jù)各自邏輯運(yùn)算結(jié)果影響SF、ZF和PF標(biāo)志位。同時(shí),將CF、OF標(biāo)志位置“0”,使AF的值不確定。

3.3.3

邏輯運(yùn)算和移位指令(1)邏輯“與”指令A(yù)ND

指令格式:ANDDST,SRC;DST←DST∧SRC

指令功能:將目標(biāo)操作數(shù)與源操作數(shù)按位進(jìn)行“與”運(yùn)算,結(jié)果回送目標(biāo)操作數(shù)。

對(duì)操作數(shù)的要求如下:

①源操作數(shù)可以是8位或16位的通用寄存器、存儲(chǔ)器操作數(shù)或立即數(shù)。

②目標(biāo)操作數(shù)只允許是寄存器或存儲(chǔ)器操作數(shù)。

③源操作數(shù)和目標(biāo)操作數(shù)不能同時(shí)為存儲(chǔ)器操作數(shù)。

3.3.3

邏輯運(yùn)算和移位指令(2)邏輯“或”指令OR

指令格式:ORDST,SRC;DST←DST∨SRC

指令功能:將目標(biāo)操作數(shù)與源操作數(shù)進(jìn)行邏輯“或”運(yùn)算,并將結(jié)果回送到目標(biāo)操作數(shù)。

對(duì)操作數(shù)的要求與AND指令一樣。

(3)邏輯“非”指令NOT

指令格式:NOTDST

指令功能:將源操作數(shù)按位取反,NOT指令對(duì)標(biāo)志位沒有影響。

操作數(shù)要求:操作數(shù)可以是8位或16寄存器或存儲(chǔ)器。

3.3.3

邏輯運(yùn)算和移位指令(4)邏輯“異或”指令XOR

指令格式:XORDST,SCR;DST←DST⊕SCR。

指令功能:目標(biāo)操作數(shù)與源操作進(jìn)行“異或”運(yùn)算,運(yùn)算結(jié)果回送目標(biāo)操作數(shù)。對(duì)操作數(shù)的要求與“AND”相同?!爱惢颉辈僮鞯脑瓌t是:兩操作數(shù)相同結(jié)果為0,不同結(jié)果為1。

(5)測(cè)試指令TEST

指令格式:TESTDST,SCR

指令功能:與AND指令執(zhí)行過程類似,但指令執(zhí)行后,目標(biāo)操作數(shù)保持不變,只影響標(biāo)志位。

3.3.3

邏輯運(yùn)算和移位指令2.移位指令

移位指令包括非循環(huán)移位指令和循環(huán)移位指令。移位指令用來完成對(duì)寄存器操作數(shù)或存儲(chǔ)器操作數(shù)一定次數(shù)的移位。當(dāng)移動(dòng)1次時(shí),移動(dòng)次數(shù)由指令直接給出;當(dāng)移動(dòng)次數(shù)大于1

時(shí),移動(dòng)次數(shù)要放到CL寄存器中。指令操作數(shù)由源操作數(shù)和目標(biāo)操作數(shù)構(gòu)成,源操作數(shù)表示移動(dòng)次數(shù),目標(biāo)操作數(shù)表示被移動(dòng)的對(duì)象移位指令大都影響6個(gè)狀態(tài)標(biāo)志位。(1)非循環(huán)移位指令非循環(huán)移位指令包括邏輯左移指令SHL、算術(shù)左移指令SAL、邏輯右移指令SHR和算術(shù)右移指令SAR等指令4條。邏輯移位指令針對(duì)的是無符號(hào)數(shù),算術(shù)移位指令針對(duì)的是有符號(hào)數(shù)。3.3.3

邏輯運(yùn)算和移位指令1)邏輯左移指令SHL和算術(shù)左移指令SAL邏輯左移指令SHL和算術(shù)左移指令SAL完全相同,指令格式如下:

SHL(SAL)OPRD,1;SALOPRD,1

SHL(SAL)OPRD,CL;SALOPRD,CL

指令功能:將目標(biāo)操作數(shù)順序左移1位或CL寄存器中指定的位數(shù)。具體操作:每次左移1位,左邊的最高位移入標(biāo)志位

CF,而在右邊的最低位補(bǔ)0。指令操作過程如圖3-16所示。

3.3.3

邏輯運(yùn)算和移位指令2)邏輯右移指令SHR

指令格式:

SHROPRD,1

SHROPRD,CL

指令功能:這條指令將無符號(hào)操作數(shù)右移1位或由CL寄存器指定的位數(shù)。

具體操作:當(dāng)邏輯右移1位時(shí),操作數(shù)的最低位移到進(jìn)位標(biāo)志CF,最高位補(bǔ)“0”。指令操作示意圖如圖3-17所示。

3.3.3

邏輯運(yùn)算和移位指令3)算術(shù)右移指令SAR

指令格式:

SAROPRD,1

SAROPRD,CL

指令功能:將有符號(hào)數(shù)向右移1位或由CL寄存器指定的位數(shù)。具體操作:當(dāng)算術(shù)右移1位時(shí),操作數(shù)的最低位移到進(jìn)位標(biāo)志CF,而左邊的高位保持不變。指令操作示意圖如圖3-18所示。

3.3.3

邏輯運(yùn)算和移位指令(2)循環(huán)移位指令所謂循環(huán)移位,是指將目標(biāo)操作數(shù)一端移出來的位移至目標(biāo)操作數(shù)的另一端。它是一種將目標(biāo)操作數(shù)首尾相連的移位,從目標(biāo)操作數(shù)移出來的位不會(huì)丟失。

8086/8088指令系統(tǒng)中有4條循環(huán)移位指令,分別是:不帶進(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。

3.3.3

邏輯運(yùn)算和移位指令1)不帶CF的循環(huán)左移指令ROL

指令格式:

ROLOPRD,1

ROLOPRD,CL

指令功能:ROL是循環(huán)左移指令,將目標(biāo)操作數(shù)向左循環(huán)移動(dòng)1位或CL寄存器中指定的位數(shù)。目標(biāo)操作數(shù)每一次向左移動(dòng)一位,最高位移入最低位構(gòu)成循環(huán),同時(shí)把最高位移入CF,而CF原來的值丟失。標(biāo)志位CF不在循環(huán)之內(nèi),指令操作示意圖如圖3-19所示。

3.3.3

邏輯運(yùn)算和移位指令2)不帶CF的循環(huán)右移指令ROR

指令格式:

ROROPRD,1

ROROPRD,CL

指令功能:ROR是循環(huán)右移指令,它將目標(biāo)操作數(shù)中的每一位向右移動(dòng)一位,最低位移入最高位,同時(shí)把最低位移入CF,而CF原來的值丟失。同樣,標(biāo)志位CF不在循環(huán)之內(nèi),指令操作示意圖如圖3-20所示。

3.3.3

邏輯運(yùn)算和移位指令3)帶CF的循環(huán)左移指令RCL

指令格式:

RCLOPRD,1

RCLOPRD,CL

指令功能:RCL是帶進(jìn)位循環(huán)左移指令,它將目標(biāo)操作數(shù)連同進(jìn)位標(biāo)志位一起循環(huán)左移,標(biāo)志位CF移入目標(biāo)操作數(shù)最低位,而目標(biāo)操作數(shù)最高位移入CF。標(biāo)志位CF在循環(huán)之內(nèi),指令操作示意圖如圖3-21所示。

3.3.3

邏輯運(yùn)算和移位指令4)帶CF的循環(huán)右移指令RCR

指令格式:

RCROPRD,1

RCROPRD,CL

指令功能:RCR是帶進(jìn)位循環(huán)右移指令,它將目標(biāo)操作數(shù)連同進(jìn)位標(biāo)志位一起循環(huán)右移,標(biāo)志位CF移入目標(biāo)操作數(shù)最高位,而目標(biāo)操作數(shù)最低位移入CF。標(biāo)志位CF在循環(huán)之內(nèi),指令操作示意圖如圖3-23所示。

3.3.4

串操作指令1.串操作指令的特點(diǎn)

串操作指令共有五條:串傳送指令、串比較指令、串掃描指令、串裝入指令、串存儲(chǔ)指令。所有的串操作指令(除了與累加器打交道的串操作指令外)都具有以下特點(diǎn):①總是用SI寄存器尋址源串,用DI寄存器尋址目標(biāo)串。源串默認(rèn)為在數(shù)據(jù)段,允許段重設(shè)。目標(biāo)串默認(rèn)在附加段,不允許進(jìn)行段重設(shè)。②串的長(zhǎng)度存放在CX寄存器中。③可以在串操作命令前加重復(fù)前綴。若使用重復(fù)前綴,CX的內(nèi)容也會(huì)每次自動(dòng)減1。④指針自動(dòng)修改,修改方向與DF標(biāo)志有關(guān),若DF=0,則每次操作后,SI和DI按地址增量方向修改;否則,按照相反向修改。因此,在使用串操作指令前,需要進(jìn)行必要的設(shè)置,即設(shè)置源串指針(DS、SI)、目標(biāo)串指針(ES、DI),重復(fù)次數(shù)(CX)以及操作方向(DF)。3.3.4

串操作指令2.重復(fù)操作前綴在串操作指令前加一個(gè)適當(dāng)?shù)闹貜?fù)操作前綴,使該指令能重復(fù)執(zhí)行。用于串操作的重復(fù)操作前綴指令共有5條,即REP:無條件重復(fù)前綴——重復(fù)執(zhí)行指令規(guī)定的操作,直到CX=0;REPE:相等時(shí)重復(fù)——ZF=1,且CX≠0時(shí)重復(fù);REPZ:結(jié)果為0時(shí)重復(fù)——ZF=1,且CX≠0時(shí)重復(fù);REPNE:不相等時(shí)重復(fù)——ZF=0,且CX≠0時(shí)重復(fù);REPNZ:結(jié)果不為0時(shí)重復(fù)——ZF=0,且CX≠0時(shí)重復(fù)。加重復(fù)操作前綴指令之后的串操作指令的執(zhí)行由以下幾個(gè)步驟構(gòu)成:①執(zhí)行串操作指令規(guī)定的相應(yīng)操作。②SI和DI自動(dòng)增減。③CX的內(nèi)容自動(dòng)減1。④根據(jù)ZF的狀態(tài)決定是否重復(fù)進(jìn)行。3.3.4

串操作指令3.串操作指令(1)串傳送指令串傳送指令有3種格式:MOVSOPRD1,OPRD2MOVSBMOVSW指令功能:串傳送指令是將源串的內(nèi)容傳送到目標(biāo)串中。幾點(diǎn)說明:①第一種格式中,該格式中,源串和目標(biāo)串的段地址可以使用默認(rèn)值,源串也可段重設(shè)。第一種格式多用于需要段重設(shè)的情況。②第二種格式和第三種格式隱含了兩個(gè)操作數(shù)的地址,此時(shí),源串和目標(biāo)串的段地址必須使用默認(rèn)值,MOVSB表示一次完成一個(gè)字節(jié)的傳送,MOVSW表示一次完成一個(gè)字的傳送。③MOVS指令常與重復(fù)前綴聯(lián)合使用。④串傳送指令的執(zhí)行結(jié)果不影響標(biāo)志位。3.3.4

串操作指令(2)串比較指令串比較指令有3種格式:CMPSOPRD1,OPRD2CMPSBCMPSW指令功能:該指令使兩個(gè)字符串中的相應(yīng)元素逐個(gè)比較。具體執(zhí)行過程是:將源串地址和目標(biāo)串地址中的字符串按照字節(jié)或字進(jìn)行比較,比較結(jié)果不送回目標(biāo)串地址中,而只是影響標(biāo)志位。每進(jìn)行一次比較之后,自動(dòng)修改地址指針,指向串中的下一個(gè)元素。3.3.4

串操作指令幾點(diǎn)說明:①第一種格式中,源串和目標(biāo)串的段地址可以使用默認(rèn)值,源串也可使用段前綴來指定在其他段中。第一種格式多用于需要段重設(shè)的情況。②第二種格式和第三種格式隱含了兩個(gè)操作數(shù)的地址,源串和目標(biāo)串的段地址必須使用默認(rèn)值。CMPSB表示按字節(jié)進(jìn)行比較,CMPSW表示按字進(jìn)行比較。③CMPS指令常與重復(fù)前綴聯(lián)合使用。④串傳送指令的執(zhí)行結(jié)果影響標(biāo)志位。3.3.4

串操作指令(3)串掃描指令串掃描指令有3種格式:SCASOPRD;OPRD是目標(biāo)串SCASBSCASW指令功能:將累加器AL/AX中的內(nèi)容與字符串中的元素逐個(gè)進(jìn)行比較,比較結(jié)果不改變目標(biāo)串內(nèi)容,只是反映在標(biāo)志位上。說明:①格式一中只有一個(gè)操作數(shù),用來表示目標(biāo)串的符號(hào)地址。格式二中SCASB表示按字節(jié)方式進(jìn)行掃描,SCASW表示按字方式進(jìn)行掃描。該指令在執(zhí)行前必須設(shè)置ES:DI來指向目標(biāo)串。②該指令主要用于在一個(gè)字符串中查找某個(gè)特定的關(guān)鍵字。進(jìn)行該指令前,要將要找的關(guān)鍵字放到AL(或AX)中,再用本指令與字符串中的各個(gè)元素逐一進(jìn)行比較。③SCAS指令常與重復(fù)前綴聯(lián)合使用。④該指令的執(zhí)行結(jié)果影響標(biāo)志位。3.3.4

串操作指令(4)串裝入指令串裝入指令有3種格式:LODSOPRD;OPRD是源串LODSBLODSW指令功能:將一個(gè)字符串的字節(jié)或字逐個(gè)裝入累加器AL/AX中。指令執(zhí)行過程是:指令執(zhí)行前必須設(shè)置DS:SI來指向源串,執(zhí)行指令時(shí),將由DS:SI指向的源串中的字節(jié)或者字,取到累加器AL或AX中,并在這之后根據(jù)DF的值自動(dòng)修改指針SI,以指向下一個(gè)元素。說明:①格式1中只有一個(gè)操作數(shù),用來表示源串的符號(hào)地址;格式2中LODSB表示按字節(jié)裝入;格式3中,LODSW表示按字裝入。②該指令一般不帶前綴,因?yàn)槊恐貜?fù)一次AL或AX中的內(nèi)容將被后一次所裝入的內(nèi)容取代。③指令的執(zhí)行結(jié)果不影響標(biāo)志位。3.3.4

串操作指令(5)串存儲(chǔ)指令串存儲(chǔ)指令有3種格式:STOSOPRD;OPRD是目標(biāo)串STOSBSTOSW指令功能:將AL或AX中的內(nèi)容存放到位于ES:DI所指的存儲(chǔ)單元中,并自動(dòng)修改地址指針DI。說明:①格式一中只有一個(gè)目標(biāo)操作數(shù),用來表示目標(biāo)串的符號(hào)地址。STOSB按字節(jié)進(jìn)行存儲(chǔ),STOSW按字進(jìn)行存儲(chǔ)。②指令執(zhí)行前,必須設(shè)置ES:DI指向目標(biāo)串。③可以利用重復(fù)前綴對(duì)連續(xù)的存儲(chǔ)單元存入相同的內(nèi)容。④指令的執(zhí)行結(jié)果不影響標(biāo)志位。3.3.5

程序控制指令程序控制指令用于控制程序的轉(zhuǎn)移,這些指令有的只修改IP的內(nèi)容,有的則同時(shí)修改IP和CS的內(nèi)容。程序控制指令分為4小類:轉(zhuǎn)移指令、循環(huán)控制指令、過程調(diào)用與返回指令和中斷指令,除中斷指令外,其他指令均不影響標(biāo)志位。1.轉(zhuǎn)移指令

轉(zhuǎn)移指令包括無條件轉(zhuǎn)移指令和條件轉(zhuǎn)移指令。(1)無條件轉(zhuǎn)移指令JMP指令格式:JMPOPRD;OPRD是轉(zhuǎn)移的目標(biāo)地址指令功能:無條件地使程序轉(zhuǎn)移到指定的目標(biāo)地址,并從目標(biāo)地址處開始執(zhí)行新的指令。無條件轉(zhuǎn)移指令分為4種形式,即段內(nèi)直接轉(zhuǎn)移、段內(nèi)間接轉(zhuǎn)移、段間直接轉(zhuǎn)移、段間間接轉(zhuǎn)移。3.3.5

程序控制指令1)段內(nèi)直接轉(zhuǎn)移指令格式:JMPLABELLABEL是一個(gè)標(biāo)號(hào),或稱為符號(hào)地址,用來表示要轉(zhuǎn)移的目標(biāo)地址,該標(biāo)號(hào)在本程序所在的代碼段內(nèi)。指令在匯編時(shí),匯編程序可以計(jì)算得到JMP指令的下一條指令與LABEL所指示的地址之間的一個(gè)偏移量,指令的操作是將IP的當(dāng)前值加上地址的偏移量,形成新的IP。偏移量為8位數(shù)時(shí),稱為段內(nèi)直接短轉(zhuǎn)移,轉(zhuǎn)移范圍:?128~+127,格式為JMPSHORTLABEL;偏移量為16位數(shù)時(shí),稱為段內(nèi)直接近轉(zhuǎn)移,范圍:?32768~+32767,格式為JMPNEARLABEL;缺省時(shí)為近轉(zhuǎn)移,NEAR可不寫。指令的操作是將IP的當(dāng)前值加上計(jì)算出的地址偏移量,形成新的IP,并使CS保持不變,從而使程序按新地址繼續(xù)運(yùn)行,從而實(shí)現(xiàn)了程序的轉(zhuǎn)移。3.3.5

程序控制指令2)段內(nèi)間接轉(zhuǎn)移指令格式:JMPOPRD指令中的操作數(shù)OPRD是16位的寄存器或存儲(chǔ)單元,目標(biāo)操作數(shù)可以采用各種尋址方式。執(zhí)行后,是用指定的寄存器或指定存儲(chǔ)器兩單元的內(nèi)容作為目標(biāo)的偏移地址,用來取代原來IP的內(nèi)容,從而實(shí)現(xiàn)程序的轉(zhuǎn)移。3)段間直接轉(zhuǎn)移

指令格式:JMPFARLABEL

這里FAR表示其后的標(biāo)號(hào)LABEL是一個(gè)遠(yuǎn)標(biāo)號(hào),即它在另外一個(gè)代碼段內(nèi),因此這是段間轉(zhuǎn)移。段間直接轉(zhuǎn)移的意思是指令中直接提供了要轉(zhuǎn)移的16位段地址和16偏移地址。匯編程序根據(jù)遠(yuǎn)標(biāo)號(hào)LABEL的位置確定出LABEL所在的段地址和偏移地址,然后將LABEL所在的段地址和偏移地址分別送入CS和IP,使程序轉(zhuǎn)移到另一代碼段內(nèi)指定的標(biāo)號(hào)處(即CS:IP)進(jìn)行執(zhí)行。3.3.5程序控制指令4)段間間接轉(zhuǎn)移

指令格式:JMPOPRD

指令的操作數(shù)OPRD是一個(gè)32位的存儲(chǔ)器。指令的執(zhí)行是將指定的連續(xù)4個(gè)存儲(chǔ)單元的內(nèi)容分別送入IP和CS(高地址字內(nèi)容送CS,低地址字內(nèi)容送IP),從而實(shí)現(xiàn)從當(dāng)前程序到新程序的轉(zhuǎn)移。

(2)條件轉(zhuǎn)移指令指令格式:JXX目標(biāo)標(biāo)號(hào)指令功能:XX是測(cè)試條件。該指令以執(zhí)行指令時(shí)CPU標(biāo)志寄存器中標(biāo)志位的狀態(tài)為測(cè)試條件,決定是否控制程序轉(zhuǎn)移。條件轉(zhuǎn)移指令的執(zhí)行過程如下:第一步:測(cè)試規(guī)定的條件。第二步:如果條件滿足,則轉(zhuǎn)移到目標(biāo)地址,否則繼續(xù)順序執(zhí)行。3.3.5程序控制指令在8086/8088CPU中,條件轉(zhuǎn)移指令共有19條,根據(jù)測(cè)試條件的不同可分為如下情況。

1)與標(biāo)志無關(guān)的轉(zhuǎn)移指令。該類轉(zhuǎn)移指令只有1條,即

JCXZ;轉(zhuǎn)移條件CX=0

2)與標(biāo)志位有關(guān)的轉(zhuǎn)移指令。與標(biāo)志位有關(guān)的轉(zhuǎn)移指令共18條。根據(jù)測(cè)試條件中標(biāo)志位目的不同可分為兩組。

①單測(cè)試條件的轉(zhuǎn)移指令。單測(cè)試條件的轉(zhuǎn)移指令有10條。根據(jù)單個(gè)標(biāo)志位的狀態(tài)判斷轉(zhuǎn)移的條件轉(zhuǎn)移指令,見表3-3。②復(fù)測(cè)試條件的轉(zhuǎn)移指令。復(fù)測(cè)試條件的轉(zhuǎn)移指令有8條,根據(jù)兩個(gè)或兩個(gè)以上標(biāo)志的狀態(tài)判斷轉(zhuǎn)移的條件轉(zhuǎn)移指令。根據(jù)所測(cè)試操作數(shù)類型的不同分為無符號(hào)數(shù)條件轉(zhuǎn)移指令和有符號(hào)數(shù)條件轉(zhuǎn)移指令兩種,見表3-4。3.3.5程序控制指令3.3.5程序控制指令3.3.5程序控制指令2.循環(huán)控制指令

在8086/8088指令系統(tǒng)中,提供了LOOP、LOOPE/LOOPZ和LOOPNE/LOOPNZ等3種形式的循環(huán)指令,在執(zhí)行指令前,循環(huán)次數(shù)必須先送入CX寄存器中,一般情況下,循環(huán)控制指令放到循環(huán)程序的開始或結(jié)尾,每循環(huán)一次,CX內(nèi)容減1,若CX≠0,則繼續(xù)循環(huán);否則退出循環(huán)。

3種形式的循環(huán)指令均不影響標(biāo)志寄存器。(1)LOOP指令

指令格式:LOOPLABEL

這里的LABEL相當(dāng)于一個(gè)近地址標(biāo)號(hào)。指令的執(zhí)行過程是:先將CX內(nèi)容減1,再判斷CX的值是否為0,若CX≠0,則轉(zhuǎn)移到目標(biāo)標(biāo)號(hào)所給定的地址繼續(xù)循環(huán);否則結(jié)束循環(huán),執(zhí)行下一條指令。3.3.5程序控制指令(2)LOOPE/LOOPZ指令

指令格式:LOOPE/LOOPZLABEL

執(zhí)行過程:先將CX減1送CX,若CX≠0且ZF=1,則循環(huán),否則執(zhí)行下一條指令。

說明:

溫馨提示

  • 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)論