第2,3,4章微處理器與指令系統(tǒng)-15_第1頁(yè)
第2,3,4章微處理器與指令系統(tǒng)-15_第2頁(yè)
第2,3,4章微處理器與指令系統(tǒng)-15_第3頁(yè)
第2,3,4章微處理器與指令系統(tǒng)-15_第4頁(yè)
第2,3,4章微處理器與指令系統(tǒng)-15_第5頁(yè)
已閱讀5頁(yè),還剩141頁(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)介

第二章微處理器2016.22.1.18086/8088微處理器8086是1978年推出的全16位微處理器,8088是1978年推出的準(zhǔn)16位微處理器。二者除外數(shù)據(jù)總線位數(shù)(8086為16位,8088為8位)及與此相關(guān)的部分邏輯稍有差別外,內(nèi)部結(jié)構(gòu)和基本性能相同,指令系統(tǒng)完全兼容。

在8086/8088的設(shè)計(jì)中,引入了兩個(gè)重要的結(jié)構(gòu)概念:

指令流水線

存儲(chǔ)器分段這兩個(gè)概念在以后升級(jí)的Intel系列微處理器中一直被沿用和發(fā)展。正是這兩個(gè)概念的引入,使8086/8088比原來(lái)的8位MPU在運(yùn)行速度、處理能力和對(duì)存儲(chǔ)空間的訪問(wèn)等性能方面有很大提高。2.18086/8088微處理器內(nèi)部結(jié)構(gòu)指令流水線存儲(chǔ)器分段8086是全16位微處理器,8088是準(zhǔn)16位微處理器。二者除了外數(shù)據(jù)總線位數(shù)及與此相關(guān)的部分邏輯稍有差別外,內(nèi)部結(jié)構(gòu)和基本性能相同,指令系統(tǒng)完全兼容。

1.內(nèi)部結(jié)構(gòu)2.1.18086/8088微處理器20位ABEU控制電路總線控制電路通用寄存器累加器基址寄存器計(jì)數(shù)寄存器數(shù)據(jù)寄存器堆棧指針基址指針目的變址源變址指針寄存器變址寄存器地址加法器運(yùn)算暫存器ALU標(biāo)志寄存器指令指針內(nèi)部暫存器指令隊(duì)列總線接口單元(BIU)執(zhí)行單元(EU)外部總線8086/8088DB8088:8位8086:16位∑CSDSSSESIP1234568位80888086AXAHALBXBHBLCXCHCLDXDHDL

SPBPDISIALUDB16位8086CPU內(nèi)部指令執(zhí)行流程段寄存器CS程序指針寄存器IP內(nèi)容經(jīng)過(guò)地址加法器形成20位地址;由CPU內(nèi)部地址總線AB,經(jīng)過(guò)總線地址控制電路,向外部總線發(fā)讀取指令的的控制信號(hào),外部總線開(kāi)始總線操作;讀取指令送入到指令隊(duì)列中,等待執(zhí)行;EU單元從隊(duì)列中取一條指令到EU控制電路,譯碼指令需要做的系列操作,包括寄存器的內(nèi)容送累加器;操作結(jié)果經(jīng)過(guò)內(nèi)部數(shù)據(jù)總線,存放到寄存器或內(nèi)部暫存器,同時(shí)置FR;根據(jù)DS寄存器的內(nèi)容,及指令尋址方式產(chǎn)生的偏移量,經(jīng)過(guò)地址加法器,形成數(shù)據(jù)保存地址,并送到外部總線。CPU發(fā)寫總線操作命令,將暫存器的內(nèi)容,通過(guò)總線,寫到指定內(nèi)存單元。2.指令流水線指令隊(duì)列的存在使EU和BIU并行工作,取指令和分析、執(zhí)行指令操作可重疊進(jìn)行,形成了兩級(jí)指令流水線結(jié)構(gòu),減少了CPU等待時(shí)間,提高了CPU的利用率,加快了整機(jī)運(yùn)行速度,降低了對(duì)存儲(chǔ)器存取速度的要求。BIUEU8086/8088的指令“流水”操作取指令1取指令2譯碼1取數(shù)據(jù)1執(zhí)行1取指令3譯碼2存結(jié)果1執(zhí)行2取指令4譯碼3取指令5等待3.存儲(chǔ)器分段8086物理地址(1M=220)將1MB的物理存儲(chǔ)空間分成若干個(gè)邏輯段,每段大小為64KB。

64KB30000H(段基址)段的起始單元地址叫段基址,存放在段寄存器中。通過(guò)4個(gè)段寄存器,CPU每次可同時(shí)對(duì)4個(gè)段進(jìn)行尋址。內(nèi)存00000H00001H00002H00003HFFFFFH分段方式不唯一,各段之間可以連續(xù)、分離、部分重疊或完全重疊,這主要取決于對(duì)各個(gè)段寄存器的預(yù)置內(nèi)容。1000H2000H3100H3100H代碼段(64KB)堆棧段(64KB)數(shù)據(jù)段與附加數(shù)據(jù)段重疊(64KB)CS10000H20000H31000HSSDSES1FFFFH2FFFFH……40FFFH……………存儲(chǔ)器分段結(jié)構(gòu)示例

物理地址是1MB存儲(chǔ)空間中的某一單元地址,用20位地址碼表示,CPU訪問(wèn)存儲(chǔ)器時(shí),地址總線上送出的就是物理地址。

邏輯地址在編程時(shí)采用,由段基址和偏移地址組成,兩者均為16位。內(nèi)存20000H20A00H0A00H物理地址20A00H邏輯地址2000物理地址和邏輯地址邏輯地址與20位物理地址的變換關(guān)系:

物理地址=段基址×16+偏移地址偏移地址段基址段基址000020位物理地址邏輯地址150150

左移四位190∑地址加法器邏輯地址與物理地址的變換【例】若數(shù)據(jù)段寄存器DS=2100H,試確定該存儲(chǔ)區(qū)段物理地址的范圍。

一個(gè)邏輯段的最大容量為64KB;第一個(gè)存儲(chǔ)單元的偏移地址為0;最后一個(gè)存儲(chǔ)單元的偏移地址為FFFFH。該數(shù)據(jù)區(qū)段由低至高相應(yīng)存儲(chǔ)單元的偏移地址為:0000H~FFFFH。

存儲(chǔ)區(qū)的首地址=DS×16+偏移地址=2100H×16+0000H=21000H

存儲(chǔ)區(qū)的末地址=DS×16+偏移地址=2100H×16+FFFFH=30FFFH

2.2Pentium微處理器2-16實(shí)地址工作模式最基本的工作方式。

8086/8088的實(shí)地址模式保持兼容。

微處Pentium理器的實(shí)地址模式具有更強(qiáng)的功能,增加了寄存器,擴(kuò)充了指令,可進(jìn)行32位操作。

實(shí)模式操作方式只允許微處理器尋址第一個(gè)1MB存儲(chǔ)器空間;當(dāng)微處Pentium理器工作于實(shí)地址模式時(shí),存儲(chǔ)器的管理方式與8086微處理器存儲(chǔ)器的管理方式完全相同。2.2.3Pentium的四種工作方式2.保護(hù)虛擬方式

通常在程序運(yùn)行過(guò)程中,應(yīng)防止以下情況的發(fā)生:

①應(yīng)用程序破壞系統(tǒng)程序。

②某一應(yīng)用程序破壞了其他應(yīng)用程序。

