微機(jī)原理接口技術(shù)03-指令系統(tǒng)_第1頁(yè)
微機(jī)原理接口技術(shù)03-指令系統(tǒng)_第2頁(yè)
微機(jī)原理接口技術(shù)03-指令系統(tǒng)_第3頁(yè)
微機(jī)原理接口技術(shù)03-指令系統(tǒng)_第4頁(yè)
微機(jī)原理接口技術(shù)03-指令系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩145頁(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ì)算機(jī)用以控制各個(gè)部件協(xié)調(diào)工作的命令,指令系統(tǒng)是微處理器所能執(zhí)行的指令的集合,它與微處理器有密切的聯(lián)系,不同的微處理器有不同的指令系統(tǒng)第3章指令系統(tǒng)3.18086指令系統(tǒng)概述計(jì)算機(jī)的工作就是運(yùn)行程序,而程序由存儲(chǔ)在存儲(chǔ)器中的指令序列構(gòu)成。

微處理器高效軟件的發(fā)展要求對(duì)每條指令的尋址方式(AddressingMode)都要相當(dāng)?shù)厥煜?。機(jī)器語(yǔ)言指令由二進(jìn)制代碼組成。指令語(yǔ)句一般由操作碼(OperatingCode)和操作數(shù)(OperatingData)兩部分組成:

匯編語(yǔ)言助記符指令書(shū)寫(xiě)的基本格式為

(標(biāo)號(hào)):操作碼

(操作數(shù))(;注釋)

其中,操作碼是指令語(yǔ)句中不可缺少的;帶括號(hào)的項(xiàng)是可選項(xiàng),如果有此項(xiàng)時(shí),不能加括號(hào);多個(gè)操作數(shù)間是以‘,’隔開(kāi)的;操作碼與操作數(shù)之間必須以空格分開(kāi)。助記符指令格式

操作碼由便于記憶的助記符表示(通常為英文單詞縮寫(xiě)),操作碼表示計(jì)算機(jī)執(zhí)行什么操作;操作數(shù)可能指明了參與操作的數(shù)本身,或規(guī)定了操作數(shù)的地址。

8086/8088系統(tǒng)中一條指令的操作數(shù)可以是雙操作數(shù)(源操作數(shù)和目的操作數(shù)),也可以是單操作數(shù),有的指令還可以沒(méi)有操作數(shù)或隱含操作數(shù)。而80386/80486系統(tǒng)中的指令則有多個(gè)操作數(shù)操作數(shù)主要分為三類(lèi):立即數(shù)操作數(shù)立即數(shù)即常數(shù),是一個(gè)固定數(shù)值的操作數(shù);寄存器操作數(shù)寄存器操作數(shù)存放在CPU的某個(gè)寄存器中;存儲(chǔ)器操作數(shù)存儲(chǔ)器操作數(shù)則存放在內(nèi)存的數(shù)據(jù)區(qū)中。3.2尋址方式

通過(guò)指令采用合適的方式指定操作數(shù)的地址。尋找操作數(shù)所在地址的方法稱(chēng)為尋址方式。

在80X86系統(tǒng)中,尋址方式通常分為兩種:一種為尋找操作數(shù)的地址,稱(chēng)為數(shù)據(jù)尋址;另一種為尋找要執(zhí)行的下一條指令的地址,即程序轉(zhuǎn)移或子程序調(diào)用時(shí)的目的地址或入口地址,稱(chēng)為程序轉(zhuǎn)移地址尋址。

3.2.1數(shù)據(jù)的尋址方式

本節(jié)中尋址方式一般針對(duì)源操作數(shù)而言,以通用傳送指令為例

MOVDST,SRC

SRC為源操作數(shù),指令執(zhí)行過(guò)程中原值保持不變;DST為目的操作數(shù),原值不保留,MOV指令完成從源操作數(shù)向目的操作數(shù)拷貝數(shù)據(jù)的功能。3.2.1數(shù)據(jù)的尋址方式1.立即尋址(ImmediateAddressing)

操作數(shù)包含在指令碼中,由指令給出。匯編語(yǔ)言可用多種方式描述立即數(shù)。立即操作數(shù)可以是常數(shù),如果操作數(shù)以字母開(kāi)頭,匯編程序要求操作數(shù)在其前加0。

立即尋址通常用于給寄存器賦值,并且只適用于源操作數(shù)字段,不能用于目的操作數(shù)字段,要求源操作數(shù)與目的操作數(shù)長(zhǎng)度一致。MOVAL,100

指令執(zhí)行后,

(AL)=64H

MOVCL,01001100B

指令執(zhí)行后,

(CL)=4CH

MOVAX,1234H

指令執(zhí)行后,

(AX)=1234H3.2.1數(shù)據(jù)的尋址方式立即數(shù)如果是多字節(jié)數(shù),則高位字節(jié)存放在高地址中,低位字節(jié)存放在低地址中。

3.2.1數(shù)據(jù)的尋址方式3.2.1數(shù)據(jù)的尋址方式3.2.1數(shù)據(jù)的尋址方式2.寄存器尋址(RegisterAddressing)

寄存器尋址是一種最普遍的數(shù)據(jù)尋址方式,指令指定寄存器號(hào),操作數(shù)存放在指令規(guī)定的CPU內(nèi)部寄存器中??捎糜诩拇嫫鲗ぶ返臑橥ㄓ眉拇嫫?。寄存器尋址不需要訪問(wèn)存儲(chǔ)器,也不需要使用總線周期,操作在CPU內(nèi)部進(jìn)行,因而可取得較高的運(yùn)算速度。MOVAX,BX

指令執(zhí)行前,(AX)?=?5678H,(BX)?=?1234H;指令執(zhí)行后,(AX)?=?1234H,(BX)?=?1234H。

除上述兩種尋址方式外,以下各種尋址方式的操作數(shù)均在代碼段以外的存儲(chǔ)區(qū)中,尋址方式通過(guò)不同的途徑求得操作數(shù)的偏移地址,即有效地址EA(EffectiveAddress)。3.2.1數(shù)據(jù)的尋址方式3.2.1數(shù)據(jù)的尋址方式3.直接尋址(DirectAddressing)

直接尋址由指令直接給出操作數(shù)的有效地址EA,操作數(shù)本身在存儲(chǔ)單元中,通常存放在數(shù)據(jù)段,默認(rèn)的段寄存器為DS。操作數(shù)有效地址格式為

[數(shù)值]或符號(hào)或[符號(hào)]

MOVAX,[2040H]

執(zhí)行結(jié)果為(AX)?=?6A4BH

注意:本指令不是將立即數(shù)2040H傳送到AX,而是將有效地址是2040H的存儲(chǔ)單元的內(nèi)容傳送到AX。

3.2.1數(shù)據(jù)的尋址方式匯編語(yǔ)言指令中可以用符號(hào)地址代替數(shù)值地址:

MOVAX,[TABLE];或MOVAX,TABLE;這兩者等價(jià),此處TABLE為存放操作數(shù)單元的符號(hào)地址。

如果要對(duì)其他段寄存器所指出的存儲(chǔ)區(qū)進(jìn)行直接尋址,則在指令前必須用前綴指出段寄存器名。

MOVAX,ES:[2000H];將ES段的2000H和2001H兩單元的內(nèi)容傳送到AX。

3.2.1數(shù)據(jù)的尋址方式3.2.1數(shù)據(jù)的尋址方式

4.寄存器間接尋址(RegisterIndirectAddressing)

操作數(shù)的有效地址存放在基址寄存器或變址寄存器中,而操作數(shù)則在存儲(chǔ)器中。對(duì)16位數(shù)進(jìn)行寄存器間接尋址時(shí)可用的寄存器是基址寄存器BX、BP和變址寄存器SI、DI。使用BP時(shí)默認(rèn)的段寄存器為SS,使用其他寄存器默認(rèn)的段寄存器為DS。

操作數(shù)有效地址格式為:[間接尋址的寄存器]。尋址寄存器放在方括號(hào)中。MOVBX,[BP]

