微機(jī)第二章8086處理器指令_第1頁(yè)
微機(jī)第二章8086處理器指令_第2頁(yè)
微機(jī)第二章8086處理器指令_第3頁(yè)
微機(jī)第二章8086處理器指令_第4頁(yè)
微機(jī)第二章8086處理器指令_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第二章 處理器指令 一微機(jī)在實(shí)地址模式下的寄存器 1 .pentium處理器的工作模式 inter系列的微處理器從80386開始就具備了3 種工作模式,到80486dx又增加了1種工作模式,這4種工作模式都被pentium繼承下來(lái)并一直延續(xù)到pentium/和pentium 4。這4種狀態(tài)分別是:實(shí)地模式、虛地址保護(hù)模式、虛擬8086模式和系統(tǒng)管理模式。1) 實(shí)地址模式系統(tǒng)啟動(dòng)后,pentium自動(dòng)進(jìn)入實(shí)地址模式。在此模式下,采用類似于8086的體系結(jié)構(gòu)。pentium在實(shí)地址模式下的尋址方式、存儲(chǔ)器管理、中斷處理與8086的一樣。操作數(shù)默認(rèn)長(zhǎng)度為16位,但如果在指令前加前綴也允許訪問(wèn)32位寄

2、存器。在實(shí)地址模式下不用虛擬地址,最大地址范圍仍限于1mb,只采用分段方式,每段最大64kb。盡管pentium有4個(gè)特權(quán)級(jí),但在實(shí)地址模式下,程序在最高級(jí)0級(jí)上執(zhí)行,也就是說(shuō)用戶此時(shí)和操作系統(tǒng)擁有一樣的級(jí)別。2) 保護(hù)模式所謂保護(hù)是指在執(zhí)行多任務(wù)操作時(shí),對(duì)不同任務(wù)使用的虛擬存儲(chǔ)器空間進(jìn)行完全的隔離,保護(hù)每個(gè)任務(wù)順利執(zhí)行。保護(hù)模式是80386及以后的微機(jī)常用的模式,系統(tǒng)啟動(dòng)后先進(jìn)入實(shí)地址模式,完成系統(tǒng)初始化后立即轉(zhuǎn)到保護(hù)模式。這種保護(hù)模式提供了多任務(wù)環(huán)境下的各種復(fù)雜功能以及對(duì)復(fù)雜存儲(chǔ)器組織的管理機(jī)制。只有在保護(hù)模式下,pentium才發(fā)揮其強(qiáng)大的功能。在保護(hù)模式下,pentium具有如下特點(diǎn):

3、存儲(chǔ)器采用虛擬地址空間,線性地線空間和物理地址空間三種方式來(lái)描述。在保護(hù)模式下,pentium尋址機(jī)構(gòu)是通過(guò)描述符這種數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)對(duì)內(nèi)存訪問(wèn)的。pentium可以尋址的空間大至64tb(),這個(gè)空間就是所謂的虛擬地址空間。在保護(hù)模式下,可以使用pentium的4級(jí)保護(hù)功能,實(shí)現(xiàn)程序與程序,用戶與用戶及用戶與操作系統(tǒng)之間的隔離和保護(hù),為多任務(wù)操作系統(tǒng)提供優(yōu)化支持。只是在保護(hù)模式下,pentium就能啟動(dòng)其分頁(yè)單元,以支持虛擬內(nèi)存。 3)虛擬8086模式所謂虛擬8086模式是指一個(gè)多任務(wù)的環(huán)境(multitasking),即模擬多個(gè)8086的工作模式。在這個(gè)模式下,pentium被模擬成多個(gè)80

4、86微處理器并行工作。虛擬8086模式允許pentium將內(nèi)存劃分成若干部分,每個(gè)部分由操作系統(tǒng)分配給不同的應(yīng)用程序,而應(yīng)用程序,數(shù)據(jù)以及內(nèi)存管理程序等部分則存放在所分配的內(nèi)存中。因此,操作系統(tǒng)可根據(jù)時(shí)間上的平均分配或優(yōu)先權(quán),分配每個(gè)應(yīng)用程序的執(zhí)行時(shí)間。在虛擬8086模式下可執(zhí)行原來(lái)采用8086指令書寫的應(yīng)用程序。段寄存器的用法與實(shí)地址模式一樣,即段寄存器內(nèi)容乘以16后加上偏移量即可得到20位的線性地址。虛擬地址模式下可以使用分頁(yè)方式,比如將1mb分為256個(gè)頁(yè)面,分頁(yè)內(nèi)存是將內(nèi)存以4kb為單位進(jìn)行劃分,每一個(gè)4kb稱為一“頁(yè)”,因此可以比段尋址方式劃分的細(xì),從而可處理較小的應(yīng)用程序與數(shù)據(jù)段。

