8086微處理器及其系統(tǒng)綜述_第1頁(yè)
8086微處理器及其系統(tǒng)綜述_第2頁(yè)
8086微處理器及其系統(tǒng)綜述_第3頁(yè)
8086微處理器及其系統(tǒng)綜述_第4頁(yè)
8086微處理器及其系統(tǒng)綜述_第5頁(yè)
已閱讀5頁(yè),還剩168頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

微機(jī)原理及其應(yīng)用

信息與計(jì)算機(jī)學(xué)院閆勇辦公室:經(jīng)技樓411電話:5786160第3章8086微處理器及其系統(tǒng)3.18086/8088微處理器內(nèi)部結(jié)構(gòu)(2課時(shí))3.28086/8088的存儲(chǔ)器(2課時(shí))3.38086/8088指令系統(tǒng)

(實(shí)驗(yàn)課)3.48086/8088微處理器外部引腳(2課時(shí))3.58086/8088系統(tǒng)的最小/最大工作方式(2課時(shí))作業(yè)本章教學(xué)目的、重點(diǎn)、難點(diǎn)目的:掌握8086/8088CPU的內(nèi)部功能結(jié)構(gòu)、寄存器和外部引腳,理解8086/8088的最小及最大工作方式,掌握存儲(chǔ)器的組織與管理,掌握8086/8088的指令系統(tǒng)。重點(diǎn):寄存器,CPU引腳及其功能、最大與最小工作方式、存儲(chǔ)器的組織、指令系統(tǒng)。難點(diǎn):總線周期、存儲(chǔ)器的組織與分段。3.18086/8088微處理器8086是Intel系列的16位微處理器,有16根數(shù)據(jù)線和20根地址線,可以處理8位或16位數(shù)據(jù),尋址1MB的存儲(chǔ)單元和64KB的I/O端口。它的主機(jī)設(shè)計(jì)較之8位機(jī)的性能大約提高了10倍。 在推出8086之后不久,Intel公司還推出了準(zhǔn)16位微處理器8088。8088的內(nèi)部寄存器、運(yùn)算器以及內(nèi)部數(shù)據(jù)總線都是按16位設(shè)計(jì)的,但外部數(shù)據(jù)總線只有8根。其設(shè)計(jì)目的是為了與Intel原有的8位外圍接口芯片直接兼容。3.1.18086/8088CPU的內(nèi)部結(jié)構(gòu)從功能上講,8086可分為兩個(gè)部分,即總線接口單元BIU(BusInterfaceUnit)和執(zhí)行單元EU(ExecutionUnit)。3.1.1.1總線接口單元BIU

--具體任務(wù)BIU的功能是負(fù)責(zé)完成CPU與存儲(chǔ)器或I/O端口之間的數(shù)據(jù)傳送。具體任務(wù):BIU要從內(nèi)存取指令送到指令隊(duì)列;CPU執(zhí)行指令時(shí),BIU要配合執(zhí)行單元從指定的內(nèi)存單元或者外設(shè)端口中取數(shù)據(jù),將數(shù)據(jù)傳送給執(zhí)行單元;把執(zhí)行單元的操作結(jié)果傳送到指定的內(nèi)存單元或外設(shè)端口中。BIU的結(jié)構(gòu)6字節(jié)指令隊(duì)列緩沖器;20位地址加法器;總線控制電路;16位指令指針I(yè)P;4個(gè)16位段地址寄存器: CS(代碼段寄存器)、DS(數(shù)據(jù)段寄存器)、

SS(堆棧段寄存器)、ES(附加段寄存器)。

1.指令隊(duì)列緩沖器8086的指令隊(duì)列為6個(gè)字節(jié)(為何是6?)。(8088的指令隊(duì)列為4個(gè)字節(jié))“先進(jìn)先出”的原則:(1)取指時(shí),存滿1條指令后,送EU執(zhí)行;(2)只要空出2個(gè)(8086)或1個(gè)(8088)指令字節(jié)時(shí),BIU自動(dòng)取指直到填滿;(3)執(zhí)指過(guò)程中,當(dāng)指令需要對(duì)存儲(chǔ)器或I/O設(shè)備存取數(shù)據(jù)時(shí),BIU將在執(zhí)行完現(xiàn)行取指的存儲(chǔ)器周期后的下一個(gè)存儲(chǔ)器周期,對(duì)指定的內(nèi)存單元或I/O設(shè)備進(jìn)行存取操作。即:取完一個(gè)數(shù)據(jù),才能取下一個(gè)數(shù)據(jù)。(4)當(dāng)EU執(zhí)行完轉(zhuǎn)移、調(diào)用和返回指令時(shí),則要清除指令隊(duì)列緩沖器,并要求BIU從新的地址重新開(kāi)始取指令。2.地址加法器8086有20根地址線,內(nèi)部寄存器有16位,采用了16位的段寄存器與16位的偏移地址即“段加偏移”的技術(shù)。地址加法器用來(lái)實(shí)現(xiàn)邏輯地址到物理地址的變換。3.16位指令指針I(yè)P其功能與8位CPU中的PC類(lèi)似。正常運(yùn)行時(shí),IP中含有BIU要取的下1條指令(字節(jié))的偏移地址。IP在程序運(yùn)行中能自動(dòng)加1修正,使之指向要執(zhí)行的下1條指令(字節(jié))。例外:執(zhí)行轉(zhuǎn)移、調(diào)用、返回指令時(shí),能使IP值改變或使IP值壓進(jìn)堆棧,或由堆棧彈出恢復(fù)原值。4.總線控制電路:發(fā)總線控制信號(hào),如對(duì)存儲(chǔ)器的讀寫(xiě)控制信號(hào)。5.4個(gè)16位段寄存器(待敘)3.1.1.2執(zhí)行單元EU

--具體任務(wù)EU只負(fù)責(zé)執(zhí)行指令。由于EU并不與系統(tǒng)的總線控制電路直接相連,這使得它能與總線接口單元之間保持既相互聯(lián)系又相互獨(dú)立的關(guān)系:執(zhí)行的指令從BIU的指令隊(duì)列緩沖器中取得;執(zhí)行指令的結(jié)果或執(zhí)行指令所需要的數(shù)據(jù),都由EU向BIU發(fā)出請(qǐng)求,再由BIU經(jīng)總線控制電路對(duì)存儲(chǔ)器或外設(shè)存取。EU的結(jié)構(gòu)16位算術(shù)邏輯單元(ALU)16位標(biāo)志寄存器F數(shù)據(jù)暫存寄存器通用寄存器組EU控制電路1.16位算術(shù)邏輯單元(ALU)進(jìn)行算術(shù)、邏輯運(yùn)算;按指令尋址方式計(jì)算尋址單元的16位偏移地址。2.16位標(biāo)志寄存器F(待敘)反映CPU運(yùn)算狀態(tài)或存放控制標(biāo)志。3.數(shù)據(jù)暫存寄存器協(xié)助ALU完成運(yùn)算,暫存參加運(yùn)算的數(shù)據(jù)。4.通用寄存器組

(待敘)數(shù)據(jù)寄存器(AX,BX,CX,DX)地址指針寄存器(SP,BP)變址寄存器(SI,DI)5.EU控制電路是控制、定時(shí)與狀態(tài)邏輯電路,接收從BIU中指令隊(duì)列取來(lái)的指令,經(jīng)過(guò)指令譯碼形成各種定時(shí)控制信號(hào),對(duì)EU的各個(gè)部件實(shí)現(xiàn)特定的定時(shí)操作。小結(jié)

-總線數(shù)目1.8086內(nèi)部總線除隊(duì)列總線是8位、地址總線是20位,其余均為16位。2.8088與8086內(nèi)部結(jié)構(gòu)方面的差別:8088BIU中指令隊(duì)列長(zhǎng)度為4個(gè)字節(jié), 8086BIU中指令隊(duì)列長(zhǎng)度為6個(gè)字節(jié);8088BIU通過(guò)總線控制電路與外部交換數(shù)據(jù)的總線寬度是8位,8086BIU通過(guò)總線控制電路與外部交換數(shù)據(jù)的總線寬度是16位。小結(jié)

-8086為什么要分成BIU和EU?等待取指1執(zhí)行1等待取指2執(zhí)行2等待取指3執(zhí)行3CPU總線取指1,忙閑取指2,忙閑取指3,忙閑傳統(tǒng)微處理器的指令執(zhí)行過(guò)程取指1取指2取指3取指4取指5取指6EU總線執(zhí)行1執(zhí)行2執(zhí)行3執(zhí)行4執(zhí)行5執(zhí)行6忙忙忙忙忙忙BIU8086CPU的指令執(zhí)行過(guò)程

小結(jié)