③錯(cuò)誤地把數(shù)據(jù)當(dāng)作程序運(yùn)行。

為了避免出現(xiàn)以上情形的發(fā)生,所采取的措施稱作“保護(hù)”。

CPU復(fù)位RSM復(fù)位或RSMVM=0VM=1復(fù)位復(fù)位或PE=0使CR0的PE=1系統(tǒng)管理方式保護(hù)方式虛擬8086方式RSMSMI實(shí)地址方式SMISMI實(shí)地址方式實(shí)地址方式:工作原理與8086基本相同,主要區(qū)別是借助操作數(shù)長(zhǎng)度前綴能處理32位數(shù)據(jù),運(yùn)行速度也更高,且可使用4個(gè)數(shù)據(jù)段。保護(hù)方式保護(hù)方式:CPU可訪問(wèn)的物理存儲(chǔ)空間為232=4GB;程序可用的虛擬地址空間為246=64TB。段長(zhǎng)度在啟動(dòng)頁(yè)功能時(shí)是4GB,不啟動(dòng)頁(yè)功能時(shí)是1MB??芍С侄嘤脩艉蛦斡脩舻亩嗳蝿?wù)操作,并對(duì)各任務(wù)提供了多方面的保護(hù)機(jī)制。虛擬8086方式虛擬8086方式:既有保護(hù)功能又能執(zhí)行8086代碼的工作方式,是保護(hù)方式的一種子方式。CPU的工作原理與保護(hù)虛地址方式下相同,但程序指定的邏輯地址解釋與8086相同。系統(tǒng)管理方式系統(tǒng)管理方式:使設(shè)計(jì)者實(shí)現(xiàn)高級(jí)管理功能,如對(duì)電源的管理以及為操作系統(tǒng)和正在運(yùn)行的程序提供安全性。基本寄存器系統(tǒng)級(jí)寄存器調(diào)試和模型專用寄存器浮點(diǎn)寄存器Pentium的內(nèi)部寄存器,按功能可分為4類:2.2.2Pentium內(nèi)部寄存器

2.280486微處理器的體系結(jié)構(gòu)標(biāo)志寄存器指令指針寄存器EFLAGSFLAGSEIPIP311503115031161570通用寄存器EAXAHAXALEBXBHBXBLECXCHCXCLEDXDHDXDLEDIDIESISIEBPBPESPSP1.基本寄存器選擇器CSSSDSESFSGS150630描述符高速緩存器段寄存器EIP用于保存下一條待預(yù)取指令相對(duì)于代碼基址的偏移量。它的低16位也可單獨(dú)訪問(wèn),稱之為IP。標(biāo)志寄存器位定義CFEFLAGSFLAGS313029282726252423222120191817161514131211109876543210ACVMRF0NTIOPLOFDFIFTFSFZF0AF0PF0X對(duì)準(zhǔn)檢查標(biāo)志X虛擬86模式標(biāo)志X恢復(fù)標(biāo)志X嵌套標(biāo)志X特權(quán)級(jí)標(biāo)志S溢出標(biāo)志C方向標(biāo)志X中斷允許標(biāo)志X自陷標(biāo)志S符號(hào)標(biāo)志S零標(biāo)志S輔助進(jìn)位標(biāo)志S奇偶標(biāo)志S進(jìn)位標(biāo)志注:S表示狀態(tài)標(biāo)志,X表示系統(tǒng)標(biāo)志,C表示控制標(biāo)志X虛擬中斷標(biāo)志XID標(biāo)志X虛擬中斷掛起0000000000VIFVIPID選擇器描述符高速緩存器CSSSDSESFSGS150630段寄存器段寄存器Pentium有6個(gè)段寄存器:CS--指明當(dāng)前的代碼段SS--指明當(dāng)前的堆棧段DSESFSGS決定程序使用存儲(chǔ)器區(qū)域塊指明當(dāng)前的4個(gè)數(shù)據(jù)段編程者可直接訪問(wèn)的編程者不能訪問(wèn)的段選擇符段描述符實(shí)地址方式和虛擬8086方式下相同,段的長(zhǎng)度固定為64KB,段選擇器就是段寄存器,它保存的是邏輯段基址的高16位,將它的內(nèi)容左移4位即可得到實(shí)際段基址,而不必使用描述符高速緩存器。在保護(hù)虛地址方式下,段的長(zhǎng)度可以在1字節(jié)到4G字節(jié)之間變化;為了描述每個(gè)段的基址、屬性和邊界,為每個(gè)段定義了一個(gè)描述符。Pentium段的定義與8086有所不同:2.2.3Pentium的四種工作方式實(shí)地址工作模式最基本的工作方式。

8086/8088的實(shí)地址模式保持兼容。

微處Pentium理器的實(shí)地址模式具有更強(qiáng)的功能,增加了寄存器,擴(kuò)充了指令,可進(jìn)行32位操作。

實(shí)模式操作方式只允許微處理器尋址第一個(gè)1MB存儲(chǔ)器空間;當(dāng)微處Pentium理器工作于實(shí)地址模式時(shí),存儲(chǔ)器的管理方式與8086微處理器存儲(chǔ)器的管理方式完全相同。

2.保護(hù)虛擬方式

通常在程序運(yùn)行過(guò)程中,應(yīng)防止以下情況的發(fā)生:

①應(yīng)用程序破壞系統(tǒng)程序。

②某一應(yīng)用程序破壞了其他應(yīng)用程序。

③錯(cuò)誤地把數(shù)據(jù)當(dāng)作程序運(yùn)行。

為了避免出現(xiàn)以上情形的發(fā)生,所采取的措施稱作“保護(hù)”。

CPU復(fù)位RSM復(fù)位或RSMVM=0VM=1復(fù)位復(fù)位或PE=0使CR0的PE=1系統(tǒng)管理方式保護(hù)方式虛擬8086方式RSMSMI實(shí)地址方式SMISMI實(shí)地址方式實(shí)地址方式:工作原理與8086基本相同,主要區(qū)別是借助操作數(shù)長(zhǎng)度前綴能處理32位數(shù)據(jù),運(yùn)行速度也更高,且可使用4個(gè)數(shù)據(jù)段。保護(hù)方式保護(hù)方式:CPU可訪問(wèn)的物理存儲(chǔ)空間為232=4GB;程序可用的虛擬地址空間為246=64TB。段長(zhǎng)度在啟動(dòng)頁(yè)功能時(shí)是4GB,不啟動(dòng)頁(yè)功能時(shí)是1MB??芍С侄嘤脩艉蛦斡脩舻亩嗳蝿?wù)操作,并對(duì)各任務(wù)提供了多方面的保護(hù)機(jī)制。虛擬8086方式虛擬8086方式:既有保護(hù)功能又能執(zhí)行8086代碼的工作方式,是保護(hù)方式的一種子方式。CPU的工作原理與保護(hù)虛地址方式下相同,但程序指定的邏輯地址解釋與8086相同。系統(tǒng)管理方式系統(tǒng)管理方式:使設(shè)計(jì)者實(shí)現(xiàn)高級(jí)管理功能,如對(duì)電源的管理以及為操作系統(tǒng)和正在運(yùn)行的程序提供安全性。這類數(shù)不帶任何符號(hào)信息,只含有量值域,僅CPU支持。分為三類:字節(jié):字:雙字:任何邏輯地址上的8位相鄰位串。任何字節(jié)地址開(kāi)始的2個(gè)相鄰字節(jié)。低字節(jié)地址為該字地址。任何字節(jié)地址開(kāi)始的2個(gè)相鄰字,即4個(gè)相鄰字節(jié)。最小字節(jié)地址為雙字的地址。1.無(wú)符號(hào)二進(jìn)制數(shù)(序數(shù))3.1.0基本數(shù)據(jù)類型第三章80486微處理器指令系統(tǒng)這類數(shù)均以補(bǔ)碼表示,有8位數(shù)(字節(jié))、16位數(shù)(字)、32位數(shù)(雙字)、64位數(shù)(4字)四種。CPU支持前3種,F(xiàn)PU支持后3種。2.帶符號(hào)的二進(jìn)制定點(diǎn)整數(shù)(整數(shù))★關(guān)于數(shù)據(jù)類型的兩點(diǎn)說(shuō)明:(1)各類型數(shù)據(jù)中,基本的數(shù)據(jù)類型仍是字節(jié)、字和雙字盡可能將字操作對(duì)準(zhǔn)于偶地址,將雙字操作對(duì)準(zhǔn)于4的整數(shù)倍地址。對(duì)準(zhǔn)的字和雙字可一次傳遞完,未對(duì)準(zhǔn)的字和雙字需幾次才能傳遞完。(2)對(duì)于字和雙字?jǐn)?shù)據(jù),80X86是采用低端低地址方式來(lái)存儲(chǔ)字?jǐn)?shù)據(jù)被存儲(chǔ)在兩個(gè)相鄰的字節(jié)單元之中,低位字節(jié)在低地址單元,高位字節(jié)在高地址單元;雙字?jǐn)?shù)據(jù)存儲(chǔ)在四個(gè)連續(xù)字節(jié)單元中,最低位字節(jié)在最低地址單元,最高字節(jié)在最高地址單元。