指令執(zhí)行前,(BP)?=?4000H,執(zhí)行結(jié)果為:(BX)?=?50A0H。3.2.1數(shù)據(jù)的尋址方式3.2.1數(shù)據(jù)的尋址方式寄存器間接尋址方式可用于表格處理,執(zhí)行完一條指令后,只需修改寄存器的內(nèi)容就可以取出表格中的下一項(xiàng)。3.2.1數(shù)據(jù)的尋址方式5.寄存器相對(duì)尋址(RegisterRelativeAddressing)

操作數(shù)的有效地址為指令中規(guī)定的間接尋址寄存器的內(nèi)容和指令中指定的位移量之和。操作數(shù)存放在存儲(chǔ)器中。操作數(shù)有效地址格式為

位移量[間接尋址的寄存器]或[位移量?+?間接尋址的寄存器]

MOVAX,TAB[SI]

如果TAB為16位的符號(hào)地址,其值為3080H,(SI)=?2000H,默認(rèn)的段寄存器為DS,則

EA=TAB+(SI)=3080H+2000H=5080H

3.2.1數(shù)據(jù)的尋址方式

寄存器相對(duì)尋址可用于表格處理或訪問(wèn)一維數(shù)組中的元素。把表格的首地址設(shè)置為位移量,利用修改間接寄存器的值來(lái)存取表格中的任意一個(gè)元素。3.2.1數(shù)據(jù)的尋址方式3.2.1數(shù)據(jù)的尋址方式6.基址變址尋址(BasedIndexedAddressing)

操作數(shù)的有效地址是一個(gè)基址寄存器和變址寄存器的內(nèi)容之和,操作數(shù)本身在存儲(chǔ)單元中。操作數(shù)有效地址格式為:

[基址寄存器][變址寄存器]

MOVAX,[BX][SI]

如果

(BX)?=?0200H,(SI)?=?0010H,

(DS)?=?3000H,

EA=(BX)+(SI)=0200H+0010H=0210H

物理地址=(DS)×10H+EA=3000H×10H+0210H?

=30210H若30210H和30211H中分別存放的數(shù)值為56H、78H,則指令執(zhí)行結(jié)果(AX)?=?7856H。3.2.1數(shù)據(jù)的尋址方式

基址變址尋址同樣適用于數(shù)組或表格處理,首地址存放在基址寄存器中,變址寄存器訪問(wèn)數(shù)組中各元素。因兩個(gè)寄存器都可以修改,所以它比寄存器相對(duì)尋址方式更靈活。需要注意的是,兩個(gè)寄存器不能均為基址寄存器,也不能均為變址寄存器。3.2.1數(shù)據(jù)的尋址方式7.基址變址相對(duì)尋址

(RelativeBasedIndexedAddressing)

操作數(shù)的有效地址為指令中規(guī)定的1個(gè)基址寄存器和1個(gè)變址寄存器的內(nèi)容及指令中指定的位移量三者之和。位移量[基址寄存器][變址寄存器]可以表示成多種形式組合。尋址寄存器要放在方括號(hào)中。3.2.1數(shù)據(jù)的尋址方式MOVAX,TAB[BX][SI]

(BX)?=?1000H,(SI)?=?2000H,

TAB?=?0150H

EA?=?(BX)?+?(SI)?+TAB?=?3150H

執(zhí)行結(jié)果(AX)?=?1234H。3.2.1數(shù)據(jù)的尋址方式3.2.1數(shù)據(jù)的尋址方式基址變址相對(duì)尋址通常用于對(duì)二維數(shù)組的訪問(wèn)。位移量為數(shù)組起始地址?;芳拇嫫骱妥冎芳拇嫫鞣謩e存放行和列的值,利用相對(duì)基址變址尋址就可以直接訪問(wèn)二維數(shù)組中指定的某個(gè)元素。

3.2.1數(shù)據(jù)的尋址方式8.隱含尋址(ConcealedAddressing)

有些指令的指令碼中不包含指明操作數(shù)地址的部分,而其操作碼本身隱含地指明了操作數(shù)的地址。如:LODSB;表示SI的內(nèi)容送到AL,SI指針加1。該指令將在后面串操作指令部分詳細(xì)介紹。

3.2.1數(shù)據(jù)的尋址方式

9.I/O端口尋址

I/O端口尋址就是尋找輸入輸出設(shè)備的端口地址對(duì)I/O端口的尋址有以下兩種方式。

(1)直接端口尋址方式端口地址用8位地址碼表示:

IN AL(AXorEAX),port8;

OUTport8,AL(AXorEAX)

如:INAL,21H。表示從I/O地址為21H的端口中讀取數(shù)據(jù)到AL中。3.2.1數(shù)據(jù)的尋址方式

(2)間接端口尋址方式

端口地址為16位,并規(guī)定存放在寄存器DX中。格式如下:

INAL(AXorEAX),DX;

OUTDX,AL(AXorEAX)

如:INAL,DX。這條指令表示從DX寄存器內(nèi)容所指定的端口中讀取數(shù)據(jù)到AL中。3.2.1數(shù)據(jù)的尋址方式3.2.2程序轉(zhuǎn)移地址尋址方式

CPU執(zhí)行指令時(shí),指令是按順序存放在存儲(chǔ)器中的,而程序執(zhí)行順序是由CS和IP的內(nèi)容來(lái)決定的。當(dāng)程序執(zhí)行到某一轉(zhuǎn)移或調(diào)用指令時(shí),需脫離程序的正常順序執(zhí)行,而把它轉(zhuǎn)移到指定的指令地址,程序轉(zhuǎn)移及調(diào)用指令通過(guò)改變IP和CS內(nèi)容,就可改變程序執(zhí)行順序。

根據(jù)程序轉(zhuǎn)移地址相對(duì)于當(dāng)前程序地址的關(guān)系,可分為段內(nèi)、段外;又根據(jù)轉(zhuǎn)移地址是否直接出現(xiàn)在指令中,分為直接、間接,所以有四種程序轉(zhuǎn)移尋址方式:段內(nèi)直接尋址、段內(nèi)間接尋址、段間直接尋址及段間間接尋址。3.2.2程序轉(zhuǎn)移地址尋址方式1.段內(nèi)直接尋址(IntrasegmentDirectAddressing)

段內(nèi)直接尋址方式也稱(chēng)為相對(duì)尋址方式。指令碼中包括一個(gè)位移量disp,轉(zhuǎn)移的有效地址為:

EA?=?(IP)?+?disp。當(dāng)位移量是8位時(shí),稱(chēng)為短程轉(zhuǎn)移;當(dāng)位移量是16位時(shí),稱(chēng)為近程轉(zhuǎn)移。

JMPNEARPTR符號(hào)地址

JMPSHORT符號(hào)地址3.2.2程序轉(zhuǎn)移地址尋址方式2.段內(nèi)間接尋址(IntrasegmentIndirectAddressing)

程序轉(zhuǎn)移的有效地址是一個(gè)寄存器或存儲(chǔ)單元的內(nèi)容。所得到的轉(zhuǎn)向的有效地址用來(lái)取代IP寄存器的內(nèi)容。

JMP寄存器

JMP存儲(chǔ)單元

由于以上兩種尋址方式僅修改IP的內(nèi)容,?所以這種尋址方式只能在段內(nèi)進(jìn)行程序轉(zhuǎn)移。3.2.2程序轉(zhuǎn)移地址尋址方式JMPBX

如果(BX)?=?1020H,則指令執(zhí)行后

(IP)?=?1020HJMPTABLE[BX][SI]

如果(DS)?=

2000H,(BX)?=?1020H,

(SI)?=?0002H,TABLE?=?0010H,(21032H)?=?1234H,

則指令執(zhí)行后

(IP)=((DS)×10H+(BX)+(SI)+TABLE)

=(2000H×10H+1020H+0002H+0010H)=(21032H)=1234H

3.2.2程序轉(zhuǎn)移地址尋址方式3.段間直接尋址(IntersegmentDirectAddressing)

