微機(jī)原理 第四章-指令系統(tǒng)_第1頁(yè)
微機(jī)原理 第四章-指令系統(tǒng)_第2頁(yè)
微機(jī)原理 第四章-指令系統(tǒng)_第3頁(yè)
微機(jī)原理 第四章-指令系統(tǒng)_第4頁(yè)
微機(jī)原理 第四章-指令系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩165頁(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)介

《微機(jī)原理與接口技術(shù)》主講:田娟

信息工程學(xué)院電子信息教研室郵箱:jtian@電話4章指令系統(tǒng)4.1數(shù)據(jù)類(lèi)型及其存儲(chǔ)規(guī)則(了解)4.2計(jì)算機(jī)指令格式(了解)4.38086的尋址方式(重點(diǎn))4.48086的指令系統(tǒng)(重點(diǎn))4.5DOS和BIOS中斷(重點(diǎn))§4.1數(shù)據(jù)類(lèi)型及其存儲(chǔ)規(guī)則

4.1.1基本數(shù)據(jù)類(lèi)型及其存儲(chǔ)數(shù)據(jù)在存儲(chǔ)器中常以字節(jié)為單位進(jìn)行存儲(chǔ),一個(gè)字節(jié)占用內(nèi)存的一個(gè)地址,稱為一個(gè)存儲(chǔ)單元。

8086微處理器指令系統(tǒng)中的基本數(shù)據(jù)類(lèi)型為:字節(jié)、字。當(dāng)多于一個(gè)字節(jié)的數(shù)據(jù)存儲(chǔ)時(shí),其存儲(chǔ)規(guī)則是高位字節(jié)存儲(chǔ)在地址號(hào)高的存儲(chǔ)單元中,低位字節(jié)存儲(chǔ)在地址號(hào)低的存儲(chǔ)單元中。

圖4-1基本數(shù)據(jù)類(lèi)型的結(jié)構(gòu)形式§4.1數(shù)據(jù)類(lèi)型及其存儲(chǔ)規(guī)則

4.1.2數(shù)字?jǐn)?shù)據(jù)類(lèi)型數(shù)字?jǐn)?shù)據(jù)類(lèi)型包含三部分,即:

無(wú)符號(hào)整數(shù)。當(dāng)選擇字節(jié)時(shí),范圍是0~255;當(dāng)選擇字時(shí),范圍是0~65535。

帶符號(hào)整數(shù)。當(dāng)選擇字節(jié)時(shí),范圍是-128~+127;當(dāng)選擇字時(shí),范圍是-32768~+32767。

浮點(diǎn)數(shù)?!魩Х?hào)數(shù)的表示方法計(jì)算機(jī)中的帶符號(hào)的數(shù),用二進(jìn)制編碼表示,數(shù)的符號(hào)也用二進(jìn)制表示。帶符號(hào)的數(shù)有三種表示方法:1、原碼2、反碼3、補(bǔ)碼數(shù)X的原碼記作[X]原反碼記作[X]反補(bǔ)碼記作[X]補(bǔ)在進(jìn)行運(yùn)算時(shí),負(fù)數(shù)的符號(hào)位不能與其數(shù)值部分一道參加運(yùn)算,而必須利用單獨(dú)的線路確定和的符號(hào)位,從而使計(jì)算機(jī)的結(jié)構(gòu)變得復(fù)雜化。為了解決機(jī)器內(nèi)復(fù)數(shù)的符號(hào)位參加運(yùn)算的問(wèn)題,引入了反碼和補(bǔ)碼兩種機(jī)器數(shù)形式。補(bǔ)充知識(shí)◆帶符號(hào)數(shù)的表示方法(續(xù))補(bǔ)充知識(shí)☆原碼表示法:原碼用數(shù)的最左邊一位(MSB)表示數(shù)的正負(fù),即在D7或D15位加0或1。

符號(hào)位:0表示正,1表示負(fù);數(shù)值位:真值的絕對(duì)值?!罘创a表示法:若X>0,則[X]反=[X]原若X<0,則[X]反=對(duì)應(yīng)原碼的符號(hào)位不變,數(shù)值部分按位求反?!魩Х?hào)數(shù)的表示方法(續(xù))補(bǔ)充知識(shí)☆補(bǔ)碼表示法:若X>0,則[X]補(bǔ)=[X]反=[X]原若X<0,則[X]補(bǔ)=[X]反+1§4.1數(shù)據(jù)類(lèi)型及其存儲(chǔ)規(guī)則

4.1.3指針數(shù)據(jù)類(lèi)型指針是內(nèi)存單元的地址,在實(shí)方式下有兩種類(lèi)型的指針:

近指針(near)是段內(nèi)的16位偏移量(稱為有效地址)遠(yuǎn)指針(far)是一個(gè)32位的邏輯地址,不僅包含16位有效地址,而且包含了16位段地址?!?.1數(shù)據(jù)類(lèi)型及其存儲(chǔ)規(guī)則

4.1.4字符串、位及位串?dāng)?shù)據(jù)類(lèi)型

字符串包括字節(jié)串、字串和雙字串,它們分別是字節(jié)、字和雙字的相鄰序列,其格式如圖4-4所示,其中N為地址,分別以字節(jié)、字和雙字為單位存取。§4.2計(jì)算機(jī)指令格式

引言計(jì)算機(jī)處理各種數(shù)據(jù)或完成某些其他任務(wù)都是通過(guò)執(zhí)行具體指令來(lái)實(shí)現(xiàn)的。指令除了說(shuō)明計(jì)算機(jī)做什么,還要指出數(shù)據(jù)的來(lái)源、操作結(jié)果的去向一條指令包括兩部分:指令操作碼(OperationCode)部分和地址碼部分。指令操作碼部分是給出該指令應(yīng)完成何種操作,其長(zhǎng)度(代碼位數(shù))取決于指令系統(tǒng)中的指令條數(shù)。地址碼部分是用來(lái)描述該指令的操作對(duì)象,如給出參與操作的操作數(shù)的值是多少或者指出操作數(shù)存放在何處、操作的結(jié)果應(yīng)送往何處等信息。根據(jù)地址碼部分所給出地址的個(gè)數(shù),指令格式可分為:零地址指令、一地址指令、二地址指令和三地址指令。零地址指令指只有操作碼部分,而沒(méi)有操作數(shù)的指令。一地址指令指只有目的操作數(shù)的單操作數(shù)指令。二地址指令指有兩個(gè)地址指出兩個(gè)操作數(shù)的指令,這是最常見(jiàn)的指令格式。三地址指令的優(yōu)點(diǎn)是操作結(jié)束后,原兩個(gè)操作數(shù)的內(nèi)容均未被破壞;其缺點(diǎn)是增加一個(gè)地址后,使指令碼加長(zhǎng),增加了存儲(chǔ)空間,取指時(shí)間變長(zhǎng)?!?.2計(jì)算機(jī)指令格式

引言(續(xù))

4.2.1指令的助記符格式§4.2計(jì)算機(jī)指令格式80x86微處理器指令的助記符格式可用以下通式表示:

L:opDl,D2,D3L是標(biāo)號(hào),在標(biāo)識(shí)符后面跟有冒號(hào)(:)。

op是助記符,具有相同功能的指令操作碼的保留名。

D1、D2、D3是任選的操作數(shù)參數(shù),可以有零至三個(gè)。參數(shù)的個(gè)數(shù)取決于指令操作碼,可形成四種指令格式(零地址指令、一地址指令、二地址指令和三地址指令)。

最常用的是二地址指令格式,這種格式的指令中存在兩個(gè)操作數(shù),右邊的是源操作數(shù),左邊的是目的操作數(shù)。補(bǔ)充知識(shí)

[標(biāo)號(hào):]操作碼助記符[操作數(shù)][;注釋]其中[]為任選項(xiàng)。匯編語(yǔ)言指令語(yǔ)句的一般格式標(biāo)號(hào):該指令所在地址的符號(hào)名稱,后必跟“:”。由字母a~z或A~Z、數(shù)字0~9或特殊字符(@,-,?)組成;必須由字母a~z或A~Z或特殊字符(@,-,?)開(kāi)頭,數(shù)字不能開(kāi)頭,?不能單獨(dú)使用。有效長(zhǎng)度為31個(gè)字符。標(biāo)號(hào)不能使用指令助記符。規(guī)則:

