第二章 80868088尋址方式與指令系統(tǒng)_第1頁
第二章 80868088尋址方式與指令系統(tǒng)_第2頁
第二章 80868088尋址方式與指令系統(tǒng)_第3頁
第二章 80868088尋址方式與指令系統(tǒng)_第4頁
第二章 80868088尋址方式與指令系統(tǒng)_第5頁
已閱讀5頁,還剩101頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第二章8086/8088尋址方式和指令系統(tǒng)

本章主要掌握的要點:

1.14個16位寄存器,8個8位寄存器2.8086/8088七種尋址方式3.8086/8088各種指令匯編語言與CPU關(guān)系密切。從匯編語言程序設(shè)計的角度看,8086/8088、80186和實方式下的80286沒有多大差異,而且Intel的80X86指令系統(tǒng)向上兼容。本章介紹8086/8088尋址方式和指令系統(tǒng)。

一、8086/8088寄存器組

AHAL

AXBHBLBX

數(shù)據(jù)寄存器

通用寄存器

SP

堆棧指針指針寄存器

BP

基址指針

SI

源地址變址寄存器

DI

目的地址

CHCLDHDLCXDX

IP

指令指針

控制寄存器

FLAG

標志寄存器

CS

代碼段

DS

數(shù)據(jù)段段寄存器

SS

堆棧段

ES

附加段1、通用寄存器數(shù)據(jù)寄存器,指針寄存器和變址寄存器統(tǒng)稱為通用寄存器。這些寄存器除了各自專門用途外,它們均可用于傳送和暫存數(shù)據(jù),可以保存算術(shù)邏輯運算中的操作數(shù)和運算結(jié)果。(1)數(shù)據(jù)寄存器數(shù)據(jù)寄存器主要用來保存操作數(shù)或運算結(jié)果等信息,它們的存在節(jié)省了為存取操作數(shù)所需占用總線和訪問存儲器的時間。(2)變址和指針寄存器變址和指針寄存器主要用于存放某個存儲單元地址的偏移,或某組存儲單元開始地址的偏移,即作為存儲器(短)指針使用。作為通用寄存器,它們也可以保存16位算術(shù)邏輯運算中的操作數(shù)和運算結(jié)果,有時運算結(jié)果就是需要的存儲單元地址的偏移。

2、段寄存器

8086/8088CPU依賴其內(nèi)部的四個段寄存器實現(xiàn)尋址1M字節(jié)物理地址空間。8086/8088把1M字節(jié)地址空間分成若干邏輯段,當(dāng)前使用的段值存放在段寄存器中。由于8086/8088有這四個段寄存器,所以有四個當(dāng)前使用段可直接存取,這四個當(dāng)前段分別稱為代碼段,數(shù)據(jù)段,堆棧段和附加段。

3、控制寄存器

(1)指令指針

8086/8088CPU中的指令指針I(yè)P也是16位的。指令指針I(yè)P給出接著要執(zhí)行的指令在代碼段中的偏移。(2)標志寄存器

8086/8088CPU中有一個16位的標志寄存器,包含了9個標志,主要用于反映處理器的狀態(tài)和運算結(jié)果的某些特征。各標志在標志寄存器中的位置如下所示。1514131211109876543210ODITSZAPCFFFFFFFFF①運算結(jié)果標志

(1)進位標志CF主要用于反映運算是否產(chǎn)生進位或借位。

(2)零標志ZF用于反映運算結(jié)果是否為0。如果運算結(jié)果為0,則ZF被置1,否則置0。(3)符號標志SF用于反映運算結(jié)果的符號位。SF與運算結(jié)果的最高位相同,如果運算結(jié)果的最高位為1,則SF被置1,否則SF被置0。(4)溢出標志OF

用于反映有符號數(shù)加減運算是否引出溢出。如運算結(jié)果超出了8位或16位有符號數(shù)的表示范圍,即在字節(jié)運算時大于127或小于-128,在字運算時大于32767或小于-32768,稱為溢出。如溢出,則OF被置1,否則被置0。

(5)奇偶標志PF用于反映運算結(jié)果中“1”的個數(shù)。如果“1”的個數(shù)為偶數(shù),則OF被置1,否則OF被清0。

(6)輔助進位標志AF在字節(jié)操作時,如發(fā)生低半字節(jié)向高半字節(jié)進位或借位;在字操作時,如發(fā)生低字節(jié)向高字節(jié)進位或借位,則輔助進位標志AF被置1,否則AF被清0。②狀態(tài)控制標志(1)方向標志DF方向標志決定著串操作指令執(zhí)行時,有關(guān)指針寄存器調(diào)整方向。當(dāng)DF為1時,串操作指令按減方式改變有關(guān)的存儲器指針值,當(dāng)DF為0時,串操作指令按加方式改變有關(guān)的存儲器指針值。

(2)中斷允許標志IF中斷允許標志決定著CPU是否響應(yīng)外部可屏蔽中斷請求,當(dāng)IF為1時,CPU能夠響應(yīng)外部的可屏蔽中斷請求;當(dāng)IF為0時,則不響應(yīng)外部的可屏蔽中斷請求。(3)追蹤標志TF當(dāng)TF被置1后,CPU進入單步方式。所謂單步方式是指在一條指令執(zhí)行后,產(chǎn)生一個單步中斷。主要用于程序的調(diào)試。