而字或雙字?jǐn)?shù)據(jù)的地址是指最低位字節(jié)所在的單元地址。3.1.1操作數(shù)尋址方式1.尋址方式和有效地址概念2.11種尋址方式3.存儲(chǔ)器尋址時(shí)的段約定4.應(yīng)用舉例尋址方式就是尋找指令中操作數(shù)地址的方式。操作數(shù)所在地址有三種可能:

直接包含在指令中,即指令的操作數(shù)部分就是操作數(shù)本身。這種操作數(shù)叫立即數(shù),對(duì)應(yīng)的指令尋址方式稱為立即數(shù)尋址。包含在CPU的某個(gè)內(nèi)部寄存器中。這時(shí)指令中的操作數(shù)部分是CPU的一個(gè)寄存器,這種指令尋址方式稱為寄存器尋址。在內(nèi)存儲(chǔ)器中。這時(shí)指令的操作數(shù)部分包含著該操作數(shù)所在的內(nèi)存地址。這種指令尋址方式稱為存儲(chǔ)器尋址。1.尋址方式和有效地址概念尋址方式

在Pentium系列MPU中,內(nèi)存實(shí)際地址(PA):

PA=段基地址+段內(nèi)偏移地址(EA)為了適應(yīng)處理各種數(shù)據(jù)結(jié)構(gòu)的需要,段內(nèi)偏移地址可由以下幾部分組合而成:基址寄存器內(nèi)容變址寄存器內(nèi)容比例因子(僅與32位方式相關(guān))位移量

這四個(gè)基本部分稱為偏移地址四元素,一般又將由這四種元素組合形成的偏移地址稱為有效地址EA。EA=基址+(變址×比例因子)+位移量有效地址EA有效地址元素16位尋址32位尋址基址寄存器BX,BP任何32位通用寄存器變址寄存器SI,DI除ESP外的任何32位通用寄存器比例因子無(wú)(或1)1,2,4,8位移量0,8,16位0,8,32位

指令尋址字段規(guī)定了操作數(shù)的來(lái)源部件和如何計(jì)算EA的方法。實(shí)地址與保護(hù)方式的PA方法不同.無(wú)AX、CX、DX、SP、IP寄存器

保護(hù)方式下的尋址過(guò)程(地址轉(zhuǎn)換過(guò)程)---

虛擬存儲(chǔ)有效地址計(jì)算變址位移基址×比例因子+32位有效地址310BE7~BE0A31~A3┇┇┇32位32位13位描述符檢索段寄存器選擇符TIRPL153210分段部件線性地址物理存儲(chǔ)器4G分頁(yè)部件(可選)物理地址邏輯地址(虛擬)(CS,DS,ES,SS,FS,GS)不分頁(yè)邏輯地址=段選擇符:有效地址

偏移地址四元素可優(yōu)化組合出9種存儲(chǔ)器尋址方式,加上立即數(shù)尋址和寄存器尋址,Pentium共有11種尋址方式:(1)立即數(shù)尋址(2)寄存器尋址(3)直接尋址(4)寄存器間接尋址(5)基址尋址(6)變址尋址(7)比例變址尋址(8)基址加變址尋址(9)基址加比例變址尋址(10)帶位移的基址加變址尋址(11)帶位移的基址加比例變址尋址2.11種尋址方式EA=基址+(變址×比例因子)+位移量

在這種尋址方式下,操作數(shù)作為立即數(shù)直接存在指令中,可為8位、16位或32位。例:MOVAX,4567HMOVBL,78HMOVECX,12345678H⑴立即數(shù)尋址78563412順序存放在指令后面

在這種方式下,操作數(shù)包含在指令規(guī)定的8位、16位或32位寄存器中。例:MOVEAX,EDXINCCLMOVDS,AX

這種尋址方式指令編碼短,無(wú)需從存儲(chǔ)器取操作數(shù),故執(zhí)行速度快。(2)寄存器尋址(寄存器直接尋址)指令中的操作數(shù)部分直接給出操作數(shù)有效地址EA。與操作碼一起放在存儲(chǔ)器代碼段中,可以是16位或32位整數(shù)。操作數(shù)一般在數(shù)據(jù)段DS中。(3)直接尋址(存儲(chǔ)器直接尋址)實(shí)際中對(duì)于直接尋址,如操作數(shù)在DS段中,則可直接寫成:MOVAX,[3000H]

如操作數(shù)在DS之外的其他段(CS,SS,ES,FS,GS)中,指令中則必須用段寄存器名前綴(稱為段超越前綴)予以指明。例如:MOVAX,FS:[3000H]

直接尋址主要用于單個(gè)操作數(shù)的相對(duì)尋址場(chǎng)合(如簡(jiǎn)單的標(biāo)量操作數(shù)尋址和靜態(tài)分配數(shù)組的起始地址尋址等)。操作數(shù)放在存儲(chǔ)器中,但其有效地址EA在寄存器中,即:

EA=[寄存器]寄存器的使用規(guī)定在16位尋址和32位尋址時(shí)不一樣。

16位:BX,BP,SI,DI

32位:EAXEBX,ECX,EDX

ESI.EDI.EBP,ESP(4)寄存器間接尋址8個(gè)通用寄存器①16位尋址時(shí),偏移地址放在SI、DI、BP或BX中。這 時(shí)又有兩種段默認(rèn)情況:若以SI、DI、BX間接尋址,則默認(rèn)操作數(shù)在DS段中。例如:

MOVAX,[SI];默認(rèn)DS為段基址若以BP間接尋址,則默認(rèn)操作數(shù)在SS段中。例如:

MOVAX,[BP];默認(rèn)SS為段基址