-8086內(nèi)部BIU和EU結(jié)構(gòu)的優(yōu)點(diǎn)BIU與EU之間既相互配合又彼此獨(dú)立,使得兩者的操作可以非同步的進(jìn)行,即:可以在EU執(zhí)行前一條指令的同時(shí),BIU并行的取下一條指令。這樣,在8086CPU中,EU單元可以不停的執(zhí)行事先已經(jīng)取到指令隊(duì)列中的指令。提高了CPU執(zhí)行指令的效率,體現(xiàn)了“流水線計(jì)算機(jī)”(PipeLineComputer)的初步特點(diǎn);只有當(dāng)遇到轉(zhuǎn)移、調(diào)用、返回指令時(shí),或當(dāng)某一條指令執(zhí)行過(guò)程中需要頻繁訪問(wèn)內(nèi)存以至于BIU沒(méi)有空閑從內(nèi)存將指令取到指令隊(duì)列時(shí),才需要EU等待BIU提取指令。3.1.28086/8088的寄存器結(jié)構(gòu)共有14個(gè)16位寄存器,其中標(biāo)志寄存器只用了16位中的9位;AX、BX、CX、DX可分別對(duì)高低字節(jié)單獨(dú)訪問(wèn),其余全部按字訪問(wèn)。AX累加器AHALBHBLCLDHDLCHSPSIDIIPFLAGSCSDSSSESBPBX基址寄存器CX計(jì)數(shù)寄存器DX數(shù)據(jù)寄存器堆棧指針寄存器基址指針寄存器源變址寄存器目的變址寄存器指令指針寄存器標(biāo)志寄存器代碼段寄存器段寄存器附加段寄存器堆棧段寄存器數(shù)據(jù)寄存器地址指針和變址寄存器控制寄存器通用寄存器數(shù)據(jù)段寄存器8086CPU內(nèi)部寄存器結(jié)構(gòu)3.1.2.1通用寄存器

1.數(shù)據(jù)寄存器常用來(lái)存放參與運(yùn)算的操作數(shù)或運(yùn)算結(jié)果??梢砸宰只蜃止?jié)的形式訪問(wèn)。AX:累加器。多用于存放中間運(yùn)算結(jié)果。乘法指令、除法指令,所有I/O指令必須都通過(guò)AX與接口傳送信息。BX:基址寄存器。在間接尋址中用于存放基地址,可用于查表轉(zhuǎn)化指令。CX:計(jì)數(shù)寄存器。用于在循環(huán)或串操作指令中存放循環(huán)次數(shù)或重復(fù)次數(shù)。DX:數(shù)據(jù)寄存器。在32位(雙字)乘除法運(yùn)算時(shí),存放高16位數(shù);在間接尋址的I/O指令中存放I/O端口地址。2.地址指針寄存器(SP,BP)

變址寄存器(SI,DI)SP:堆棧指針寄存器,其內(nèi)容為堆棧棧頂?shù)钠频刂?,用于出棧和入棧指令;BP:堆棧基址指針寄存器,其內(nèi)容是堆棧段中的某一數(shù)據(jù)區(qū)基地址的偏移地址,用于間接尋址中作為基址指針。**SP、BP是不同用途的兩個(gè)有關(guān)堆棧的寄存器。SI:源變址寄存器,存放源操作數(shù)的偏移地址;DI:目標(biāo)變址寄存器,存放目的操作數(shù)的偏移地址;**SI、DI常與DS一起使用,存放DS段中操作數(shù)的偏移地址。特別是在串操作指令中,分別存放源操作數(shù)和目標(biāo)操作數(shù)的偏移地址。通用寄存器小節(jié)通用寄存器主要用于暫存CPU執(zhí)行程序的常用數(shù)據(jù)或地址,以便減少CPU在運(yùn)行程序過(guò)程中通過(guò)外部總線訪問(wèn)存儲(chǔ)器或I/O設(shè)備來(lái)獲得操作數(shù)的次數(shù),從而可加快CPU的運(yùn)行速度。因此,可以把它們看成是設(shè)置在CPU工作現(xiàn)場(chǎng)的一個(gè)小型、快速的"存儲(chǔ)器"。3.1.2.2控制寄存器

1.標(biāo)志寄存器8086/8088的16位標(biāo)志寄存器F只用了其中的9位作標(biāo)志位,即6個(gè)狀態(tài)標(biāo)志位,3個(gè)控制標(biāo)志位。6個(gè)狀態(tài)標(biāo)志位:CF(CarryFlag)進(jìn)位標(biāo)志執(zhí)行加、減法使最高位產(chǎn)生進(jìn)位或借位時(shí),CF=1;否則為0。也受帶進(jìn)位循環(huán)指令的影響。PF(ParityFlag)奇偶性標(biāo)志當(dāng)指令執(zhí)行結(jié)果低8位中含有偶數(shù)個(gè)1時(shí),PF=1;否則PF=0。曾用于數(shù)據(jù)傳輸出錯(cuò)檢驗(yàn)。AF(AuxiliaryCarryFlag)輔助進(jìn)位標(biāo)志執(zhí)行加減法時(shí)若結(jié)果的低字節(jié)的低4位向高4位有進(jìn)位或借位,則AF=1;否則為0。常用在BCD碼運(yùn)算中作為是否需要對(duì)AL進(jìn)行十進(jìn)制調(diào)整的依據(jù)。ZF(ZeroFlag)零標(biāo)志表示算術(shù)或邏輯操作的結(jié)果是否為零。若為零,ZF為1;否則為0。SF(SignFlag)符號(hào)標(biāo)志存放算術(shù)或邏輯運(yùn)算指令執(zhí)行后結(jié)果的算術(shù)符號(hào),與結(jié)果的最高位相同。若數(shù)據(jù)(結(jié)果)用補(bǔ)碼表示,則負(fù)數(shù)為1,正數(shù)為0。OF(OverflowFlag)溢出標(biāo)志溢出標(biāo)志用于判斷有符號(hào)數(shù)進(jìn)行加法或減法時(shí)是否出現(xiàn)溢出,OF=1表示有溢出。無(wú)符號(hào)數(shù)的運(yùn)算不會(huì)影響OF。3個(gè)控制標(biāo)志位:DF(DirectionFlag)方向標(biāo)志用來(lái)控制數(shù)據(jù)串操作指令的步進(jìn)方向。STD指令可將DF置1,則數(shù)據(jù)串操作中地址(SI、DI)會(huì)自動(dòng)遞減;CLD使其清零,地址遞增。IF(InterruptEnableFlag)中斷允許標(biāo)志若用指令STI將IF置1,表示允許CPU接受外部從其INTR引腳上發(fā)來(lái)的可屏蔽中斷請(qǐng)求信號(hào);反之CLI將其清零則不允許。IF的狀態(tài)不影響非屏蔽中斷(NMI)請(qǐng)求,也不影響CPU響應(yīng)內(nèi)部的中斷請(qǐng)求。TF(TrapFlag)跟蹤(陷阱)標(biāo)志用于調(diào)試程序。若將TF標(biāo)志置為1,則CPU處于單步工作方式;若清零則正常運(yùn)行。無(wú)專(zhuān)用指令用于TF的清零與置1。2.指令指針寄存器IP-復(fù)習(xí)

其功能與8位CPU中的PC類(lèi)似。正常運(yùn)行時(shí),IP中含有BIU要取的下1條指令(字節(jié))的偏移地址。IP在程序運(yùn)行中能自動(dòng)加1修正,使之指向要執(zhí)行的下1條指令(字節(jié))。例外:執(zhí)行轉(zhuǎn)移、調(diào)用、返回指令時(shí),能使IP值改變或使IP值壓進(jìn)堆棧,或由堆棧彈出恢復(fù)原值。3.1.2.3段寄存器8086/8088CPU的BIU中有4個(gè)16位段寄存器(CS、DS、SS、ES),8086/8088的指令可以直接訪問(wèn)這4個(gè)段寄存器.CS-程序當(dāng)前使用的代碼段的段地址;DS-。。。。。。。數(shù)據(jù)段。。。。;SS-。。。。。。。堆棧段。。。。;ES-。。。。。。。附加段。。。。,也可以存放處理后的數(shù)據(jù)。例:設(shè)CS存放當(dāng)前代碼段段地址,IP存放下一條將要執(zhí)行指令的段內(nèi)偏移地址,其中CS=2000H,IP=003AH。則存放該指令的內(nèi)存單元的物理地址為:CS×10H+I(xiàn)P=2000H×10H+003AH=2003AH3.28086/8088的存儲(chǔ)器

3.2.1存儲(chǔ)器組織存儲(chǔ)器仍按字節(jié)組織,每個(gè)字節(jié)只有惟一的一個(gè)地址。1.數(shù)據(jù)的存放若存放的信息是8位的字節(jié),將按順序存放;若存放的數(shù)為1個(gè)字時(shí),則將字的低位字節(jié)放在低地址中;當(dāng)存放的是雙字形式(這種數(shù)一般作為指針),其低位字是被尋址地址的偏移量;高位字是被尋址地址所在的段地址。例:設(shè)雙字?jǐn)?shù)據(jù)1A2B3C4DH存于首址為A0000H的數(shù)據(jù)區(qū)中,則該數(shù)據(jù)區(qū)中地址為A0001H和A0002H的單元存放的字節(jié)依次為