指令中直接給出程序轉(zhuǎn)移的代碼段地址和偏移地址來(lái)取代當(dāng)前的CS和IP。

指令的匯編語(yǔ)言格式為

JMPFARPTR符號(hào)地址;FARPTR表示段間轉(zhuǎn)移的操作符3.2.2程序轉(zhuǎn)移地址尋址方式4.段間間接尋址(IntersegmentIndirectAddressing)

程序轉(zhuǎn)移的有效地址是一個(gè)存儲(chǔ)單元中連續(xù)4個(gè)字節(jié)的內(nèi)容。這個(gè)存儲(chǔ)單元的內(nèi)容可以用數(shù)據(jù)尋址方式中除立即數(shù)和寄存器方式以外的任何一種尋址方式獲得,將所尋址的存儲(chǔ)單元前2個(gè)字節(jié)內(nèi)容送IP,后2個(gè)字節(jié)內(nèi)容送CS。指令的匯編語(yǔ)言格式為

JMPDWORDPTR存儲(chǔ)單元3.2.2程序轉(zhuǎn)移地址尋址方式JMPDWORDPTR[BX]

如果(BX)?=?1034H,且從1034H開(kāi)始的連續(xù)4個(gè)存儲(chǔ)單元內(nèi)容分別為12H、34H、56H、78H,則指令執(zhí)行后(IP)=1234H,(CS)=5678H。

3.2.2程序轉(zhuǎn)移地址尋址方式3.38086指令系統(tǒng)指令系統(tǒng)是指微處理器所能執(zhí)行全部指令的集合。不同微處理器具有不同的指令系統(tǒng),這在微處理器設(shè)計(jì)時(shí)就已決定了。80X86系列的CPU中,其指令系統(tǒng)的機(jī)器代碼是完全向上兼容的。80X86指令系統(tǒng)按功能可分為以下9類(lèi):

(1)數(shù)據(jù)傳送類(lèi)指令;

(2)算術(shù)運(yùn)算類(lèi)指令;

(3)邏輯運(yùn)算和移位類(lèi)指令;

(4)位操作指令;

(5)串操作指令;

(6)控制轉(zhuǎn)移類(lèi)指令;

(7)處理器控制指令;

(8)高級(jí)語(yǔ)言類(lèi)指令;

(9)操作系統(tǒng)型指令。3.38086指令系統(tǒng)常用到的一些符號(hào)所表示的含義。src

源操作數(shù)dst

目的操作數(shù)data

立即數(shù)disp

8位或16位位移量[]

存儲(chǔ)單元的內(nèi)容mem

存儲(chǔ)器操作數(shù)opr

表示操作數(shù)reg

寄存器count

移位次數(shù),可以是1或CL3.38086指令系統(tǒng)3.3.1數(shù)據(jù)傳送類(lèi)指令數(shù)據(jù)傳送類(lèi)指令用于實(shí)現(xiàn)立即數(shù)到寄存器或存儲(chǔ)器、CPU內(nèi)部寄存器之間、寄存器與存儲(chǔ)器之間、累加器與I/O口之間的數(shù)據(jù)傳送。除標(biāo)志位傳送指令之外,數(shù)據(jù)傳送類(lèi)指令不會(huì)影響標(biāo)志寄存器中的標(biāo)志位。這類(lèi)指令又分為通用數(shù)據(jù)傳送、地址傳送、標(biāo)志傳送和輸入輸出等4組指令。1.通用數(shù)據(jù)傳送指令

通用數(shù)據(jù)傳送指令包括最基本的傳送指令、堆棧指令、數(shù)據(jù)交換指令、換碼指令。(1)數(shù)據(jù)傳送指令

基本的傳送指令包括MOV、MOVSX、MOVZX。其中MOVSX、MOVZX僅在386及其后繼機(jī)型中可用。3.3.1數(shù)據(jù)傳送類(lèi)指令

●傳送指令(move)——MOV

指令格式:MOVDST,SRC

指令功能:將源操作數(shù)SRC的內(nèi)容傳送到目的操作數(shù)DST所指單元,完成字節(jié)、字或雙字傳送。源操作數(shù)可以是通用寄存器(REGn)、段寄存器(SEG)、立即數(shù)(DATAn)和存儲(chǔ)單元(MEMn)。目的操作數(shù)可以是REGn、SEG和MEMn。存儲(chǔ)單元可通過(guò)數(shù)據(jù)尋址的各種尋址方式尋址。3.3.1數(shù)據(jù)傳送類(lèi)指令在使用MOV指令時(shí)應(yīng)注意以下幾點(diǎn):

(1)目的操作數(shù)不得為立即數(shù)。如:MOV12H,BL為非法指令。

(2)不影響標(biāo)志位。

(3)操作數(shù)類(lèi)型必須一致。如:MOVAX,BL為非法指令,應(yīng)為MOVAL,BL。

(4)源操作數(shù)為非立即數(shù)時(shí),兩操作數(shù)之一必為寄存器。如:MOV[DX],[SI]為非法指令,不能在兩個(gè)存儲(chǔ)單元之間進(jìn)行數(shù)據(jù)傳送。

3.3.1數(shù)據(jù)傳送類(lèi)指令

(5)目的操作數(shù)為段寄存器(CS和IP或EIP不能作為目的寄存器),源操作數(shù)不得為立即數(shù)。

(6)不能在段寄存器之間進(jìn)行直接數(shù)據(jù)傳送。如:MOVDS,ES為非法指令。3.3.1數(shù)據(jù)傳送類(lèi)指令幾個(gè)不能傳送操作的解決辦法是通過(guò)AX作橋梁。

存儲(chǔ)器←存儲(chǔ)器:

MOVAX,MEM1

MOVMEM2,AX

段寄存器←段寄存器:

MOVAX,SEG1

MOVSEG2,AX

段寄存器←立即數(shù):

MOVAX,DATA

MOVSEG,AX3.3.1數(shù)據(jù)傳送類(lèi)指令(2)堆棧操作指令

堆棧指令包括壓棧PUSH和出棧POP指令。堆棧是按“后進(jìn)先出(LIFO)”方式工作的存儲(chǔ)區(qū)域。規(guī)定由SS指示堆棧段的段基址,堆棧指針(E)SP始終指向堆棧的頂部,(E)SP的初值規(guī)定了所用堆棧區(qū)的大小。堆棧的最高地址叫棧底。進(jìn)棧方向是由高地址向低地址發(fā)展。3.3.1數(shù)據(jù)傳送類(lèi)指令①壓入堆棧指令指令格式:PUSHsrc指令功能:SP←SP-2,((SP)+1,(SP))←(src)。指令中的操作數(shù)可以是通用寄存器、段寄存器、存儲(chǔ)器,但不能是立即數(shù)。例如:

PUSHAX;SP←SP-2,(SP)+1←(AH),

(SP)←(AL)3.3.1數(shù)據(jù)傳送類(lèi)指令②彈出堆棧指令指令格式:POPdst指令功能:dst←((SP)+1,(SP)),SP←(SP)+2。操作數(shù)可以是通用寄存器、存儲(chǔ)器、段寄存器(但不能是CS),同樣,不能是立即數(shù)。

POPBX;BH←((SP)+1),BL←((SP)),

SP←(SP)+2

注意,堆棧指令中操作數(shù)一定是16位操作數(shù)。3.3.1數(shù)據(jù)傳送類(lèi)指令【例】PUSHAX

如果(AX)?=?1234H,(SP)?=?0100H,則指令執(zhí)行后,(SP)?=?00FEH。3.3.1數(shù)據(jù)傳送類(lèi)指令【例】POPAX

3.3.1數(shù)據(jù)傳送類(lèi)指令【例】如果將AX,BX兩個(gè)寄存器的內(nèi)容互換,則可執(zhí)行下列程序段實(shí)現(xiàn)。

PUSH AX

PUSH BX

POPAX

POP BX