操作碼助記符:是指令名稱的代表符號(hào),不可缺省。

操作數(shù):是參加本指令運(yùn)算的數(shù)據(jù),可以缺省。

注釋:如果帶注釋,前面必須用“;”開(kāi)頭。該項(xiàng)可以缺省。

說(shuō)明:操作數(shù)可以用表達(dá)式來(lái)表示,可在指令、寄存器、存儲(chǔ)器中存取。通常將指令執(zhí)行過(guò)程中保持原值不變的操作數(shù)稱為源操作數(shù);若操作數(shù)原值不保留,而將存放此操作數(shù)的地址用來(lái)存放運(yùn)行結(jié)果值,則稱此操作數(shù)為目的操作數(shù)。

[標(biāo)號(hào):]操作碼助記符[目的操作數(shù)][,源操作數(shù)][;注釋]

補(bǔ)充知識(shí)§4.2計(jì)算機(jī)指令格式

4.2.280x86指令編碼格式(自學(xué))見(jiàn)課本P82~85。計(jì)算機(jī)中的指令有些不需要操作數(shù),大多數(shù)指令采用一個(gè)或兩個(gè)操作數(shù)。一般來(lái)說(shuō),操作數(shù)可以跟隨在指令操作碼之后,稱為立即數(shù);操作數(shù)也可以存放在CPU內(nèi)部的寄存器中,稱為寄存器操作數(shù);絕大多數(shù)的操作數(shù)存放在內(nèi)存儲(chǔ)器中,稱為存儲(chǔ)器操作數(shù)。指令指定操作數(shù)的位置,即給出地址信息,在執(zhí)行時(shí)需要根據(jù)這個(gè)地址信息找到需要的操作數(shù)。這種尋找操作數(shù)的過(guò)程稱為尋址,而尋找操作數(shù)的方法稱為尋址方式。補(bǔ)充知識(shí)-幾個(gè)重要概念§4.38086的尋址方式

引言尋址方式就是指令中說(shuō)明操作數(shù)所在地址的方法。操作數(shù)可以包含在寄存器、存儲(chǔ)器或I/O端口地址中,也可以是立即數(shù)。操作數(shù)在寄存器中的指令執(zhí)行速度最快(寄存器尋址),因?yàn)樗鼈兛梢栽贑PU內(nèi)部立即執(zhí)行。立即數(shù)尋址指令可直接從指令隊(duì)列中取數(shù),所以執(zhí)行速度也較快。操作數(shù)在存儲(chǔ)器中的指令執(zhí)行速度較慢,因?yàn)樗ㄟ^(guò)總線與CPU之間交換數(shù)據(jù),當(dāng)CPU進(jìn)行讀寫(xiě)存儲(chǔ)器的操作時(shí),必須先把一個(gè)偏移量送到BIU,計(jì)算出20位物理地址,再執(zhí)行總線周期去存取操作數(shù)?!?.38086的尋址方式

4.3.1立即尋址在立即尋址(ImmediateAddressing)方式下,操作數(shù)直接包含在指令中,它是一個(gè)8位或16位的常數(shù)(只能是整數(shù),不能是小數(shù)、變量或者其他類(lèi)型的數(shù)據(jù)),也叫立即數(shù)。該指令翻譯成機(jī)器碼時(shí),立即數(shù)作為指令的一部分,緊跟在操作碼之后,存放在代碼段內(nèi)。立即尋址方式的指令常用來(lái)給寄存器賦初值。立即數(shù)不但可以送到寄存器中,而且還可以送到一個(gè)存儲(chǔ)單元(8位)中或兩個(gè)連續(xù)的存儲(chǔ)單元(16位)中去。要強(qiáng)調(diào)的是,在所有的指令中,立即數(shù)只能作源操作數(shù),不能作目的操作數(shù),位數(shù)要與目的操作數(shù)的位數(shù)一致。

以A~F打頭的數(shù)字出現(xiàn)在指令中時(shí),前面一定要加一個(gè)數(shù)字“0”,以免與其它符號(hào)相混淆。

如:MOVCX,2A50H;將立即數(shù)2A50H送到CX寄存器中。指令的機(jī)器碼存放及執(zhí)行過(guò)程如圖4-8所示。圖4-8MOVCX,2A50H執(zhí)行過(guò)程2A50CLCHCX代碼段:操作碼502AMOVCX,2A50H指令代碼:§4.38086的尋址方式

4.3.2寄存器尋址在寄存器尋址(RegisterAddressing)方式下,操作數(shù)包含在寄存器中,由指令指定寄存器的名稱。

對(duì)于16位操作數(shù),寄存器可以是AX、BX、CX、DX、SI、DI、SP和BP等。

對(duì)于8位操作數(shù),則用寄存器AH、AL、BH、BL、CH、CL、DH和DL。

源操作數(shù)的長(zhǎng)度必須與目的操作數(shù)一致,否則會(huì)出錯(cuò)。如:MOVCL,AH;它表示將AH中的8位數(shù)據(jù)傳送到CL寄存器。MOVCX,AH;錯(cuò)誤書(shū)寫(xiě)已知(AX)=3A68H,(DX)=18C7H,則執(zhí)行指令MOVDX,AX后,(DX)=?,而AX=?例題:答案:(DX)=3A68H

,而AX=3A68H。§4.38086的尋址方式

4.3.3直接尋址在IBMPC機(jī)中,把操作數(shù)的偏移地址稱為有效地址EA。使用直接尋址方式(DirectAddressing)的指令時(shí),存儲(chǔ)單元的EA直接由指令給出,在機(jī)器碼中,EA存放在CS指令的操作碼之后。須先求出操作數(shù)的物理地址,然后再訪問(wèn)存儲(chǔ)器,才能取得操作數(shù)。指令中的常數(shù)地址必須用方括號(hào)括起來(lái),以便與立即數(shù)相區(qū)別。如:

MOVAX,[2000H];當(dāng)采用直接尋址指令時(shí),若指令中沒(méi)有用前綴指明操作數(shù)存放在哪一段,則默認(rèn)為段寄存器為DS,因此操作數(shù)的物理地址=DS×16+EA。如果要對(duì)CS、SS或ES寄存器所指出的存儲(chǔ)區(qū)進(jìn)行直接尋址,應(yīng)在指令中指定段超越前綴。如:MOVAX,ES:[500H];這里的冒號(hào)“:”稱為修改屬性運(yùn)算符,該指令的源操作數(shù)的物理地址即為16×ES+500H。如:MOVAX,[2000H]

該指令給出操作數(shù)的有效地址EA=2000H,設(shè)DS=3000H,則源操作數(shù)的物理地址=3000H×16H+2000H=32000H。該指令執(zhí)行完,把地址32000H處的一個(gè)字送進(jìn)AX。若地址32000H中的內(nèi)容為34H,32001H中的內(nèi)容為12H。則執(zhí)行指令后,(AX)=1234H。指令執(zhí)行過(guò)程見(jiàn)圖4-9所示。若指令為:MOVAL,[2000H]

假設(shè)所有條件都和圖4-9相同,則該指令執(zhí)行后將存儲(chǔ)單元(32000H)=34H中的字節(jié)送到AL中,結(jié)果為(AL)=34H。圖4-9MOVAX,[2000H]執(zhí)行過(guò)程示意圖3000DS+200032000×10H:3412320001234ALAHAX數(shù)據(jù)段:代碼段:操作碼0020MOVAX,[2000H]指令代碼:執(zhí)行指令MOVBX,[1070H]后,BX=?練習(xí):答案:BX=5634H?!?.38086的尋址方式

4.3.4寄存器間接尋址指令中給出的寄存器中的值不是操作數(shù)本身,而是操作數(shù)的有效地址,這種尋址方式稱為寄存器間接尋址。