5、盡管在虛擬86模式下得到的線性地址是20位即1mb的空間,但由于線性地址可以通過(guò)頁(yè)表映射到任何32位物理地址,因此應(yīng)該程序可以在pentium現(xiàn)有實(shí)際內(nèi)存的任何地方執(zhí)行。在pentium多任務(wù)系統(tǒng)中,可以使其中一個(gè)或幾個(gè)任務(wù)使用虛擬8086模式。此時(shí),一個(gè)任務(wù)所用的全部頁(yè)面可以定位于某個(gè)物理地址空間,另一個(gè)任務(wù)的頁(yè)面可以定位于其他區(qū)域,即每個(gè)虛擬8086模式下的任務(wù)可以轉(zhuǎn)換到物理存儲(chǔ)器的不同位置。這樣,把存儲(chǔ)器虛擬化了,故稱之為虛擬8086模式。在虛擬8086模式中,應(yīng)用程序在最低特權(quán)級(jí)3級(jí)上運(yùn)行,因此pentium指令不能使用。表2.1列出了實(shí)地址模式與虛擬8086模式的主要區(qū)別表2.1 實(shí)

6、地址模式與虛擬8086模式的主要區(qū)別實(shí)地址模式虛擬8086模式內(nèi)存管理分段管理即分段又分頁(yè)存儲(chǔ)空間1mb每個(gè)8086程序任務(wù)尋址1mb,總尋址空間4gb多任務(wù)不支持支持,虛擬8086模式是pentium保護(hù)模式中多任務(wù)的一個(gè)任務(wù)。應(yīng)該注意,在開機(jī)或復(fù)位時(shí),pentium總是自動(dòng)進(jìn)入實(shí)地址模式。在實(shí)地址模式下,執(zhí)行保護(hù)模式的初始化后,利用mov cr0,reg指令修改機(jī)器控制寄存器,使pe=1,進(jìn)入保護(hù)模式。如果要從保護(hù)模式回到實(shí)地址模式,則可用指令mov cr0,reg使pe=0。3) 系統(tǒng)管理模式系統(tǒng)管理模式(system management mode,smm)的功能主要包括電源管理以及為

7、操作系統(tǒng)和正在運(yùn)行的程序提供安全性。而smm最顯著的應(yīng)用就是電源管理。smm可以使處理器和系統(tǒng)外圍部件都休眠一定時(shí)間,然后在有一鍵按下或鼠標(biāo)移動(dòng)時(shí)能自動(dòng)喚醒它們,并使之繼續(xù)工作。此外,smm還可以完全控制整個(gè)系統(tǒng),包括i/o和全部ram。利用smm可實(shí)現(xiàn)軟件關(guān)機(jī)(windows95/98或nt等)。2. 8086寄存器的特殊用途我們已經(jīng)知道了信息在8086中的表示,雖然信息(對(duì)8086而言,實(shí)際上就是一系列位的組合)存放在ram中,但是對(duì)信息的處理實(shí)際上是cpu的alu(算術(shù)邏輯單元)中進(jìn)行的。在信息處理過(guò)程中,需要在cpu內(nèi)部辟出一塊存儲(chǔ)區(qū)域,用來(lái)存放信息和保存中間結(jié)果。8086cpu以一系

8、列寄存器的形式提供了這樣的存儲(chǔ)區(qū)域,所有的匯編語(yǔ)言程序都要廣泛用到這些cpu寄存器。因此,學(xué)會(huì)訪問(wèn)和使用cpu寄存器相當(dāng)重要。8086有八個(gè)十六位通用寄存器,其名稱分別為:ax,bx,cx,dx,bp,si,di,sp,其中前四個(gè)寄存器,也可以用作八位寄存器對(duì)。圖2.1給出了這些八位寄存器的名稱。這些八位寄存器名稱的首字母與相應(yīng)的十六位寄存器相同,第二個(gè)字母分別是h和l,分別代表相應(yīng)的十六位寄存器的高半部分和低半部分。因此,ax寄存器的高位字節(jié)和低位字節(jié)分別稱為ah和al。 雖然名義上說(shuō)它們都是通用寄存器,但是實(shí)際上每個(gè)寄存器都有一些特定的用途。比如說(shuō),cx寄存器用作移位和循環(huán)指令的計(jì)數(shù)器,s