3.3.1數(shù)據(jù)傳送類(lèi)指令(3)數(shù)據(jù)交換指令

指令格式:XCHGDST,SRC

指令功能:將兩個(gè)操作數(shù)的內(nèi)容相互交換。兩操作數(shù)之一必為寄存器,操作數(shù)不能為立即數(shù)。兩個(gè)操作數(shù)可以同時(shí)為寄存器,但不允許同時(shí)都為段寄存器。該指令執(zhí)行后不影響標(biāo)志位。例如:

XCHGAH,BL

XCHGES,AX

XCHGEAX,ARRAY[4*EBX]3.3.1數(shù)據(jù)傳送類(lèi)指令(4)

換碼指令

指令格式:XLAT

指令功能:用查表方式將一種代碼轉(zhuǎn)換成另一種代碼。如將字符的掃描碼轉(zhuǎn)換為ASCII碼。該類(lèi)指令是隱含尋址。規(guī)定BX指向存放在內(nèi)存表格的首地址,AL為表格中某一元素與表格首地址之間的偏移量,表格中的內(nèi)容即為要替換的代碼,指令執(zhí)行后在AL中得到轉(zhuǎn)換后的代碼。3.3.1數(shù)據(jù)傳送類(lèi)指令

例3-1有一個(gè)表存放數(shù)字0~9的ASCII碼,其表首地址是0100H,找出7的ASCII碼。

MOVBX,0100H;0100→BXMOVAL,7;7→ALXLAT;[BX+AL]→AL3.3.1數(shù)據(jù)傳送類(lèi)指令2.地址傳送指令

1)有效地址傳送指令——LEA(loadeffectiveaddress)

指令格式:LEAREG,SRC ;(REG)←SRC

指令功能:將源操作數(shù)的有效地址EA傳送到指定寄存器中。源操作數(shù)的尋址方式只能是存儲(chǔ)器尋址方式(即不允許是立即數(shù)和寄存器尋址方式),目的操作數(shù)的寄存器可使用16位或32位寄存器,但不能為段寄存器。3.3.1數(shù)據(jù)傳送類(lèi)指令【例】比較以下兩條指令的執(zhí)行結(jié)果。

LEABX,[DI]

MOV?BX,[DI]

3.3.1數(shù)據(jù)傳送類(lèi)指令2)指針傳送指令LDS(loadDSwithpointer)

指令格式:LDSREG,MEM

;(REG)←(MEM),(DS)←(MEM+2)

指令功能:?將源操作數(shù)MEM所指定存儲(chǔ)單元中連續(xù)4個(gè)單元的前兩個(gè)單元的內(nèi)容作為有效地址存入指令指定的16位寄存器(REG)中,后兩個(gè)單元的內(nèi)容裝入指令指定的段寄存器(DS)中.

3.3.1數(shù)據(jù)傳送類(lèi)指令

【例】LDSBX,TABLE[SI]

如果指令執(zhí)行前,TABLE?=?0200H,(SI)?=?0008H,(DS)?=?0000H,則EA=?TABLE?+?(SI)?=0200H?+?0008H?=?0208H。指令執(zhí)行后,(DS)?=?1000H,(BX)?=?1234H3.3.1數(shù)據(jù)傳送類(lèi)指令

3)地址指針裝入ES指令指令格式:LESreg,mere

指令功能:與LDS指令功能類(lèi)似,只是把DS換成ES。操作時(shí)將段地址傳送到ES段寄存器。需要注意的是,LDS、LES兩條指令都是傳送一個(gè)目的地址指針,包括一個(gè)偏移地址和一個(gè)段地址,共32位數(shù)據(jù)。3.3.1數(shù)據(jù)傳送類(lèi)指令3.標(biāo)志傳送指令

1)?標(biāo)志送AH(loadAHwithflags)——LAHF

指令格式:LAHF ;(AH)←(FLAGS的低字節(jié))

指令功能:將標(biāo)志寄存器FLAGS的低8位中5個(gè)狀態(tài)標(biāo)志位(不包括OF)分別傳送到AH的對(duì)應(yīng)位,如圖所示。該指令的執(zhí)行不影響標(biāo)志位。2)?AH送標(biāo)志寄存器(storeAHintoflags)SAHF

指令格式:SAHF

;(FLAGS的低字節(jié))←(AH)

指令功能:SAHF指令與LAHF指令 功能相反,即將AH中相應(yīng)位(D7、D6、D4、D2、D0)的狀態(tài)分別傳送到標(biāo)志寄存器FLAGS的對(duì)應(yīng)位(SF、ZF、AF、PF、CF),而FLAGS其他位不受影響。3.3.1數(shù)據(jù)傳送類(lèi)指令3)標(biāo)志進(jìn)出棧指令

PUSHF(pushtheflags);

POPF(poptheflags)

指令功能:將FLAGS標(biāo)志寄存器中內(nèi)容壓入堆棧/從堆棧中彈出字FLAGS標(biāo)志寄存器中。3.3.1數(shù)據(jù)傳送類(lèi)指令3.3.2算術(shù)運(yùn)算類(lèi)指令

80X86提供了加、減、乘、除等各類(lèi)算術(shù)運(yùn)算指令,這些指令可處理4種類(lèi)型的數(shù)據(jù):有符號(hào)的二進(jìn)制數(shù)、無(wú)符號(hào)的二進(jìn)制數(shù)、無(wú)符號(hào)的壓縮十進(jìn)制數(shù)(壓縮BCD碼)和無(wú)符號(hào)非壓縮十進(jìn)制數(shù)(非壓縮BCD碼)。壓縮型BCD碼一個(gè)字節(jié)表示兩位BCD碼。非壓縮型BCD碼一個(gè)字節(jié)表示一位BCD碼,有效位在低4位,高4位為零

1.加減法指令

不帶進(jìn)(借)位的加減法指令A(yù)DD、SUB;帶進(jìn)(借)位的加減法指令A(yù)DC、SUB;增減量指令I(lǐng)NC、DEC;特殊減法指令即求補(bǔ)指令NEG、比較指令CMP。3.3.2算術(shù)運(yùn)算類(lèi)指令1)?ADD/SUB——加/減法指令

(addition/subtraction)

指令格式:ADDDST,SRC ;

SUBDST,SRC

指令功能:ADD指令將目的操作數(shù)與源操作數(shù)相加之和送到目的操作數(shù)所指單元中。SUB指令將目的操作數(shù)與源操作數(shù)相減之差送到目的操作數(shù)所指單元中。指令會(huì)影響SF、ZF、CF、AF、PF和OF等6個(gè)標(biāo)志位。3.3.2算術(shù)運(yùn)算類(lèi)指令

指令中源操作數(shù)可以是通用寄存器REGn、立即數(shù)DATAn和存儲(chǔ)單元MEMn。目的操作數(shù)可以是REGn和MEMn。源操作數(shù)和目的操作數(shù)都不能是段寄存器,目的操作數(shù)不得為立即數(shù)。存儲(chǔ)單元可通過(guò)數(shù)據(jù)尋址的各種尋址方式尋址。使用加、減法指令時(shí),應(yīng)注意源操作數(shù)為非立即數(shù)時(shí),兩操作數(shù)之一必為寄存器,兩存儲(chǔ)單元之間不能進(jìn)行加、減法運(yùn)算。兩操作數(shù)類(lèi)型必須一致,可以同時(shí)為字節(jié)、字或雙字。3.3.2算術(shù)運(yùn)算類(lèi)指令例如:

ADDAX,DI ;(AX)←(AX)?+?(DI)

SUBBL,5FH ;(BL)←(BL)?-?(5FH)

下邊3條指令是非法的

ADDDS,BX ;操作數(shù)不允許為段寄存器

SUB[DI],[BP]

;不允許兩操作數(shù)都為存儲(chǔ)單元

ADD34H,EAX ;目的操作數(shù)不能為立即數(shù)3.3.2算術(shù)運(yùn)算類(lèi)指令2)?ADC/SBB——帶進(jìn)/借位加/減法指令(additionwithcarry/subtractionwithcarry)