。注意:字的存放規(guī)則字:低位字節(jié)從偶數(shù)地址開(kāi)始存放。非規(guī)則字:低位字節(jié)從奇數(shù)地址開(kāi)始存放。3CH2BH2.信息的讀取同一時(shí)間內(nèi),CPU從存儲(chǔ)器讀取的信息總是16位的,且總是在存儲(chǔ)器中以偶地址開(kāi)頭的兩個(gè)字節(jié)的內(nèi)容。注意:規(guī)則字的讀取需要1個(gè)總線周期;非規(guī)則字的讀取需要2個(gè)總線周期。8086系統(tǒng)的存儲(chǔ)體8086的1MB存儲(chǔ)空間分為兩個(gè)512KB的存儲(chǔ)體,稱(chēng)高位庫(kù)(奇數(shù)庫(kù))和低位庫(kù)(偶數(shù)庫(kù)),兩個(gè)存儲(chǔ)體采用字節(jié)交叉編址方式。BHEA0讀/寫(xiě)

BHEA0讀/寫(xiě)

00同時(shí)讀/寫(xiě)高低兩個(gè)字節(jié)01只讀/寫(xiě)地址為奇數(shù)的高位10只讀/寫(xiě)地址為偶數(shù)的低位11不傳送數(shù)據(jù)A0和BHE分別接存儲(chǔ)體偶數(shù)庫(kù)和奇數(shù)庫(kù)的SEL端,用于庫(kù)的選擇。3.2.2存儲(chǔ)器的分段1.為什么要分段?8086/8088CPU的指令指針I(yè)P和堆棧指針SP都是16位,故只能直接尋址64KB的地址空間;而8086/8088有20根地址線,它允許尋址1MB的存儲(chǔ)空間。為了能尋址1MB存儲(chǔ)空間,引入了分段的新概念。2.如何分段?1MB存儲(chǔ)空間被分為若干邏輯段(每段最小可以只有1B,最大只能64KB)。每個(gè)段的20位起始地址(段基址),是一個(gè)能被16整除的數(shù)(即最后4位為0;為什么?),可以通過(guò)用軟件在段寄存器中裝入16位段地址來(lái)設(shè)置。注意:段基址(20位)≠段地址(段基址的高16位)。3.不同分段之間的位置關(guān)系∶

00000H→邏輯段C起點(diǎn)→

FFFFFH→邏輯段A≤64K

邏輯段B≤64K邏輯段C≤64K邏輯段D≤64K邏輯段E≤64K邏輯段B起點(diǎn)→邏輯段A起點(diǎn)→邏輯段D、E起點(diǎn)→例已知CS

=150AH,DS=250AH,ES

=2EF0H,SS=8FF0H,數(shù)據(jù)段有一操作數(shù),其偏移地址=0204H,1)畫(huà)出各段在內(nèi)存中的分布2)指出各段首地址/段基址3)該操作數(shù)的物理地址=?解:各段分布及段首址見(jiàn)右圖所示。操作數(shù)的物理地址為:250AH×10H+0204H=252A4H注意:64K=216=10000H150A0H250A0H2EF00H8FF00HCSSSDSES分段的好處1、解決了16位地址寄存器對(duì)20位物理地址的尋址問(wèn)題;2、實(shí)現(xiàn)了程序代碼的浮動(dòng)裝配。8086/8088CPU引入了分段技術(shù),CPU尋址時(shí)是利用段基地址加偏移地址的原理,稱(chēng)這種尋址機(jī)制為“段加偏移”?!岸渭悠啤痹试S重定位(或再定位)是一種重要的特性。重定位是指一個(gè)完整的程序塊或數(shù)據(jù)塊可以在存儲(chǔ)器所允許的空間內(nèi)任意浮動(dòng)并定位到一個(gè)新的可尋址的區(qū)域。

在8086以前的8位微處理器中是沒(méi)有這種特性的,而從8086引入分段概念之后,由于段寄存器中的段地址可以由程序來(lái)重新設(shè)置,因而,在偏移地址不變的情況下,就可以將整個(gè)存儲(chǔ)器段移動(dòng)到存儲(chǔ)器系統(tǒng)內(nèi)的任何區(qū)域而無(wú)需改變?nèi)魏纹频刂?。這就是說(shuō),“段加偏移”的尋址機(jī)制可以實(shí)現(xiàn)程序的重定位。3.2.3實(shí)際地址和邏輯地址1.實(shí)際地址指CPU對(duì)存儲(chǔ)器進(jìn)行訪問(wèn)時(shí)實(shí)際尋址所使用的地址,又稱(chēng)為物理地址。2.邏輯地址是指在程序和指令中表示的一種地址,它包括兩部分:段地址和偏移地址。段地址由相應(yīng)的16位段寄存器給出;偏移地址是指令尋址時(shí)的寄存器組合和位移量之和構(gòu)成的16位的偏移量。3.存儲(chǔ)器中一個(gè)存儲(chǔ)單元既可以用物理地址表示,也可以用邏輯地址表示。例如,CS=1200H,IP=100AH,則對(duì)應(yīng)的存儲(chǔ)單元可以表示為:物理地址:1300AH(=1200H*10H+100AH)

或邏輯地址:1200H:100AH(即CS:IP)4.一個(gè)實(shí)際地址可對(duì)應(yīng)著多個(gè)邏輯地址。例如,實(shí)際地址11245H=11230H+15H

=11240H+05H3.2.4堆棧堆棧:是內(nèi)存中一個(gè)按先入后出方式操作的特殊區(qū)域。建立堆棧:8086/8088系統(tǒng)中的堆棧是用段定義語(yǔ)句在存儲(chǔ)器中定義的一個(gè)堆棧段,和其他邏輯段一樣,它可在1MB的存儲(chǔ)空間中浮動(dòng),一個(gè)棧的深度最大為64KB。一個(gè)系統(tǒng)具有的堆棧數(shù)目不受限制。堆棧的尋址:SS:SP。SS中記錄的是其16位的段地址,它將確定堆棧段的段基址;而SP的16位偏移地址將指定當(dāng)前棧頂,即指出從堆棧段的段基址到棧頂?shù)钠屏?,棧頂是堆棧操作的惟一出口,它是堆棧地址較小的一端。堆棧的用途:用于存放返回地址、過(guò)程參數(shù)或需要保護(hù)的數(shù)據(jù),常用于響應(yīng)中斷或子程序調(diào)用。堆棧的尋址:SS:SP。SS中記錄的是其16位的段地址,它將確定堆棧段的段基址;而SP的16位偏移地址將指定當(dāng)前棧頂,即指出從堆棧段的段基址到棧頂?shù)钠屏?,棧頂是堆棧操作的惟一出口,它是堆棧地址較小的一端。段首棧底棧頂堆棧段例,已知SS=1000H,SP=2000H,則堆棧段的段首地址=?棧頂?shù)刂罚剑慷问椎刂罚絊S×10H=1000H×10H =10000H棧頂?shù)刂罚絊S×10H+SP

=10000H+2000H=12000H對(duì)于8086,為了加快堆棧操作的速度,堆棧操作均以字為單位進(jìn)行操作。入棧(PUSH)順序:SP-2→SP;數(shù)據(jù)入棧。出棧(POP)順序:數(shù)據(jù)出棧;SP

+2→SP。SPSSSS壓棧前退棧后高低低高高12HSSF0HSP壓棧后低高SPSPSPF0H12HSP3.38086/8088指令系統(tǒng)3.3.18086指令系統(tǒng)的特點(diǎn)3.3.28086/8088指令的格式3.3.3尋址方式3.3.48086/8088指令的分類(lèi)

3.3.18086指令系統(tǒng)的特點(diǎn)8086與8088的指令系統(tǒng)由8位的8080/8085指令系統(tǒng)擴(kuò)展而來(lái)的,同時(shí)又能在其后續(xù)的80x86系列的CPU上正確運(yùn)行。其主要特點(diǎn)是:采用可變長(zhǎng)指令,指令格式比較復(fù)雜,編碼形式靈活;尋址方式多樣靈活,處理數(shù)據(jù)的能力比較強(qiáng),可處理字節(jié)或字、帶符號(hào)或無(wú)符號(hào)的二進(jìn)制數(shù)據(jù)以及壓縮型/非壓縮型的十進(jìn)制數(shù)據(jù);有重復(fù)指令和乘、除運(yùn)算指令,擴(kuò)充了條件轉(zhuǎn)移、移位/循環(huán)指令;為加強(qiáng)軟件中斷功能和支持多處理器系統(tǒng)的工作,增設(shè)了有關(guān)的指令。3.3.28086/8088指令的格式

-指令的構(gòu)成1.指令助記符包括操作碼和操作數(shù)。操作碼:表示指令完成什么樣的功能操作數(shù):指令的操作對(duì)象2.指令的一般格式:

操作碼

[操作數(shù)1],[操作數(shù)2];[注釋]