二、存儲器分段和地址的形成1、存儲單元的地址和內(nèi)容

在存儲器里以字節(jié)為單位存儲信息。為了正確地存放或取得信息,每一個字節(jié)單元給以一個存儲器的地址。地址從0開始編號,順序地每次加1。在機器里,地址也是用二進制數(shù)來表示的。它是無符號整數(shù),書寫格式為十六進制數(shù)。那么16位二進制數(shù)可以表示多少個字節(jié)單元的地址呢?應(yīng)該是216個所以表示的地址范圍應(yīng)該是0~65535。65536個字節(jié)單元的存儲容量就是64K,

其地址編號的范圍用十六進制數(shù)表示為:0~FFFFH。如下所示:0000,0001,0002,0003,……0009,000A,000B,000C,000D,000E,000F,0010,0011,……,0019,001A,001B,001C,001D,001E,001F,0020,0021,……,,002F,……FFE0,F(xiàn)FE1,……,,F(xiàn)FEE,F(xiàn)FEF,F(xiàn)FF0,F(xiàn)FF1,……,,F(xiàn)FFE,F(xiàn)FFF。一個存儲單元中存放的信息稱為該存儲單元的內(nèi)容。如下圖表示了存儲器里存放信息的情況??梢钥闯觯?號字節(jié)單元中存放的信息為34H表示為:(0004H)=34H但是機器字長是16位,大部分數(shù)據(jù)都是以字為單元表示的。字單元的地址采用它的低地址來表示的。

0000H

0001H

66H

0002H如左圖存儲器4號字單元的內(nèi)容為1234H,45H0003H表示為:(0004)=1234H34H0004H上述原則稱為“高高低低”原則。12H0005H四個連續(xù)的字節(jié)單元就構(gòu)成了一個雙字單元,1EH0006H地址為0002H的雙字單元中存放的內(nèi)容是:…

12344566H12H1234H

(0004H)=1234H1AH1235H

(1234H)=1A12H

1236H

所以:((0004))=1A12H

1237H

2.存儲器地址的分段及物理地址的形成前面已經(jīng)提到16位字長的機器,可以訪問的最大存儲空間為64K字節(jié)。而8086/8088CPU有20根地址線,可直接尋址的物理地址空間為1M字節(jié)。所以,要訪問1M字節(jié)空間的存儲器必須有20位地址。

用16進制數(shù)表示1M字節(jié)的地址范圍應(yīng)為00000~FFFFF。那么,在16位字長的機器里,用什么辦法來提供20位地址呢?

采用存儲器地址分段的辦法。程序員在編制程序時要把存儲器劃分成段,每個段的大小可達64K,這樣段內(nèi)地址可以用16位表示。

段與段之間可以相連,也可以不相連,還可以部分重疊。但IBMPC機對段的起始地址有所限制,段不能起始于任意地址,而必須從任一小段的首地址開始。機器規(guī)定:從0地址開始,每16個字節(jié)為一小段(16的倍數(shù)),下面列出了存儲器最低地址區(qū)的三個小段的地址區(qū)間,每行為一小段。

00000,00001,00002,…,0000E,0000F;00010,00011,00012,…,0001E,0001F;00020,00021,00022,…,0002E,0002F;

…………第一列就是每個小段的首地址。其特征是:在16進制表示的地址中,最低為0(即20位地址的低4位為0)。在1M字節(jié)的地址空間里,共有64K個小段首地址,可表示如下:

00000H00010H……41230H41240H……FFFE0HFFFF0H在1M字節(jié)的存儲器里,每一個存儲單元都有一個唯一的20位地址。稱為:

該存儲單元的物理地址。

CPU訪問存儲器時,必須先確定所要訪問的存儲單元的物理地址才能取得(或存入)該單元中的內(nèi)容。

要訪問的某一個存儲單元總是屬于某個段。把存儲單元的地址與所在段的起始地址的差稱為段內(nèi)偏移,簡稱為偏移。在一個段內(nèi),通過偏移可指定要訪問的存儲單元,或者說要訪問的存儲單元可由偏移來指定。在整個1M地址空間中,存儲單元的物理地址等于段起始地址加上偏移。

存儲單元的邏輯地址由:段值和偏移兩部分組成用如下形式表示:段值:偏移根據(jù)邏輯地址可方便地得到存儲單元的物理地址,公式如下:物理地址=段值×16+偏移。所以20位物理地址由:16位段地址和16位偏移地址組成。段地址是指每一段的起始地址,由于它必須是小段的首地址,所以其低4位一定是0。如下左圖物理地址產(chǎn)生的示意圖:

19

0段值0000

15

0偏移

+

19

0物理地址例如:用16進制表示的邏輯地址1000:3456所對應(yīng)的存儲單元的物理地址為:

物理地址=10000+3456=13456H

存儲器

10020H

12330H

2325H

15H