指令格式:ADCDST,SRC ;

SBBDST,SRC

指令功能:將進(jìn)/借位標(biāo)志位的值(CF)一起與操作數(shù)相加/減。該組指令主要針對(duì)出現(xiàn)在8086中超過(guò)16位的數(shù)據(jù)進(jìn)行多字節(jié)加/減法的運(yùn)算中,其中CF的當(dāng)前值是由程序中本指令之前的指令產(chǎn)生的。其他規(guī)定均與ADD/SUB指令相同。3.3.2算術(shù)運(yùn)算類(lèi)指令

3)?INC/DEC——增減量指令

(increment/decrement)

指令格式:INC DST ;DECDST

指令功能:INC/DEC將目的操作數(shù)的內(nèi)容加/減1。用于循環(huán)程序中指針修改。該組指令影響OF、SF、ZF、AF、DF標(biāo)志位,但不影響CF位。目的操作數(shù)可以是REGn和MEMn。目的操作數(shù)不能是段寄存器,不得為立即數(shù)。3.3.2算術(shù)運(yùn)算類(lèi)指令4)求補(bǔ)指令(negate)——NEG

指令格式:NEG DST

指令功能:對(duì)一個(gè)操作數(shù)取補(bǔ)碼,即相當(dāng)于用0減去目的操作數(shù),并將結(jié)果送回到目的操作數(shù)。可利用NEG指令得到補(bǔ)碼表示的負(fù)數(shù)的絕對(duì)值。

3.3.2算術(shù)運(yùn)算類(lèi)指令

5)比較指令(compare)——CMP

指令格式:CMP DST ,SRC

指令功能:將兩個(gè)操作數(shù)相減,但不將結(jié)果送回到目的操作數(shù),兩個(gè)操作數(shù)的內(nèi)容均不變,僅根據(jù)結(jié)果影響標(biāo)志位,CMP指令對(duì)標(biāo)志位的影響與SUB相同。目標(biāo)操作數(shù)可以是寄存器或存儲(chǔ)器,源操作數(shù)可以是立即數(shù)、寄存器或存儲(chǔ)器,既可以進(jìn)行字節(jié)比較,也可以進(jìn)行字比較。一般情況下,該指令后面都會(huì)有一條條件轉(zhuǎn)移指令,用來(lái)檢查標(biāo)志位的狀態(tài)是否滿足某種關(guān)系。3.3.2算術(shù)運(yùn)算類(lèi)指令

比較指令后面常常會(huì)跟一個(gè)跳轉(zhuǎn)指令,以檢測(cè)標(biāo)志位,控制程序的走向。CMP指令執(zhí)行后可根據(jù)標(biāo)志位判斷比較結(jié)果。

(1)根據(jù)ZF判斷兩個(gè)數(shù)是否相等。若ZF?=?1,則兩數(shù)相等。

(2)若兩個(gè)數(shù)不相等,則分兩種情況考慮:

①比較的是兩個(gè)無(wú)符號(hào)數(shù):

若CF?=?0,則(DST)≥(SRC);

若CF?=?1,則(DST)<(SRC)。

②比較的是兩個(gè)有符號(hào)數(shù):

若OF⊕SF?=?0,則(DST)>(SRC);

若OF⊕SF?=?1,則(DST)<(SRC)。3.3.2算術(shù)運(yùn)算類(lèi)指令2.乘法指令

乘法指令有單操作數(shù)的無(wú)符號(hào)數(shù)乘法指令MUL和有符號(hào)數(shù)乘法指令I(lǐng)MUL指令。386及其后繼機(jī)型中還增加了雙操作數(shù)和三操作數(shù)有符號(hào)數(shù)乘法指令I(lǐng)MUL指令。3.3.2算術(shù)運(yùn)算類(lèi)指令1)無(wú)符號(hào)數(shù)乘法指令(multiple)——MUL

指令格式:MULSRC

指令功能:將目的操作數(shù)乘以源操作數(shù),結(jié)果存放到目的操作數(shù)中。目的操作數(shù)是隱含尋址,必須為累加器。源操作數(shù)用于存放乘數(shù),可以是寄存器或存儲(chǔ)器中的數(shù)據(jù),但不允許為立即數(shù)。乘法指令執(zhí)行完后的結(jié)果總是一個(gè)兩倍于原數(shù)據(jù)大小的數(shù)據(jù)。當(dāng)兩個(gè)8位數(shù)相乘時(shí),16位乘積存放在AX中;當(dāng)兩個(gè)16位數(shù)相乘時(shí),32位乘積存放在DX:AX中,其中高位字存放在DX中,低位字存放在AX中。3.3.2算術(shù)運(yùn)算類(lèi)指令

當(dāng)乘法指令執(zhí)行完后,一些標(biāo)志位(CF和OF)會(huì)改變,產(chǎn)生預(yù)期的結(jié)果。其他的標(biāo)志位也會(huì)改變,不過(guò)它們的結(jié)果是無(wú)法預(yù)知的,因而不能被利用。CF、OF表示乘積值的范圍。對(duì)于無(wú)符號(hào)數(shù),若CF?=?OF?=?0,則表示AH(字節(jié)乘)/DX(字乘)乘積值高位為零。3.3.2算術(shù)運(yùn)算類(lèi)指令

2)有符號(hào)數(shù)乘法指令(signedmultiple)——IMUL

指令格式:IMULSRC

指令功能:與MUL相同,只是必須是有符號(hào)數(shù)。對(duì)于有符號(hào)數(shù),IMUL執(zhí)行后,CF?=?OF?=?0,AH(字節(jié)乘)/DX(字乘)乘積值高位為符號(hào)擴(kuò)展。若CF?=?OF?=?1,則積的高位存在其有效值。3.3.2算術(shù)運(yùn)算類(lèi)指令3.除法指令

除法指令有無(wú)符號(hào)數(shù)除法指令DIV和有符號(hào)數(shù)除法指令I(lǐng)DIV。和乘法一樣,除法指令的操作數(shù)類(lèi)型可以是字節(jié)或字者。被除數(shù)的字長(zhǎng)常常是兩倍于除數(shù)字長(zhǎng)的數(shù)據(jù)??梢杂梅?hào)擴(kuò)展的方法獲得除法指令所需要的被除數(shù)格式。對(duì)于除法來(lái)講,全部標(biāo)志無(wú)意義。溢出處理不是使OF為1,而是當(dāng)除數(shù)為0時(shí)產(chǎn)生0號(hào)中斷。3.3.2算術(shù)運(yùn)算類(lèi)指令1)無(wú)符號(hào)數(shù)除法指令(divide)——DIV

指令格式:DIVSRC

指令功能:完成兩個(gè)不帶符號(hào)的8位/16位二進(jìn)制數(shù)的除法運(yùn)算。將AX(16位)中或DX和AX(32位)中的內(nèi)容,除以在指定的寄存器或存儲(chǔ)單元中的內(nèi)容,對(duì)于字節(jié)除法,所得的商存于AL,余數(shù)存于AH;對(duì)于字除法,所得的商存于AX,余數(shù)存于DX。3.3.2算術(shù)運(yùn)算類(lèi)指令2)有符號(hào)數(shù)除法指令(signeddivide)——IDIV

指令格式:IDIVSRC

指令功能:有符號(hào)除法指令與無(wú)符號(hào)除法指令相同,只是操作數(shù)必須為有符號(hào)數(shù),商和余數(shù)也必須是有符號(hào)數(shù),且余數(shù)符號(hào)與被除數(shù)符號(hào)相同。

有符號(hào)除法指令運(yùn)算時(shí)先將數(shù)變?yōu)樵a,并去掉符號(hào)位,然后再兩數(shù)(絕對(duì)值)相除,其結(jié)果的符號(hào)按兩數(shù)符號(hào)位異或運(yùn)算規(guī)則確定。如果符號(hào)位為1(負(fù)數(shù)),則再取補(bǔ)碼。此過(guò)程由計(jì)算機(jī)執(zhí)行指令時(shí)自動(dòng)完成。3.3.2算術(shù)運(yùn)算類(lèi)指令4.BCD碼(十進(jìn)制)調(diào)整指令