目的操作數(shù)源操作數(shù)3.操作數(shù)的一般來(lái)源:1.立即數(shù)操作數(shù),如MOVAX,1234H2.寄存器操作數(shù),如MOVAH,AL3.存儲(chǔ)器操作數(shù),如MOVAX,[SI]4.I/O端口操作數(shù),如INAL,n指令的格式8086/8088采用可變長(zhǎng)指令,指令長(zhǎng)度為1~6個(gè)字節(jié)。其指令編碼格式有以下幾種基本格式。1.無(wú)操作數(shù)指令這類(lèi)指令一般屬于控制類(lèi)指令,指令中只包含1個(gè)字節(jié)的操作碼OP,故又稱(chēng)為單字節(jié)指令。如:HLT2.單操作數(shù)指令這類(lèi)指令只有1個(gè)操作數(shù)(字節(jié)或字),也只給出1個(gè)操作數(shù)地址。該操作數(shù)可以在寄存器或在存儲(chǔ)器中,也可以是指令中直接給出的立即數(shù)。如: PUSHAX ; INC[1600H];[1600H]是數(shù)據(jù)段中的一個(gè)單元3.雙操作數(shù)指令雙操作數(shù)指令不允許兩個(gè)操作數(shù)均在存儲(chǔ)器中(串操作指令除外)。兩個(gè)操作數(shù)均在寄存器中。如:MOVAX,BX兩個(gè)操作數(shù)中有一個(gè)在寄存器中,另一個(gè)在存儲(chǔ)器中。如:MOVAL,[SI]兩個(gè)操作數(shù)中有一個(gè)在寄存器中,另一個(gè)是指令中給出的立即數(shù)。如:MOVAL,12H兩個(gè)操作數(shù)中,一個(gè)在存儲(chǔ)器中,另一個(gè)操作數(shù)是指令中給出的立即數(shù)。如:MOV[1600H],1200H3.3.3尋址方式在指令中,指定操作數(shù)或操作數(shù)存放位置的方法稱(chēng)為尋址方式。8086/8088的指令系統(tǒng)有以下幾種尋址方式:(一)固定尋址

(二)立即數(shù)尋址(一)固定尋址有些單字節(jié)指令其操作是規(guī)定CPU對(duì)某個(gè)固定的寄存器進(jìn)行的,如加法的ASCII調(diào)整指令A(yù)AA,規(guī)定被調(diào)整的數(shù)總是位于AL中。(二)立即數(shù)尋址操作數(shù)就在指令中,存放在代碼段,當(dāng)執(zhí)行指令需要操作數(shù)時(shí),CPU直接從指令隊(duì)列緩沖器中取得該立即數(shù),不需要額外執(zhí)行總線周期訪問(wèn)存儲(chǔ)器。注意:立即尋址只能用于源操作數(shù)。例如: MOV AX, 1C8FH MOV BYTEPTR[2A00H],8FH錯(cuò)誤例:

×

MOV2A00H,AX(三)寄存器尋址操作數(shù)在寄存器(如AX、BH等)中,而寄存器名在指令中指出。寄存器尋址不需要執(zhí)行總線周期訪問(wèn)存儲(chǔ)器。例: MOVAX,BX ;BX->AX MOV [3F00H],AX ;AX->DS:3F00H MOV CL,AL ;AL

->CL MOV AH,4CH注意:源操作數(shù)與目的操作數(shù)字長(zhǎng)要相同;

寄存器尋址與段地址無(wú)關(guān)。錯(cuò)誤例:

×MOVAX,BL ;字長(zhǎng)不同

×MOVES:AX,DX ;寄存器與段無(wú)關(guān)(四)存儲(chǔ)器尋址操作數(shù)在存儲(chǔ)器中(不是存在于代碼段的立即數(shù)),必須經(jīng)總線控制邏輯電路進(jìn)行存取。當(dāng)EU需要讀/寫(xiě)位于存儲(chǔ)器的操作數(shù)時(shí),由EU中ALU先計(jì)算出操作數(shù)地址的偏移量(即有效地址EA),并將它送給總線接口單元BIU,同時(shí)請(qǐng)求BIU執(zhí)行一個(gè)總線周期;BIU將與該偏移量相應(yīng)的段寄存器的內(nèi)容左移4位,加上由EU送來(lái)的該偏移量形成一個(gè)20位的實(shí)際地址(即物理地址),然后執(zhí)行總線周期,讀/寫(xiě)指令所需的操作數(shù)。有效地址8086/8088CPU所尋址的操作數(shù)地址的偏移量即有效地址EA,或稱(chēng)偏移地址,它是一個(gè)不帶符號(hào)的16位地址碼。計(jì)算EA的通式為:注意:有效地址=偏移地址=偏移量,由ALU根據(jù)操作數(shù)尋址方式計(jì)算得出;位移量≠偏移量,位移量一般在指令中直接給出。1.直接尋址方式指令中以位移量DISP的形式直接給出操作數(shù)的EA,即:EA=DISP;此方式需要將位移量外加[],表示里面存放的是地址而不是操作數(shù)。如: MOVAX,[1680H]注意:操作數(shù)默認(rèn)的段寄存器為DS,也允許在以代碼段、堆棧段、或附加段為基準(zhǔn)的區(qū)域中,但要在指令中顯式地指定其他段寄存器—稱(chēng)為段超越前綴。如:MOVDL,ES:[0100H]。在匯編語(yǔ)言指令中偏移地址一般用符號(hào)地址來(lái)表示。如:MOVSI,TABLE_PTR。為了使指令字不要過(guò)長(zhǎng),規(guī)定雙操作數(shù)指令不能兩個(gè)操作數(shù)都用直接尋址方式。錯(cuò)誤例:

×

MOV[2000H],[3000H]2.間接尋址方式間接尋址方式是指寄存器間接尋址方式,其操作數(shù)一定在存儲(chǔ)器中,而存儲(chǔ)單元的有效地址EA則由寄存器指出。注意:只有SI、DI、BX和BP可作間址寄存器。書(shū)寫(xiě)指令時(shí),這些寄存器帶有方括號(hào)[]。以BX、SI、DI寄存器間接尋址,操作數(shù)在數(shù)據(jù)段;物理地址=DS×10H+BX/SI/DI(BX、SI、DI的某種組合)以BP寄存器間接尋址,操作數(shù)在堆棧段;物理地址=SS×10H+BP例:MOVAX,[SI]若DS=6000H,SI=1200H,(61200H)=44H,(61201H)=33H。則指令執(zhí)行后,AX=3344H。44H33H6000H1200HDSSI60000H61200H

61200HAX存儲(chǔ)器數(shù)據(jù)段

+)1200H44H33H(1)基址尋址方式

(2)變址尋址方式(1)基址尋址方式有效地址EA=BX/BP+DISP物理地址=DS/SS×10H+BX/BP+DISP例:MOVSI,[BX+1400H]或MOVSI,1400H[BX]則物理地址為:DS×10H+BX+1400H(2)變址尋址方式有效地址EA=SI/DI+DISP物理地址=DS×10H+SI/DI+DISP例:MOVAX,[SI]則物理地址:DS×10H+SI(3)基址加變址尋址方式有效地址EA=BX/BP+SI/DI+DISP物理地址=DS/SS×10H+BX/BP+SI/DI+DISP例: MOVAX,[BP+SI+6] ;BP默認(rèn)SS段有效地址EA=BP+SI+06H物理地址為:SS×10H+BP+SI+06H注意:有的教材中,當(dāng)指令中的地址位移量不為0時(shí),又稱(chēng)為相對(duì)基址變址尋址方式。例:MOVAX,DATA[DI][BX]或MOVAX,[BX+DI+DATA]若DS=8000H,BX=2000H,DI=1000H,DATA=200H則指令執(zhí)行后AH=(83021H),AL=(83020H)。8320083200HAHALAX+DATA0200操作碼代碼段數(shù)據(jù)段.........YYXXDS8000BX2000

DI1000選講:存儲(chǔ)器尋址的

段默認(rèn)與段超越在存儲(chǔ)器尋址方式中,基址與變址都有默認(rèn)的段;但有時(shí)也可以通過(guò)段超越方式去尋址在其它段中的操作數(shù)。尋址方式操作數(shù)有效地址段默認(rèn)段超越前綴直接尋址[disp]DSES,CS基址尋址[BX+disp]DSES,CS[BP+disp]SSDS,ES,CS變址尋址[SI/DI+disp]DSES,CS基址變址尋址[BX+SI/DI+disp]DSES,CS[BP+SI/DI+disp]SSDS,ES,CS選講注意:不允許使用段超越前綴的情況:與堆棧操作有關(guān)的指令(PUSH,POP,CALL,RET,INT,IRET)使用SP作為指針,只能使用SS為段寄存器。串操作指令規(guī)定用DS:SI來(lái)指定源數(shù)據(jù)區(qū),用ES:DI來(lái)指定目的數(shù)據(jù)區(qū)。