寄存器名稱外面必須加方括號(hào),以與寄存器尋址方式相區(qū)別。這類(lèi)指令中使用的寄存器有基址寄存器BX、BP及變址寄存器SI、DI。如果指令中指定的寄存器是BX、SI或DI,則默認(rèn)操作數(shù)存放在DS中,這時(shí)要用數(shù)據(jù)段寄存DS的內(nèi)容作為段地址。若指令中用寄存器BP進(jìn)行間接尋址,則默認(rèn)操作數(shù)在SS段中,操作數(shù)的段地址在SS中。如:MOVAX,[BP]例4-2設(shè)DS=1000H,SI=2000H,(12000H)=318BH;分析指令MOVBX,[SI]執(zhí)行后寄存器BX的結(jié)果。圖4-10例4-2指令執(zhí)行過(guò)程示意圖1000DS+SI200012000×10H:8B3112000318BBLBHBX數(shù)據(jù)段:代碼段:操作碼0020MOVBX,[SI]指令代碼:答案:BX=318BH。§4.38086的尋址方式

4.3.5寄存器(間接)相對(duì)尋址寄存器相對(duì)尋址方式的操作數(shù)的有效地址是一個(gè)基址或變址寄存器的內(nèi)容與指令中指定的8位或16位位移量之和。對(duì)BX、SI、DI這三個(gè)間址寄存器,指示的是數(shù)據(jù)段中的數(shù)據(jù);而用BP作間址寄存器,則指示的是堆棧段中的數(shù)據(jù)。寄存器相對(duì)尋址方式與寄存器間接尋址相似,主要區(qū)別是前者在有效地址上要加一個(gè)位移量(即帶位移量的寄存器間接尋址)如:MOVBX,COUNT[SI]等價(jià)于MOVBX,[COUNT+SI]這種尋址方式也允許使用段超越前綴。例4-3設(shè)DS=3000H,SI=2000H,位移量COUNT=4000H,(36000H)=5678H,分析指令“MOVBX,COUNT[SI]”執(zhí)行后寄存器BX的結(jié)果。執(zhí)行結(jié)果:BX=5678H。圖4-11例4-3指令執(zhí)行過(guò)程示意圖20003000DSSI+COUNT400036000×10H:7856360005678BLBHBX數(shù)據(jù)段:代碼段:操作碼0040MOVBX,COUNT[SI]指令代碼:§4.38086的尋址方式

4.3.6基址變址尋址(基址寄存器加變址寄存器間接尋址)基址加變址尋址(BasedIndexedAddressing)方式,操作數(shù)的有效地址是一個(gè)基址寄存器(BX或BP)和一個(gè)變址寄存器(SI或DI)的內(nèi)容之和,兩個(gè)寄存器均由指令指定。如:MOVAX,[BX][SI]等價(jià)于MOVAX,[BX+SI]

例4-4設(shè)DS=3000H,BX=1200H,SI=0500H,(31700H)=ABCDH,分析指令“MOVAX,[BX][SI]”執(zhí)行后寄存器AX的結(jié)果。圖4-12例4-4指令執(zhí)行過(guò)程示意圖:CDAB31700ABCDALAHAX數(shù)據(jù)段:代碼段:操作碼MOVAX,[BX][SI]指令代碼:+317000500SI3000DS×10H1200BX執(zhí)行結(jié)果:AX=ABCDH?!?.38086的尋址方式

4.3.7相對(duì)基址變址尋址(基址寄存器加變址寄存器間接相對(duì)尋址)相對(duì)基址變址尋址(RelativeBasedIndexedAddressing)方式的操作數(shù)的有效地址是一個(gè)基址寄存器和一個(gè)變址寄存器的內(nèi)容,再加上指令中指定的8位或16位位移量之和。如:MOVAX,MASK[BX][SI]MOVAX,[MASK+BX+SI]MOVAX,200H[BX+SI]MOVAX,MASK[BX+SI]

例4-5設(shè)DS=2000H,BX=1500H,SI=0300H,MASK=0200H,(21A00H)=26BFH,分析指令“MOVAX,MASK[BX][SI]”執(zhí)行后寄存器AX的結(jié)果。執(zhí)行結(jié)果:AX=26BFH圖4-13例4-5指令執(zhí)行過(guò)程示意圖1500BX+MASK020021A002000DS×10H:BF2621A0026BFALAHAX數(shù)據(jù)段:操作碼操作碼00代碼段:MOVAX,MASK[BX][SI]指令代碼:0300SI02

尋址方式中,只有三種操作數(shù)類(lèi)型:立即數(shù)、寄存器、存儲(chǔ)器;可以按源、目的操作數(shù)分別確定尋址方式;尋址方式約定了隱含段寄存器,但允許超越;存儲(chǔ)器操作,讀/寫(xiě)速度最慢;寄存器操作,讀/寫(xiě)速度最快;在涉及操作數(shù)的地址時(shí),常常要在指令中使用方括號(hào),有關(guān)帶方括號(hào)的地址表達(dá)式必須遵循下列規(guī)則:立即數(shù)可以出現(xiàn)在方括號(hào)內(nèi),表示直接地址,例如[2000H]。

只有BX、BP、SI、DI這4個(gè)寄存器可以出現(xiàn)在[]內(nèi),它們可以單獨(dú)出現(xiàn),也可以由幾個(gè)寄存器組合起來(lái)(只能相加),或以寄存器與常數(shù)相加的形式出現(xiàn),但BX和BP寄存器不允許出現(xiàn)在同一個(gè)[]內(nèi),SI和DI也不能同時(shí)出現(xiàn)。

小結(jié)小結(jié)§4.48086的指令系統(tǒng)

引言就8086CPU而言,其指令系統(tǒng)共有133條指令。按功能分類(lèi),8086的指令共有六大類(lèi),分別是:數(shù)據(jù)傳送指令、算術(shù)運(yùn)算指令、邏輯運(yùn)算和移位指令、字符串處理指令、控制轉(zhuǎn)移指令以及處理器控制指令。表4-4中列出指令中的操作數(shù)的簡(jiǎn)寫(xiě)符號(hào),是從IntelIA-32手冊(cè)上摘錄下來(lái)的。用這些符號(hào)來(lái)描述Intel指令的格式。表4-4指令中的操作數(shù)表示法操作數(shù)描述r88位通用寄存器:AH,AL,BH,BL,CH,CL,DH,DLr1616位通用寄存器:AX,BX,CX,DX,SI,DI,SP,BPr3232位通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBPreg任意的通用寄存器sreg16位段寄存器:CS,DS,SS,ES,F(xiàn)S,GSimm8位、16位或32位立即數(shù)imm88位立即數(shù)(字節(jié))imml616位立即數(shù)(字)imm3232位立即數(shù)(雙字)r/m88位操作數(shù)(可以是8位通用寄存器或內(nèi)存字節(jié))r/m1616位操作數(shù)(可以是16位通用寄存器或內(nèi)存字)r/m3232位操作數(shù)(可以是32位通用寄存器或內(nèi)存雙字)mem8位、16位或32位內(nèi)存操作數(shù)DOPDSrc源操作數(shù),dst目的操作數(shù)§4.48086的指令系統(tǒng)

4.4.1數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令用來(lái)把數(shù)據(jù)或地址傳送到寄存器或存儲(chǔ)器單元中,共14條,可分為4組:

通用數(shù)據(jù)傳送指令

累加器專用傳送指令

地址傳送指令

標(biāo)志傳送指令格式:MOVDST,SRC;操作:DST←SRCMOV指令允許在CPU的寄存器之間、存儲(chǔ)器和寄存器之間傳送字節(jié)和字?jǐn)?shù)據(jù),(操作數(shù)類(lèi)型要匹配,字對(duì)字,字節(jié)對(duì)字節(jié)傳送)也可將立即數(shù)送到寄存器或存儲(chǔ)器中(如圖4-14所示)。注意:IP寄存器不能用作源操作數(shù)或目的操作數(shù),目的操作數(shù)也不允許用立即數(shù)和CS寄存器;除了源操作數(shù)為立即數(shù)外,兩個(gè)操作數(shù)中必有一個(gè)是存器,但不能都是段寄存器。MOV指令不能在兩個(gè)存儲(chǔ)單元之間直接傳送數(shù)據(jù)(源和目的不能同為存儲(chǔ)器操作數(shù)),也不能在兩個(gè)段寄存器之間直接傳送數(shù)據(jù)。