如何方便地將二進(jìn)制數(shù)轉(zhuǎn)換為人們?nèi)粘I钪辛?xí)慣使用的十進(jìn)制數(shù)呢?80X86指令系統(tǒng)專(zhuān)門(mén)提供了一組相應(yīng)的十進(jìn)制調(diào)整指令:DAA、DAS、AAA、AAS、AAM和AAD。該類(lèi)指令都是隱含尋址,BCD碼總是作為無(wú)符號(hào)數(shù)看待的。學(xué)習(xí)該類(lèi)指令時(shí)應(yīng)重點(diǎn)理解并掌握它們的用途,即指令執(zhí)行后的結(jié)果。指令操作過(guò)程是計(jì)算機(jī)自動(dòng)完成的,只需了解即可。3.3.2算術(shù)運(yùn)算類(lèi)指令1)壓縮BCD碼調(diào)整指令●加法的十進(jìn)制調(diào)整指令(decimaladjustforaddition)——DAA

指令格式:DAA

指令功能:該指令之前必須先執(zhí)行ADD或ADC指令,加法指令將兩個(gè)壓縮的BCD碼相加,并將結(jié)果存放在AL寄存器中,而后DAA將AL中的和調(diào)整到壓縮的BCD格式。

3.3.2算術(shù)運(yùn)算類(lèi)指令執(zhí)行指令時(shí)CPU對(duì)AL中高4位、低4位進(jìn)行檢測(cè),判斷是否為有效的BCD碼。如果AL中低4位大于9或AF?=?1,則將AL寄存器的內(nèi)容加06H,并將AF置1;如果AL中高4位大于9或CF?=?1,則將AL寄存器的內(nèi)容加60H,并將CF置1;如果AL中高低4位均大于9,則將AL寄存器的內(nèi)容加66H。

3.3.2算術(shù)運(yùn)算類(lèi)指令

0100100048H

MOVAL,48H+0111010074H

MOVBL,74H10111100BCH

ADDAL,BL+0110011066H

DAA

100100010

122H

最后結(jié)果為:

(AL)=22H,CF=1,AF=1●減法的十進(jìn)制調(diào)整指令(decimaladjustforsubtraction)——DAS

指令格式:DAS

指令功能:該指令之前必須先執(zhí)行SUB或SBB指令,減法指令將兩個(gè)壓縮的BCD碼相減,并將結(jié)果存放在AL寄存器中,而后DAS將AL中的差調(diào)整到壓縮的BCD格式。

3.3.2算術(shù)運(yùn)算類(lèi)指令

執(zhí)行指令時(shí),CPU對(duì)AL中高4位、低4位進(jìn)行檢測(cè),判斷是否為有效的BCD碼。如果AL中低4位大于9或AF=1,則將AL寄存器的內(nèi)容減去06H,并將AF置1;如果AL中高4位大于9或CF=1,則將AL寄存器的內(nèi)容減去60H,并將CF置1;如果AL中高低4位均大于9,則將AL寄存器的內(nèi)容減去66H3.3.2算術(shù)運(yùn)算類(lèi)指令2)非壓縮BCD碼調(diào)整指令●加法的ASCII碼調(diào)整指令(ASCIIadjustforaddition)—AAA

指令格式:AAA

指令功能:將兩個(gè)ASCII碼或非壓縮BCD碼相加之和存放在AL中,而后進(jìn)行調(diào)整,形成一個(gè)擴(kuò)展的非壓縮BCD碼,調(diào)整后的結(jié)果低位在AL中,高位在AH中。

執(zhí)行指令時(shí),CPU對(duì)AL中的低4位進(jìn)行檢測(cè)。如果AL中低4位大于9或AF?=?1,則將AL寄存器的內(nèi)容加6,AH寄存器的內(nèi)容加1,并將AF置1,同時(shí)將AL中的高4位清零,CF置1。3.3.2算術(shù)運(yùn)算類(lèi)指令●減法的ASCII碼調(diào)整指令(ASCIIadjustforsubtraction)——AAS

指令格式:AAS

指令功能:將兩個(gè)ASCII碼或非壓縮BCD碼相減之差存放在AL中,而后進(jìn)行調(diào)整,形成一個(gè)擴(kuò)展的非壓縮BCD碼,調(diào)整后的結(jié)果低位在AL中,高位在AH中。

執(zhí)行指令時(shí),CPU對(duì)AL中的低4位進(jìn)行檢測(cè)。如果AL中低4位大于9或AF?=?1,則將AL寄存器的內(nèi)容減去06H,AL寄存器的內(nèi)容減去01H,并將AF置1,同時(shí)將AL中的高4位清零,CF置1。3.3.2算術(shù)運(yùn)算類(lèi)指令●?BCD碼乘法調(diào)整指令(ASCIIadjustformultiplication)——AAM

指令格式:AAM

指令功能:將存放在AL寄存器中兩個(gè)一位非壓縮BCD碼相乘之積調(diào)整為非壓縮BCD碼。3.3.2算術(shù)運(yùn)算類(lèi)指令

●?BCD碼除法調(diào)整指令

(ASCIIadjustfordivision)——AAD

指令格式:AAD

指令功能:將AX中存放的兩位非壓縮BCD碼調(diào)整為二進(jìn)制數(shù)。3.3.2算術(shù)運(yùn)算類(lèi)指令5.符號(hào)擴(kuò)展指令

80X86指令系統(tǒng)提供了一組符號(hào)擴(kuò)展指令:CBW、CWD、CWDE和CDQ。該類(lèi)指令都是隱含尋址,常用于除法運(yùn)算,指令執(zhí)行后不影響標(biāo)志位。其中CWDE和CDQ用于80386及其后繼機(jī)型中。3.3.2算術(shù)運(yùn)算類(lèi)指令

1)字節(jié)轉(zhuǎn)換為字指令

(convertbytetoword)——CBW

指令格式:CBW

指令功能:將AL中的8位數(shù)符號(hào)擴(kuò)展為16位數(shù),形成AX中的字。3.3.2算術(shù)運(yùn)算類(lèi)指令

2)字轉(zhuǎn)換為雙字指令

(convertwordtodoubleword)——CWD

指令格式:CWD

指令功能:將AX中的16位數(shù)符號(hào)擴(kuò)展為32位數(shù),形成DX:AX中的雙字。

3.3.2算術(shù)運(yùn)算類(lèi)指令3.3.3邏輯運(yùn)算和移位類(lèi)指令

1.邏輯運(yùn)算指令

邏輯運(yùn)算指令包括AND(與)、OR(或)、NOT(非)、XOR(異或)和TEST(測(cè)試)等指令??梢詫?duì)8位、16位操作數(shù)進(jìn)行邏輯運(yùn)算,除NOT不影響標(biāo)志位外,其余指令將使CF=OF=0,影響SF、ZF、PF。

1)邏輯與指令——AND

指令格式:AND

DSTSRC;(DST)←(DST)∧(SRC)

指令功能:將目的操作數(shù)與源操作數(shù)按位相與,結(jié)果送目的操作數(shù);該指令可用來(lái)使操作數(shù)的某些位被屏蔽。3.3.3邏輯運(yùn)算和移位類(lèi)指令

2)邏輯或指令(or)——OR

指令格式:ORDST,SRC

;(DST)←(DST)∨(SRC)

指令功能:將目的操作數(shù)與源操作數(shù)按位相或,結(jié)果送目的操作數(shù);該指令可用來(lái)使操作數(shù)某些位置1。

3)邏輯非指令(not)——NOT

指令格式:NOTDST

指令功能:將目的操作數(shù)按位取反;該指令常用來(lái)將某個(gè)數(shù)據(jù)取成反碼。3.3.3邏輯運(yùn)算和移位類(lèi)指令