段超越前綴只能用于源,而不能用于目的;即SI可以更換段寄存器,而DI只能使用ES。指令只能存放在代碼段。(五)I/O端口尋址方式輸入/輸出指令對(duì)I/O端口的尋址可采用直接或間接兩種方式。1.直接端口尋址:I/O端口地址以8位立即數(shù)方式在指令中直接給出。所尋址的端口號(hào)只能在0~255范圍內(nèi)。

例如:INAL,n2.間接端口尋址:類(lèi)似于寄存器間接尋址,16位的I/O端口地址在DX寄存器中,即通過(guò)DX間接尋址??蓪ぶ返亩丝谔?hào)為0~65535。

例如:OUTDX,AL ;將AL的內(nèi)容輸出到由DX指定的端口中去。(六)串操作指令尋址方式

(七)轉(zhuǎn)移類(lèi)指令的尋址方式(六)串操作指令尋址方式執(zhí)行數(shù)據(jù)串指令時(shí),源串操作數(shù)第1個(gè)字節(jié)或字的有效地址應(yīng)存放在源變址寄存器SI中(不允許修改),目標(biāo)串操作數(shù)第1個(gè)字節(jié)或字的有效地址應(yīng)存放在目標(biāo)變址寄存器DI中(不允許修改)。(七)轉(zhuǎn)移類(lèi)指令的尋址方式在8086/8088系統(tǒng)中,由于存儲(chǔ)器采用分段結(jié)構(gòu),所以轉(zhuǎn)移類(lèi)指令有段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移之分。所有的條件轉(zhuǎn)移指令只允許實(shí)現(xiàn)段內(nèi)短轉(zhuǎn)移,即只允許轉(zhuǎn)移的地址范圍在-128~+127字節(jié)內(nèi),由指令中直接給出8位地址位移量。尋址方式舉例1.指出下列指令的源操作數(shù)尋址方式,對(duì)于存儲(chǔ)器尋址寫(xiě)出EA的計(jì)算公式。a.MOV AX,[1000H]b.MOV AX,1000H;

c.MOV AX,BXd.MOV AX,[BP] e.MOV AX,1000H[DI] f.MOV AX,[BX+DI] g.IN AL,15H 2.判斷下列指令是否正確,并說(shuō)明原因。a.MOV [AX],[BP]b.MOV1000H,BXc.MOV[1000H],BXd.MOVCL,AX3.3.48086/8088指令的分類(lèi)根據(jù)指令的功能,分為六類(lèi):數(shù)據(jù)傳送類(lèi);3.3.4.1算術(shù)運(yùn)算類(lèi);3.3.4.2邏輯運(yùn)算類(lèi);3.3.4.3串操作類(lèi);3.3.4.4程序控制類(lèi);3.3.4.5CPU控制類(lèi)。3.3.4.63.3.4.1

數(shù)據(jù)傳送類(lèi)指令數(shù)據(jù)傳送類(lèi)指令可完成寄存器與寄存器之間、寄存器與存儲(chǔ)器之間以及寄存器與I/O端口之間的字節(jié)或字傳送。一.通用數(shù)據(jù)傳送指令1.MOVd,s ;d←s即將由源s指定的源操作數(shù)送到目標(biāo)d其中。注意:源與目的操作數(shù)要等長(zhǎng)(即類(lèi)型要匹配);源s不能是IP,目標(biāo)d不能為CS、IP和立即數(shù);

源s/目標(biāo)d不能同時(shí)為存儲(chǔ)器操作數(shù);給段寄存器賦值,不能采用立即數(shù)方式。

錯(cuò)誤例: MOVDS,1000H

;×

可改為: MOVAX,DATA ;DATA是預(yù)先分配的段名 MOVDS,AX例:MOVAL,BL;寄存器之間傳送MOVBX,SIMOVCX,[BX+SI];存儲(chǔ)器操作數(shù)傳送到寄存器MOVAX,ARRAY[SI]MOVAX,0B00H;立即數(shù)傳送到寄存器MOVCL,10000000BMOVVALUE,100H;立即數(shù)傳送到存儲(chǔ)器MOVES:[BX],4BH2.PUSHs

;將源操作數(shù)s(16位)壓入堆棧

POPd

;將堆棧當(dāng)前棧頂兩相鄰單元的數(shù)據(jù)字彈出到d這是兩條進(jìn)棧與出棧指令,其中,s和d可以是16位寄存器或存儲(chǔ)器兩相鄰單元,以保證堆棧按字操作。注意:PUSH和POP指令執(zhí)行過(guò)程(即:SP的變化);成對(duì)并且按照對(duì)稱(chēng)的次序使用;堆棧操作按字進(jìn)行,沒(méi)有單字節(jié)的堆棧操作指令;CS寄存器的值可以入棧,但不能反過(guò)來(lái)從堆棧彈出一個(gè)字到CS寄存器;常用于子程序調(diào)用和中斷處理。例:設(shè)AX

=1020H,執(zhí)行PUSHAX示意圖:低地址存儲(chǔ)區(qū)(SS段)(SP)存儲(chǔ)區(qū)(SS段)進(jìn)棧SP變化的方向執(zhí)行后20H10H(AL)(AH)(SP)-2(SP)高地址低地址高地址執(zhí)行前AX=1020H執(zhí)行POPBX的示意圖:低地址存儲(chǔ)區(qū)(SS段)出棧方向執(zhí)行前20H10H(SP)存儲(chǔ)區(qū)(SS段)執(zhí)行后BX=1020H(SP)BX20H10H高地址低地址高地址3.XCHGd,s此指令是將源操作數(shù)與目標(biāo)操作數(shù)相互對(duì)應(yīng)交換位置。注意:可以在通用寄存器與累加器之間、通用寄存器之間、通用寄存器與存儲(chǔ)器之間進(jìn)行交換。不能在兩個(gè)存儲(chǔ)單元之間交換,段寄存器與IP也不能作為一個(gè)源或目的操作數(shù)。例: XCHGAL,BL XCHGBX,CX XCHG[2530H],CX 選講4.XLAT ;[BX+AL]→AL這是一條用于實(shí)現(xiàn)字節(jié)翻譯功能的指令,又稱(chēng)為代碼轉(zhuǎn)換指令,或查表指令。它可以將AL寄存器中設(shè)定的一個(gè)字節(jié)數(shù)值變換為內(nèi)存一段連續(xù)表格中的另一個(gè)相應(yīng)的代碼,以實(shí)現(xiàn)編碼制的轉(zhuǎn)換。執(zhí)行XLAT指令之前,將表的首地址→BX;表中某一項(xiàng)與表首址的位移量(距離)→AL。例:內(nèi)存數(shù)據(jù)段有一張16進(jìn)制數(shù)的ASCII碼表,設(shè)段首偏移地址為2000H,如欲查出表中第11個(gè)代碼(代碼序號(hào)從0開(kāi)始)即十六進(jìn)制數(shù)B的ASCII碼。ASCII表在DS段中,并假設(shè)DS=4000H。執(zhí)行程序:MOVBX,2000H;BX←表首地址MOVAL,0BH;AL←表中序號(hào)XALT;查表轉(zhuǎn)換執(zhí)行后得到:(AL)=42H=‘B’303132...394142...4546...42000H+042000H+11‘0’‘1’‘2’‘9’‘A’‘B’‘E’‘F’存儲(chǔ)器二.目標(biāo)地址傳送指令1.LEAd,s取有效地址指令,其功能是把用于指定源操作數(shù)(它必須是存儲(chǔ)器操作數(shù))的16位偏移地址(即有效地址)傳送到一個(gè)指定的16位通用寄存器中。例:LEABX,[1600H];則指令執(zhí)行之后,BX

=1600H,是偏移地址。區(qū)別:MOVBX,[1600H] ;指令執(zhí)行后BX等于數(shù)據(jù)段偏移地址為

;1600H的存儲(chǔ)單元的內(nèi)容,一般為操作數(shù)。下面兩條指令等效:

LEABX,BUFFER MOVBX,OFFSETBUFFER其中OFFSETBUFFER表示存儲(chǔ)器單元BUFFER的偏移地址。2.LDSd,s取某變量的32位地址指針的指令,其功能是從由s指定的存儲(chǔ)單元開(kāi)始的4個(gè)連續(xù)存儲(chǔ)單元中取出該變量的地址指針(共4個(gè)字節(jié)),將其前兩個(gè)字節(jié)(即變量的偏移地址)送到由d指定的某16位通用寄存器,后兩字節(jié)(即變量的段地址)傳送到DS段寄存器中。如:LDSSI,[DI+100AH] ;執(zhí)行后 SI=(DS×10H+DI+100AH),DS=(DS×10H+DI+100AH+2)3.LESd,s這條指令與LDSd,s指令的操作基本相同,其區(qū)別僅在于將把由源所指定的某變量的地址指針中后2個(gè)字節(jié)(段地址)傳送到ES段寄存器,而不是DS段寄存器。如:LESSI,[DI+100AH]