12345H由于段可以重疊,所以一個物理地址可用多個邏輯地址表示。如:上圖其中:存儲單元的物理地址是12345H,標出的:兩個重疊段的段值分別是:1002H和1233H,在對應(yīng)段內(nèi)的偏移分別是2325H和0015H。采用段值和偏移構(gòu)成邏輯地址后,段值由段寄存器給出,偏移可由指令指針I(yè)P、堆棧指針SP和其他可作為存儲器指針使用的寄存器(SI、DI、BX和BP)給出,偏移還可直接用16位數(shù)給出。

指令中不使用物理地址,而是使用邏輯地址,由總線接口單元BIU按需要根據(jù)段值和偏移自動形成20位物理址。3、段寄存器的引用由于8086/8088CPU有四個段寄存器,可保存四個段值。所以可同時使用四個段值,但這四個段有所分工。在取指令的時候,自動引用代碼段寄存器CS,再加上由IP所給出的16位偏移,得到要取指令的物理地址。

當(dāng)涉及到一個堆棧操作時,則自動引用堆棧寄存器SS,再加上由SP所給出的16位偏移,得到堆棧操作所需要的物理地址。當(dāng)偏移涉及BP寄存器時,缺省引用段寄存器SS。

在存取一個普通存儲器操作數(shù)時,則自動選擇數(shù)據(jù)寄存器DS或附加段寄存器ES,再加上16位偏移,得到存儲器操作數(shù)的物理地址。

在不改變段寄存器值的情況下,尋址的最大范圍是64K字節(jié)。若某個程序使用的總的存儲長度(包括代碼、堆棧和數(shù)據(jù)區(qū))不超過64K字節(jié),則整個程序可以合用一個64K字節(jié)的段。假如某個程序的數(shù)據(jù)區(qū)長度超過64K字節(jié),那么就要在兩個或多個數(shù)據(jù)段中存取數(shù)據(jù)

三、.8086/8088的尋址方式計算機是通過執(zhí)行指令序列來解決問題的,因而每種計算機都有一組指令集提供給用戶使用,這組指令集就稱為計算機的指令系統(tǒng)。計算機中的指令由操作碼字段和操作數(shù)字段兩部分組成。指令的操作碼字段在機器里的表示比較簡單,只需對每一種操作指定確定的二進制代碼就可以了。指令的操作數(shù)字段的情況就比較復(fù)雜,如果操作數(shù)存放在寄存器中,則由于寄存器的數(shù)量較少,因而需要指定的操作數(shù)地址的位數(shù)就較少。但如果操作數(shù)存放在存儲器里,那么一個存儲單元的地址就需要20位,怎樣設(shè)法使它在指令的操作數(shù)字段的表示中減少位數(shù)呢?前面我們已經(jīng)講了,計算機只能識別二進制代碼,所以機器指令是由二進制代碼組成的。為了便于人們使用而采用匯編語言來編寫程序。匯編語言是一種符號語言,它用助記符來表示操作碼,用符號或符號地址來表示操作數(shù)或操作數(shù)地址。它與機器指令一一對應(yīng)的。尋址方式:表示指令中用于說明操作數(shù)所在的地址的方法8086/8088有七種基本的尋址方式,下面介紹這七種尋址方式:

1、立即尋址方式操作數(shù)就包含在指令中,它作為指令的一部分,跟在操作碼后存放在代碼段。這種操作數(shù)稱為立即數(shù)。立即數(shù)可以是8位的可以是16位的。如果立即數(shù)是16位的按‘高高低低的原則。例如:指令:MOVAX,1234H的存儲和執(zhí)行情況如下圖:AHAL存儲器AX1234…OP34指令代碼段12…

圖中指令存放在代碼段中,OP表示該指令的操作碼部分再例如:

MOVAL,5

則指令執(zhí)行后,(AL)=05H

MOVBX,3064H則指令執(zhí)行后,(BX)=3064H2、寄存器尋址方式操作數(shù)在CPU內(nèi)部的寄存器中,指令指定寄存器號。對于16位操作數(shù)數(shù),寄存器可以是:AX、BX、CX、DX、SI、DI、SP和BP等;對于8位操作數(shù),寄存器可以是:AL、AH、BL、BH、CL、CH、DL、DH。這種尋址方式由于操作數(shù)就在寄存器中,不需要訪問存儲器來取得操作數(shù),因而可以取得較高的運算速度。例如:MOVAX,BX如指令執(zhí)行前(AX)=3064H,(BX)=1234H;則指令執(zhí)行后,(AX)=1234H,(BX)保持不變例如:MOVSI,AXMOVAL,DH3、直接尋址方式操作數(shù)在寄存器中,指令直接包含有操作數(shù)的有效地址(偏移地址)。操作數(shù)一般存放在數(shù)據(jù)段,所以操作數(shù)的地址由DS加上指令中直接給出的16位偏移得到。如果采用段超越前綴,則操作數(shù)也可含在數(shù)據(jù)段外的其他段中。

存儲器…DS2000OP例如;+806666代碼段MOVAX,[8066]AHAL2806680如(DS)=2000H,AX1234…則執(zhí)行結(jié)果如左圖為:20000(AX)=1234H…(物理地址=200000+28066348066=28066H)