9、p寄存器用作堆棧指針(見表2.2)。類似地,ax寄存器常稱為累加器,意指用在許多算術(shù)和輸入/出指令中。表2.2 8086寄存器的特殊用途符號(hào)名稱特殊用途ax累加器算術(shù)操作,端口輸入/出bx基地址數(shù)據(jù)結(jié)構(gòu)的起始地址cx計(jì)數(shù)器循環(huán)計(jì)數(shù)器,移位計(jì)數(shù)器dx數(shù)據(jù)算術(shù)操作,輸入/出地址sp堆棧指針當(dāng)前棧頂偏移bp基指針指向堆棧結(jié)構(gòu)的指針si源索引字符串指令di目標(biāo)索引字符串指令8086如何尋址內(nèi)存呢?它借用了段和偏移的概念,每個(gè)段實(shí)際上就是一塊內(nèi)存,其大小可高達(dá)64k。 8086之所以提供四個(gè)專用寄存器就是因?yàn)檫@種分段內(nèi)存尋址策略。這些專用寄存器稱為段寄存器,其名稱分別為cs,ds,ss和es它們分別用來(lái)

10、存放代碼段,數(shù)據(jù)段,堆棧段和附加段的段地址。 cs:ip=控制 所謂代碼段指的是其間含有8086要執(zhí)行的指令的一塊內(nèi)存。cs寄存器中存放的是該塊內(nèi)存的起始地址,ip(指令指針)寄存器中存放的是要執(zhí)行的下一條指令的偏移(本章后面將要介紹偏移的情況)。該指針的完整地址經(jīng)常表示成cs:ip(用一個(gè)冒號(hào)將段寄存器名稱和存放偏移值得寄存器名稱分隔開來(lái))。因?yàn)楦淖僣s,ip,或者同時(shí)改變cs,ip中的值,將導(dǎo)致程序的執(zhí)行流發(fā)生變化,所以cs:ip經(jīng)常稱為控制,像call和jmp這樣的能夠改變cs:ip內(nèi)容的指令稱為控制轉(zhuǎn)移指令。 ss:sp=堆棧如同cs和ip總是成對(duì)出現(xiàn)一樣,ss和sp也總是成對(duì)出現(xiàn)。s

11、s:ip用來(lái)確定堆棧地址,所謂堆棧就是用作后進(jìn)先出存儲(chǔ)區(qū)域的一塊內(nèi)存。bp寄存器用于尋址堆棧中的內(nèi)存位置。段寄存器ds和esds(數(shù)據(jù)段)和es(附加段)段寄存器是專門用于尋址數(shù)據(jù)的。借助于這兩個(gè)寄存器,可以同時(shí)訪問(wèn)2段數(shù)據(jù),每一段數(shù)據(jù)可多達(dá)64k字節(jié)。bx寄存器與ds相聯(lián),用來(lái)確定數(shù)據(jù)在si和di寄存器來(lái)訪問(wèn)數(shù)組(字符串)中的單個(gè)字節(jié)或字。這些指令將si與ds,di與es相關(guān)聯(lián)起來(lái)。標(biāo)志寄存器除了前面介紹的寄存器外,8086還提供了一個(gè)用來(lái)表明算術(shù)邏輯操作結(jié)果的寄存器。例如,在將兩個(gè)數(shù)相減后,我們可能想知道結(jié)果值是否為0,以便確定這兩個(gè)數(shù)是否相等。8086將結(jié)果信息存放在一個(gè)十六位寄存器的某