三.標(biāo)志位傳送指令1.LAHF將標(biāo)志寄存器F的低字節(jié)(共包含5個(gè)狀態(tài)標(biāo)志位)傳送到AH寄存器中。2.SAHF將AH寄存器內(nèi)容傳送到標(biāo)志寄存器F的低字節(jié)。OFDFIFTFSFZFAFPFCFAHFLAGOFDFIFTFSFZFAFPFAHFLAGCF3.PUSHF將16位標(biāo)志寄存器F內(nèi)容入棧保護(hù)。其操作過(guò)程與前述的PUSH指令類(lèi)似。4.POPF將當(dāng)前棧頂和次棧頂中的數(shù)據(jù)字彈出送回到標(biāo)志寄存器F中。提示:PUSHF與POPF常成對(duì)出現(xiàn),一般用在子程序和中斷處理程序的首尾,用來(lái)保護(hù)和恢復(fù)主程序涉及的標(biāo)志寄存器內(nèi)容.必要時(shí)可以用來(lái)修改標(biāo)志寄存器的內(nèi)容.四.

I/O數(shù)據(jù)傳送指令1.IN累加器,端口號(hào)IN指令是將指定端口中的內(nèi)容輸入到累加器AL/AX中。端口號(hào)可以用8位立即數(shù)直接給出;也可以將端口號(hào)事先安排在DX寄存器中,間接尋址16位端口號(hào)。例如:INAL,PORT;AL←(端口PORT)

INAX,PORT;AX←(端口PORT)

INAL,DX;AL←(端口(DX))

INAX,DX;AX←(端口(DX))2.OUT端口號(hào),累加器OUT指令是將累加器AL/AX中的內(nèi)容輸出到指定的端口。具體如下: OUTPORT,AL ;端口PORT←AL

OUTPORT,AX ;端口PORT←AX

OUTDX,AL ;端口(DX)←AL

OUTDX,AX ;端口(DX)←AX注意:I/O指令只能用累加器AL/AX作為執(zhí)行I/O數(shù)據(jù)傳送的機(jī)構(gòu),而不能用其它寄存器(包括AH)代替。當(dāng)用直接尋址的I/O指令時(shí),尋址范圍為0~255,適用于較小規(guī)模的微機(jī)系統(tǒng);當(dāng)用端口號(hào)由寄存器DX給出的間接尋址的I/O指令時(shí),尋址范圍為0~65535。數(shù)據(jù)傳送指令小結(jié)1.數(shù)據(jù)傳送指令本身不影響標(biāo)志位;2.除XCHG指令外,都是從源到目的的單向傳送;3.注意MOV和LEA的差別;4.指令有多種格式,但一般遵循以下規(guī)則:雙操作數(shù)指令中一般不允許兩個(gè)操作數(shù)都在存儲(chǔ)器中(串操作指令除外);目的操作數(shù)不允許立即數(shù)尋址方式。5.段寄存器只能在MOV、POP、PUSH指令中作為操作數(shù)出現(xiàn)。如:MOVES,AX和PUSHCS和POPDS;但下列指令不合法:MOVCS,reg和POPCS;3.3.4.2算術(shù)運(yùn)算類(lèi)指令

一.加法指令1.ADDd,s;d←d+s目標(biāo)操作數(shù)不允許是立即數(shù),其他同源操作數(shù)。且不允許兩者同時(shí)為存儲(chǔ)器操作數(shù)。ADD指令對(duì)6個(gè)狀態(tài)標(biāo)志均產(chǎn)生影響。例:已知BX=D75FH,指令A(yù)DDBX,8046H執(zhí)行后,狀態(tài)標(biāo)志各是多少?

D75FH=1101011101011111

+8046H=1000000001000110

(1)0101011110100101結(jié)果:CF=1,ZF=0,PF=1,AF=1,OF=1,SF=02.

ADCd,s

;d←d+s+CF帶進(jìn)位的加法指令進(jìn)位標(biāo)志位CF的原狀態(tài)也將一起參與加法運(yùn)算;待運(yùn)算結(jié)束后,CF將根據(jù)結(jié)果置成新的狀態(tài)。例如:ADCAL,68H;AL←AL+68H+CF ADCAX,CX;AX←AX+CX+CF ADCBX,[DI];BX←BX+[DI]+CFADC指令用于多字節(jié)加法運(yùn)算中,一般在ADD之后使用。

例:見(jiàn)下頁(yè)。例:有兩個(gè)4字節(jié)的無(wú)符號(hào)數(shù)相加:2C56F8ACH+309E47BEH=?設(shè)被加數(shù)、加數(shù)分別存放在BUFFER1及BUFFER2開(kāi)始的兩個(gè)存儲(chǔ)區(qū)內(nèi),結(jié)果放回BUFFER1存儲(chǔ)區(qū)。分析:因CPU只能進(jìn)行8/16位的加法運(yùn)算,可將兩數(shù)分成低字和高字分別相加。程序段如下:MOVAX,BUFFER2 ADDBUFFER1,AX ;低字相加MOVAX,BUFFER2+2 ADCBUFFER1+2,AX ;高字相加,包括低字的進(jìn)位56H2CHBEH47HBUFFER1BUFFER2ACHF8H9EH30H被加數(shù)加數(shù)數(shù)據(jù)段......3.INCd

;d←d+1加1指令將目標(biāo)操作數(shù)當(dāng)作無(wú)符號(hào)數(shù),加1后仍保留在目標(biāo)中;

如:INCAX ;AX←AX+1目標(biāo)操作數(shù)不允許是立即數(shù)。本指令只影響ZF、OF、SF、PF、AF,而不影響CF標(biāo)志;對(duì)于間接尋址的存儲(chǔ)器數(shù)據(jù)加1要求用偽指令BYTEPTR、WORDPTR、DWORDPTR類(lèi)型偽指令來(lái)說(shuō)明數(shù)據(jù)的長(zhǎng)度。

如:INC

BYTEPTR

[BX+1000H]二.減法指令1.SUBd,s

;d←d-s,減法指令不允許兩個(gè)操作數(shù)同時(shí)為存儲(chǔ)器操作數(shù),也不允許做段寄存器的減法。2.SBBd,s

;d←d-s-CF帶借位減法指令完成減法運(yùn)算時(shí)還要再減去進(jìn)位標(biāo)志CF的原狀態(tài)。待運(yùn)算結(jié)束,CF將根據(jù)結(jié)果置成新的狀態(tài)。常用于比16字節(jié)寬的多字節(jié)減法中。3.DECd

;d←d-1減1指令目標(biāo)操作數(shù)不允許是立即數(shù)。不影響進(jìn)位標(biāo)志CF,因此不能用INC設(shè)置進(jìn)位位。間接尋址需偽指令說(shuō)明數(shù)據(jù)的長(zhǎng)度。4.NEGd

;d←d+1求補(bǔ)碼指令將d按位取反后加1,實(shí)際為d←0-d,即取負(fù)。系統(tǒng)約定CF一般置1,只有d=0時(shí)CF=0。5.CMPd,s

;d-s,

比較指令不回送結(jié)果,只根據(jù)結(jié)果置標(biāo)志位;不允許做段寄存器比較。比較兩數(shù)的大小時(shí),應(yīng)區(qū)分無(wú)符號(hào)數(shù)與有符號(hào)數(shù)的判斷條件:(1)對(duì)于兩無(wú)符號(hào)數(shù)比較,只需根據(jù)進(jìn)位標(biāo)志CF即可判斷:ZF=1時(shí),表示d=s;ZF=0時(shí):若CF=0,則d≥s;若CF=1,則d<s。(2)對(duì)于兩有符號(hào)數(shù)比較,則要根據(jù)OF和SF兩者的異或運(yùn)算結(jié)果來(lái)判斷:當(dāng)OF⊕SF=0時(shí),d≥s;當(dāng)OF⊕SF=1時(shí),d<s。比較指令CMP在使用時(shí),一般在其后緊跟一條條件轉(zhuǎn)移指令,判斷比較結(jié)果的轉(zhuǎn)向。例:比較AL、BL、CL中有符號(hào)數(shù)的大小,將最小數(shù)放在AL中。

CMPAL,BL ;前兩個(gè)數(shù)相比較

JNGBBB ;若AL較小,則轉(zhuǎn)而與CL比較 XCHGAL,BL ;若AL>BL,將BL中的小數(shù)放入ALBBB: CMPAL,CL ;AL和CL比較

JNGCCC ;若AL≤CL,則AL中為最小的 XCHGAL,CL ;若AL>CL,將CL中的小數(shù)放入ALCCC: HLT三.乘法指令指令格式:OPs進(jìn)行乘法時(shí):

字節(jié)乘法: 8位×8位→16位乘積;

字乘法: 16位×16位→32位乘積。對(duì)被乘數(shù)、乘數(shù)及乘積存放有如下規(guī)定:

被乘數(shù) 乘數(shù) 乘積

字節(jié)乘法 AL s(8bit) AX