MOV指令不影響標(biāo)志寄存器的值。

通用數(shù)據(jù)傳送指令☆

MOV傳送指令(Move)圖4-14MOV允許傳送數(shù)據(jù)的途徑通用寄存器AXAHBXALCXBHDXBLSICHDICLSPDHBPDL段寄存器CS,DS,ES,SS存儲(chǔ)器立即數(shù)從通用寄存器到通用寄存器。立即數(shù)傳送到通用寄存器。通用寄存器和存儲(chǔ)單元之間。立即數(shù)傳送到存儲(chǔ)單元。段寄存器與通用寄存器間的數(shù)據(jù)傳送。

段寄存器與存儲(chǔ)單元間的數(shù)據(jù)傳送。

允許的MOV指令的形式有如下幾種:小結(jié)MOVreg1,reg2MOVreg,immMOVmem(reg),reg(mem)MOVmem,immMOVseg,reg或MOVreg,segMOVsreg,mem或MOVmem,sreg小結(jié)不能在兩個(gè)存儲(chǔ)單元之間傳送。立即數(shù)不能送段寄存器。段寄存器之間不能傳送。

CS不能做目的但可做源操作數(shù)。不允許的MOV指令的形式有如下幾種:MOV[1000H],[2000H]MOVDS,300HMOVDS,ESMOVCS,AXMOVAX,CSMOVAX,BL××∨小結(jié)修改:MOVAX,300HMOVDS,AX×××修改:MOVAX,[2000H]MOV[1000H],AX通用數(shù)據(jù)傳送指令☆PUSH進(jìn)棧指令(PushWordontoStack)原則:按“后進(jìn)先出”原則設(shè)計(jì)的數(shù)據(jù)區(qū)。堆棧段地址:由SS段寄存器提供。堆棧區(qū)操作數(shù)據(jù)地址:由堆棧指針寄存器SP提供。SP的初值是指向的地址為棧底,進(jìn)行堆棧數(shù)據(jù)操作后SP指向棧頂?shù)刂贰8袷剑篜USHSRC;將源操作數(shù)(SRC)推入堆棧。(SP)←(SP)-2,((SP)+1,(SP))←(SRC)(先減后壓)說(shuō)明:源操作數(shù)是16位通用寄存器、段寄存器或存儲(chǔ)器中的數(shù)據(jù)字,不能是立即數(shù)。有下列形式:PUSHreg/mem/sreg。進(jìn)棧指令不影響標(biāo)志位。通用數(shù)據(jù)傳送指令☆POP出棧指令(PopWordoffStack)格式:POPdst;把當(dāng)前SP所指向的堆棧頂部的一個(gè)字送到指定的目的操作數(shù)中。(DST)←((SP)+1,(SP)),(SP)←(SP)+2(先出后加)說(shuō)明:有下列形式:POPreg/mem/sreg。其中CS可以壓棧但不能作目的操作數(shù)。標(biāo)志位不受影響。

例4-6設(shè)SS=2000H,SP=40H,BX=3120H,AX=25FEH,依次執(zhí)行下列指令后堆棧中的數(shù)據(jù)和SP的變化情況如何?PUSHBXPUSHAXPOPBXPOPAX20000:000020000:003C20000:0040FE252031AX=25FEHBX=3120H(c)執(zhí)行PUSHAX指令后SP20000:000020000:003E20000:0040FE252031AX=25FEHBX=25FEH(d)執(zhí)行POPBX指令后SP圖4-15PUSH和POP指令執(zhí)行過(guò)程20000:000020000:0040AX=25FEHBX=3120H(a)指令執(zhí)行前SP20000:000020000:003E20000:00402031AX=25FEHBX=3120H(b)執(zhí)行PUSHBX指令后SP通用數(shù)據(jù)傳送指令☆XCHG交換指令(Exchange)格式:XCHGOPR1,OPR2;操作:(OPR1)(OPR2)說(shuō)明:交換可以在reg之間、reg與mem之間進(jìn)行,但sreg不能作為操作數(shù),也不能直接交換兩個(gè)存儲(chǔ)單元中的內(nèi)容。舉例:設(shè)AX=2000H,DS=3000H,BX=1800H,(31A00H)=1995H,執(zhí)行下面指令:XCHGAX,[BX+200H]后,它把內(nèi)存中的一個(gè)字與AX中的內(nèi)容進(jìn)行交換,源操作數(shù)的物理地址=3000×10H+1800H+200H=31A00H,該地址處存放的字?jǐn)?shù)據(jù)為1995H。因此,指令執(zhí)行后,AX=1995H,(31A00H)=2000H。格式:XLAT表首地址或XLAT操作:(AL)←((BX)+(AL))。將AL中的值(碼)轉(zhuǎn)換為內(nèi)存表格中的某一值,再送回AL中說(shuō)明:使用XLAT指令之前必須先建立一個(gè)表格,并將轉(zhuǎn)換表的起始地址裝入BX寄存器中。AL中事先也送一個(gè)初值,該值等于表頭地址與所要查找的某一項(xiàng)之間的位移量。表格中的內(nèi)容則是要轉(zhuǎn)換的代碼,表格最多包含256個(gè)字節(jié)。執(zhí)行XLAT指令后,根據(jù)位移量可以從表中查到轉(zhuǎn)換后的代碼值,并自動(dòng)送入AL寄存器中,得到所需結(jié)果。累加器專用傳送指令☆XLAT表轉(zhuǎn)換指令累加器專用傳送指令☆輸入輸出指令(I/O指令)I/O指令是專門(mén)面向輸入輸出端口進(jìn)行讀寫(xiě)的指令。輸入指令I(lǐng)N:用于從I/O端口讀數(shù)據(jù)到累加器AL(或AX)中;輸出指令OUT:用于將累加器AL(或AX)中的數(shù)據(jù)寫(xiě)到I/O端口。8086/8088的I/O指令中,只允許用兩種尋址方式:

直接尋址方式:指令中包含了一個(gè)8位的I/O端口地址,允許尋址256個(gè)端口,端口地址為0~0FFH。

寄存器間接尋址方式:端口地址由DX寄存器指定,可尋址64K個(gè)端口(0~0FFFFH)。間接尋址的適用范圍較大,在編寫(xiě)程序時(shí)要盡量采用這種方式。INAL,PORT

;直接尋址,PORT為8位立即數(shù),表示端口地址,從PORT端口讀一個(gè)字節(jié)送ALINAX,PORT

;直接尋址,從PORT和PORT+l兩個(gè)端口讀一個(gè)字送AXINAL,DX

;間接尋址,16位端口地址由DX指出,從(DX)所指的端口讀一個(gè)字節(jié)送ALINAX,DX

;間接尋址,從(DX)和(DX+1)所指的兩個(gè)端口讀一個(gè)字到AX,;低地址端口的內(nèi)容送入AL,高地址端口的內(nèi)容送入AH☆輸入指令I(lǐng)N(Intput)☆輸出指令OUT(Output)OUTPORT,AL

;將AL中的一個(gè)字節(jié)輸出到PORT端口OUTPORT,AX

;將AX中的一個(gè)字輸出到PORT和PORT+l兩個(gè)端口OUTDX,

AL

;DX中為端口地址,將AL中的字節(jié)送(DX)所指的端口OUTDX,

AX

;將AX中的字送(DX)和(DX)+l所指的兩個(gè)端口INAL,0F1H INAX,80H