12、一位中,這個(gè)十六位寄存器稱為標(biāo)志寄存器,這一位稱為零標(biāo)志(if)位。如果結(jié)果的是0,cpu就將零標(biāo)志位置成1??梢酝ㄟ^(guò)某些專門為此目的推出的指令(如jz和jnz)檢驗(yàn)標(biāo)志值,然后根據(jù)實(shí)際情況進(jìn)行相應(yīng)的動(dòng)作。作為一個(gè)匯編語(yǔ)言設(shè)計(jì)人員,應(yīng)當(dāng)認(rèn)識(shí)到標(biāo)志值的重要性。在進(jìn)行條件判斷時(shí)經(jīng)常要用到這些標(biāo)志值。標(biāo)志寄存器如圖2.2所示 8086標(biāo)志寄存器共有九個(gè)標(biāo)志,每個(gè)標(biāo)志占用標(biāo)志寄存器中的一位,其中6個(gè)標(biāo)志用來(lái)處理器在執(zhí)行完一條指令后的狀態(tài),另外三個(gè)標(biāo)志用來(lái)控制8086操作。狀態(tài)標(biāo)志有:進(jìn)位標(biāo)志,檢驗(yàn)標(biāo)志,輔助進(jìn)位標(biāo)志,零標(biāo)志,符號(hào)標(biāo)志和溢出標(biāo)志。3.數(shù)據(jù)傳送指令向/從內(nèi)存?zhèn)魉蛿?shù)據(jù)由于一個(gè)程序的數(shù)據(jù)駐留在

13、計(jì)算機(jī)內(nèi)存中,而操作卻在cpu中執(zhí)行,所以,匯編語(yǔ)言程序中最常見的任務(wù)就是將數(shù)據(jù)在內(nèi)存和cpu寄存器之間來(lái)回傳送,mov指令時(shí)傳送數(shù)據(jù)的主要手段,該指令的使用相當(dāng)頻繁,幾乎找不到有哪一個(gè)masm程序能不用它。mov指令有兩個(gè)操作數(shù),其句法形式如下:mov destination,source該指令的作用就是將數(shù)據(jù)從源傳送至目標(biāo),并且不破壞源值。例如,指令mov bx,ax的作用就是將ax寄存器中存放的值拷貝進(jìn)bx寄存器中。mov指令中,允許有多種源(source)和目標(biāo)(destination)操作數(shù)的組合,具體如何組合還要取決于操作數(shù)是寄存器,立即數(shù)還是內(nèi)存單元,但下列組合不允許。1)目標(biāo)(

14、destination)操作數(shù)不能是cs寄存器,這樣做可以防止cs寄存器被修改。cs段寄存器總是指向當(dāng)前正執(zhí)行的代碼所在的段地址,在執(zhí)行期間改變cs值顯然不明智。改變cs值的唯一合法的方法是作用int,jmp,call或ret指令。2)源和目標(biāo)操作數(shù)不能都是內(nèi)存操作數(shù),這條限制只用于需要兩個(gè)操作數(shù)的所有80x86指令。由于設(shè)計(jì)時(shí)強(qiáng)加的限制,80x86系列處理器不允許直接對(duì)兩個(gè)內(nèi)存操作數(shù)進(jìn)行操作。3)如果源操作數(shù)是立即數(shù),則目標(biāo)操作數(shù)不能再有段寄存器。4)目標(biāo)操作數(shù)不能是立即操作數(shù),這個(gè)限制來(lái)源于下列事實(shí):立即操作數(shù)是嵌在指令中的,若允許向立即操作數(shù)傳送數(shù)據(jù),則將導(dǎo)致代碼修改它本身,這不是良好的

15、程序設(shè)計(jì)方法。將數(shù)據(jù)從一個(gè)內(nèi)存位置傳送至另一個(gè)內(nèi)存位置 假定我們想將變量count的內(nèi)容拷貝進(jìn)另一個(gè)變量lastcount中。雖然不允許出現(xiàn)指令mov lastcount,count,但可以通過(guò)兩條mov指令以間接的方式達(dá)到目的。 count dw ? 定義word lastcount dw ? mov ax,count mov lastcount,ax這個(gè)例子以ax寄存器為中介,先將count值拷貝進(jìn)ax中,再通過(guò)第二條mov指令將count值從ax中拷貝至lastcount。借助于這種方法,完全可以將單個(gè)數(shù)據(jù)項(xiàng)從一個(gè)內(nèi)存單元傳送至另一個(gè)內(nèi)存單元。 堆棧管理從技術(shù)角度看,堆棧就是一個(gè)后進(jìn)先出