字乘法 AX s(16bit) DX||AX注意:由s指定的源操作數(shù)作乘數(shù),它可以是8/16位通用寄存器或存儲(chǔ)器操作數(shù),不能是立即數(shù);若為存儲(chǔ)器操作數(shù),必須在前面加BYTEPTR或WORDPTR說(shuō)明是字節(jié)還是字。如:

MULBYTEPTR[SI]1.MULs

;無(wú)符號(hào)乘法指令它完成兩個(gè)無(wú)符號(hào)的8/16位二進(jìn)制數(shù)相乘的功能。若運(yùn)算結(jié)果的高位字節(jié)(字節(jié)乘)或高位字(字乘)有效,即AH≠0或DX≠0,則CF和OF同時(shí)置1;否則CF=OF=0。

標(biāo)志寄存器其他4個(gè)狀態(tài)位狀態(tài)不定。2.IMULs ;有符號(hào)乘法指令該指令除計(jì)算對(duì)象是有符號(hào)二進(jìn)制數(shù)以外,其他都與MUL一樣。IMUL指令對(duì)OF和CF的影響是:若乘積的高一半是低一半的符號(hào)擴(kuò)展(為全0或全1),則OF=CF=0;否則均為1。

標(biāo)志寄存器其他4個(gè)狀態(tài)位狀態(tài)不定。四.除法指令指令格式:OPs進(jìn)行除法時(shí): 16位/8位→8位商(/8位余數(shù)); 32位/16位→16位商(/16位余數(shù))。對(duì)被除數(shù)、商及余數(shù)存放有如下規(guī)定:

被除數(shù) 除數(shù)

商 余數(shù)

字節(jié)除法 AX s(8bit) AL AH

字除法 DX||AX s(16bit) AX DX注意:由s指定的源操作數(shù)作乘數(shù),它可以是8/16位通用寄存器或存儲(chǔ)器操作數(shù),不能是立即數(shù)。若為存儲(chǔ)器操作數(shù),必須在前面加BYTEPTR或WORDPTR說(shuō)明是字節(jié)還是字。如:

DIVWORDPTR[BX]1.DIVs完成兩個(gè)無(wú)符號(hào)二進(jìn)制數(shù)相除的功能。商和余數(shù)也是無(wú)符號(hào)數(shù),字節(jié)/字除法時(shí)商最大為FFH/FFFFH。2.IDIVs完成將兩個(gè)有符號(hào)的二進(jìn)制數(shù)相除的功能。字節(jié)/字除法允許的最大商數(shù)為+127/+32767,最小商數(shù)為-127/-32767。與DIV指令的主要區(qū)別在于對(duì)符號(hào)位處理的約定:與DIV一樣,如果除數(shù)s是字節(jié)/字?jǐn)?shù)據(jù),被除數(shù)應(yīng)為字/雙字?jǐn)?shù)據(jù)并隱含存放于AX/DX||AX中;如果被除數(shù)也是字節(jié)/字?jǐn)?shù)據(jù)在AL/AX中,應(yīng)將AL/AX的符號(hào)位(AL7)/(AX15)擴(kuò)展到AH/DX后,才能開(kāi)始字節(jié)/字除法運(yùn)算商和余數(shù)均為有符號(hào)數(shù):商數(shù)在AL/AX寄存器中,AL7/AX15是商數(shù)的符號(hào)位;余數(shù)在AH/DX中,AH7/DX15

是余數(shù)的符號(hào)位,它應(yīng)與被除數(shù)的符號(hào)一致。注意事項(xiàng)若字節(jié)除法/字除法的被除數(shù)是字節(jié)/字的長(zhǎng)度,一定要先將AH/AX進(jìn)行處理,再執(zhí)行除法;

其中對(duì)于DIV指令,需要編程事先將AH/AX清零;對(duì)于IDIV指令,需要專(zhuān)門(mén)的符號(hào)擴(kuò)展指令對(duì)AH/AX進(jìn)行設(shè)置。

(請(qǐng)?jiān)趯?shí)驗(yàn)課上驗(yàn)證。)若除法運(yùn)算所得的商數(shù)超出累加器(AL或AX)的容量,則系統(tǒng)將其當(dāng)作除數(shù)為0處理,自動(dòng)產(chǎn)生中斷類(lèi)型號(hào)為0的除法出錯(cuò)中斷,此時(shí)所得的商、余數(shù)均無(wú)效。3.CBW和CWDCBW和CWD是專(zhuān)為IDIV指令設(shè)置的符號(hào)擴(kuò)展指令,用來(lái)擴(kuò)展被除數(shù)字節(jié)/字為字/雙字的符號(hào),所擴(kuò)充的高位字節(jié)/字部分均為低位的符號(hào)位。CBW指令將AL的最高有效位D7擴(kuò)展至AH

即:若D7=0,則(AH)=00000000B=00H;

若D7=1,則(AH)=11111111B=FFH。CWD指令將AX的最高有效位D15擴(kuò)展形成DX。CBW和CWD在使用時(shí)應(yīng)安排在IDIV之前,用來(lái)獲取除法指令所需要的被除數(shù)。執(zhí)行結(jié)果對(duì)標(biāo)志位沒(méi)有影響。五.十進(jìn)制調(diào)整指令8086為完成十進(jìn)制數(shù)運(yùn)算而專(zhuān)設(shè)了一組十進(jìn)制調(diào)整指令。1.DAA

;加法的十進(jìn)制調(diào)整指令。將存于AL寄存器中的2位BCD碼加法運(yùn)算的結(jié)果調(diào)整為2位壓縮型十進(jìn)制數(shù),仍保留在AL中。它必須跟在ADD或ADC指令之后使用。調(diào)整過(guò)程:若(AL∧0FH)>9H或AF=1(低四位非法),則AL+06H→AL,1→AF;若AL>9FH或CF=1(高四位非法),則AL+60H→AH,1→CF。例:計(jì)算54+63,采用BCD碼。 MOVAL,54H MOVBL,63H ADDAL,BL DAA01010100;54H+01100011;63H10110111;B7H>9FH+01100000

;60H100010111;17H,CF=12.DAS

;減法的十進(jìn)制調(diào)整指令將AL寄存器中的減法運(yùn)算結(jié)果調(diào)整為2位壓縮型十進(jìn)制數(shù),仍保留在AL中。減法是加法的逆運(yùn)算,對(duì)減法的調(diào)整操作是減6調(diào)整。調(diào)整過(guò)程:若(AL∧0FH)>9H或AF=1,則AL-06H→AL;若AL>9FH或CF=1,則AL-60H→AL。3.AAA

;加法的ASCII碼調(diào)整指令。將存于AL寄存器中的1位ASCII碼數(shù)加法運(yùn)算的結(jié)果調(diào)整為1位非壓縮型十進(jìn)制數(shù),仍保留在AL中;如果向高位有進(jìn)位(AF=1),則進(jìn)到AH中。該指令只能放在ADD之后。調(diào)整過(guò)程:①若(AL∧0FH)≤9H且AF=0(低四位合法),轉(zhuǎn)③;②若(AL∧0FH)>9H或AF=1(低四位非法),則AL+6→AL,AH+1→AH,1→AF,1→CF;③AL高4位無(wú)意義,參與運(yùn)算也不應(yīng)影響結(jié)果,屏蔽之:

(AL∧0FH)→AL,0→AF→CF。例計(jì)算5+9,采用ASCII碼。用ACSII碼表示:AL=00110101B=35H,BL=00111001B=39H,AH=00H.指令為: MOVAL,35H MOVBL,39H ADDAL,BL AAA結(jié)果:(AH)=00000001B,(AL)=00000100B,即十進(jìn)制14;AF=1,CF=100110101+0011100101101110;低4位>9

+0110

01110100;AF=1CF,AH+1AH∧00001111;屏蔽高4位00000100;AL高4位清0,低4位不變②③4.AAS

;減法的ASCII碼調(diào)整指令,它必須跟在SUB或SBB指令之后,用來(lái)將AL寄存器中的減法運(yùn)算結(jié)果調(diào)整為1位非壓縮型十進(jìn)制數(shù);如有借位,則保留在借位標(biāo)志CF中。調(diào)整過(guò)程:①若(AL∧0FH)≤9H且AF=0(低四位合法),轉(zhuǎn)③;②若(AL∧0FH)>9H或AF=1(低四位非法),則AL-6→AL,AH-1→AH,1→AF,1→CF;③AL高4位無(wú)意義,參與運(yùn)算也不應(yīng)影響結(jié)果,屏蔽之:

(AL∧0FH)→AL,0→AF→CF。5.AAM

;乘法的ASCII碼調(diào)整指令將AL中的乘法運(yùn)算結(jié)果調(diào)整為2位非壓縮型十進(jìn)制數(shù),其高位在AH中,低位在AL中。AAM用于乘法指令之后,參加乘法運(yùn)算的十進(jìn)制數(shù)必須是非壓縮型。調(diào)整過(guò)程:將AL中的乘積除以10,商存于AH中,余數(shù)存于AL中。MUL指令之前一般安排兩條AND指令(為什么?)例: ANDAL,0FH;初始ACSII碼AL=37H,BL=39H ANDBL,0FH;使得AL=07H,BL=09H MULBL;則AL=3FH AAM;則AH=06H,AL=03H6.AAD