12數(shù)據(jù)段…在匯編語言指令中,可以用符號地址代替數(shù)值地址,如:

MOVAX,VALUE

此時VALUE為存放操作數(shù)單元的符號地址。如寫成:MOVAX,[VALUE]

也是可以的,兩者是等效的。如VALUE在附加段中,則應(yīng)指定段超越前綴如下:MOVAX,ES:VALUE或MOVAX,ES:[VALUE]直接尋址方式常用于處理單個存儲器變量的情況。它可實現(xiàn)在64K字節(jié)的段內(nèi)尋找操作數(shù)。直接尋址的操作數(shù)通常是程序使用的變量。注意立即尋址和直接尋址書寫表示方法上的不同,直接尋址的地址要放在方括號中。在源程序中,往往用變量名表示。4、寄存器間接尋址方式操作數(shù)在存儲器中,操作數(shù)有效地址在SI、DI、BX、BP這四個寄存器之一中。在一般情況下,如果有效地址在SI、DI和BX中,則以DS段寄存器之內(nèi)容為段值。如果有效地址在BP中,則以SS段寄存器之內(nèi)容為段值。

存儲器

DS5000…例如:MOVAX,[SI]

+SI1234OP代碼段如果(DS)=5000H

51234…(SI)=1234H

AHAL50000則物理地址=500000+AX6789…1234=51234H

5123489數(shù)據(jù)段

執(zhí)行該指令后,

67

(AX)=6789H

指令中也可指定段超越前綴來取得其他段中的數(shù)據(jù)如:MOVAX,ES:[BX];引用的段寄存器是ES

MOV[SI],AX;目的操作數(shù)寄存器間接尋址MOV[BP],CX;引用的段寄存器是BPMOVSI,AX;目的操作數(shù)寄存器尋址。

5、寄存器相對尋址方式操作數(shù)在存儲器中,操作數(shù)的有效地址是一個基址寄存器(BX、BP)或變址寄存器的(SI、DI)內(nèi)容加上指令中給定的8位或16位位移量之和。即:(BX)8位位移量EA(有效地址)=(BP)+(SI)16位位移量(DI)

在一般情況下,如果SI、DI或BX之內(nèi)容作為有效地址的一部分,那么引用的段寄存器是DS;如果BP之內(nèi)容作為有效地址的一部分,那么引用的段寄存器是SS。物理地址=16d×(DS)+(BX)+8

或(SI)或16位位移量或(DI)物理地址=16d×(SS)+(BP)+8位位移量或16位位移量在指令中給定的8位或16位位移量采用補碼形式表示。在計算有效地址時,如位移量是8位,則被帶符號擴展成16位。例如:MOVAX,[DI+1223H]假設(shè),(DS)=5000H,(DI)=3678H則

物理地址=50000+3678+1223=5489BH假設(shè)該字存儲單元的內(nèi)容如下圖,則(AX)=55AAH

存儲器DS5000…DI3678OP+122323代碼段5489B12AHAL…AX55AA……1223AA數(shù)據(jù)段55…下面指令中,源操作數(shù)采用寄存器相對尋址,引用的段寄存器是SS:MOVBX,[BP-4]下面指令中,目的操作數(shù)采用寄存器相對尋址,引用的段寄存器是ES:MOVES:[BX+5],AL

指令:MOVAX,[SI+3]與MOVAX,3[SI]是等價的

50000

5489B536786、基址加變址尋址方式

操作數(shù)在存儲器中,操作數(shù)的有效地址由:基址寄存器之一的內(nèi)容與變址寄存器之一的內(nèi)容相加

在一般情況下,如果BP之內(nèi)容作為有效地址的一部分,則以SS之內(nèi)容為段值,否則以DS之內(nèi)容為段值。存儲器例如:MOVAX,[BX][DI]DS2100…如(DS)=2100H,BX0158(BX)=0158H,AHALDI10A5…(DI)=10A5H

AX1234221FD…則EA=0158+10A5=11FD數(shù)據(jù)段34物理地址=21000+11FD=221FDH12指令情況如左圖執(zhí)行結(jié)果:

(AX)=1234H(BX)(BP)即:EA=+(SI)(DI)+

2100021158221FD下面指令中,目的操作數(shù)采用基址加變址尋址,引用的段寄存器是DS:

MOVDS:[BP+SI],AL下面指令中,源操作數(shù)采用基址加變址尋址,

引用的段寄存器ES:MOVAX,ES:[BX+SI]這種尋址方式適用于數(shù)組或表格處理。用基址寄存器存放數(shù)組首地址,而用變址寄存器來定位數(shù)組中的各元素,或反之。由于兩個寄存器都可改變,所以能更加靈活地訪問數(shù)組或表格中的元素。下面的兩種表示方法是等價的:

MOVAX,[BX+DI]MOVAX,[DI][BX]