4)異或指令(exclusiveor)——XOR

指令格式:XORDST,SRC

指令功能:將目的操作數(shù)與源操作數(shù)按位相異或,結(jié)果送目的操作數(shù);該指令可用來(lái)使操作數(shù)某些位變反。

5)測(cè)試指令(test)——TEST

指令格式:TESTDST,SRC

指令功能:將目的操作數(shù)與源操作數(shù)按位相與,只影響標(biāo)志位,但結(jié)果不保存;該指令可用來(lái)屏蔽某些位,或使某些位置1或測(cè)試某些位等。

3.3.3邏輯運(yùn)算和移位類(lèi)指令

XORAX,AX

;清零AX,CF

ANDAL,0FH

;屏蔽高4位,保留低4位,

TESTAL,01H

;測(cè)AL最低位

ORAL,0FH

;保留高4位,使低4位置1,3.3.3邏輯運(yùn)算和移位類(lèi)指令2.移位指令邏輯左移指令

SHL邏輯右移指令

SHR算術(shù)左移指令

SAL算術(shù)左移指令

SAR不帶進(jìn)位循環(huán)左移指令

ROL不帶進(jìn)位循環(huán)右移指令

ROR帶進(jìn)位循環(huán)左移指令

RCL帶進(jìn)位循環(huán)右移指令

RCR

S:ShiftR:RotateL:LeftR:RightA:ArithmeticC:Carryflag3.3.3邏輯運(yùn)算和移位類(lèi)指令

1)算術(shù)移位和邏輯移位

算術(shù)移動(dòng)N位,相當(dāng)于把二進(jìn)制數(shù)乘以或除以2N,把操作數(shù)看做有符號(hào)數(shù);邏輯移位操作則用于截取字節(jié)或字中的若干位,把操作數(shù)看做無(wú)符號(hào)數(shù)。所有的移位指令在移位時(shí),都會(huì)影響標(biāo)志位CF、OF、PF、SF和ZF。3.3.3邏輯運(yùn)算和移位類(lèi)指令

①算術(shù)/邏輯左移指令

(shiftarithmetic/logicalleft)——SAL/SHL

指令格式:SAL/SHLDST,CNT

指令功能:按照CNT規(guī)定的移位次數(shù),對(duì)目的操作數(shù)DST進(jìn)行左移,每移一次,最高位MSB移入CF,而最低位LSB補(bǔ)0。移位位數(shù)CNT放在CL寄存器中,如果只移1位,也可以直接寫(xiě)在指令中。CFDST03.3.3邏輯運(yùn)算和移位類(lèi)指令CFDST0

②邏輯右移指令(shiftlogicalright)——SHR

指令格式:SARDST,CNT

指令功能:按照CNT規(guī)定的移位次數(shù),對(duì)目的操作數(shù)DST進(jìn)行右移,每移一次,最高位MSB補(bǔ)0,最低位LSB移入CF。3.3.3邏輯運(yùn)算和移位類(lèi)指令

③算術(shù)右移指令(shiftarithmeticright)——SAR

指令格式:SARDST,CNT

指令功能:按照CNT規(guī)定的移位次數(shù),對(duì)目的操作數(shù)DST進(jìn)行右移,每移一次,最高位MSB(符號(hào)位)保持不變,最低位LSB移入CF。CFDST3.3.3邏輯運(yùn)算和移位類(lèi)指令

【例】設(shè)一個(gè)字節(jié)數(shù)據(jù)X存放在AL寄存器中,完成(AL)?×?10的功能,即10X。可用移位實(shí)現(xiàn)乘10操作,因?yàn)?0?=?8?+?2?=?23?+?21

XOR AH,AH

SAL AX,1 ;2X

MOV BX,AX

MOV CL,2

SAL AX,CL ;8X

ADD AX,BX ;8X+2X=10X3.3.3邏輯運(yùn)算和移位類(lèi)指令

3)循環(huán)移位指令

循環(huán)移位指令在移位時(shí)移出的目的操作數(shù)并不丟失,而循環(huán)送回目的操作數(shù)的另一端。循環(huán)移位指令僅影響CF和OF。3.3.3邏輯運(yùn)算和移位類(lèi)指令

①循環(huán)左移指令(rotateleft)——ROL

指令格式:ROLDST,CNT

指令功能:目的操作數(shù)每向左移位一次,其最高位MSB移入最低位LSB,MSB同時(shí)也移入CF。CFDST3.3.3邏輯運(yùn)算和移位類(lèi)指令

②循環(huán)右移指令(rotateright)——ROR

指令格式:RORDST,CNT

指令功能:目的操作數(shù)每向右移位一次,其最低位LSB移入最高位MSB,LSB同時(shí)也移入CF。CFDST3.3.3邏輯運(yùn)算和移位類(lèi)指令

③帶進(jìn)位循環(huán)左移指令

(rotateleftthroughcarry)——RCL

指令格式:RCLDST,CNT

指令功能:目的操作數(shù)每向左移位一次,其最高位MSB移入CF,CF移入最低位LSB。CFDST3.3.3邏輯運(yùn)算和移位類(lèi)指令

④帶進(jìn)位循環(huán)右移指令

(rotaterightthroughcarry)——RCR

指令格式:RCRDST,CNT

指令功能:目的操作數(shù)每向右移位一次,其最低位LSB移入CF,CF移入最高位MSB。CFDST3.3.3邏輯運(yùn)算和移位類(lèi)指令【例】將BX的高8位與低8位互換。

MOVBX,1234H ;(BX)=1234H

MOVCL,8

ROLBX,CL ;(BX)=3412H3.3.3邏輯運(yùn)算和移位類(lèi)指令

串操作指令就是對(duì)一個(gè)字符串進(jìn)行操作、處理。字符串可以是字串或字節(jié)串。字串操作允許對(duì)連續(xù)存放在存儲(chǔ)器中大的數(shù)據(jù)塊進(jìn)行操作。80X86通過(guò)加重復(fù)前綴來(lái)實(shí)現(xiàn)串操作。所有串操作指令都用寄存器SI對(duì)源操作數(shù)進(jìn)行間接尋址,并且默認(rèn)是在DS段中;用DI為目的操作數(shù)進(jìn)行間接尋址,并且默認(rèn)是在ES段中。串操作指令是唯一的一組源操作數(shù)和目的操作數(shù)都在存儲(chǔ)器中的指令。

3.3.4串操作類(lèi)指令

串操作時(shí),地址的修改往往與方向標(biāo)志DF有關(guān),當(dāng)DF=1時(shí),SI和DI作自動(dòng)減量修改;當(dāng)DF=0時(shí),SI和DI作自動(dòng)增量修改。一條帶重復(fù)前綴的串操作指令的執(zhí)行過(guò)程往往相當(dāng)于執(zhí)行一個(gè)循環(huán)程序。在每次重復(fù)之后,都會(huì)修改地址指針SI和DI,要用CX寄存器作為重復(fù)次數(shù)計(jì)數(shù)器,指令每執(zhí)行一次,CX的內(nèi)容減1,直到其值減為0。3.3.4串操作類(lèi)指令

1.重復(fù)前綴指令

重復(fù)前綴指令控制其后的串指令重復(fù)執(zhí)行。

1)重復(fù)前綴指令(repeat)——REP

功能:重復(fù)其后指令串的操作直至(CX)?=?0;用于串傳送、串裝入、串存儲(chǔ)指令前。

(1)判條件,若(CX)?=?0,則退出REP,否則往下執(zhí)行;

(2)?(CX)←(CX)-1;

(3)執(zhí)行其后串指令;

(4)重復(fù)(1)~(3)。3.3.4串操作類(lèi)指令

2)相等/為零則重復(fù)前綴指令

(repeatwhileequal/zero)——REPE/REPZ

功能:相等/為零則重復(fù)串操作;用于串比較、串掃描指令前。

操作:與REP類(lèi)同,區(qū)別在于判斷條件,當(dāng)(CX)?≠?0且ZF?=?1時(shí),重復(fù)執(zhí)行。