MOVDX,3l0H INAL,DXOUT85H,AL MOVDX,0FF4HOUTDX,AL MOVDX,300H OUTDX,AX 舉例:地址傳送指令☆取有效地址指令:LEA(LoadEffectiveAddress)格式:LEAreg16,mem;(reg16)←mem的偏移地址功能:取源操作數(shù)地址的偏移量,并把它傳送到目的操作數(shù)制定的寄存器。標(biāo)志位:不受影響。LEA指令要求源操作數(shù)必須是存儲(chǔ)單元,而且目的操作數(shù)必須是一個(gè)除CS之外的16位寄存器。注意它與MOV指令的區(qū)別,MOV指令傳送的一般是源操作數(shù)中的內(nèi)容而不是地址。地址傳送指令☆將雙字指針?biāo)偷郊拇嫫骱虳S的指令:LDS格式:LDSreg16,mem32功能:從mem32指定的存儲(chǔ)單元地址開(kāi)始,將連續(xù)4字節(jié)單元中的內(nèi)容,分別送入制定寄存器reg16和DS中。其中前2個(gè)字節(jié)(變量的偏移地址)送到reg16,后2個(gè)字節(jié)(變量的段地址)送入DS寄存器。標(biāo)志位:不受影響。指令中的reg16通常使用SI寄存器,不能使用sreg。mem32必須是存儲(chǔ)單元,從該存儲(chǔ)單元開(kāi)始的連續(xù)4個(gè)字節(jié)單元中,存放著一個(gè)變量的地址指針。地址傳送指令☆將雙字指針?biāo)偷郊拇嫫骱虴S的指令:LES格式:LESreg16,mem32功能:該指令與LDS指令的操作基本相同,不同的是要將mem32所指向的地址指針中的段地址部分送到ES寄存器中,不是DS寄存器,reg16常用DI寄存器。標(biāo)志傳送指令☆LAHF(LoadAHfromFlags)標(biāo)志寄存器低8為送入AH格式:LAHF功能:把標(biāo)志寄存器SF、ZF、AF、PF和CF分別傳送到AH寄存器的位7,6,4,2和0,位5,3,1的內(nèi)容未定義,可以是任意值。執(zhí)行指令后,標(biāo)志位不受影響。☆SAHF(StoreAHintoFlags)AH送標(biāo)志寄存器低8位格式:SAHF功能:把AH內(nèi)容存入標(biāo)志寄存器。這條指令與LAHF的操作相反,它把寄存器AH中的7,6,4,2,0位傳送到標(biāo)志寄存器的SF、ZF、AF、PF和CF位,高位標(biāo)志OF、DF、IF和TF不受影響?!頟USHF(PushFlagsontoStack)標(biāo)志寄存器入棧指令格式:PUSHF☆POPF(PopFlagsoffStack)標(biāo)志出棧指令格式:POPF§4.48086的指令系統(tǒng)

4.4.2算術(shù)運(yùn)算指令8086/8088指令系統(tǒng)提供了加、減、乘、除四種基本運(yùn)算指令,可處理無(wú)符號(hào)或帶符號(hào)的8位或16位二進(jìn)制數(shù)的算術(shù)運(yùn)算,還提供了各種調(diào)整操作指令,故可進(jìn)行壓縮的或非壓縮的十進(jìn)制數(shù)的算術(shù)運(yùn)算?!?/p>

ADD(Addition)加法指令格式:ADDDST,SRC操作:DST←SRC+DST☆A(yù)DC(AdditionwithCarry)帶進(jìn)位的加法指令格式:ADCDST,SRC操作:DST←DST+SRC+CF說(shuō)明:這兩條指令的SRC可以是reg、mem或imm,DST只能用seg和存儲(chǔ)單元。

源和目的操作數(shù)不能同時(shí)為存儲(chǔ)器,且類(lèi)型必須一致。這兩條指令影響的標(biāo)志位為:CF、OF、PF、SF、ZF和AF。加法指令☆I(lǐng)NC(Increment)增量指令格式:INCOPR操作:OPR←OPR+1說(shuō)明:OPR操作數(shù)可以在通用reg或內(nèi)存中。該指令主要用在循環(huán)程序中對(duì)地址指針和循環(huán)計(jì)數(shù)器等進(jìn)行修改。指令執(zhí)行后影響AF、OF、PF、SF和ZF,但CF不受影響。INC在對(duì)內(nèi)存操作時(shí)必須加WORDPTR[]、BYTEPTR[]指令。

AAA(ASCIIAdjustforAddition)加法的ASCII調(diào)整指令格式:AAA;非壓縮BCD碼加法累加器調(diào)整指令功能:在用ADD或ADC指令對(duì)兩個(gè)非壓縮十進(jìn)制數(shù)或ASCII碼表示的十進(jìn)制數(shù)作加法后,運(yùn)算結(jié)果已存在AL的情況下,AAA指令將AL寄存器中的運(yùn)算結(jié)果調(diào)整為非壓縮十進(jìn)制數(shù),仍保留在AL中,如果AF=1,表示向高位有進(jìn)位,則進(jìn)到AH寄存器中。加法指令例4-8若AH=0,AL寄存器中存放BCD碼數(shù)9,BL寄存器中存放BCD碼數(shù)5,寫(xiě)出兩寄存器相加的指令語(yǔ)句。解:指令語(yǔ)句如下:ADDAL,BL

AAA00001001…9+00000101…500001110…低4位>9+00000110…加6調(diào)整00010100∧00001111…清高4位00000100…AL=4CF=1,AF=1,AH=1結(jié)果為AX=0104H,表示非壓縮十進(jìn)制數(shù)14。

調(diào)整過(guò)程為:若AL低4位>9或半進(jìn)位標(biāo)志AF=1,則:AL←AL+6;用與操作(∧)將AL高4位清0;

AF置1,CF置1,AH←AH+1。否則,僅將AL寄存器的高4位清0。格式:DAA功能:將兩個(gè)壓縮BCD數(shù)相加后的結(jié)果調(diào)整為正確的壓縮BCD數(shù)。相加后的結(jié)果必須在AL中,才能使用DAA指令。調(diào)整過(guò)程為:做加法后AL中的低半字節(jié)﹥9或AF=1,則AL←AL+6,對(duì)低半字節(jié)進(jìn)行調(diào)整。做加法后AL中高半字節(jié)結(jié)果﹥9或CF=l,則AL←AL+60H,對(duì)高半字節(jié)進(jìn)行調(diào)整,并使CF置l,否則CF置0。加法指令☆DAA(DecimalAdjustforAddition)加法的十進(jìn)制調(diào)整指令(壓縮BCD碼加法累加器調(diào)整指令)例4-9若AL寄存器中存放BCD碼數(shù)88,BL寄存器中存放BCD碼數(shù)49,寫(xiě)出兩寄存器相加的指令語(yǔ)句。解:指令代碼如下:ADDAL,BLDAA10001000…88+01001001…4911010001…AF=1+00000110…加6調(diào)整11010111…調(diào)整后高半字節(jié)>9∧01100000…加60H調(diào)整00110111…結(jié)果為AL=BCD37,CF=1減法指令☆

SUB(Subtraction)不帶借位的減法指令格式:SUBDST,SRC操作:DST←DST-SRC?!頢BB(SubtractwithBorrow)帶借位的減法指令格式:SBBDST,SRC操作:DST←DST-SRC-CF☆

DEC(Decrement)減1指令格式:DECOPR操作:OPR←OPR-1

格式:AAS功能:在用SUB或SBB指令對(duì)兩個(gè)非壓縮十進(jìn)制數(shù)或以ASCII碼表示的十進(jìn)制數(shù)進(jìn)行相減后,對(duì)AL中所得結(jié)果進(jìn)行調(diào)整,在AL中得到一個(gè)正確的非壓縮十進(jìn)制數(shù)之差。如果有借位,則CF置1。AAS指令必須緊跟在SUB或SBB指令之后。調(diào)整過(guò)程為:若AL寄存器的低4位﹥9或AF=1,則:AL←AL-6,AF置1;將AL寄存器高4位清零;AH←AH-1,CF置1。否則,不需要調(diào)整?!?/p>

AAS(ASCIIAdjustforSubtraction)減法的ASCII調(diào)整指令減法指令☆

DAS(DecirnalAdjustforSubtraction)減法的十進(jìn)制調(diào)整指令減法指令格式:DAS功能:在兩個(gè)壓縮十進(jìn)制數(shù)用SUB或SBB相減后,結(jié)果已存在AL中的情況下,對(duì)所得結(jié)果進(jìn)行調(diào)整,在AL中得到正確的壓縮十進(jìn)制數(shù)。同樣,它也要對(duì)AL中高半字節(jié)和低半字節(jié)分別進(jìn)行調(diào)整。調(diào)整過(guò)程為:如果AL寄存器的低4位﹥9或AF=1,則:AL←AL-6,AF置1。如果此時(shí)AL高半字節(jié)﹥9或標(biāo)志位CF=1,則:AL←AL-60H,CF置1?!?/p>