7、相對基址加變址尋址方式操作數(shù)在存儲器中,操作數(shù)的有效地址由基址寄存器之一的內(nèi)容與變址寄存器之一的內(nèi)容及指令中給定的8位或16位位移量相加得到。在一般情況下,如果BP之內(nèi)容作為有效地址的一部分,則以SS段寄存器之內(nèi)容為段值,否則以DS段寄存器之內(nèi)容為段值。在指令中給定的8位或16位位移量采用補碼形式表示。在計算有效地址時,如果位移量是8位,那么被帶符號擴展成16位。當(dāng)所得的有效地址超過FFFFH時,就取其64K的模。即:EA=(BX)(BP)+(SI)(DI)+8位16位位移量例如:MOVAX,[BX+DI-2]假設(shè),(DS)=5000H,(BX)=1223H,(DI)=54H(51275)=54H(51276)=76H那么,存取的物理存儲單元是多少呢?物理地址=50000+1223+0054+FFFE=51275H在執(zhí)行該指令后,(AX)=7654H。相對基址加變址這種尋址方式的表示方法多種多樣,下面四種表示方法均是等價的:MOVAX,[BX+DI+1234H],MOVAX,1234H[BX][DI]MOVAX,1234H[BX+DI],MOVAX,1234H[DI][BX]1、現(xiàn)有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100)=12H,(20101)=34H,(20102)=56H(20103)=78H,(21200)=2AH,(21201)=4CH(21202)=B7H,(21203)=65H試說明下列各條指令執(zhí)行完后AX寄存器的內(nèi)容MOVAX,1200HMOVAX,BXMOVAX,[1200H]MOVAX,[BX]MOVAX,1100[BX]MOVAX,[BX][SI]MOVAX,1100[BX][SI]2、假設(shè)(DS)=2000H,(ES)=2100H,(SS)=1500H,(SI)=00A0H,(BX)=0100H(BP)=0010H,數(shù)據(jù)段中變量名VAL的偏移地址值為0050H,試指出下列源操作數(shù)字段的尋址方式是什么?其物理地址值是多少?MOVAX,0ABHMOVAX,BXMOVAX,[100H]MOVAX,VALMOVAX,[BX]MOVAX,ES:[BX]MOVAX,[BP]MOVAX,[SI]MOVAX,[BX+10]MOVAX,VAL[BX]MOVAX,[BX][SI]MOVAX,VAL[BX][SI]四、8086/8088指令系統(tǒng)8086/8088的指令系統(tǒng)豐富,而且指令的功能也強。大多數(shù)指令既能處理字數(shù)據(jù),又能處理字節(jié)數(shù)據(jù);算術(shù)運算和邏輯運算不局限于累加器,存儲器操作數(shù)也可直接參加算術(shù)邏輯運算。8086/8088的指令系統(tǒng)可分為如下六個功能組:數(shù)據(jù)傳送算術(shù)運算邏輯運算串操作程序控制處理器控制匯編語言中指令語句的一般格式。指令語句可由四部分組成,一般格式如下:[標號:]指令助記符[操作數(shù)1[,操作數(shù)2]][;注釋]指令是否帶有操作數(shù),完全取決于指令本身標號的使用取決于程序的需要,標號只被匯編程序識別,它與指令本身無關(guān)。

(一).數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令組又可分為:傳送指令,交換指令,地址傳送指令,堆棧操作指令,標志傳送指令。查表指令,輸入輸出指令在有關(guān)章節(jié)介紹。除了SAHF和POPF指令外,這組指令對各標志沒有影響。1、傳送指令其格式如下:MOVDST,SRC源操作數(shù)可以是累加器、寄存器、存儲單元以及立即數(shù),而目的操作數(shù)可以是累加器、寄存器和存儲單元。傳送不改變源操作數(shù)。數(shù)據(jù)傳送指令能實現(xiàn)下列傳送功能:(1)CPU內(nèi)部寄存器之間的數(shù)據(jù)傳送。例如:MOVAH,ALMOVDL,DHMOVBP,SPMOVAX,CS注意:源和目的操作數(shù)不能同時是段寄存器;代碼段寄存器CS不能作為目的;指令指針I(yè)P既不能作為源,也不能作為目的。注意,這種例外永遠存在。(2)

立即數(shù)送至通用寄存器或存儲單元(各種存儲器尋址方式)。例如:MOVAL,3MOVSI,-5MOVVARB,-1;VARB是變量名,代表一個存儲單元MOVVARW,3456H;VARW是一個字變量MOV[SI],6543H注意:立即數(shù)不能直接傳送到段寄存器,立即數(shù)永遠不能作為目的操作。(3)寄存器與存儲器間的數(shù)據(jù)傳送。例如:MOVAX,VARW;VARW是一個字變量,存儲器操作為直接尋址MOVBH,[DI];存儲器操作數(shù)為寄存器間接尋址MOVDI,ES:[SI+3];存儲器操作數(shù)為相對變址尋址,使用段超越前綴MOVVARB,DL;VARB是一個字節(jié)變量MOVDS:[BP],DL;使用段超越前綴MOVVARW,DS;VARW是一個字變量MOVES,VARW