3)不相等/不為零則重復(fù)前綴指令

(repeatwhilenotequal/notzero)——REPNE/REPNZ

功能:不相等/不為零則重復(fù)串操作;用于串比較、串掃描指令前。

操作:與REP類(lèi)同,區(qū)別在于判斷條件,當(dāng)(CX)≠0且ZF=0時(shí),重復(fù)執(zhí)行。3.3.4串操作類(lèi)指令2.串操作指令1)串傳送指令(movestring)——MOVS指令格式:MOVS DST,SRC

MOVSB(字節(jié));

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

(SI)←(SI)±1,(DI)←(DI)±1

MOVSW(字);((ES):(DI))←((DS):(SI)),

(SI)←(SI)±2,(DI)←(DI)±2

3.3.4串操作類(lèi)指令執(zhí)行串指令之前,應(yīng)先進(jìn)行如下設(shè)置:

(1)源串首地址(末地址)→SI;

(2)目的串首地址(末地址)→DI;

(3)串長(zhǎng)度→CX;

(4)建立方向標(biāo)志(CLD使DF?=?0,STD使DF?=?1)。串操作指令前面可加重復(fù)前綴完成串傳送功能。3.3.4串操作類(lèi)指令

【例】將DS:0100H地址開(kāi)始的50個(gè)字傳送到ES:2000H開(kāi)始的內(nèi)存單元中。

MOV SI,0100H

MOV DI,2000H

MOV CX,50

CLD

REP MOVSW3.3.4串操作類(lèi)指令

2)串裝入指令(loadfromstring)——LODS

指令格式:

LODS SRC

LODSB(字節(jié));

(AL)←((DS):(SI)),(SI)←(SI)±1

LODSW(字);(AX)←((DS):(SI)),(SI)←(SI)±2

3.3.4串操作類(lèi)指令3)串存儲(chǔ)指令(storeintostring)——STOS

指令格式:

STOS DST

STOSB(字節(jié));

((ES):(DI))←(AL),(DI)←(DI)±1

STOSW(字);

((ES):(DI))←(AX),(DI)←(DI)±2

3.3.4串操作類(lèi)指令4)串比較指令(comparestring)——CMPS

指令格式:

CMPS DST,SRC

CMPSB(字節(jié));

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

(SI)←(SI)±1,(DI)←(DI)±1

CMPSW(字);((ES):(DI))-((DS):(SI)),(SI)←(SI)±2,(DI)←(DI)±2

3.3.4串操作類(lèi)指令5)串掃描指令(scanstring)——SCAS指令格式:

SCAS DST

SCASB(字節(jié));

(AL)-((ES):(DI)),(DI)←(DI)±1

SCASW(字);(AX)-((ES):(DI)),(DI)←(DI)±2

3.3.4串操作類(lèi)指令

轉(zhuǎn)移指令用于分支程序,它分為無(wú)條件轉(zhuǎn)移和條件轉(zhuǎn)移。無(wú)條件轉(zhuǎn)移可轉(zhuǎn)到內(nèi)存中存放的任何程序段。條件轉(zhuǎn)移指令對(duì)于條件的判別主要是根據(jù)標(biāo)志位來(lái)判別的,對(duì)于CF、OF、PF、SF、ZF都有相應(yīng)的判別指令。3.3.5控制轉(zhuǎn)移類(lèi)指令

1.無(wú)條件轉(zhuǎn)移指令(1)JMP(jump)指令

指令格式:JMP DST

指令功能:無(wú)條件跳轉(zhuǎn)到指令指定的目標(biāo)地址DST去執(zhí)行指令。DST可以是標(biāo)號(hào)、通用寄存器或存儲(chǔ)器。前面已經(jīng)詳細(xì)介紹了四種程序轉(zhuǎn)移尋址方式:段內(nèi)直接尋址、段內(nèi)間接尋址、段間直接尋址及段間間接尋址。3.3.5控制轉(zhuǎn)移類(lèi)指令①段內(nèi)直接轉(zhuǎn)移指令

JMPnearlabel②段內(nèi)直接短轉(zhuǎn)移指令

JMPshortlabel③段內(nèi)間接轉(zhuǎn)移指令

JMPreg16JMPmem16④段間直接轉(zhuǎn)移指令

JMPFARPTRlabelname⑤段間間接轉(zhuǎn)移指令

JMPmem323.3.5控制轉(zhuǎn)移類(lèi)指令

(2)子程序調(diào)用指令

主程序用CALL指令來(lái)調(diào)用子程序。

CALL指令的功能是先將斷點(diǎn)地址(

(IP)與(CS))壓入堆棧,然后將子程序的首址裝入IP與CS中,從而將程序轉(zhuǎn)移到子程序的入口,再順序執(zhí)行子程序。在子程序的最后應(yīng)安排一條返回指令RET,CPU執(zhí)行RET指令時(shí),會(huì)從堆棧中彈出斷點(diǎn)地址,重新裝入IP與CS中,從而達(dá)到返回主程序的目的。3.3.5控制轉(zhuǎn)移類(lèi)指令3.3.5控制轉(zhuǎn)移類(lèi)指令

①調(diào)用指令(call)——CALL

指令格式:CALLDST

執(zhí)行操作:(1)?PUSHCS

(2)?PUSHIP

(3)?JMP?DST

目的操作數(shù)的尋址方式與JMP相似,只是沒(méi)有短程調(diào)用。3.3.5控制轉(zhuǎn)移類(lèi)指令

②返回指令(return)——RET

指令格式:RET

執(zhí)行操作:(1)?POPIP

(2)?POP CS

3.3.5控制轉(zhuǎn)移類(lèi)指令

2.條件轉(zhuǎn)移指令(jumpifcc)——Jcc

指令格式:Jcc DST

指令功能:如果測(cè)試條件cc為真,則轉(zhuǎn)移到目標(biāo)地址DST處執(zhí)行程序,否則順序執(zhí)行。DST應(yīng)給出轉(zhuǎn)移到的指令的標(biāo)號(hào)或轉(zhuǎn)移的8位相對(duì)偏移量。3.3.5控制轉(zhuǎn)移類(lèi)指令

條件“cc”共分三類(lèi)。

(1)以狀態(tài)標(biāo)志位為條件:ZF、SF、OF、CF、PF;

(2)以兩個(gè)無(wú)符號(hào)數(shù)比較為條件:高于、高于等于、低于、低于等于;

(3)以兩個(gè)有符號(hào)數(shù)比較為條件:大于、大于等于、小于、小于等于。3.3.5控制轉(zhuǎn)移類(lèi)指令類(lèi)

指令格式指令功能條件轉(zhuǎn)移JZ/JEtargetJNZ/JNEtargetJP/JPEtargetJNP/JPOtargetJOtargetJNOtargetJCtargetJNCtargetJStargetJNStargetJB/JNAEtargetJNB/JAEtargetJA/JNBEtargetJNA/JBEtargetJL/JNGEtargetJNL/JGEtargetJG/JNLEtargetJNG/JLEtarget結(jié)果為0/相等轉(zhuǎn)移不為0/不相等轉(zhuǎn)移結(jié)果為偶性轉(zhuǎn)移結(jié)果為奇性轉(zhuǎn)移溢出轉(zhuǎn)移無(wú)溢出轉(zhuǎn)移有進(jìn)(借)位轉(zhuǎn)移無(wú)進(jìn)(借)位轉(zhuǎn)移符號(hào)位為1轉(zhuǎn)符號(hào)位為0轉(zhuǎn)低于/不高于等于轉(zhuǎn)不低于/高于等于轉(zhuǎn)高于/不低于等于轉(zhuǎn)不高于/低于等于轉(zhuǎn)小于/不大于等于轉(zhuǎn)不小于/大于等于轉(zhuǎn)大于/不小于等于轉(zhuǎn)不大于/小于等于轉(zhuǎn)3.3.5控制轉(zhuǎn)移類(lèi)指令【例】在DA

溫馨提示

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