NEG(Negate)取負(fù)指令(取補(bǔ)指令)格式:NEGOPR;按位取反加1(包括符號(hào)位)操作:OPR←0-OPR(或OPR←-OPR)。注意:取補(bǔ)指令不同于補(bǔ)碼!!舉例:MOVAL,73HNEGAL;AL=?減法指令答案:AL=8DH☆CMP(Compare)比較指令格式:CMPDST,SRC功能:即:DST-SRC,結(jié)果不回送到目的操作數(shù)中,僅將結(jié)果反映在標(biāo)志位上,可用條件跳轉(zhuǎn)指令決定程序的去向。說(shuō)明:比較指令主要用在希望比較兩個(gè)數(shù)的大小,而又不破壞原操作數(shù)的情況。

減法指令乘法指令☆MUL(Multiply)無(wú)符號(hào)數(shù)乘法指令格式:MULSRC操作:字節(jié)操作數(shù):AX←AL×SRC字操作數(shù):(DX,AX)←AX×SRC說(shuō)明:SRC可以是寄存器,或是存儲(chǔ)單元,但不能是立即數(shù)。當(dāng)SRC是存儲(chǔ)單元時(shí),必須在操作數(shù)前加B或W說(shuō)明是字節(jié)還是字。舉例:MULBYTEPTR[SI]MULWORDPTR[BX]

MULDL說(shuō)明:MUL指令執(zhí)行后影響CF和OF標(biāo)志。乘法指令使AF、PF、SF和ZF的狀態(tài)不定。如果結(jié)果的高半部分(字節(jié)操作為AH、字操作為DX)不為零,表明其內(nèi)容是結(jié)果的有效位,則CF和OF均置1。否則,CF和OF均清0?!頜UL(Multiply)無(wú)符號(hào)數(shù)乘法指令(續(xù))乘法指令☆I(lǐng)MUL(Integer

Multiply)帶符號(hào)數(shù)乘法指令乘法指令格式:IMULSRC操作:同MUL指令。功能:把乘數(shù)和累加器中的數(shù)都作為帶符號(hào)數(shù),進(jìn)行相乘。乘積的符號(hào)符合一般代數(shù)運(yùn)算規(guī)則。說(shuō)明:如果乘積的高半部分不是低半部分的符號(hào)擴(kuò)展(不是全零或全1),則視高位部分為有效位,表示它是積的一部分,于是置CF=1,OF=1。若結(jié)果的高半部分為全零或全1,表明它僅包含了符號(hào)位,那么使CF=0,OF=0。利用這兩個(gè)標(biāo)志狀態(tài)可決定是否需要保存積的高位字節(jié)或高位字。IMUL指令執(zhí)行后,AF、PF、SF和ZF不定?!頓IV(Divisionunsigned)無(wú)符號(hào)數(shù)除法指令除法指令格式:DIVSRC操作:字節(jié)除數(shù):AL←AX/SRC的商;AH←AX/SRC的余數(shù)。字除數(shù):AX←(DX,AX)/SRC的商;DX←(DX,AX)/SRC的余數(shù)。說(shuō)明:被除數(shù)、除數(shù)、商及余數(shù)均為無(wú)符號(hào)數(shù)。6個(gè)狀態(tài)標(biāo)志均無(wú)定義?!領(lǐng)DIV(IntegerDivision)帶符號(hào)數(shù)除法指令除法指令格式:IDIVSRC操作:字節(jié)除數(shù):AL←AX/SRC的商;AH←AX/SRC的余數(shù)。字除數(shù):AX←(DX,AX)/SRC的商;DX←(DX,AX)/SRC的余數(shù)。說(shuō)明:被除數(shù),除數(shù)、商及余數(shù)均為帶符號(hào)數(shù),商的符號(hào)符合一般代數(shù)運(yùn)算的符號(hào)規(guī)則,余數(shù)的符號(hào)與被除數(shù)相同。6個(gè)狀態(tài)標(biāo)志均無(wú)定義。商超過(guò)了目標(biāo)寄存器AL或AX所能存放數(shù)的范圍。這時(shí)系統(tǒng)會(huì)自動(dòng)產(chǎn)生一個(gè)中斷類(lèi)型號(hào)為0的除法錯(cuò)中斷,相當(dāng)于執(zhí)行了除數(shù)為0的運(yùn)算,所得的商和余數(shù)都不確定。這類(lèi)指令的功能是對(duì)操作數(shù)最高位進(jìn)行擴(kuò)展,用于處理帶符號(hào)數(shù)運(yùn)算時(shí)的操作類(lèi)型匹配問(wèn)題。☆

CBW(ConvertBytetoWord)把字節(jié)擴(kuò)展為字指令格式:CBW功能:AL中字節(jié)的符號(hào)位擴(kuò)展到AH中(即把AL中的最高位送入AH的所有位)☆CWD(ConvertWordtoDoubleWord)把字?jǐn)U展成雙字指令格式:CWD功能:把AX中字的符號(hào)位擴(kuò)展到DX中(即把AH中的最高位送入DX的所有位)標(biāo)志:不影響任何標(biāo)志位。符號(hào)擴(kuò)展指令補(bǔ)充例題:MOVAL,10011010B;CBW ;AX=1111111110011010B=0FF9AHAL=10011010B=9AHMOV DX,0;MOV AX,0FFABH;CWD ;(DX)=0(AX)=0FFABH(DX)=0FFFFH,(AX)=0FFABH§4.48086的指令系統(tǒng)

4.4.3邏輯運(yùn)算與移位指令邏輯運(yùn)算和移位指令對(duì)字節(jié)或字操作數(shù)進(jìn)行按位操作,這類(lèi)運(yùn)算可分成:邏輯運(yùn)算(LogicalOperations)算術(shù)邏輯移位(shiftArithmeticandShiftLogical)循環(huán)移位(Rotate)邏輯運(yùn)算指令☆邏輯與指令A(yù)ND格式:ANDDEST,SRC

操作:DEST←(DEST)(SRC)說(shuō)明:運(yùn)算法則為:1∧1=1,1∧0=0,0∧1=0,0∧0=0邏輯運(yùn)算指令☆邏輯或指令OR格式:ORDEST,SRC

操作:DEST←(DEST)∨

(SRC)說(shuō)明:運(yùn)算法則為:1∨1=1,1∨0=1,0∨1=1,0∨0=0。格式:XORDEST,SRC;(DEST)←(DEST)(SRC)說(shuō)明:運(yùn)算法則為:1⊕1=0,1⊕0=1,0⊕1=1,0⊕0=0。邏輯運(yùn)算指令☆邏輯異或指令XOR☆測(cè)試指令TEST格式:TESTDEST,SRC;FLAGS←(DEST)(SRC)功能:源地址和目的地址的內(nèi)容執(zhí)行按位的邏輯乘運(yùn)算,結(jié)果不送入目的地址,只影響標(biāo)志位。邏輯運(yùn)算指令☆邏輯非指令NOT:格式:NOTDEST;DEST←()功能:將目的地址中的內(nèi)容逐位取反后送入目的地址。補(bǔ)充知識(shí):邏輯運(yùn)算指令小結(jié)邏輯運(yùn)算指令的操作均是按位進(jìn)行的。邏輯非NOT指令只有一個(gè)操作數(shù)。目的操作數(shù)可以是8位或16位寄存器或存儲(chǔ)器。對(duì)于存儲(chǔ)器操作數(shù),要說(shuō)明其類(lèi)型是字節(jié)還是字。指令執(zhí)行后,對(duì)標(biāo)志位無(wú)影響。其余邏輯運(yùn)算指令均為雙操作數(shù)指令,SRC可以是8位或16位立即數(shù)、寄存器或存儲(chǔ)器,DST只能是寄存器或存儲(chǔ)器,兩個(gè)操作數(shù)不能同時(shí)為存儲(chǔ)器。指令執(zhí)行后,均將CF和OF清0,ZF、SF和PF反映操作結(jié)果,AF未定義,源操作數(shù)不變。