注意:源操作數(shù)和目的操作數(shù)類型要一致。即同時為字節(jié)或字,不能一個字節(jié),另一個是字。除了串操作指令外,源操作數(shù)和目的操作數(shù)不能同時是存儲器操作數(shù)。如果要在兩個存儲單元間傳送數(shù)據(jù),那么可利用通用寄存器過渡的方法進行,例如:把字變量VARW1的內(nèi)容送到字變量VARW2MOVAX,VARW1MOVVARW2,AX這種利用通用寄存器過渡的方法,也適用于段寄存器間的數(shù)據(jù)傳送。例如:MOVAX,CS;把CS的內(nèi)容送到DSMOVDS,AS例如:MOVAL,‘D’立即數(shù)(字符D的ASCII碼)送到AL寄存器.MOVBX,OFFSETTABLE把TABLE的偏移地址(不是內(nèi)容)送到BX寄存器.其中OFFSET為屬性操作符.此指令不影響標志位2、交換指令利用交換指令可方便地實現(xiàn)通用寄存器與通用寄存器或存儲單元間的數(shù)據(jù)交換,交換指令的格式如下:XCHGOPRD1,OPRD2此指令把操作數(shù)OPRD1的內(nèi)容與操作數(shù)OPRD2的內(nèi)容交換。操作數(shù)同時是字節(jié)或字。例如:XCHGAL,AHXCHGSI,BXOPRD1和OPRD2可以是通用寄存器和存儲單元。但不包括段寄存器,也不能同時是存儲單元,還不能有立即數(shù),可采用各種存儲器尋址方式來指定存儲單元。例如:XCHGBX,[BP+SI]如指令執(zhí)行前:(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246)=4154H物理地址=2F000+0200+0046=2F246H指令執(zhí)行后:(BX)=4154H(2F246H)=6F30H

此指令不影響標志位3、地址傳送指令8086/8088有如下三條地址傳送指令。(1)指令LEA(LoadEffectiveAddress)指令LEA稱為傳送有效地址指令,其格式如下:LEAREG,OPRD該指令把操作數(shù)OPRD的有效地址傳送到操作數(shù)REG。操作數(shù)OPRD必須是一個存儲器操作數(shù),操作數(shù)REG必須是一個16位的通用寄存器。例如:LEAAX,BUFFER;BUFFER是變量名LEADS,[BS+S]LEASI,[BP+DI+4]例如:LEABX,[BX+SI+0F62H]如指令執(zhí)行前(BX)=0400H,(SI)=003CH指令執(zhí)行后(BX)=0040+003C+0F62=139EH(2)指令LDS(LoadpointerintoDS)段值和段內(nèi)偏移構(gòu)成32位的地址指針。該指令傳送32位地址指針,其格式如下:

LDSREG,OPRD執(zhí)行的操作:(REG)(SRC)(DS)(SRC+2)該指令把操作數(shù)OPRD中所含的一個32位地址指針的段值部分送到數(shù)據(jù)段寄存器DS,把偏移部分送到指令給出的通用寄存器REG。操作數(shù)OPRD必須是一個32位的存儲器操作數(shù),操作數(shù)REG可以是一個16位的通用寄存器,但實際使用的往往是變址寄存器或指針寄存器。LDSSI,POINTER;POINTER是一個雙字變量

假設(shè)雙字變量POINTER包含的32位地址指針的段值為5678H,偏移為1234H,那么在執(zhí)行指令后:(DS)=5678H,(SI)=1234H32位地址指針的偏移部分存儲在雙字變量的低地址字中,段值部分存儲在高地址字中。例如:LDSSI,[10H]如指令執(zhí)行前:(DS)=C000H,(C0010H)=0180,(C0012H)=2000H指令執(zhí)行后:(SI)=0180H,(DS)=2000H(3)指令LES(LoadpointerintoES)LES指令也傳送32位地址指針,其格式如下:LESREG,OPRD該指令把操作數(shù)OPRD中所含的32位地址指針的段值部分送到附加段寄存器ES,把偏移部分送到指令給出的通用寄存器REG。

執(zhí)行的操作;(REG)(SRC)(ES)(SRC+2)例如:LESDI,[BX]如指令執(zhí)行前:(DS)=B000H,(BX)=080AH,(0B080AH)=05AEH,(0B080CH)=4000H指令執(zhí)行后:(DI)=05AEH,(ES)=4000H以上三條指令LEA、LDS、LES不影響標志位例如:如TABLE為數(shù)據(jù)段中0032單元的符號名,其中存放的內(nèi)容為1234H,試問以下兩條指令有什么區(qū)別?指令執(zhí)行完后AX寄存器的內(nèi)容是什么?MOVAX,TABLELEAAX,TABLEMOVAX,OFFSETTABLE例如:一個有16個字的的數(shù)據(jù)區(qū),它的起始地址為:70A0:DDF6,請寫出這個數(shù)據(jù)區(qū)首末字單元的物理地址首地址為:70A00+DDF6=7E7F6H末地址為:7E7F6+1E=7E814H

…7E7F6H7E814H4、堆棧操作指令在8086/8088系統(tǒng)中,堆棧是一段RAM區(qū)域。稱為棧底的一端地址較大,稱為棧頂?shù)囊欢说刂份^小。(高地址)(低地址)堆棧的段值在堆棧段寄存器SS中,堆棧指針寄存器SP始終指向棧頂。堆棧是以“后進先出”方式工作的一個存儲區(qū)。堆棧的存取必須以字為單位。堆棧操作指令分為兩種:(1)進棧指令PUSH