;除法的ASCII碼調(diào)整指令將累加器AX中的2位非壓縮型十進(jìn)制的被除數(shù)調(diào)整為二進(jìn)制數(shù),保留在AL中。在除法之前進(jìn)行調(diào)整操作。調(diào)整過(guò)程:(AL+AH×10)→AL。例:十進(jìn)制數(shù)67,非壓縮BCD碼表示時(shí),AH=00000110B,AL=00000111B,

執(zhí)行AAD時(shí),將AH內(nèi)容乘以10,得到00111100,再加到AL中,結(jié)果為01000011B=43H。

算數(shù)運(yùn)算類(lèi)指令小結(jié)包括二進(jìn)制運(yùn)算指令和十進(jìn)制運(yùn)算調(diào)整指令;算數(shù)運(yùn)算指令影響標(biāo)志位;注意有符號(hào)和無(wú)符號(hào)的區(qū)別;乘除法指令是單操作數(shù)指令,另一個(gè)操作數(shù)約定在AX/DX||AX中,運(yùn)算結(jié)果的存放也有相應(yīng)的約定;SUB和CMP指令都做減法運(yùn)算,但CMP指令不改變操作數(shù)的值,而改變標(biāo)志位的值;加1和減1指令,一般用于修改地址指針和修改循環(huán)計(jì)數(shù)器;十進(jìn)制運(yùn)算調(diào)整指令,分為壓縮的和非壓縮的兩種,僅限于字節(jié),只對(duì)AL/AX中的內(nèi)容調(diào)整。3.3.4.3邏輯運(yùn)算和

移位循環(huán)類(lèi)指令一.邏輯運(yùn)算指令1.ANDd,s ;d←d∧s,按位“與”操作,可實(shí)現(xiàn)位清0。例: MOVAL,B6H ANDAL,0FH 10110110

∧ 00001111

;屏蔽字OFH

00000110;高4位清02.ORd,s

;d←d∨s,按位“或”操作;可實(shí)現(xiàn)位置1。例: MOVAL,B6H ORAL,0FH 10110110

∨ 00001111

;屏蔽字0FH10111111;低4位置13.XORd,s

;d←d⊕s,按位“異或”操作主要用于將若干位取反的操作:需取反的位與1異或,保持不變的位與0異或。例:XORAL,AL;可以實(shí)現(xiàn)AL清0,且CF=0。4.NOTd

;d←d,按位取反操作5.TESTd,s

;d∧s,按位“與”操作與AND類(lèi)似,但不送回結(jié)果,后面常跟轉(zhuǎn)移指令。二.移位指令與

循環(huán)移位指令格式:OPd,CNT操作:對(duì)目的操作數(shù)d移動(dòng)由CNT指定的次數(shù);移位結(jié)果送d;移出的位送標(biāo)志位CF。說(shuō)明:d可以是通用寄存器或存儲(chǔ)器操作數(shù);當(dāng)移動(dòng)次數(shù)等于1時(shí),CNT=1;

當(dāng)移動(dòng)次數(shù)大于1時(shí),必須將移動(dòng)次數(shù)事先存入CL,此時(shí)CNT為CL。(一)

移位指令移位指令分為算術(shù)移位和邏輯移位。算術(shù)移位對(duì)有符號(hào)數(shù)移位,移位過(guò)程中保持符號(hào)不變;邏輯移位對(duì)無(wú)符號(hào)數(shù)移位,總是用“0”填補(bǔ)已空出的位。根據(jù)移位的結(jié)果置標(biāo)志寄存器中的狀態(tài)標(biāo)志(AF位除外)。若移1位,并使得最高位(符號(hào)位)發(fā)生變化,則將溢出標(biāo)志OF置“1”;若移多位,則OF標(biāo)志無(wú)效。C0CSAL算數(shù)左移SAR算數(shù)右移C0SHL邏輯左移CSHR邏輯右移0相同不同例:AL=abcdefgh,CL=3。a~h均為0、1二進(jìn)制數(shù)。分別執(zhí)行四種移位指令。 CF AL執(zhí)行前/ abcdefgh1.SALAL,CL c defgh000

2.SARAL,CL f

aaaabcde3.SHLAL,CL c defgh000

4.SHRAL,CL f

000abcdeC0CC0C0(二)

循環(huán)移位指令循環(huán)移位指令是將操作數(shù)首尾相接進(jìn)行移位,它分為不帶進(jìn)位位與帶進(jìn)位位兩種循環(huán)移位。這類(lèi)指令只影響CF和OF標(biāo)志:CF標(biāo)志總是保持移出的最后一位的狀態(tài)。若只循環(huán)移1位,且使最高位發(fā)生變化,則OF標(biāo)志置“1”;若循環(huán)移多位,則OF標(biāo)志無(wú)效。CCROL循環(huán)左移ROR循環(huán)右移CCRCL帶進(jìn)位位循環(huán)左移RCR帶進(jìn)位位循環(huán)右移例:設(shè)AL=abcdefgh,CL=3,CF=i。a~i均為0、1二進(jìn)制數(shù)。分別執(zhí)行四種循環(huán)移位指令。 CF AL執(zhí)行前 i abcdefgh1.ROLAL,CL c defghabc2.RORAL,CL f fghabcde3.RCLAL,CL c defghiab4.RCRAL,CL f ghiabcdeCCCC3.3.4.4串操作類(lèi)指令串操作類(lèi)指令是惟一一類(lèi)在存儲(chǔ)器內(nèi)的源與目標(biāo)之間進(jìn)行操作的指令。使用約定串操作指令均采用隱含尋址:源數(shù)據(jù)串由DS:SI提供;目標(biāo)串由ES:DI提供,即將源串和目標(biāo)串的首元素或末元素的偏移地址分別置入SI和DI中。如果要在同一段內(nèi)進(jìn)行串操作,必須使DS和ES指向同一段。數(shù)據(jù)串的長(zhǎng)度預(yù)先送CX寄存器。使用CLD、STD指令設(shè)置方向標(biāo)志位: DF=0:串操作由低向高地址進(jìn)行,SI和DI內(nèi)容應(yīng)遞增; DF=1:串操作由高向低地址進(jìn)行,SI和DI內(nèi)容應(yīng)遞減。每條指令有兩種形式,分別對(duì)應(yīng)著字節(jié)操作和字操作。

如:MOVS d,s指令有以下兩種形式: MOVSBd,s ;字節(jié)傳送MOVSWd,s ;字傳送一.5個(gè)基本的

串操作指令1.MOVS將DS:SI源串中的1個(gè)字節(jié)或字,傳送到ES:DI作為指針的目標(biāo)串中,自動(dòng)修改SI/DI,使之指向下一個(gè)元素。在MOVS指令之前可以加上重復(fù)前綴REP。具體操作:字節(jié)傳送MOVSB

;

((ES):(DI))←((DS):(SI)),SI±1,DI±1;字傳送MOVSW

;((ES):(DI+1)(DI))←((DS):(SI+1)(SI)),SI±2,DI±2。2.CMPS將DS:SI源串的1個(gè)元素減去由ES:DI作為指針的目標(biāo)串中相對(duì)應(yīng)的1個(gè)元素,不回送結(jié)果,只根據(jù)結(jié)果特征置標(biāo)志位;相應(yīng)地修改SI和DI。在CMPS指令前可以加重復(fù)前綴REPE/REPZ,可用來(lái)確定兩個(gè)串中第一個(gè)不相同的數(shù)據(jù)

。具體操作:字節(jié)比較CMPSB

;

((DS):(SI))←((ES):(DI)),

SI±1,DI±1;字比較CMPSW

;((DS):(SI+1)(SI))←((ES):(DI+1)(DI)), SI±2,DI±2。3.SCAS從目標(biāo)串ES:DI中搜索(查找)某個(gè)關(guān)鍵字,要求將待查找的關(guān)鍵字在事先置入AX或AL中。不傳送結(jié)果,只根據(jù)結(jié)果置標(biāo)志位。具體操作:字節(jié)查找SCASB

;AL-((DI)),DI←DI±1;字查找SCASW;AX-((DI+1)(DI)),DI←DI±2。通常在SCAS前加重復(fù)前綴REPNE/REPNZ,用來(lái)從目標(biāo)串中尋找關(guān)鍵字,操作一直進(jìn)行到ZF=1(查到了某關(guān)鍵字)或CX=0(終未查找到)為止。4.LODS將源串中由SI所指向的元素取到AX/AL寄存器中,修改SI的內(nèi)容。一般不加重復(fù)前綴,常用來(lái)和其他指令結(jié)合使用。具體操作:字節(jié)取LODSB ;AL

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論