AND指令常用來(lái)對(duì)一個(gè)數(shù)據(jù)的指定位清零;

OR指令可用來(lái)對(duì)一些指定的位置置1;

XOR指令可用于將操作數(shù)的某些位取反;

TEST指令則常用于檢測(cè)某些數(shù)據(jù)的指定位是1還是0。小結(jié)算術(shù)邏輯移位指令☆算術(shù)左移指令SAL格式:SALDST,CNT最低位CF0最高位SAL移動(dòng)☆邏輯左移指令SHL格式:SHLDST,CNT最低位CF0最高位SHL移動(dòng)算術(shù)邏輯移位指令☆算術(shù)右移指令SAR格式:SARDST,CNT☆邏輯右移指令SHR格式:SHRDST,CNT最低位最高位CFSAR移動(dòng)0最低位最高位CFSHR移動(dòng)移位指令實(shí)現(xiàn)對(duì)操作數(shù)的移位操作。邏輯移位把操作數(shù)看成無(wú)符號(hào)數(shù)來(lái)移位,右移時(shí),最高位補(bǔ)0,左移時(shí),最低位補(bǔ)0算術(shù)移位則把操作數(shù)看做有符號(hào)數(shù),右移時(shí)最高位(符號(hào)位)保持不變,左移時(shí),最低位補(bǔ)0DST可以是8位、16位寄存器或存儲(chǔ)器操作數(shù)。CNT為移位計(jì)數(shù)值,可以設(shè)定為1,也可以由寄存器CL確定其值。小結(jié)小結(jié)SHL和SAL兩條指令的功能完全相同,在機(jī)器中實(shí)際對(duì)應(yīng)同一種操作。對(duì)標(biāo)志位影響的情況是:AF總是無(wú)定義。PF、SF和ZF在指令執(zhí)行后被修改。CF總是等于目的操作數(shù)最后被移出去的那一位的值。OF的值多次移位的情況下是不確定。在移位次數(shù)為1的情況下,如果最高位(符號(hào)位)的值被改變,則OF標(biāo)志置1,否則OF清0。移位操作還可以實(shí)現(xiàn)對(duì)一個(gè)數(shù)乘以2n或除以2n的運(yùn)算,這種方法的運(yùn)算速度要比直接使用乘除法高很多。邏輯移位指令適用于無(wú)符號(hào)數(shù)運(yùn)算,SHL用來(lái)乘以2n,SHR用于除以2n;算術(shù)移位指令用于對(duì)帶符號(hào)數(shù)運(yùn)算,SAL用來(lái)乘以2n,SAR用于除以2n。

小結(jié)(續(xù))小結(jié)循環(huán)移位指令☆不帶進(jìn)位位的循環(huán)左移指令ROL格式:ROLDST,CNT☆不帶進(jìn)位位的循環(huán)右移指令ROR格式:RORDST,CNTCFROLROL移動(dòng)CFRORROR移動(dòng)循環(huán)移位指令☆帶進(jìn)位位的循環(huán)左移指令RCL格式:RCLDST,CNT☆帶進(jìn)位位的循環(huán)右移指令RCR格式:RCRDST,CNTCFRCLRCL移動(dòng)CFRCRRCR移動(dòng)小結(jié)小結(jié)4條指令都按指令中計(jì)數(shù)值規(guī)定的移位次數(shù)進(jìn)行循環(huán)移位,移位后的結(jié)果仍送回目的操作數(shù)。目的操作數(shù)可以是8/16位的寄存器操作數(shù)或內(nèi)存操作數(shù),循環(huán)移位的次數(shù)可以是1,也可以由CL寄存器的值指定。這4條指令中,ROL和ROR指令沒(méi)有把進(jìn)位標(biāo)志CF包含在循環(huán)中,而RCL和RCR指令把CF作為整個(gè)循環(huán)的一部分,一起參加循環(huán)移位。OF位只有在移位次數(shù)為1的時(shí)候才有效,在移位后當(dāng)前最高有效位(符號(hào)位)發(fā)生變化時(shí),則OF標(biāo)志置1,否則OF置0。在多位循環(huán)移位時(shí),OF的值是不確定的。CF的值總是由最后一次被移出的值決定?!?.48086的指令系統(tǒng)

4.4.4串操作指令字符串(String)是指一系列存放在存儲(chǔ)器中的字或字節(jié)數(shù)據(jù)。字符串長(zhǎng)度可達(dá)64K字節(jié),組成字符串的字節(jié)或字稱為字符串元素,每種字符串指令對(duì)字符串中的元素只進(jìn)行同一種操作。8086提供5條1字節(jié)的字符串操作指令,專門(mén)對(duì)存儲(chǔ)器中的字節(jié)串和字串?dāng)?shù)據(jù)進(jìn)行。分類(lèi):傳送(MoveString)、比較(CompareString)、掃描(ScanString)、存儲(chǔ)(StoreString)、裝入(LoadString)。

字符串的傳送MOVS格式1:MOVSB;(ES:DI)(DS:SI),SISI±1,;DIDI±1格式2:MOVSW;(ES:DI)(DS:SI),SISI±2,;DIDI±2功能:將以SI為指針的源串中的一個(gè)字節(jié)(或字)存儲(chǔ)單元中的數(shù)據(jù)傳送至以DI為指針的目的地址中去,并自動(dòng)修改指針,使之指向下一個(gè)字節(jié)(或字)存儲(chǔ)單元。在使用MOVS指令進(jìn)行字符串傳送時(shí),傳送方向由DF控制。如果源字符串與目標(biāo)字符串不重迭,則傳送方向可以任意?!⒁猓╝)源和目的不重疊,DF取值任意

源串目的串低地址高地址若源字符串與目標(biāo)字符串部分重迭,則傳送方向要特別注意。當(dāng)源字符串的地址低于目標(biāo)字符串的地址時(shí),則應(yīng)該自動(dòng)減量(置DF=1),從高地址開(kāi)始傳送。(b)源和目的下重疊,

DF=1

源串目的串低地址高地址當(dāng)源字符串的地址高于目標(biāo)字符串的地址時(shí),則應(yīng)該自動(dòng)增量(置DF=0),從低地址開(kāi)始傳送。源串目的串低地址高地址(c)源和目的上重疊,

DF=0

格式1:CMPSB;FLAGS(DS:SI)-(ES:DI),;SISI±1,DIDI±1格式2:CMPSW;FLAGS(DS:SI)-(ES:DI),;SISI±2,DIDI±2字符串的比較指令CMPS功能:將SI所指的源串中的一個(gè)字節(jié)(或字)存儲(chǔ)單元中的數(shù)據(jù)與DI所指的目的串中的一個(gè)字節(jié)(或字)存儲(chǔ)單元中的數(shù)據(jù)相減,并根據(jù)相減的結(jié)果設(shè)置標(biāo)志,但結(jié)果并不保存。字符串的掃描指令SCAS功能:AL(字節(jié))或AX(字)中的內(nèi)容與DI所指的目的串中的一個(gè)字節(jié)(或字)存儲(chǔ)單元中的數(shù)據(jù)相減,根據(jù)相減結(jié)果設(shè)置標(biāo)志位,結(jié)果不保存。利用SCAS指令,可在內(nèi)存中搜索所需要的數(shù)據(jù)。被搜索的數(shù)據(jù)也稱為關(guān)鍵字。指令執(zhí)行前,先將關(guān)鍵字存在AL(字節(jié))或AX(字)中,才能用SCAS指令進(jìn)行搜索。格式1:SCASB;FLAGSAL-(ES:DI),DIDI±1格式2:SCASW;FLAGSAX-(ES:DI),DIDI±2字符串的裝入指令LODS格式1:LODSB;AL(DS:SI),SISI±1格式2:LODSW;AX(DS:SI),SISI±2字符串的存儲(chǔ)指令STOS格式1:STOSB;(ES:DI)AL,DIDI±1格式2:STOSW;(ES:DI)AX,DIDI±2為了加快串運(yùn)算指令的執(zhí)行速度,可在基本指令前加重復(fù)前綴,使數(shù)據(jù)串指令重復(fù)執(zhí)行。每重復(fù)執(zhí)行一次,地址指針SI和DI都根據(jù)方向標(biāo)志DF自動(dòng)進(jìn)行修改,CX的值則自動(dòng)減1。