格式如下;PUSHSRC執(zhí)行的操作:(SP)(SP)-2該指令把源操作數(shù)SRC壓入堆棧。它先把堆棧指針寄存器SP的值減2,然后把源操作數(shù)SRC送入由SP所指的棧頂。源操作數(shù)SRC可以是通用寄存器和段寄存器,也可以是字存儲單元。例如:PUSHAX

假設(shè)AX=2107H

指令執(zhí)行前指令執(zhí)行后堆棧段堆棧段低地址低地址

(SP)0721進棧方向(SP)高地址高地址(2)出棧指令POP格式如下;POPDST執(zhí)行的操作:(SP)(SP)+2POPDST該指令從棧頂彈出一個字數(shù)據(jù)到目的操作數(shù)DST。它先把堆棧指針寄存器SP所指的字數(shù)據(jù)送至目的的操作數(shù)DST,然后SP值加2,DST可以是通用寄存器和段寄存器(但CS例外),也可以是字存儲單元。

指令執(zhí)行前指令執(zhí)行后堆棧段堆棧段低地址低地址接前面的例子(SP)0707如左圖:2121例如:POPAX(SP)執(zhí)行后:出棧方向(AX)=2107H高地址高地址注意:以上兩條指令PHSH和POP只能作字操作。它們可以使用除立即數(shù)以外的其他尋址方式。但POP指令不允許用CS寄存器。此兩條指令不影響標志位下面的程序段說明堆棧的一種用途,臨時保存寄存器的內(nèi)容,必要時再恢復(fù)其原始內(nèi)容。例如:PUSHAX;保護AXPUSHBX……;其間程序用到AX和BX寄存器POPBX;使DS的內(nèi)容與CS的內(nèi)容相同POPAX;恢復(fù)AX再例如:

PUSHSIPOPSIPUSHDSPOPESPUSHVARW;VARW是字變量POPVARW;VARW是字變量PUSH[SI]POP[SI]

通過上面講過的指令,數(shù)據(jù)交換有三種方式;傳送指令、交換指令、堆棧指令例如:將寄存器AX與SI的內(nèi)容交換用MOV指令,利用通用寄存器過渡的方法 MOVBX,AX MOVAX,SI MOVSI,BX用交換指令XCHG XCHGAX,SI用堆棧指令 PUSHAX PUSHSI … POPAX POPSI例:假設(shè)(SS)=2250H,(SP)=0140H,如果在堆棧中存入5個數(shù)據(jù),則棧頂?shù)奈锢淼刂窞槎嗌??如果又從堆棧中取?個數(shù)據(jù),則棧頂?shù)奈锢淼刂肥嵌嗌??未存入?shù)據(jù)之前物理地址=22500+0140=22640H存入5個數(shù)據(jù)棧頂?shù)奈锢淼刂窞椋?2640-0A=22636H取出3個數(shù)據(jù)棧頂?shù)奈锢淼刂窞椋?2636+6=2263CH5、標志操作指令

(1)標志傳送指令標志傳送指令屬于數(shù)據(jù)傳送指令組。①指令LAHF(LoadAHwithFlags)

指令LAHF采用固定尋址方式,指令格式如下:LAHF該條指令把標志寄存器的低8位(包括SF、ZF、AF、PF和CF)傳送到寄存器AH的指定位,如下圖所示70

AHFLAGOFDFIFTFSFZFAFPFCF這條指令本身不影響這些標志和其他標志。②指令SAHF(StoreAHintoFlags)指令SAHF采用固定尋址方式,其格式如下:SAHF該條指令與指令LAHF剛好相反,把寄存器AH的指定位送至標志寄存器低8位的SF、ZF、AF、PF和CF標志位。因而這些標志的內(nèi)容就要受到影響,并取決于AH中相應(yīng)位的狀態(tài)。但這條指令不影響溢出標志OF、方向標志DF、中斷允許標志IF和追蹤標志TF,也即不影響標志寄存器的高位字節(jié)。例如:MOVAH,0C1HSAHF;CF=1,PF=0,AF=0,ZF=1,SF=1③指令PUSHF

指令PUSHF的格式如下:PUSHF該條指令把標志寄存器的內(nèi)容壓入堆棧,即先把堆棧指針寄存器SP的值減2,然后把標志寄存器的內(nèi)容送入由SP所指的棧頂。④指令POPF指令POPF的格式如下:POPF該條指令把當(dāng)前堆棧頂?shù)囊粋€字傳送到標志寄存器,同時相應(yīng)地修改堆棧指針,即把堆棧指針寄存器SP的值加2。這條指令和PUSHF指令一起可以保存和恢復(fù)標志寄存器的內(nèi)容,即保存和恢復(fù)各標志的值。另外,這兩條指令也可以用來改變追蹤標志TF。為了改變TF標志,可先用PUSHF指令將標志壓入堆棧,然后設(shè)法改變棧頂字單元中的第8位(把整個標志寄存器看成是一個字),再用POPF指令把該字彈回到標起寄存器,這樣其余的標志不受影響,而只有TF標志按需要改變了。(2)標志位操作指令