如果操作數(shù)不在上述規(guī)定的默認(rèn)段,而是在其他段,則必須在指令中相應(yīng)的操作數(shù)前加上段超越前綴。例如:MOVAX,ES:[SI]MOVAX,DS:[BP]②32位尋址時(shí),8個(gè)32位通用寄存器均可作寄存器間接尋址例如:MOVEBX,[EAX];默認(rèn)DS為段基址,傳送雙字給EBXMOVDX,[EBX];默認(rèn)DS為段基址,傳送字給DXMOVCH,[EAX];默認(rèn)DS為段基址,傳送字節(jié)給CH

除ESP、EBP默認(rèn)段寄存器為SS外,其余6個(gè)通用寄存器均默認(rèn)段寄存器為DS。如操作數(shù)在默認(rèn)段之外,指令中必須加段超越前綴。

寄存器間接尋址的應(yīng)用場(chǎng)合與直接尋址的應(yīng)用場(chǎng)合相似,當(dāng)更靈活。

在這種方式下,

EA=[基址寄存器]+位移量。其中位移量一定要為常數(shù),且跟隨在操作碼之后,與操作碼一起存放在代碼段中。①16位尋址情況下,BX和BP作為基址寄存器。BX以DS作為默認(rèn)段寄存器,BP以SS作為默認(rèn)段寄存器。位移量可為8位或16位;②32位尋址情況下,8個(gè)32位通用寄存器均可作基址寄存器其中ESP、EBP以SS為默認(rèn)段寄存器,其余6個(gè)通用寄存器均以DS為默認(rèn)段寄存器。位移量為8位或32位。例如:MOVEAX,[BX+24];也可寫成MOVEAX,24[BX]MOVECX,[EBP+50];也可寫成MOVECX,50[EBP]MOVDX,[EAX+1500H];也可寫成MOVDX,1500H[EAX](5)基址尋址與32位寄存器間接尋址方式相同2-47

EA=[變址寄存器]+位移量指令書寫格式和尋址執(zhí)行過(guò)程與基址尋址相同;區(qū)別僅在于將基址寄存器改成變址寄存器。(6)變址尋址

①16位尋址時(shí),僅SI、DI可作變址寄存器,且默認(rèn)DS作為段基址寄存器。如:MOVAX,COUNT[SI]

②32位尋址時(shí),除ESP外的任何通用寄存器均可作變址寄存器。默認(rèn)EBP以SS作段基址寄存器,其余均以DS作段基址寄存器。

MOVEAX,5[EBP]MOVECX,DATA[EAX]

基址、變址尋址適于對(duì)一維數(shù)組的數(shù)組元素進(jìn)行檢索操作。位移量表示數(shù)組起始地址偏移量;基址/變址表示數(shù)組元素的下標(biāo),可變。MOVECX,DATA[ESP]

是什么尋址方式?答案:基址尋址方式。默認(rèn)段寄存器SS

變址尋址不能使用ESP在這種方式下:EA=[變址寄存器]×比例因子+位移量這種尋址方式只適于32位尋址一種情況。例如:MOVEAX,TABLE[ESI*4]

;TABLE是位移量,4是比例因子(7)比例變址尋址

比例變址尋址和基址/變址尋址的作用相似,也適用于對(duì)一維數(shù)組元素的檢索。但當(dāng)數(shù)組元素大小為2/4/8字節(jié)時(shí),用它更方便、更高效。在這種尋址方式下,EA=[基址寄存器]+[變址寄存器]例如:MOVAX,[BX+SI];或?qū)懗蒑OVAX,[BX][SI]

MOVAX,[BP][SI]

它有16位尋址和32位尋址兩種情況,每種情況下基址、變址寄存器的使用規(guī)定和段寄存器的默認(rèn)規(guī)定與前面所述相同。

基址寄存器與變址寄存器默認(rèn)的段寄存器不相同時(shí),一般規(guī)定由基址寄存器(比如:BP,BX)來(lái)決定默認(rèn)哪一個(gè)段寄存器作段基址指針?;芳幼冎穼ぶ分饕糜诙S數(shù)組元素的檢索和二重循環(huán)等。(8)基址加變址尋址在這種方式下,EA=[基址寄存器]+[變址寄存器]×比例因子它只有32位尋址一種情況。格式舉例:MOVECX,[EDX*8][EAX];或MOVECX,[EDX*8+EAX]MOVAX,[EBX*4][ESI];或MOVAX,[EBX*4+ESI]

這種方式主要用于數(shù)組元素大小為2/4/8字節(jié)時(shí)的二維數(shù)組檢索操作等場(chǎng)合。(9)基址加比例變址尋址在這種方式下:EA=[變址寄存器]+[基址寄存器]+位移量

這種方式也分16位尋址和32位尋址兩種情況。變址、基址寄存器的使用約定和對(duì)段寄存器的默認(rèn)約定與前面所述相同。格式舉例:MOVAX,[BX+DI+MASK]或MOVAX,MASK[BX][DI]ADDEDX,[ESI][EBP+0FFFF000H]或ADDEDX,0FFFF000H[ESI][EBP]這種尋址方式也是主要用于二維數(shù)組操作,位移量即為數(shù)組起始地址。(10)帶位移的基址加變址尋址這種方式將偏移地址四元素都用上了,即:EA=[變址寄存器]×比例因子+[基址寄存器]+位移量它只有32位尋址一種情況。各種約定和默認(rèn)情況同前所述。格式舉例:INC[EDI*8][ECX+40];或INC[EDI*8+ECX+40]

當(dāng)二維數(shù)組的數(shù)組元素大小為2/4/8字節(jié),且數(shù)組起始地址不為0時(shí),適于用這種尋址方式進(jìn)行數(shù)組檢索操作。(11)帶位移的基址加比例變址尋址3.存儲(chǔ)器尋址時(shí)的段約定訪存操作類型 默認(rèn)段寄存器允許超越的段寄存器偏移地址寄存器堆棧操作

SS

無(wú)(E)SP取指令代碼

CS

無(wú)(E)IP源串?dāng)?shù)據(jù)訪問(wèn)

DS

CS、SS、ES、FS、GS(E)SI目的串?dāng)?shù)據(jù)訪問(wèn)

ES

無(wú)(E)DI通用數(shù)據(jù)訪問(wèn)

DSCS、SS、ES、FS、GS偏移地址SSCS、DS、ES、FS、GS偏移地址以(E)BP、(E)SP間接尋址的指令4.應(yīng)用舉例

CPUBX0100HSI0002HDS3000H30100H12H30101H34H30102H56H30103H78H31200H2AH31201H4CH31202HB7H31203H65HM

例2.1已知80486工作在實(shí)地址方式下,其中一些寄存器的內(nèi)容和一些存儲(chǔ)單元的內(nèi)容如圖所示,試指出下列各條指令執(zhí)行后,AX中的內(nèi)容。⑴MOVAX,2010H⑵MOVAX,BX⑶MOVAX,[1200H]⑷MOVAX,[BX]⑸MOVAX,1100H[BX]⑹MOVAX,[BX][SI]⑺MOVAX,1100H[BX+SI]AX=2010AX=0100HAX=4C2AHAX=3412AX=4C2AHAX=7856AX=65B7H數(shù)據(jù)傳送是計(jì)算機(jī)中最基本、最常用、最重要的一類操作。如:這類指令尋址方式最豐富,除POPF外,均不影響標(biāo)志寄存器的標(biāo)志位。在實(shí)際程序中,它的使用頻率最高?!窀鞣N初始化操作●取操作數(shù)●保存結(jié)果3.2.1數(shù)據(jù)傳送類指令3.280486微處理器指令系統(tǒng)1.傳送指令MOV指令操作:(源操作數(shù))→目的操作數(shù)