REP:REP前綴用在MOVS指令前。功能:每執(zhí)行一次串指令,(CX)-1,直到(CX)=0,重復(fù)執(zhí)行結(jié)束。

REPZ

:該指令一般用在CMPS、SCAS指令前。功能:每執(zhí)行一次串指令,(CX)-1,并判斷ZF標(biāo)志是否為0,只要(CX)=0或ZF=0,則重復(fù)執(zhí)行結(jié)束。

REPNZ

:該指令一般用在CMPS、SCAS指令前。功能:每執(zhí)行一次串指令,(CX)-1,并判斷ZF標(biāo)志是否為0,只要(CX)=0或ZF=1,則重復(fù)執(zhí)行結(jié)束。重復(fù)過(guò)程:1、檢測(cè)CX。若CX=0,則退出串操作;否則繼續(xù)執(zhí)行2。2、完成一次串操作。3、修改地址指針,SISI±1(或2)DIDI±1(或2)。4、CXCX-15、若重復(fù)前綴為REP,則轉(zhuǎn)1執(zhí)行;若重復(fù)前綴為REPZ,且ZF=1時(shí),則轉(zhuǎn)1執(zhí)行;否則退出串操作;若重復(fù)前綴為REPNZ,且ZF=0時(shí),則轉(zhuǎn)1執(zhí)行;否則退出串操作。表4-10串操作指令及重復(fù)前綴分組指令名稱命令格式操作串操作指令串傳送(字節(jié),字串傳送)MOVSDST,SRC(MOVSB,MOVSW)(ES:DI)←(DS:SI),SI←SI±1或2,DI←DI±1或2串比較(字節(jié),字串比較)CMPSDST,SRC(CMPSB,CMPSW)(ES:DI)?(DS:SI),SI←SI±1或2,DI←DI±1或2串掃描(字節(jié),字串掃描)SCASDST,SRC(SCASB,SCASW)AL或AX?(ES:DI),DI←DI±1或2取串(取字節(jié),字串)LODSSRC(LODSB,LODSW)AL或AX←(DS:SI),SI←SI±1或2存串(存字節(jié),字串)STOSDST(STOSB,STOSW)(ES:DI)←AL或AX,DI←DI±1或2重復(fù)前綴無(wú)條件重復(fù)前綴REP使其后的串操作重復(fù)執(zhí)行,每執(zhí)行一次,CX的內(nèi)容減1,直至CX=0相等/為零重復(fù)前綴REPE/REPZ當(dāng)ZF=1且CX≠0時(shí),重復(fù)執(zhí)行其后的串操作,每執(zhí)行一次,CX的內(nèi)容減1,直至ZF=0或CX=0不相等/不為零重復(fù)前綴REPNE/REPNZ當(dāng)ZF=0且CX≠0時(shí),重復(fù)執(zhí)行其后的串操作,每執(zhí)行一次,CX的內(nèi)容減1,直至ZF=1或CX=0小結(jié)源串位于當(dāng)前數(shù)據(jù)段中,由DS尋址,源串的元素由SI作指針,即源串字符的起始地址(或末地址)為DS:SI,源串允許使用段超越前綴來(lái)修改段地址。目的串必須位于當(dāng)前附加段中,由ES尋址,目的串元素由DI作指針,即目的串字符的起始地址(或末地址)為ES:DI,但目的串不允許使用段超越前綴修改ES。如果要在同一段內(nèi)進(jìn)行串運(yùn)算,必須使DS和ES指向同一段。每執(zhí)行一次字符串指令,指針SI和DI會(huì)自動(dòng)進(jìn)行修改,以便指向下一待操作單元。DF標(biāo)志控制字符串處理的方向。要處理的字符串長(zhǎng)度(字節(jié)或字?jǐn)?shù))放在CX寄存器中。補(bǔ)充知識(shí)如果已知兩個(gè)數(shù)據(jù)塊的內(nèi)容基本上是相同的,若要尋找其中是否有不一致的地方,則應(yīng)使用CMP指令查找,并在CMP指令前使用REPE/REPZ前綴。如果已知兩個(gè)數(shù)據(jù)塊的內(nèi)容基本是不相同的,若要尋找其中相一致的地方,則應(yīng)使用CMP指令查找,并在CMP指令前使用REPNE/REPNZ前綴。例4-22要求把數(shù)據(jù)段DS中以SRC_MESS為偏移地址的一串字符“HELLO!”,傳送到附加段ES中以NEW_LOC開(kāi)始的單元中,寫(xiě)出其指令代碼?解:實(shí)現(xiàn)該操作的程序如下:

DATASEGMENT

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

SRCMESSDB‘HELLO!’ ;源串

DATAENDS

EXTRASEGMENT

;附加段

NEWLOCDB6DUP(?);存放目的串

EXTRAENDS

CODESEGMENT

;代碼段

ASSUMECS:CODE,DS:DATA,ES:EXTRA程序頭START:MOVAX,DATA MOVDS,AX;DS←數(shù)據(jù)段段址 MOVAX,EXTRA MOVES,AX ;ES←附加段段址 LEASI,SRCMESS;SI指向源串偏移地址

LEADI,NEWLOC;DI指向目的串偏移地址 MOVCX,6 ;CX作串長(zhǎng)度計(jì)數(shù)器 CLD ;清方向標(biāo)志,地址增量DF=0

REPMOVSB ;重復(fù)傳送串中的各字節(jié)直到

;CX=0為止

CODEENDS

ENDSTART本例中的REPMOVSB指令也可用以下幾條指令代替:AGAIN:MOVSNEWLOC,SRCMESSDECCXJNZAGAIN初始化例4-23在某一字符串中搜尋是否有字符A,若有,則把搜索次數(shù)記下來(lái),送到BX寄存器中,若沒(méi)有查到,則將BX寄存器清0。寫(xiě)出其指令代碼。解:設(shè)字符串起始地址STRING的偏移地址為0,字符串長(zhǎng)度為CX。程序段如下:MOVDI,OFFSETSTRING ;DI=字符串偏移地址(相對(duì)于LEADI,STRING)MOVCX,COUNT ;CX=字符串長(zhǎng)度MOVAL,‘A’ ;AL=關(guān)鍵字A的ASCII碼CLD ;清方向標(biāo)志REPNESCASB;CX≠0(沒(méi)查完)和ZF=0(不相等)時(shí)重復(fù)JZFIND;若ZF=1,表示已搜到,轉(zhuǎn)出MOVDI,0 ;若ZF=0,表示沒(méi)搜到,DI=0FIND:MOVBX,DI;BX=搜索次數(shù)HLT;停機(jī)

例4-24若在數(shù)據(jù)段中有一個(gè)數(shù)據(jù)塊,起始地址為BLOCK,數(shù)據(jù)塊中的數(shù)為8位帶符號(hào)數(shù),要求將其中所含的正、負(fù)數(shù)分開(kāi),然后把正數(shù)送到附加段中始址為PLUS_DATA的緩沖區(qū),負(fù)數(shù)則送到附加段中始址為MINUS_DATA的緩沖區(qū)。寫(xiě)出其指令代碼。

解:可以將這塊數(shù)據(jù)看成一個(gè)數(shù)據(jù)串,用SI作源串指針,DI和BX分別作正、負(fù)數(shù)目的緩沖區(qū)的指針,CX用于控制循環(huán)次數(shù),可寫(xiě)出如下程序段:START:MOVSI,OFFSETBLOCK ;SI為源串指針

MOVDI,OFFSETPLUS_DATA;DI為正數(shù)目的區(qū)指針

MOVBX,OFFSETMINUS_DATA;BX為負(fù)數(shù)目的區(qū)指針

MOVCX,COUNT ;CX放循環(huán)次數(shù)

CLDGOON:LODSBBLOCK;AL←取源串的一個(gè)字節(jié)

TESTAL,80H ;是負(fù)數(shù)?JNZMINUS ;是,轉(zhuǎn)MINUSSTOSB ;

溫馨提示

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