標志位操作指令僅對指令規(guī)定的標志產(chǎn)生指令規(guī)定的影響,對其他標志沒有影響。①清進位標志指令CLC(ClearCarryflag)清進位標志指令的格式如下:CLC該指令使進位標志為0。②置進位標志指令STC(SeTCarryflag)

置進位標志指令的格式如下:STC該指令使進位標志為1。③進位標志取反指令CMC(CoMplementcarryflag)進位標志取反指令的格式如下:CMC該指令使進位標志取反。如CF為1,則使CF為0;如CF為0,則CF為1④清方向標志CLD(ClearDirectionflag)

清方向標志指令的格式如下:CLD該條指令使方向標志DF為0。從而在執(zhí)行串操作指令時,使地址按遞增方式變化。⑤置方向標志STD(SeTDirectionflag)置方向標志指令的格式如下:STD該條指令使方向標志DF為1。從而在執(zhí)行串操作指令時,使地址按遞減方式變化。⑥清中斷允許標志CLI(ClearInterruptenableflag)清中斷允許標志指令的格式如下:CLI該條指令使中斷允許標志IF為0,于是CPU就不響應(yīng)來自外部裝置的可屏蔽中斷。但對不可屏蔽中斷和內(nèi)部中斷都沒有影響。⑦置中斷允許標志STI(SeTInterruptenableflag)置中斷允許標志指令的格式如下:STI該條指令使中斷允許標志IF為1,則CPU可以響應(yīng)可屏蔽中斷。(二)加減運算指令1.加法指令A(yù)DD格式如下:ADDOPRD1,OPRD2執(zhí)行的操作:(OPRD1)(OPRD1)+(OPRD2)例如:MOVAX,7896H;AX=7890H,即AH=78H,AL=96H;各標志位保持不變ADDAL,AH;AL=0EH,AH=78H,即AX=780EHCF=1,ZF=0,SF=0,OF=0,AF=0,AF=0,PF=0例如:ADDDX,0F0F0H執(zhí)行前(DX)=4652H執(zhí)行后(DX)=3742HZF=0,SF=0,CF=1,OF=0例如:ADDAX,4321執(zhí)行前(AX)=62A0H執(zhí)行后(AX)=A5C1HSF=1,ZF=0,CF=0,OF=1從上面例子可看出:加法指令影響標志位.OF位則根據(jù)操作數(shù)的符號及其變化情況來設(shè)置:若兩個操作數(shù)的符號相同而結(jié)果的符號與之相反時OF=1,否則OF=0CF位可以用來表示無符號數(shù)的溢出.由于無符號數(shù)的最高有效位只有數(shù)值意義而無符號意義,所以從該位產(chǎn)生的進位應(yīng)該是結(jié)果的實際進位值,但在有限數(shù)的范圍內(nèi)就說明了結(jié)果的溢出.2、帶進位加指令A(yù)DC(ADdwithCarry)

帶進位加指令的格式如下:ADCOPRD1,OPRD2

OPRD1OPRD1+OPRD2+CF例如:下列指令序列執(zhí)行兩個雙精度的加法。設(shè)目的操作數(shù)放在DX和AX寄存器中,其中DX存放高位字。源操作數(shù)存放在BX、CX中,其中BX存放高位字。如指令執(zhí)行前:(DX)=0002H,(AX)=0F365H(BX)=0005H,(CX)=0E024H指令序列為:

ADDAX,CXADCDX,BX執(zhí)行第一條指令后:(AX)=0D389H,SF=1,ZF=0,CF=1,OF=0執(zhí)行第二條指令后:(DX)=0008H,SF=0,ZF=0,CF=0,OF=0則該指令序列執(zhí)行完后:(DX)=0008H,(AX)=D389H從上面的例子可以看出:為實現(xiàn)雙精度數(shù)加法,必須用兩條指令分別完成低位字和高位字的加法,而且在高位字相加時,應(yīng)該使用ADC指令以便把前一條ADD指令作低位字加法所產(chǎn)生的進位值加入高位字之內(nèi)。另外,帶符號的雙精度數(shù)的溢出,應(yīng)該根據(jù)ADC指令的OF位來判斷,而作低位加法用的ADD指令的溢出是無意義的此指令影響標志位3、加1指令I(lǐng)NC(INCrement)加1指令的格式如下:

INCOPRD這條指令完成對操作數(shù)OPRD加1,然后把結(jié)果送回OPRD,即:OPRDOPRD+1操作數(shù)DST可以是通用寄存器,也可以是存儲單元。這條指令執(zhí)行的結(jié)果影響標志ZF、SF、OF、PF和AF,但它不影響CF。該指令主要用于調(diào)整地址指針和計數(shù)器。例如:寫出把首地址為BLOCK的字數(shù)組的第6個字送到DX寄存器的指令.要求使用以下幾種尋址方式:(1)寄存器間接尋址MOVBX,OFFSETBLOCKADDBX,000AH

溫馨提示

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

評論

0/150

提交評論