指令格式:MOV目的操作數(shù),源操作數(shù)尋址規(guī)定: REG/MEM/SREG,REGREG/MEM,SREG REG/SREG,MEMREG/MEM,IMM立即數(shù)通用寄存器(EAX、EBX、ECX、EDX、EBP、ESP、ESI、EDI)CS存儲(chǔ)器段寄存器(SS、DS、ES、FS、GS)MOV指令允許的傳送關(guān)系MOV指令使用說(shuō)明:源操作數(shù)和目的操作數(shù)的類型必須一致。目的操作數(shù)不能為立即數(shù)。CS和(E)IP均不能用作指令的目的寄存器。段寄存器間不能直接傳送,也不能直接將立即數(shù)送給段寄存器。源操作數(shù)為立即數(shù),而目的操作數(shù)類型不確定時(shí),要給目的操作數(shù)加類型說(shuō)明。源操作數(shù)和目的操作數(shù)不能同為存儲(chǔ)器操作數(shù)。

目的操作數(shù),源操作數(shù)REG/MEM/SREG,REGREG/MEM,SREGREG/SREG,MEMREG/MEM,IMM⑴MOVDS,100⑵MOV[1000H],23H錯(cuò)。源、目的操作數(shù)不能同為存儲(chǔ)器尋址。⑶MOV[1000H],[2000H]錯(cuò)。立即數(shù)不能直接賦給段寄存器。錯(cuò)。目的操作數(shù)長(zhǎng)度不確定。⑷

MOVCS,AX錯(cuò)。不能用傳送指令改變代碼段寄存器。⑸

MOVAX,[0100H+BX+BP]錯(cuò)。地址寄存器不能同為基址寄存器。

例識(shí)別下列指令的正確性,對(duì)錯(cuò)誤的指令,說(shuō)明錯(cuò)誤的原因。MOVAX,100MOVDS,AXMOVWORDPTR[1000H],23HMOVAX,[2000H]MOV[1000H],AX2.交換指令操作:(目的操作數(shù))(源操作數(shù))格式:XCHG目的操作數(shù),源操作數(shù)

REG/MEM, REG REG,MEM

XCHGAX,CX

等價(jià)如下指令:

MOVBX,AXMOVAX,CXMOVCX,BX

注意:(1)該指令不影響標(biāo)志位;(2)不允許使用段寄存器。

MOVSXECX,AL;(AL)=F8H;(ECX)F=FFFFFFF8MOVZXECX,AX;(AX)=FFF8H;(ECX)=0000FFF8H3.擴(kuò)展傳送指令(非8086指令)

格式:

MOVSX目的操作數(shù),源操作數(shù)

MOVZX目的操作數(shù),源操作數(shù)

操作:MOVSX:帶符號(hào)擴(kuò)展指令 MOVZX:零擴(kuò)展指令特點(diǎn):擴(kuò)展后數(shù)的真值不變。 4.地址傳送指令格式:LEA目的操作數(shù),源操作數(shù) REG16/REG32MEM操作:

REG16/REG32←EA

(源操作數(shù)地址偏移)裝入有效地址注意:寄存器、立即數(shù)和段寄存器都不能作為源操作數(shù)。

說(shuō)明:LEA指令處理變量的地址(EA)而不是變量的內(nèi)容

LEA和MOV指令的比較

MOVBX,OFFSETVAL;將VAL的有效地址=>BXMOVBX,VAL;將VAL的值=>BXLEABX,VAL;將VAL的有效地址=>BXMOV指令用

OFFSET操作不能直接取數(shù)組中任意元素

的位移量,只能取數(shù)組的第一個(gè)元素的位移量,而LEA可以傳送任意數(shù)組元素的位移量。如

LEADX,BETA[BX][SI]LEA的源操作數(shù)必須是存儲(chǔ)器操作數(shù)LEA不影響F標(biāo)志5.堆棧指令PUSH/POP格式:PUSH 源操作數(shù)

REG16/MEM16 REG32/MEM32操作:((E)SP)-2/4→(E)SP (源操作數(shù))→(SS:(E)SP)注:286以上可以有立即數(shù)方式。(1)壓棧指令先調(diào)整指針,然后存儲(chǔ)數(shù)據(jù);先壓高字節(jié)后壓低字節(jié)格式:POP目的操作數(shù)

MEM16/MEM32/REG16/REG32操作:([SS:(E)SP])→目的操作數(shù) ((E)SP)+2/4→(E)SP(2)彈棧指令先傳數(shù)據(jù),后調(diào)整指針先彈低字節(jié)后彈高字節(jié)。堆棧指令的操作數(shù)只能為字或雙字。8086只有字操作指令操作數(shù)是存儲(chǔ)器尋址時(shí),操作數(shù)長(zhǎng)度不確定時(shí),要用PTR運(yùn)算符。PUSH和POP要成對(duì)出現(xiàn),以保持堆棧平衡堆棧指令也隱含了一個(gè)目的/源操作數(shù)—堆棧。壓棧順序是先壓高字節(jié)后壓低字節(jié),彈棧則是先彈低字節(jié)后彈高字節(jié)。(3)堆棧指令使用說(shuō)明:

例用堆棧操作指令將BX和CX中的兩個(gè)16位數(shù)(其中BX是高16位)組成32位數(shù)傳送到EAX寄存器中。

PUSH BX ;

PUSH CX ;

POP EAXEAX=BX:CX解:SP1SP1-2BHBLCHCLSP1-4……SS【例】分析下列程序段的執(zhí)行情況。MOVCX,3000H

MOVSP,CX;設(shè)置堆棧的底 部,MOVAX,1234H;設(shè)置AX初始值,MOVBX,5678H;設(shè)置BX初值,

PUSHAX

PUSHBX;將AX,BX內(nèi)容壓入堆棧

POPAX

POPBX;由堆棧彈出數(shù)據(jù)送入AX,BX中實(shí)現(xiàn)AX,BX寄存器內(nèi)容交換POP:先傳數(shù)據(jù),后調(diào)整指針;先彈低字節(jié)后彈高字節(jié)。PUSH:先調(diào)整指針,然后存儲(chǔ)數(shù)據(jù);先壓高字節(jié)后壓低字節(jié)說(shuō)明:

XLAT是一條隱含尋址的指令。隱含兩個(gè)操作數(shù):DS:(E)BX存放表基址,AL存放查表參數(shù)。使用前要給隱含操作數(shù)賦初值。6.查表指令

格式:

XLAT

操作:

((EBX)+(AL))→AL((BX)+(AL))→AL

例2.5內(nèi)存中自TABLE開(kāi)始的16個(gè)單元連續(xù)存放著自然數(shù)0到15的平方值(構(gòu)成一個(gè)平方表),任給一整數(shù)M在XX單元中(該數(shù)為0≤M≤15),查表求M的平方值,并將結(jié)果存入YY單元中。解: LEABX,TABLE MOVAL,XX

XLAT

MOVYY,ALTABLE0+11+24+39+15225XX5?說(shuō)明:I/O端口有兩種尋址方式

直接尋址,尋址范圍為0~255;

間接尋址,尋址范圍為0~216-1。(1)輸入指令?格式:IN累加器,端口AL/AX/EAX,IMM8AL/AX/EAX,DX?操作:AL/AX/EAX←(I/O端口)7.I/O指令(2)輸出指令格式:OUT端口, 累加器