16、(lifo)式數(shù)據(jù)結(jié)構(gòu)。在80x86微處理器中,堆棧是通過(guò)一塊連續(xù)內(nèi)存區(qū)域?qū)崿F(xiàn)的。堆棧底部位于堆棧段中最高地址處,然后向下生長(zhǎng)(參見圖2.3)當(dāng)前棧頂中存放著最后進(jìn)入堆棧的元素,棧頂位置有sp寄存器值決定。堆棧就像是一塊臨時(shí)存儲(chǔ)區(qū)域。因?yàn)榧拇嫫鲾?shù)目有限,所以,在將一個(gè)寄存器用作另一個(gè)指令的操作數(shù)前,總要先保存這個(gè)寄存器內(nèi)容。例如,在用mul指令計(jì)算兩個(gè)整數(shù)相乘時(shí),其中一個(gè)因子值就必須存放在ax寄存器中。如果以前已將一個(gè)重要數(shù)據(jù)送入了ax,此時(shí)該怎么辦呢?堆棧最合適處理這種情形??赏ㄟ^(guò)push ax指令將ax值壓入堆棧保存起來(lái),待處理完乘法后,再通過(guò)pop ax指令從堆棧中彈出原先的內(nèi)容,進(jìn)行恢

17、復(fù)。call,int,ret和iret指令在保存和恢復(fù)返回地址時(shí)將自動(dòng)借助于堆棧來(lái)實(shí)現(xiàn)。下面將要介紹,還可以通過(guò)堆棧向匯編語(yǔ)言過(guò)程傳遞參數(shù)。實(shí)際上,諸如c,pascal和fortran之類的高級(jí)語(yǔ)言都利用堆棧向函數(shù)和子程序傳遞參數(shù)。 i/o端口數(shù)據(jù)傳送 要處理的數(shù)據(jù)有時(shí)并不在內(nèi)存中,而來(lái)自與外部源。例如,在串行通信中,發(fā)送和接收字符都要通過(guò)串行端口進(jìn)行。打印文件時(shí),要打印的數(shù)據(jù)送至打印機(jī)端口。出于這方面考慮,80x86微處理器提供了特殊的i/o指令。借助于in和out指令,可通過(guò)i/o端口一次傳送一個(gè)字節(jié)或一個(gè)字。80188和80186以后的微處理器(80286,80386和80486)還提供

18、了字符串i/o指令,即ins和outs,用來(lái)傳送一組字節(jié)。inter 80x86體系結(jié)構(gòu)規(guī)定i/o端口地址是16位,所以,最多可有65,536個(gè)i/o端口,但大多數(shù)pc兼容的外部設(shè)備卡都只使用地址中的低10位。除特殊情況外,很少有i/o地址超過(guò)3ffh。in指令從指定端口讀取一個(gè)字節(jié)或一個(gè)字,送入al或ax,al寄存器用于字節(jié)傳送,ax寄存器用于字傳送。out指令將al或ax值寫入指定i/o端口。端口號(hào)可以是一個(gè)8位的立即數(shù),也可以是存放在dx中的一個(gè)字。因?yàn)橐粋€(gè)8位立即數(shù)最大只能表示255,所以立即數(shù)操作數(shù)只能用于小于255的端口地址。例如,可以讀寫i/o端口20h和21h的內(nèi)容控制pc機(jī)中

19、的8259可編程中斷控制器。下面給出一個(gè)例子:in al,21h ;讀端口21h mov al,20h ;值送入alout 20h,al ;發(fā)往端口20h當(dāng)i/o端口地址大于offh時(shí),應(yīng)將端口地址存放在dx中。pc機(jī)中第一個(gè)串行端口使用的地址就是從3f8h到3feh。端口3fdha中存放著通信線的狀態(tài),可通過(guò)下列代碼將該狀態(tài)讀進(jìn)al:mov dx,3fdh ;先將端口地址送入dxin al,dx ;再讀端口in輸入指令 功能:本指令完成把一個(gè)字節(jié)或一個(gè)字由一個(gè)指定的輸入端口,傳送到al(若是一個(gè)字節(jié))。端口地址可以是一個(gè)立即數(shù)(在0255之間),也可以包括在寄存器dx中,若指令中的累加器為al,則表示傳送一個(gè)字節(jié);相反,若指令中的累加器為ax,則表示傳送一個(gè)字。 句法:in 累加器,立即數(shù) in 累加器,dx標(biāo)志位:標(biāo)志位均不受影響。 說(shuō)明:通過(guò)i/o端口地址,可以訪問(wèn)到許多外部

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論