IMM8,AL/AX/EAXDX,AL/AX/EAX操作:(AL/AX/EAX)→I/O端口

‘T’+1‘O’+2‘M’+3‘.’+4‘.’+520+6‘R’+7‘O’+8‘S’+9‘E’+1030+11‘K’+12‘A’+13‘T’+14‘E’+15‘.’+16

25NAMESDS……例

設(shè)程序在數(shù)據(jù)段中定義的數(shù)組如下:NAMESDB'TOM..'DB20DB'ROSE'DB30DB'KATE.'DB25

請(qǐng)指出下列指令是否正確,如正確,A累加器中的結(jié)果是多少?8.傳送指令應(yīng)用舉例1.MOVBX,OFFSETNAMESMOVAL,[BX+5](AL)=[NAMES+5]=202.MOVAX,WORDPTRNAMES+1

(AX)=[NAMES+1]=‘MO’=4D4FH

‘T’+1‘O’+2‘M’+3‘.’+4‘.’+520+6‘R’+7‘O’+8‘S’+9‘E’+1030+11‘K’+12‘A’+13‘T’+14‘E’+15‘.’+16

25NAMESDS……3.MOVBX,6MOVSI,5LEADI,NAMES[BX][SI]MOVAL,[DI](DI)=NAMES偏移地址+(BX)+(SI)=NAMES偏移地址+11(AL)=[NAMES+11]=‘K’=4BH它的操作結(jié)果一般會(huì)影響標(biāo)志寄存器中的狀態(tài)標(biāo)志位,如ZF、CF、SF、OF、AF、PF等。3.2.2算術(shù)運(yùn)算類指令1.加法/減法指令

操作:

ADD:(目的)+(源)→目的

SUB:(目的)-(源)→目的

ADC:(目的)+(源)+CF→目的

SBB:(目的)-(源)-CF→目的目的操作數(shù),源操作數(shù)REG,REG/MEM/IMMMEM,REG/IMM

格式:

ADDSUB

ADCSBB列3.12已知AL=0C1H,BL=7FH.

SUBAL,BL人工計(jì)算:11000001(AL)-01111111(BL)=0100001042HAL=42H,ZF=0,SF=0,CF=0,AF=1,PF=1,OF=1[負(fù)-正]=正,或C2=0,C1=1

對(duì)于無(wú)符號(hào)數(shù),CF=0,無(wú)溢出;對(duì)于有符號(hào)數(shù),OF=1,溢出。

機(jī)器計(jì)算過(guò)程:

11000001+10000001;補(bǔ)碼,BL求反加1=101000010;42H根據(jù)補(bǔ)碼溢出判斷標(biāo)準(zhǔn),C2=1,C1=0,溢出;AL=42H,ZF=0,SF=0,CF=0,AF=1,PF=1,OF=1

用補(bǔ)碼加法實(shí)現(xiàn)減法時(shí),CF,AF需要取反。X34H+112H+278H+356HYEAH+13FH+233H+3A0H解:⑴用8086指令MOVAX,YSUBX,AX;低16位字?jǐn)?shù)據(jù)相減

MOVAX,2[Y]SBB2[X],AX;高16位字?jǐn)?shù)據(jù)相減⑵用80386/486指令

MOVEAX,DWORDPTRYSUBDWORDPTRX,EAX兩個(gè)32位雙字?jǐn)?shù)據(jù)X、Y定義如下:

XDW1234H,5678H;X=56781234YDW3FEAH,A033H;Y=33A03FEA請(qǐng)編寫計(jì)算X=X-Y的程序段(低位在前)例特殊加減法指令I(lǐng)NC:(目的操作數(shù) )+1→目的操作數(shù)DEC:(目的操作數(shù))+1→目的操作數(shù)目的操作數(shù):寄存器或存儲(chǔ)器影響狀態(tài)標(biāo)志:OF,SF,ZF,AF,PF。不影響CFINCSIINCWORDPTR[SI]INCBYTEPTR[BX][SI]DECECX加法/減法指令使用說(shuō)明:ADD/SUB指令用于單個(gè)字節(jié)/字/雙字?jǐn)?shù)的加/減法運(yùn)算;ADC/SBB指令則常用于多精度或多字節(jié)/多字/多雙字?jǐn)?shù)的加/減法運(yùn)算。INC/DECREG/MEMADD/SUBREG/MEM,1兩者都執(zhí)行加1/減1操作,但前者不影響進(jìn)位,而后者影響。指令的異同:2.整數(shù)變反指令(求補(bǔ))格式:

NEG目的操作數(shù)

REG/MEM操作:0-(目的操作數(shù))→目的操作數(shù)標(biāo)志:OF,SF,ZF,ZF,PF,CF應(yīng)用:

常用于求負(fù)數(shù)的絕對(duì)值。解:

TESTAX,8000H;測(cè)試符號(hào)位JZNEXTNEGAXNEXT:HLT

求AX中存放的有符號(hào)數(shù)的絕對(duì)值。3.比較指令格式:CMP目的操作數(shù),源操作數(shù)

REG,REG/MEM/IMM MEM,REG/IMMCMP與SUB指令都執(zhí)行減法操作,但前者不因操作結(jié)果改變目標(biāo)操作數(shù)值,而后者改變。操作:(目的操作數(shù))-(源操作數(shù)),根據(jù)操作結(jié)果修改狀態(tài)標(biāo)志,但不改變目標(biāo)操作數(shù)值。

【例】CMPAL,CL

指令執(zhí)行前,AL=68H,CL=9AH。

指令執(zhí)行:

AL=68H,CL=9AH,CF=1,ZF=0,SF=1,AF=1,OF=1,PF=0。

作為無(wú)符號(hào)數(shù)比較,被減數(shù)小于減數(shù),不夠減,有借位,CF=1。作為有符號(hào)數(shù)時(shí),C2C1=10,結(jié)果已超出有符號(hào)數(shù)所能表示的范圍,因此OF=1,有溢出。單操作數(shù)乘法指令格式:MUL/IMUL

源操作數(shù)

REG/MEM操作:MUL和IMUL分別為無(wú)符號(hào)數(shù)和有符號(hào)數(shù)乘法指令,兩種指令除操作數(shù)類型不同外,操作完全相同:字:(AX)×(源操作數(shù))→DX:AX雙字:(EAX)×(源操作數(shù))→EDX:EAX字節(jié):(AL)×(源操作數(shù))→AX源操作數(shù)4.乘法指令單操作數(shù)乘法指令的被乘數(shù)是隱含的(在AL/AX/EAX中),而結(jié)果長(zhǎng)度一定是被乘數(shù)/乘數(shù)的二倍(在AX/DX:AX/EDX:EAX中)。源操作數(shù)不能為立即數(shù)。源操作數(shù)為存儲(chǔ)器操作數(shù),且類型不能確定時(shí),要顯式說(shuō)明操作數(shù)類型。要根據(jù)是有符號(hào)數(shù)還是無(wú)符號(hào)數(shù),分別選用IMUL或MUL指令指令執(zhí)行影響CF和OF標(biāo)志.若指令執(zhí)行后,結(jié)果的高一半是有效數(shù)值位,則CF=OF=1,否則CF=OF=0。乘法指令使用說(shuō)明:例2.11解:⑴MULBL指令完成AL和BL中的兩個(gè)無(wú)符號(hào)數(shù)相乘:AH含有效數(shù)字,∴OF=1、CF=1。(AX)=0A8CH(AL)96H×(BL)12H12C+96若(AL)=96H,(BL)=12H,求分別執(zhí)行MULBL和IMULBL指令后的結(jié)果及OF、CF狀態(tài)。AH含有效數(shù)字,∴OF=1、CF=1。解:

IMUL執(zhí)行有符號(hào)數(shù)乘法,此時(shí)AL=96H中的數(shù)是負(fù)數(shù),真值為-6AH,即:用補(bǔ)碼表示:(AX)=F88CH(AX)=-774H(AL)–6AH×(BL)12HD4+6A5.除法指令格式:DIV∕IDIV源操作數(shù)(除數(shù))

REG/MEM操作:按源操作數(shù)類型:狀態(tài)標(biāo)志不確定字節(jié):(AX)/(源),商存于AL中,余數(shù)存于AH字:(DX:AX)/(源),商存于AX中,余數(shù)存于DX雙字: (EDX:EAX)/(源),商在EAX中,余數(shù)在EDX說(shuō)明:

除法指令的被除數(shù)是隱含的,且長(zhǎng)度一定是除數(shù)的二倍(在AX,DX:AX,EDX:EAX中)。使用除法指令常要擴(kuò)展被除數(shù)長(zhǎng)度。擴(kuò)展時(shí)無(wú)符號(hào)數(shù)一般用:

MOVZXAX,ALMOVDX,0MOVEDX,0

有符號(hào)數(shù)一般用:CBW/CWD/CDQ。

CBW:等價(jià)指令MOVSXAX,ALCWD:AX帶符號(hào)擴(kuò)展→DX:AX

源操作數(shù)無(wú)立即數(shù)。

MOVAX,a①;②;a×b在CX:BX中③

MOVAX,c④;c在DX:AX中⑤;a×b+c在DX:AX中⑥⑦;(a×b+c)/a,商存入S⑧IMULbMOVCX,DXMOVBX,AXCWDADDAX,BXADCDX,CXIDIVaMOVS,AX

例2.12

下列程序段完成S=(a×b+c)/a的運(yùn)算,其中變量a、b、c和S均為帶符號(hào)的字?jǐn)?shù)據(jù),結(jié)果的商存入S,余數(shù)則不計(jì),填空完成下列程序。格式:AAA∕AAS∕AAM∕AAD∕DAA∕DAS功能:AAA/AAS:

未組合BCD加法/減法調(diào)整指令,隱含操作數(shù)為AL。DAA/DAS:

組合BCD加法/減法調(diào)整指令,隱含操作數(shù)為AL。6.BCD調(diào)整指令例解:MOVAL,BYTEPTRXADDAL,BYTEPTRY;低位相加

DAA;BCD碼調(diào)整

MOVBYTEPTRX,AL;保存低位結(jié)果

MOVAL,BYTEPTRX[1];取字變量的高字節(jié)

ADCAL,BYTEPTRY[1];高位相加

DAAMOVBYTEPTRX[1],AL;X=7412兩個(gè)4位壓縮BCD碼定義如下:

XDW3578H

YDW3834H

請(qǐng)編寫計(jì)算X+Y的程序段。多字節(jié)BCD加法/減法只能用帶進(jìn)位/借位的字節(jié)加法/減法指令實(shí)現(xiàn)!

功能:分別按位進(jìn)行邏輯“與”、“或”、“異或”、“測(cè)試”和“非”?!舾袷剑篈ND

OR

XOR

TEST

目標(biāo)操作數(shù),源操作數(shù)

REG,REG/MEM/IMMMEM,REG/IMM

NOT目標(biāo)操作數(shù)

REG/MEM3.2.3邏輯運(yùn)算與移位指令1.邏輯運(yùn)算指令A(yù)NDAL,DATAORAL,DATAXORAL,DATANOTDATANEGDATAANDAL,0FHORAL,01HXORAL,0FFHTESTAL,80H設(shè)AL=0C4H=11000100B

(DATA)=5AH=01011010B(AL)=01000000(AL)=11011110(AL)=10011110(DATA)=10100101(DATA)=10100110(AL)=00000100(AL)=11000101(AL)=00111011(AL)=原值CF=OF=0,ZF=0,SF=1,PF=0使用說(shuō)明:②編程時(shí)要根據(jù)操作合理選用指令,一般:

●對(duì)某些二進(jìn)制位‘清零’用邏輯‘與’指令A(yù)ND;●對(duì)某些二進(jìn)制位‘置位’用邏輯‘或’指令OR;●對(duì)某些二進(jìn)制位‘求反’用邏輯‘異或’指令XOR,全部位‘求反’用邏輯‘非’指令NOT。①邏輯運(yùn)算指令除NOT指令外,都影響標(biāo)志寄存器的狀態(tài)標(biāo)志位,且邏輯運(yùn)算后進(jìn)位標(biāo)志CF一定為0,所以邏輯運(yùn)算指令常用于清0和清進(jìn)位。③AND指令與TEST指令的區(qū)別:相同:都執(zhí)行按位“與”操作,對(duì)狀態(tài)標(biāo)志位的影響相同,不同:

AND改變目標(biāo)操作數(shù)的值,

TEST并不改變目標(biāo)操作數(shù)的值。所以TEST指令與CMP指令的用法類似,用于產(chǎn)生按位測(cè)試的條件碼。

例已知寄存器DX:AX的內(nèi)容為32位帶符號(hào)數(shù),編寫一段程序使DX:AX的內(nèi)容成為原來(lái)數(shù)據(jù)的絕對(duì)值。 解:TESTDX,8000H;測(cè)試符號(hào)位,產(chǎn)生狀態(tài)

JZEXIT;符號(hào)位=0,結(jié)束

NEGDX;求絕對(duì)值

NEGAXSBBDX,0EXIT:HLT2.移位指令

移位指令包括:算術(shù)移位指令(SAL/SAR)邏輯移位指令(SHL/SHR)循環(huán)移位指令(ROR/ROL/RCR/RCL)雙精度移位指令(SHLD/SHRD)2-113邏輯移位算術(shù)移位算術(shù)移位只對(duì)帶符號(hào)數(shù)進(jìn)行移,在移位過(guò)程中必須保持符號(hào)位不變。邏輯移位是對(duì)無(wú)符號(hào)數(shù)移位,移位時(shí),總是用0來(lái)填補(bǔ)已空出的數(shù)位。每左移一位,相當(dāng)于將原數(shù)據(jù)乘以2;SHL=SAL每右移一位,相當(dāng)于將原數(shù)據(jù)除以2。SHR(無(wú)符號(hào)數(shù));SAR(有符號(hào)數(shù))根據(jù)移位操作的結(jié)果置標(biāo)志寄存器中的狀態(tài)標(biāo)志(AF位除外)。若移位的次數(shù)是1:

SHL,SAL移位后的結(jié)果使最高位(符號(hào)位)發(fā)生變化(CF≠SF),則將溢出標(biāo)志OF置1;SAR:OF=0;SHR:OF=右移動(dòng)前的最高位;若移次數(shù)大于1時(shí),OF標(biāo)志無(wú)效。邏輯移位算術(shù)移位ROL和ROR指令在執(zhí)行時(shí),沒(méi)有把CF套在循環(huán)中,常稱為小循環(huán)移位。RCL和RCR指令在執(zhí)行時(shí),連同CF一起循環(huán)移位,稱為大循環(huán)移位。以上四條指令僅影響標(biāo)志位CF和OF。循環(huán)移位指令

例試編寫用移位和加法指令完成計(jì)算:(EAX)×9/4的程序段。

解:

(EAX)×9/4=[(EAX)×8+(EAX)]/4MOVEBX,EAX;保存EAXSAL/SHLEAX,3;(EAX)×8→EAXADD EAX,EBX;(EAX)×8+(EAX)→EAXSAR/SHR

EAX,2;(EAX)×9/4→EAX串操作約定:

用DS:(E)SI尋址源串,允許段超越;

用ES:(E)DI尋址目的串,但ES段不能超越;

由DF標(biāo)志位決定(E)SI,(E)DI指針增減:DF=0,遞增;DF=1,遞減;(CLD,STD)指令執(zhí)行完成后,(E)SI,(E)DI指向下一個(gè)單元。

由串長(zhǎng)度(字節(jié)、字、雙字)決定指針增/減量大小;

帶重復(fù)前綴時(shí),用(E)CX作重復(fù)計(jì)數(shù)器。

3.2.4串操作類指令1.串傳送指令

格式:MOVSB/MOVSW/MOVSDMOVS 目的串,源串

MEM,MEM操作:將DS:[(E)SI]所指的源串中的一個(gè)字節(jié)、字或雙字傳送到ES:[(E)DI]指的目的串中,然后,按DF指示和操作數(shù)長(zhǎng)度修改(E)SI,(E)DI指針,即:[ES:(E)DI]←([DS:(E)SI])(E)SI←((E)SI)±1/2/4;修改源指針(E)DI←((E)DI)±1/2/4;修改目的指針說(shuō)明:應(yīng)用:用于數(shù)據(jù)塊傳送該指令允許加重復(fù)前綴REP。即:REPMOVSB/MOVSW/MOVSD由(E)CX控制串傳送指令MOVS的執(zhí)行次數(shù)。相當(dāng)于指令序列:

AGAIN:MOVSB/MOVSW/MOVSDLOOPAGAIN

例2.18編寫將數(shù)據(jù)段中自AREA1開(kāi)始的100個(gè)字?jǐn)?shù)據(jù)搬到附加段中以AREA2開(kāi)始的數(shù)據(jù)區(qū)中的程序段。解:①用MOV指令

LEASI,AREA1

LEADI,AREA2

MOVCX,100

DONE:MOV AX,[SI]

MOV ES:[DI],AX

ADD SI,2

ADD DI,2

LOOP DONE②用基本串傳送指令

LEASI,AREA1

LEADI,AREA2

MOVCX,100

CLD

DONE:MOVSW

LOOPDONE

用重復(fù)串傳送指令

LEASI,AREA1 LEADI,AREA2 MOVCX,100 CLD REPMOVSW格式:LODSB/LODSW/LODSDLODS 源串

MEM說(shuō)明:允許加重復(fù)前綴REP。操作:([DS:(E)SI])→AL/AX/EAX

按DF指示和操作數(shù)長(zhǎng)度修改(E)SI指針應(yīng)用:用于取數(shù)據(jù)塊中元素值2.串裝入指令3.串存儲(chǔ)器指令

格式:STOSB/STOSW/STOSD STOS 目的串

MEM

說(shuō)明:允許加重復(fù)前綴REP。操作:

AL/AX/EAX→([ES:(E)DI])

按DF指示和操作數(shù)長(zhǎng)度修改(E)DI指針應(yīng)用:用于數(shù)據(jù)塊初始化。LODS和STOS結(jié)合常用于數(shù)據(jù)塊傳送。4.串掃描指令

格式:

SCASB/SCASW/SCASD SCAS 目的串

MEM 說(shuō)明:允許加重復(fù)前綴REPE或REPNE。掃描次數(shù)由(E)CX指定。重復(fù)條件:REPE:IF((E)CX)≠0ANDZF=1THEN重復(fù)串掃描REPNE:

IF((E)CX)≠0ANDZF=0THEN重復(fù)串掃描,即:只要串元素不等且未到達(dá)串尾,那么就重復(fù)執(zhí)行。

操作:(AL/AX/EAX)-([ES:(E)DI]),影響標(biāo)志,但不改變目的串內(nèi)容。按DF指示和操作數(shù)長(zhǎng)度修改(E)DI指針。應(yīng)用:用于在串?dāng)?shù)據(jù)中查找關(guān)鍵字。

MOVSI,2170H;搬移 ①

MOVCX,100HCLD② MOVDI,1000H;查找

MOVCX,100H ③

JNZK1 ④MOVBYTEPTR[DI],20H;ASCII碼20H為空

K1: …MOVDI,1000HREPMOVSBREPNESCASBDECDI;回調(diào)指針例用串操作指令將100H個(gè)數(shù)的字符從2170H處搬到1000H處,然后從中檢索與AL中字符相同的單元,并將此單元換成空格符,程序段如下,請(qǐng)把所缺指令填上。列:對(duì)內(nèi)存中的某給定的數(shù)據(jù)塊或字符串進(jìn)行搜索掃描,看其中有無(wú)關(guān)鍵字,若有,將搜索次數(shù)和存放關(guān)鍵字的地址記錄下來(lái)。分析:主體指令SCAS。要搜索的關(guān)鍵字存放在AL/AX/EAX中,被搜索實(shí)地址存放在ES:DI中;搜索數(shù)據(jù)長(zhǎng)度存放在CX/ECX中;利用重復(fù)前綴REPNE:在沒(méi)有成功匹配前,繼續(xù)搜索;

志位ZF=1,表示成功搜索到需要的關(guān)鍵字;INC5.串比較指令格式:

CMPSB/CMPSW/CMPSDCMPS 源串,目的串

MEM,MEM說(shuō)明:允許加重復(fù)前綴REPE或REPNE。操作:([DS:(E)SI])-([ES:(E)DI]),影響標(biāo)志,但不改變?cè)创湍康拇畠?nèi)容。按DF指示和操作數(shù)長(zhǎng)度修改(E)DI、(E)SI指針應(yīng)用:常用于比較兩個(gè)串?dāng)?shù)據(jù)是否匹配。包括以下5種指令:無(wú)條件轉(zhuǎn)移指令(JMP)過(guò)程調(diào)用/返回指令(CALL/RET)條件轉(zhuǎn)移指令(JCC)

循環(huán)控制指令(LOOP)中斷指令(INT)無(wú)條件向目標(biāo)地址轉(zhuǎn)移,可分為段內(nèi)、段間轉(zhuǎn)移,段內(nèi)、段間轉(zhuǎn)移又可分別分為直接和間接轉(zhuǎn)移。實(shí)現(xiàn)子程序調(diào)用或返回,也可歸入無(wú)條件轉(zhuǎn)移指令中。根據(jù)指令執(zhí)行后標(biāo)志寄存器的狀態(tài)進(jìn)行轉(zhuǎn)移,通常和CMP或TEST指令組合使用??刂蒲h(huán)程序的循環(huán),實(shí)質(zhì)上也是條件轉(zhuǎn)移指令,在CX(ECX)中預(yù)置循環(huán)次數(shù)。產(chǎn)生一個(gè)由8位立即數(shù)指定中斷號(hào)的軟中斷和處理溢出中斷。這類指令的共同特點(diǎn)是可改變程序的正常執(zhí)行順序,使之轉(zhuǎn)移。而改變程序的執(zhí)行順序,本質(zhì)上就是要改變CS

溫馨提示

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