《微型計(jì)算機(jī)原理》課件第3章2_第1頁
《微型計(jì)算機(jī)原理》課件第3章2_第2頁
《微型計(jì)算機(jī)原理》課件第3章2_第3頁
《微型計(jì)算機(jī)原理》課件第3章2_第4頁
《微型計(jì)算機(jī)原理》課件第3章2_第5頁
已閱讀5頁,還剩285頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

3.1概述3.280X86的尋址方式3.3指令格式3.480X86指令系統(tǒng)習(xí)題與思考題第3章80X86尋址方式和指令系統(tǒng)

3.1概述

由第2章可知,計(jì)算機(jī)的工作就是運(yùn)行程序,而程序由存儲(chǔ)在存儲(chǔ)器中的指令序列構(gòu)成。微處理器高效軟件的發(fā)展要求對(duì)每條指令的尋址方式(AddressingMode)都要相當(dāng)?shù)厥煜ぁC(jī)器語言指令由二進(jìn)制代碼組成。指令語句一般由操作碼(OperatingCode)和操作數(shù)(OperatingData)兩部分組成,指令的一般格式如下:這里,操作碼由便于記憶的助記符表示(通常為英文單詞縮寫),操作碼表示計(jì)算機(jī)執(zhí)行什么操作;操作數(shù)可能指明了參與操作的數(shù)本身,或規(guī)定了操作數(shù)的地址。8086/8088系統(tǒng)中一條指令的操作數(shù)可以是雙操作數(shù)(源操作數(shù)和目的操作數(shù)),也可以是單操作數(shù),有的指令還可以沒有操作數(shù)或隱含操作數(shù)。而80386/80486系統(tǒng)中的指令則有多個(gè)操作數(shù)。操作數(shù)主要分為三類:立即數(shù)、寄存器和存儲(chǔ)器操作數(shù)。立即數(shù)即常數(shù),是一個(gè)固定數(shù)值的操作數(shù);寄存器操作數(shù)存放在CPU的某個(gè)寄存器中;存儲(chǔ)器操作數(shù)則存放在內(nèi)存的數(shù)據(jù)區(qū)中。

3.280X86的尋址方式

在高級(jí)語言中可以很方便地使用表格或數(shù)組等數(shù)據(jù)結(jié)構(gòu),而在匯編語言中如何描述表格或數(shù)組呢?這就需要指令采用合適的方式指定操作數(shù)的地址。尋找操作數(shù)所在地址的方法稱為尋址方式。在80X86系統(tǒng)中,尋址方式通常分為兩種:一種為尋找操作數(shù)的地址,稱為數(shù)據(jù)尋址;另一種為尋找要執(zhí)行的下一條指令的地址,即程序轉(zhuǎn)移或子程序調(diào)用時(shí)的目的地址或入口地址,稱為程序轉(zhuǎn)移地址尋址方式。本章中使用MOV指令來描述數(shù)據(jù)尋址模式(Data-AddressingModes),它可實(shí)現(xiàn)在寄存器之間,寄存器與存儲(chǔ)器之間操作數(shù)的傳送。使用JUMP及CALL指令表明了怎樣更改程序流程。3.2.1數(shù)據(jù)的尋址方式

本節(jié)中尋址方式一般針對(duì)源操作數(shù)而言,以通用傳送指令MOVDST,SRC為例,SRC為源操作數(shù),指令執(zhí)行過程中原值保持不變;DST為目的操作數(shù),原值不保留,MOV指令完成從源操作數(shù)向目的操作數(shù)拷貝數(shù)據(jù)的功能。下面分別介紹各種數(shù)據(jù)尋址方式。

1.立即尋址(ImmediateAddressing)

操作數(shù)包含在指令碼中,由指令給出。匯編語言可用多種方式描述立即數(shù)。立即操作數(shù)可以是常數(shù),如果操作數(shù)以字母開頭,匯編程序要求操作數(shù)在其前加0。例如:在匯編語言中以0A2H描述操作數(shù)A2H。ASCII碼字符也可用于描述立即數(shù),例如:MOVAH,‘B’指令將ASCII碼B所對(duì)應(yīng)的數(shù)據(jù)42H放入寄存器AH中。

立即尋址通常用于給寄存器賦值,并且只適用于源操作數(shù)字段,不能用于目的操作數(shù)字段,要求源操作數(shù)與目的操作數(shù)長度一致。立即數(shù)可以是8位或16位的。在80386及其后繼機(jī)型中,立即數(shù)也可是32位操作數(shù)。【例3.1】MOVAL,100

指令執(zhí)行后,

(AL)=64H

【例3.2】MOVCL,01001100B

指令執(zhí)行后,

(CL)=4CH

【例3.3】MOVAX,1234H

指令執(zhí)行后,

(AX)=1234H此例說明,立即數(shù)如果是多字節(jié)數(shù),則高位字節(jié)存放在高地址中,低位字節(jié)存放在低地址中,如圖3.1所示。

表3.1列舉了一些立即尋址方式所用的示例。圖3.1例3.3的執(zhí)行情況表3.1立即尋址示例

2.寄存器尋址(RegisterAddressing)

寄存器尋址是一種最普遍的數(shù)據(jù)尋址方式,指令指定寄存器號(hào),操作數(shù)存放在指令規(guī)定的CPU內(nèi)部寄存器中??捎糜诩拇嫫鲗ぶ返臑橥ㄓ眉拇嫫鳌T谖⑻幚砥髦?,對(duì)于8位操作數(shù),寄存器可以是AH、AL、BH、BL、CH、CL、DH和DL;對(duì)于16位操作數(shù),寄存器可以是AX、BX、CX、DX、SP、BP、SI和DI。在80386及其后繼機(jī)型中,對(duì)于32位操作數(shù),32位寄存器包括EAX、EBX、ECX、EDX、ESP、EBP、EDI和ESI。在使用寄存器尋址方式時(shí),MOV、PUSH和POP指令也會(huì)使用到16位寄存器CS、ES、DS、SS、FS和GS。但這些寄存器在指令中,使用的寄存器類型要匹配,8位和16位,16位和32位及8位和32位寄存器是決不能混用的。有些指令可除外,如:SHLAX,CL。我們將在后續(xù)的章節(jié)中詳細(xì)說明。寄存器尋址不需要訪問存儲(chǔ)器,也不需要使用總線周期,操作在CPU內(nèi)部進(jìn)行,因而可取得較高的運(yùn)算速度。

【例3.4】MOVAX,BX

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

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

3.直接尋址(DirectAddressing)

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

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

【例3.5】MOVAX,[2040H]

指令執(zhí)行情況如圖3.2所示。執(zhí)行結(jié)果為

(AX)?=?6A4BH圖3.2例3.5的執(zhí)行情況在匯編語言指令中可以用符號(hào)地址代替數(shù)值地址,如:

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

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

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

在80386及其后繼機(jī)型中,直接尋址中的有效地址為32位。

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

操作數(shù)的有效地址存放在基址寄存器或變址寄存器中,而操作數(shù)則在存儲(chǔ)器中。根據(jù)表2.1的規(guī)定,對(duì)16位數(shù)進(jìn)行寄存器間接尋址時(shí)可用的寄存器是基址寄存器BX、BP和變址寄存器SI、DI。使用BP時(shí)默認(rèn)的段寄存器為SS,使用其他寄存器默認(rèn)的段寄存器為DS。在32位尋址時(shí)8個(gè)32位通用寄存器均可用。操作數(shù)有效地址格式為:[間接尋址的寄存器]。尋址寄存器放在方括號(hào)中。

【例3.8】MOVBX,[BP]

指令執(zhí)行前,(BP)?=?4000H,指令執(zhí)行情況如圖3.3所示。執(zhí)行結(jié)果為:(BX)?=?50A0H。圖3.3例3.8的執(zhí)行情況

【例3.9】MOVAX,ES:[SI];指明源操作數(shù)在ES段。

寄存器間接尋址方式可用于表格處理,執(zhí)行完一條指令后,只需修改寄存器的內(nèi)容就可以取出表格中的下一項(xiàng)。

5.寄存器相對(duì)尋址(RegisterRelativeAddressing)

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

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

參與尋址的寄存器要加方括號(hào)。在32位尋址時(shí),8個(gè)32位通用寄存器均可用。16位尋址時(shí),可用的寄存器仍為BX、BP、SI和DI。

【例3.10】MOVAX,TAB[SI]

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

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

指令執(zhí)行情況如圖3.4所示。執(zhí)行結(jié)果為(AX)?=?1234H。圖3.4例3.10的執(zhí)行情況這種尋址方式可用于表格處理或訪問一維數(shù)組中的元素。把表格的首地址設(shè)置為位移量,利用修改間接寄存器的值來存取表格中的任意一個(gè)元素。

表3.2列舉了一些寄存器相對(duì)尋址方式所用的示例。表3.2寄存器相對(duì)尋址示例

6.基址變址尋址(BasedIndexedAddressing)

操作數(shù)的有效地址是一個(gè)基址寄存器和變址寄存器的內(nèi)容之和,操作數(shù)本身在存儲(chǔ)單元中。操作數(shù)有效地址格式為:[基址寄存器][變址寄存器]。它所允許使用的寄存器及其對(duì)應(yīng)的默認(rèn)段見表2.1。寄存器要放在方括號(hào)中。在32位尋址時(shí),8個(gè)32位通用寄存器均可用。

【例3.11】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。

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

7.相對(duì)基址變址尋址(RelativeBasedIndexedAddressing)

操作數(shù)的有效地址為指令中規(guī)定的1個(gè)基址寄存器和1個(gè)變址寄存器的內(nèi)容及指令中指定的位移量三者之和。操作數(shù)本身在存儲(chǔ)單元中。它所允許使用的寄存器及其對(duì)應(yīng)的默認(rèn)段見表2.1。在32位尋址時(shí),8個(gè)32位通用寄存器均可用。操作數(shù)有效地址格式為:位移量[基址寄存器][變址寄存器],可以表示成多種形式組合。尋址寄存器要放在方括號(hào)中。

【例3.12】MOVAX,TAB[BX][SI]

如果

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

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

指令執(zhí)行情況如圖3.5所示。執(zhí)行結(jié)果為(AX)?=?1234H。圖3.5例3.12的執(zhí)行情況這種尋址方式為堆棧處理提供了方便,一般(BP)可指向棧頂,從棧頂?shù)綌?shù)組的首地址可用位移量表示,變址寄存器可用來訪問數(shù)組中的某個(gè)元素。這種尋址方式通常用于對(duì)二維數(shù)組的訪問。位移量為數(shù)組起始地址?;芳拇嫫骱妥冎芳拇嫫鞣謩e存放行和列的值,利用相對(duì)基址變址尋址就可以直接訪問二維數(shù)組中指定的某個(gè)元素。

表3.3列舉了一些相對(duì)基址變址尋址方式所用的示例。表3.3相對(duì)基址變址尋址示例

8.隱含尋址(ConcealedAddressing)

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

以上的數(shù)據(jù)尋址方式同樣適用于與存儲(chǔ)器單元統(tǒng)一編址的I/O端口,一個(gè)I/O口地址就是一個(gè)存儲(chǔ)單元地址。對(duì)I/O端口的訪問只能用存儲(chǔ)器訪問指令。如果I/O端口是按照獨(dú)立的I/O空間編址的,則I/O口和存儲(chǔ)器單元各有自己的地址,可以使用不同的指令,對(duì)外設(shè)訪問用IN或OUT專用指令(這些內(nèi)容將在后面詳細(xì)描述)。對(duì)I/O端口的尋址有以下兩種方式。

(1)直接端口尋址方式。端口地址用8位地址碼表示,在指令碼中。格式如下:

IN AL(AXorEAX),port8;

OUTport8,AL(AXorEAX)

如:INAL,21H。這條指令表示從I/O地址為21H的端口中讀取數(shù)據(jù)到AL中。

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

IN AL(AXorEAX),DX;

OUTDX,AL(AXorEAX)

DX中是16位端口地址,范圍為0000H~FFFFH。如:INAL,DX。這條指令表示從DX寄存器內(nèi)容所指定的端口中讀取數(shù)據(jù)到AL中。

注意:端口尋址方式中OP.D形式表達(dá)上與存儲(chǔ)器尋址方式中有所不同。

以下3種尋址方式中均涉及到比例因子,這些是80386及其后繼機(jī)型中特有的尋址方式,8086/8088不支持這幾種尋址方式。保護(hù)模式下存儲(chǔ)器尋址的物理地址計(jì)算在后面存儲(chǔ)器管理一章中將詳細(xì)介紹。在編程時(shí)都是用虛擬地址(邏輯地址)表示,即

選擇器:有效地址

9.比例變址尋址(ScaledIndexedAddressing)

比例變址尋址使用1個(gè)變址寄存器的內(nèi)容乘以比例因子與位移量之和來訪問存儲(chǔ)器。在32位尋址時(shí),在不加段超越前綴時(shí),除ESP以外的任何32位通用寄存器均可作為變址寄存器。比例因子可取1、2、4或8,分別對(duì)應(yīng)存儲(chǔ)序列元素的大小為1、2、4或8個(gè)字節(jié)。當(dāng)比例因子為1時(shí)將被隱含。操作數(shù)有效地址格式為

位移量[變址寄存器?*?比例因子]

或[位移量?+?變址寄存器?*?比例因子]

可以表示成多種形式組合。尋址寄存器要放在方括號(hào)中。

【例3.13】MOVEAX,ARRAY[4*EBX]

有效地址EA?=?ARRAY?+?4*EBX,將DS:EA中雙字的內(nèi)容送入EAX中。

10.基址比例變址尋址(BasedScaledIndexedAddressing)

基址比例變址尋址使用2個(gè)32位寄存器來訪問存儲(chǔ)器(1個(gè)基址寄存器和1個(gè)變址寄存器)。在32位尋址時(shí),8個(gè)32位通用寄存器均可用作基址寄存器,而變址寄存器則是除ESP以外的任何32位通用寄存器,在不加段超越前綴時(shí),除EBP、ESP是默認(rèn)SS為段選擇器外,其余6個(gè)通用寄存器均以DS為默認(rèn)段選擇器。操作數(shù)的有效地址為變址寄存器的內(nèi)容乘以比例因子與基址寄存器之和。同樣,比例因子可取1、2、4或8,分別對(duì)應(yīng)存儲(chǔ)序列元素的大小為1、2、4或8個(gè)字節(jié)。操作數(shù)有效地址格式為

[基址寄存器][變址寄存器?*?比例因子]

或[基址寄存器?+?變址寄存器?*?比例因子]

可以表示成多種形式組合。尋址寄存器要放在方括號(hào)中。

【例3.14】MOVAX,[EBX?+?4*ECX]

有效地址EA?=EBX+?4*ECX,將DS:EA中字的內(nèi)容送入AX中。

11.相對(duì)基址比例變址尋址(RelativeBasedScaledIndexedAddressing)

相對(duì)基址比例變址尋址操作數(shù)的有效地址為變址寄存器的內(nèi)容乘以比例因子、基址寄存器的內(nèi)容、位移量三者之和。它所允許使用的寄存器和比例因子同上。操作數(shù)有效地址格式為

位移量[基址寄存器][變址寄存器?*?比例因子]

或[位移量?+?基址寄存器?+?變址寄存器?*?比例因子]

可以表示成多種形式組合。尋址寄存器要放在方括號(hào)中。

【例3.15】MOVAL,ARRAY[EBP?+?2*EDI]

有效地址EA?=ARRAY?+?EBP?+?2*EDI,將SS:EA中字節(jié)的內(nèi)容送入AL中。3.2.2程序轉(zhuǎn)移地址尋址方式

前面介紹了CPU執(zhí)行指令的過程,指令是按順序存放在存儲(chǔ)器中的,而程序執(zhí)行順序是由CS和IP的內(nèi)容來決定的。當(dāng)程序執(zhí)行到某一轉(zhuǎn)移或調(diào)用指令時(shí),需脫離程序的正常順序執(zhí)行,而把它轉(zhuǎn)移到指定的指令地址,程序轉(zhuǎn)移及調(diào)用指令通過改變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)間接尋址、段間直接尋址及段間間接尋址。

1.段內(nèi)直接尋址(IntrasegmentDirectAddressing)

段內(nèi)直接尋址方式也稱為相對(duì)尋址方式。指令碼中包括一個(gè)位移量disp,轉(zhuǎn)移的有效地址為:EA?=?(IP)?+?disp。位移量在指令碼中是用補(bǔ)碼形式表示的8位或16位有符號(hào)數(shù)。當(dāng)位移量是8位時(shí),稱為短程轉(zhuǎn)移;當(dāng)位移量是16位時(shí),稱為近程轉(zhuǎn)移。指令的匯編語言格式為

JMPNEARPTR符號(hào)地址

JMPSHORT符號(hào)地址

【例3.16】請(qǐng)看下列程序段中的jmpshortnext指令執(zhí)行情況。

地址機(jī)器碼

5B1B:0017 2BC3 subax,bx

5B1B:0019 B80000 movax,0

5B1B:001C EB03 jmp0021;等效為jmpshort

next,轉(zhuǎn)移到標(biāo)號(hào)next處

5B1B:001E 03C3 addax,bx

5B1B:0020 41 inccx

5B1B:0021 50 next:?pushax

5B1B:0022 BE0200 movsi,2本例中,jmpnext指令的當(dāng)前IP=001EH,相對(duì)偏移量為03H,EA?=?001EH?+?03H?=?0021H,因此指令跳轉(zhuǎn)到0021H處執(zhí)行指令。段內(nèi)直接尋址過程如圖3.6所示。

對(duì)于386及其后繼機(jī)型中,代碼段的有效地址存放在EIP中,位移量為8位或32位。圖3.6例3.15的執(zhí)行情況

2.段內(nèi)間接尋址(IntrasegmentIndirectAddressing)

程序轉(zhuǎn)移的有效地址是一個(gè)寄存器或存儲(chǔ)單元的內(nèi)容。這個(gè)寄存器或存儲(chǔ)單元的內(nèi)容可以用數(shù)據(jù)尋址方式中除立即數(shù)以外的任何一種尋址方式獲得,所得到的轉(zhuǎn)向的有效地址用來取代IP寄存器的內(nèi)容。指令的匯編語言格式為

JMP寄存器

JMP存儲(chǔ)單元

由于以上兩種尋址方式僅修改IP的內(nèi)容,?所以這種尋址方式只能在段內(nèi)進(jìn)行程序轉(zhuǎn)移。下面示例說明段內(nèi)間接尋址的有效地址的計(jì)算方法。

【例3.17】JMPBX

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

(IP)?=?1020H

【例3.18】JMPTABLE[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

對(duì)于386及其后繼機(jī)型,除16位尋址方式外,還可使用32位尋址方式,修改EIP的內(nèi)容。

【例3.19】JMPEBX

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

(EIP)?=?20001002H

3.段間直接尋址(IntersegmentDirectAddressing)

指令中直接給出程序轉(zhuǎn)移的代碼段地址和偏移地址來取代當(dāng)前的CS和IP。指令的匯編語言格式為

JMPFARPTR符號(hào)地址;FARPTR表示段間轉(zhuǎn)移的操作符

【例3.20】請(qǐng)看下列程序段中的jmpfarptrnext指令執(zhí)行情況。

地址機(jī)器碼 代碼段1

5B16:00172BC3 subax,bx

5B16:0019B80000 movax,0

5B16:001CEA24001B5B jmp5B1B:0024;

等效為jmpfarptrnext

5B16:002103C3 addax,bx

地址機(jī)器碼 代碼段2

5B1B:0024 ?50 next:pushax

5B1B:0025BE0200 movsi,2本例中,jmpfarptrnext指令等價(jià)于jmp5B1B:0024,執(zhí)行該指令,程序跳轉(zhuǎn)到代碼段2,(CS)?=?5B1BH,(IP)?=?0024H。段間直接尋址過程如圖3.7所示。圖3.7例3.19的執(zhí)行情況對(duì)于386及其后繼機(jī)型,段間轉(zhuǎn)移應(yīng)修改CS和EIP的內(nèi)容,方法與16位尋址方式相同。

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。指令的匯編語言格式為

JMPDWORDPTR存儲(chǔ)單元

【例3.21】JMPDWORDPTR[BX]

如果(BX)?=?1034H,且從1034H開始的連續(xù)4個(gè)存儲(chǔ)單元內(nèi)容分別為12H、34H、56H、78H,則指令執(zhí)行后(IP)=1234H,(CS)=5678H。該指令的段間間接尋址過程如圖3.8所示。

對(duì)于386及其后繼機(jī)型,除16位尋址方式外,還可使用32位尋址方式,方法與16位尋址方式相同。圖3.8例3.20的執(zhí)行情況

3.3指令格式

本節(jié)將介紹助記符指令格式和指令編碼格式,并了解助記符指令是如何翻譯成機(jī)器碼的,即了解編譯程序的工作。3.3.1助記符指令格式

匯編語言源程序中助記符指令書寫的基本格式為

(標(biāo)號(hào)):(前綴指令)操作碼(操作數(shù));(注釋)

其中,操作碼是指令語句中不可缺少的;帶括號(hào)的項(xiàng)是可選項(xiàng),如果有此項(xiàng)時(shí),不能加括號(hào);多個(gè)操作數(shù)間是以‘,’隔開的;前綴指令與操作碼、操作碼與操作數(shù)之間必須以空格分開。標(biāo)號(hào)代表某條指令所存單元的符號(hào)地址。后邊要加上冒號(hào)“:”。標(biāo)號(hào)為程序轉(zhuǎn)移、循環(huán)提供了轉(zhuǎn)移目標(biāo)地址。標(biāo)號(hào)由字母、數(shù)字(0,…,9)及特殊符號(hào)(?,·,@,-,$)組成,且通常以字母開頭。字符總數(shù)必須不大于31個(gè)。不允許使用保留字(關(guān)鍵字),如CPU中的各寄存器名(AX,DS),指令助記符(MOV),偽指令(DB),表達(dá)式中的運(yùn)算符(GE、LE)和屬性操作符(PTR)等。

注釋是為閱讀方便而加的說明,并用分號(hào)‘;’作為間隔符。匯編程序?qū)ζ洳贿M(jìn)行處理。

指令各部分的詳細(xì)說明,將在后續(xù)章節(jié)中加以介紹。

例如:

DONE: MOVAX,BX;將寄存器BX的內(nèi)容傳送到AX中,BX的內(nèi)容不變3.3.2指令編碼格式

指令編碼格式是指每條指令所對(duì)應(yīng)的二進(jìn)制編碼(即機(jī)器碼)的表示格式。8086指令系統(tǒng)的16位數(shù)操作指令由1~7個(gè)字節(jié)組成,其包括操作碼、尋址方式及操作數(shù)部分(位移量、立即數(shù)),即指令中的操作碼和尋址方式字節(jié)基本格式如圖3.9所示。

在操作碼字節(jié)中,OPCODE規(guī)定了處理器執(zhí)行的操作,如加、減、傳送等,具體操作采用編碼表示。D位規(guī)定了數(shù)據(jù)流的方向,指明了尋址方式字節(jié)指定的R/M和REG域之間的數(shù)據(jù)流動(dòng)方向。當(dāng)D?=?0時(shí),REG域指定的寄存器操作作為源操作數(shù);當(dāng)D?=?1時(shí),REG域指定的寄存器操作作為目的操作數(shù),而源操作數(shù)來自R/M域中的存儲(chǔ)器或另一個(gè)寄存器。W位用于表示操作數(shù)的長度是字節(jié)或字。當(dāng)W?=?0時(shí),操作數(shù)為字節(jié);當(dāng)W?=?1時(shí),操作數(shù)為字。寄存器地址編碼與W位之間的編碼關(guān)系如表3.4所示。圖3.9操作碼和尋址方式字節(jié)格式表3.4寄存器地址編碼尋址方式字節(jié)中各個(gè)域的含義如下:

MOD域:選擇尋址類型,指定R/M域?yàn)榧拇嫫鬟€是存儲(chǔ)器,如果為存儲(chǔ)器,還要指定是否有偏移量,偏移量為8位還是16位。MOD域與R/M域之間的組合關(guān)系如表3.5所示。表3.5MOD域與R/W域組合尋址方式

REG域:規(guī)定寄存器操作數(shù)。采用三位編碼表示8個(gè)寄存器。

R/M域:表示寄存器或存儲(chǔ)器,受MOD域控制。如為寄存器,則與寄存器域相同,如為存儲(chǔ)器,則有8種組合的尋址方式。

指令編碼格式中的位移量表示指令中直接給出尋址方式所需的偏移量。8位偏移量占1個(gè)字節(jié),16位偏移量占2個(gè)字節(jié),低8位偏移量在前,高8位偏移量在后。立即數(shù)表示指令中直接給出操作數(shù)。同樣,8位立即數(shù)占1個(gè)字節(jié),16位立即數(shù)占2個(gè)字節(jié),低8位在前,高8位在后。如需要了解指令編碼的詳細(xì)情況,請(qǐng)查閱指令編碼相關(guān)手冊(cè)。下面以一條MOV指令為例,介紹手工匯編的過程。

【例3.22】寫出指令“MOVAL,[DI+0008]”的機(jī)器碼。

MOVAL,[DI+0008]的機(jī)器碼由操作碼字節(jié)、尋址字節(jié)和兩個(gè)字節(jié)的偏移量構(gòu)成。根據(jù)指令查閱指令編碼相關(guān)手冊(cè)得到操作碼字節(jié)內(nèi)容為:100010DW。指令有兩個(gè)操作數(shù),其中之一隱含于操作碼字節(jié)中。從指令中得到目的操作數(shù)是AL的內(nèi)容,若D?=?1,W=0,則操作碼字節(jié)內(nèi)容為8AH。?源操作數(shù)[DI+0008]由表3.5指定尋址字節(jié)中的MOD(10B)和R/M域(101B),尋址字節(jié)中的REG域由目的操作數(shù)寄存器AL指定,查表3.4得到REG域?yàn)?00B,則尋址字節(jié)內(nèi)容為:10000101B=85H。最終得到的指令編碼內(nèi)容為:8A850800H。

8086指令系統(tǒng)為了指定段寄存器,還提供了“段跨越前綴”的特殊字節(jié),其格式如圖3.10所示。

圖3.10段跨越前綴字節(jié)格式

REG域由表3.4的段寄存器指定。

80386/80486指令系統(tǒng)的32位數(shù)操作指令由1~14個(gè)字節(jié)組成,其中包括前綴、操作碼、尋址方式及操作數(shù)部分,即

其中,前綴由操作數(shù)長度前綴(66H)和地址碼長度前綴(67H)組成;操作數(shù)由位移量、立即數(shù)組成。由于80386/80486指令編碼較為復(fù)雜,在此僅對(duì)其格式做一簡單介紹。

如需要了解指令編碼的詳細(xì)情況,請(qǐng)查閱80386/80486指令編碼相關(guān)手冊(cè)。

3.480X86指令系統(tǒng)

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

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

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

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

(4)位操作指令;

(5)串操作指令;

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

(7)處理器控制指令;

(8)高級(jí)語言類指令;

(9)操作系統(tǒng)型指令。

在討論各類指令之前,先介紹指令操作數(shù)和指令功能說明中所用到的縮寫符號(hào),見表3.6。表3.6縮寫符號(hào)及其說明3.4.1數(shù)據(jù)傳送類指令

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

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

通用數(shù)據(jù)傳送指令包括最基本的傳送指令、堆棧指令、數(shù)據(jù)交換指令、換碼指令。指令的基本格式和操作如表3.7所示。

1)基本的傳送指令

基本的傳送指令包括MOV、MOVSX、MOVZX。其中MOVSX、MOVZX僅在386及其后繼機(jī)型中可用。

●傳送指令(move)——MOV

指令格式:MOVDST,SRC

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

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

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

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

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

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

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

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

MOVAX,MEM1

MOVMEM2,AX

段寄存器←段寄存器:

MOVAX,SEG1

MOVSEG2,AX

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

MOVAX,DATA

MOVSEG,AX表3.7通用傳送指令●帶符號(hào)擴(kuò)展傳送指令(movewithsign-extend)——MOVSX

指令格式:MOVSXREG16(32),REG8(16)/MEM8(16)

指令功能:將源操作數(shù)符號(hào)擴(kuò)展送入目的寄存器,可以是8位符號(hào)擴(kuò)展到16位或32位,也可以是16位符號(hào)擴(kuò)展到32位,源操作數(shù)可以是8位或16位的寄存器或存儲(chǔ)單元的內(nèi)容,而目的操作數(shù)則必須是16位或32位的寄存器。該指令執(zhí)行后不影響標(biāo)志位。

【例3.23】MOVSXEAX,CX

如果(CX)?=?0AB20H,則指令執(zhí)行后,(EAX)=FFFFAB20H,CX中的內(nèi)容為負(fù)數(shù),符號(hào)位?=?1。

●零擴(kuò)展傳送指令(movewithzero-extend)——MOVZX

指令格式:MOVZXREG16(32),REG8(16)/MEM8(16)

指令功能:將源操作數(shù)作零擴(kuò)展送入目的寄存器,不管源操作數(shù)的符號(hào)位是否為1,高位均作零擴(kuò)展。有關(guān)源操作數(shù)、目的操作數(shù)及對(duì)標(biāo)志位的影響均與MOVSX的相同。

【例3.24】MOVZXEAX,CL

如果(CL)?=?0FAH,則指令執(zhí)行后,(EAX)?=?

000000FAH,CL中的符號(hào)位?=?1。

2)堆棧指令

堆棧指令包括壓棧PUSH、PUSHA、PUSHAD、PUSHF、PUSHFD和出棧POP、POPA、POPAD、POPF、POPFD等10條指令。除POPF、POPFD指令由裝入值來確定標(biāo)志位的值外,其余指令均不影響標(biāo)志位。PUSHA/PUSHAD、POPA/POPAD用于386及其后繼機(jī)型。堆棧是按“后進(jìn)先出(LIFO)”方式工作的存儲(chǔ)區(qū)域。規(guī)定由SS指示堆棧段的段基址,堆棧指針(E)SP始終指向堆棧的頂部,(E)SP的初值規(guī)定了所用堆棧區(qū)的大小。堆棧的最高地址叫棧底。進(jìn)棧方向是由高地址向低地址發(fā)展。堆棧的存取在16位指令中必須以字為單位進(jìn)行壓入彈出操作。在32位指令中必須以雙字為單位進(jìn)行壓入彈出操作。堆棧操作一般用于中斷處理與子程序調(diào)用?!?壓棧/出棧指令——PUSH/POP

指令格式:PUSHSRC;POPDST

指令功能:執(zhí)行PUSH指令時(shí),將(E)SP的內(nèi)容減2(16位指令中)或減4(32位指令中),指向新的棧頂位置。壓入堆棧的數(shù)據(jù)放在棧頂。低位字節(jié)放在低地址單元,高位字節(jié)放在較高地址單元。執(zhí)行POP指令時(shí),正好相反。每彈出一個(gè)字或雙字至目的操作數(shù)地址中,(E)SP的內(nèi)容加2或加4。

PUSH指令的源操作數(shù)可以是通用寄存器(REG)、段寄存器(SEG)、立即數(shù)(DATA)和存儲(chǔ)單元(MEM),它可使用所有的尋址方式,但8086系統(tǒng)不允許使用立即數(shù)尋址方式。

POP指令的目的操作數(shù)可以是通用寄存器(REG)、段寄存器(SEG)和存儲(chǔ)單元(MEM),不允許使用立即數(shù)尋址方式。CS值可壓入堆棧,但不能彈出一個(gè)字到CS寄存器。例如:

PUSHCS

PUSH1234H;在8086系統(tǒng)中非法,但在386及其后繼機(jī)型中允許立即數(shù)進(jìn)棧

POP[EBX]

【例3.25】PUSHAX

如果(AX)?=?1234H,(SP)?=?0100H,則指令執(zhí)行后,(SP)?=?00FEH,指令執(zhí)行情況如圖3.11所示。圖3.11PUSHAX的執(zhí)行示意圖

【例3.26】POPAX

POPAX指令執(zhí)行前與執(zhí)行后的情況如圖3.12所示。圖3.12POPAX的執(zhí)行示意圖

【例3.27】如果將AX,BX兩個(gè)寄存器的內(nèi)容互換,則可執(zhí)行下列程序段實(shí)現(xiàn)。

PUSH AX

PUSH BX

POP AX

POP BX

如果保持寄存器進(jìn)出棧前后內(nèi)容不變,則出棧的順序與進(jìn)棧的順序相反?!袼屑拇嫫鲏簵?出棧指令——PUSHA/PUSHAD(pushallregisters);POPA/POPAD(popallregisters)

指令格式:PUSHA ;POPA

PUSHAD ;POPAD

指令功能:PUSHA將所有16位通用寄存器(AX,CX,DX,BX,SP,BP,SI,DI)依次進(jìn)棧,指令執(zhí)行后,(SP)←(SP)-16仍指向棧頂;PUSHAD將所有32位通用寄存器(EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI),依次進(jìn)棧,指令執(zhí)行后(ESP)←(ESP)-32指向棧頂。

POPA將堆棧中16位的數(shù)據(jù)依次彈出至所有16位通用寄存器,彈出順序?yàn)椋篋I,SI,BP,SP,BX,DX,CX,AX,指令執(zhí)行后,(SP)←(SP)+16指向棧頂;POPAD將堆棧中32位的數(shù)據(jù)依次彈出至所有32位通用寄存器,彈出順序?yàn)椋篍DI,ESI,EBP,ESP,EBX,EDX,ECX,EAX,指令執(zhí)行后,(ESP)←(ESP)?+32指向棧頂。

【例3.28】PUSHAD

如果指令執(zhí)行前32位通用寄存器的內(nèi)容為則指令執(zhí)行前后堆棧變化情況如圖3.13所示。圖3.13PUSHAD的執(zhí)行示意圖●標(biāo)志進(jìn)出棧指令——PUSHF/PUSHFD(pushtheflagsoreflags);POPF/POPFD(poptheflagsoreflags)

指令格式:PUSHF ; POPF

PUSHFD ; POPFD

指令功能:將FLAGS/EFLAGS標(biāo)志寄存器中內(nèi)容壓入堆棧;從堆棧中彈出字或雙字至FLAGS/EFLAGS標(biāo)志寄存器中。

【例3.29】若要求將TF置位,則可用如下程序段實(shí)現(xiàn):

PUSHF

POP AX

OR AH,01H

PUSH

AX

POPF

3)數(shù)據(jù)交換指令

數(shù)據(jù)交換指令包括XCHG、CMPXCHG、XADD和BSWAP等指令。其中,CMPXCHG、XADD和BSWAP用于386及其后繼機(jī)型。

●交換指令(exchange)——XCHG

指令格式:XCHGDST,SRC指令功能:將兩個(gè)操作數(shù)的內(nèi)容相互交換。兩操作數(shù)長度可以是字節(jié)、字或雙字,且類型必須一致,不能同時(shí)為存儲(chǔ)器操作,其中之一必為寄存器。操作數(shù)可用除立即數(shù)外的任何尋址方式。兩個(gè)操作數(shù)可以同時(shí)為寄存器,但不允許同時(shí)都為段寄存器。該指令執(zhí)行后不影響標(biāo)志位。例如:

XCHGAH,BL

XCHGES,AX

XCHGEAX,ARRAY[4*EBX]●比較交換指令(compareandexchange)——?CMPXCHG

指令格式:CMPXCHGDST,SRC

指令功能:將累加器中的內(nèi)容與目的操作數(shù)相比較。如果它們相等,則將源操作數(shù)拷貝到目的操作數(shù)所指單元,且置ZF為1;如果它們不相等,將目的操作數(shù)拷貝到累加器中,且置ZF為0。該指令對(duì)8位、16位、32位數(shù)都適用。目的操作數(shù)可以是通用寄存器REGn和存儲(chǔ)單元MEMn。源操作數(shù)只能為REGn。存儲(chǔ)單元可通過數(shù)據(jù)尋址的各種尋址方式尋址。

例如:CMPXCHGBX,DX

如果(BX)?=?(AX),則(BX)?=?(DX),且ZF?=?1;如果(BX)?≠?(AX),則(AX)?=?(BX),且ZF?=?0?!褡儞Q加指令(exchangeandadd)——XADD

指令格式:XADDDST,SRC

指令功能:XADD指令和其他的加法指令一樣,將源操作數(shù)和目的操作數(shù)之和存入目的操作數(shù)所指存儲(chǔ)單元。不同之處在于,在相加完成后,原來的目的操作數(shù)將被存入源操作數(shù)所指存儲(chǔ)單元內(nèi),改變了源操作數(shù)的內(nèi)容。目的操作數(shù)可以是通用寄存器REGn和存儲(chǔ)單元MEMn。源操作數(shù)只能為REGn。存儲(chǔ)單元可通過數(shù)據(jù)尋址的各種尋址方式尋址。該指令執(zhí)行后對(duì)標(biāo)志位的影響與加指令的相同。例如:

XADDAL,DL

如果(AL)?=?12H,(DL)?=?34H,則當(dāng)指令執(zhí)行后,(AL)?=?46H,而(DL)?=?12H?!褡止?jié)交換指令(byteswap)——BSWAP

指令格式:BSWAPREG32

指令功能:將指令指定的32位寄存器的字節(jié)次序變反。即1、4字節(jié)互換,2、3字節(jié)互換。該指令執(zhí)行后不影響標(biāo)志位。例如:

BSWAPEAX

如果指令執(zhí)行前,(EAX)=44223366H,則指令執(zhí)行后,(EAX)?=?66332244H,執(zhí)行情況如圖3.14所示。圖3.14指令BSWAPEAX執(zhí)行情況

4)換碼指令

XLAT為換碼指令(translate),也稱為查表轉(zhuǎn)換指令,是80X86處理器中常用的指令。

指令格式:XLAT

指令功能:用查表方式將一種代碼轉(zhuǎn)換成另一種代碼。如將字符的掃描碼轉(zhuǎn)換為ASCII碼或?qū)?shù)字0~9轉(zhuǎn)換成7段數(shù)碼管所需要的相應(yīng)代碼等。該類指令是隱含尋址。指令中規(guī)定(E)BX指向存放在某一內(nèi)存表格的首地址,AL為表格中某一元素與表格首地址之間的偏移量,表格中的內(nèi)容即為要替換的代碼,指令執(zhí)行后在AL中得到轉(zhuǎn)換后的代碼。指令執(zhí)行后不影響標(biāo)志位。

【例3.30】十進(jìn)制數(shù)0~9與BCD碼和字型碼的相互轉(zhuǎn)換如表3.8所示。請(qǐng)編寫指令,將5轉(zhuǎn)換成共陽極LED顯示的字型代碼。

表3.8中七段顯示代碼中高電平“1”表示不亮,低電平“0”表示亮。如:共陽極LED顯示的字型代碼“0”(即十進(jìn)制數(shù)“0”)只有G不亮,為高電平“1”。對(duì)于順序排列的表格,可用換碼指令XLAT來實(shí)現(xiàn)查表功能。假設(shè)表格存放在內(nèi)存中的首地址以標(biāo)號(hào)TABLE表示。將BX指向表格首地址,將表格偏移量(即序號(hào))放入AL中。本例中偏移量為05H。

用如下程序段可實(shí)現(xiàn)查表換碼功能:

MOV AX,SEGTABLE ;將標(biāo)號(hào)的段地址用SEG偽指令提取出來

MOV DS,AX

MOV BX,OFFSETTABLE ;將標(biāo)號(hào)的偏移地址用OFFSET偽指令提取出來

MOV AL,05

XLAT ;EA=(BX)+(AL),(AL)=(EA)

該程序執(zhí)行后,

(AL)=12H

2.地址傳送指令

80X86提供了6條將地址信息傳送到指定寄存器的指令,包括LEA、LDS、LES、LSS、LFS和LGS。其中LSS、LFS和LGS僅用于80386及其后繼機(jī)型。該類指令執(zhí)行后不影響標(biāo)志位。

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

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

指令功能:將源操作數(shù)的有效地址EA傳送到指定寄存器中。源操作數(shù)的尋址方式只能是存儲(chǔ)器尋址方式(即不允許是立即數(shù)和寄存器尋址方式),目的操作數(shù)的寄存器可使用16位或32位寄存器,但不能為段寄存器。

【例3.31】參見圖3.15,比較以下兩條指令的執(zhí)行結(jié)果。

LEABX,[DI]

MOV?BX,[DI]

第一條指令執(zhí)行后,(BX)?=?0100H;第二條指令執(zhí)行后,(BX)?=?0FF00H。由此看出MOV指令和LEA指令的區(qū)別,前者傳送源操作數(shù)所指單元的內(nèi)容,后者傳送源操作數(shù)的有效地址。圖3.15LEA與MOV指令的區(qū)別

2)指針傳送指令

LDS(loadDSwithpointer)指令和LES、LFS、LGS、LSS等指令的格式類同,只是指針指定的段寄存器不同而已。下面以LDS為例來介紹該類指令。指令格式:LDSREG,MEM;(REG)←(MEM),(DS)←(MEM+2)或(DS)←(MEM+4)

指令功能:?將源操作數(shù)MEM所指定存儲(chǔ)單元中連續(xù)4個(gè)單元的前兩個(gè)單元的內(nèi)容作為有效地址存入指令指定的16位寄存器(REG)中,后兩個(gè)單元的內(nèi)容裝入指令指定的段寄存器(DS)中;當(dāng)指令指定的是32位寄存器時(shí),將該存儲(chǔ)單元中連續(xù)存放的4個(gè)單元的內(nèi)容作為有效地址裝入該寄存器中,而其后的2個(gè)單元的內(nèi)容裝入指令指定的段寄存器(DS)中。

源操作數(shù)MEM的尋址方式只能是存儲(chǔ)器尋址方式(即不允許是立即數(shù)和寄存器尋址方式),目的操作數(shù)(REG)不能為段寄存器(SEG)。

【例3.32】LDSBX,TABLE[SI]

如果指令執(zhí)行前,TABLE?=?0200H,(SI)?=?0008H,(DS)?=?4000H,(BX)?=?5A80H,則EA?=?TABLE?+?(SI)?=0200H?+?0008H?=?0208H。在DS:0208H單元中存放的數(shù)據(jù)如圖3.16所示。指令執(zhí)行后,(DS)?=?1000H,(BX)?=?1234H。圖3.16LDS指令執(zhí)行情況

【例3.33】LSS ESP,DS:[0100H]

將DS:0100H單元中存放的48位地址分別裝入ESP和SS寄存器中。

3.標(biāo)志傳送指令

用于標(biāo)志寄存器傳送的指令有LAHF、SAHF、PUSHF/PUSHFD和POPF/POPFD。其中PUSHF/PUSHFD和POPF/POPFD指令已在堆棧指令中介紹。LAHF、SAHF指令為隱含尋址。

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)位,如圖3.17所示。該指令的執(zhí)行不影響標(biāo)志位。圖3.17LAHF指令功能

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其他位不受影響。AH中相應(yīng)位可編程設(shè)置。

4.輸入輸出指令

80X86提供了IN和OUT輸入輸出指令,也稱為累加器專用指令,該類指令僅限于用累加器AL、AX、EAX傳送信息。輸入輸出指令只有兩種尋址方式:直接尋址方式和寄存器間接尋址方式。輸入輸出指令執(zhí)行后不影響標(biāo)志位。

1)輸入指令(input)——IN

指令格式:INAL,port ;(AL)←(port)

INAX,port ;(AX)←(port+1,port)

INEAX,port ;(EAX)←(port+3,

port+2,port+1,port)

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

INAX,DX ;(AX)←((DX)+1,(DX))

INEAX,DX ;(EAX)←((DX)+3,

(DX)+2,(DX)+1,(DX))

指令功能:用于I/O端口到CPU的數(shù)據(jù)輸入操作。

2)輸出指令(output)——OUT

指令格式:OUTport,AL ;(port)←(AL)

OUTport,AX ;(port+1,port)←(AX)

OUTport,EAX ;(port+3,port+2,port+1,

port)←(EAX)

OUTDX,AL ;((DX))←(AL)

OUTDX,AX ;((DX)+1,(DX))←(AX)

OUTDX,EAX ;((DX)+3,(DX)+2,

(DX)+1,(DX))←(EAX)指令功能:用于CPU到I/O端口的數(shù)據(jù)輸出操作。例如:

INAL,41H;表示從端口地址為41H中輸入字

節(jié)數(shù)到AL中

INAX,41H;表示從端口地址為41H中輸入字到AX中

MOVDX,378H;將端口地址378H送入DX寄存器中

OUTDX,EAX ;表示從EAX輸出雙字?jǐn)?shù)據(jù)到

(DX)~(DX)+3所指的四個(gè)端口中3.4.2算術(shù)運(yùn)算類指令

80X86提供了加、減、乘、除等各類算術(shù)運(yùn)算指令,這些指令可處理4種類型的數(shù)據(jù):有符號(hào)的二進(jìn)制數(shù)、無符號(hào)的二進(jìn)制數(shù)、無符號(hào)的組合十進(jìn)制數(shù)和無符號(hào)的分離十進(jìn)制數(shù)。在進(jìn)行二進(jìn)制加、減運(yùn)算時(shí),不同類型的數(shù)據(jù)完成相同的操作所用的指令基本相同,只是在這些指令后所進(jìn)行的判斷或調(diào)整指令不同而已。二進(jìn)制乘除運(yùn)算分為有符號(hào)數(shù)和無符號(hào)數(shù)兩種運(yùn)算指令。另外,還提供了便于十進(jìn)制運(yùn)算的十進(jìn)制調(diào)整指令和使兩個(gè)長度不等數(shù)據(jù)一致的符號(hào)擴(kuò)展指令。指令的基本格式和操作見表3.9。表3.9算術(shù)運(yùn)算指令續(xù)表

1.加減法指令

加減法指令有不帶進(jìn)(借)位的加減法指令A(yù)DD、SUB;帶進(jìn)(借)位的加減法指令A(yù)DC、SUB;增減量指令I(lǐng)NC、DEC;特殊減法指令即求補(bǔ)指令NEG、比較指令CMP。

1)?ADD/SUB——加/減法指令(addition/subtraction)

指令格式:ADDDST,SRC ;SUBDST,SRC

指令功能:ADD指令將目的操作數(shù)與源操作數(shù)相加之和送到目的操作數(shù)所指單元中。SUB指令將目的操作數(shù)與源操作數(shù)相減之差送到目的操作數(shù)所指單元中。指令執(zhí)行后源操作數(shù)保持不變,但指令會(huì)影響SF、ZF、CF、AF、PF和OF等6個(gè)標(biāo)志位。指令中源操作數(shù)可以是通用寄存器REGn、立即數(shù)DATAn和存儲(chǔ)單元MEMn。目的操作數(shù)可以是REGn和MEMn。源操作數(shù)和目的操作數(shù)都不能是段寄存器,目的操作數(shù)不得為立即數(shù)。存儲(chǔ)單元可通過數(shù)據(jù)尋址的各種尋址方式尋址。使用加、減法指令時(shí),應(yīng)注意源操作數(shù)為非立即數(shù)時(shí),兩操作數(shù)之一必為寄存器,兩存儲(chǔ)單元之間不能進(jìn)行加、減法運(yùn)算。兩操作數(shù)類型必須一致,可以同時(shí)為字節(jié)、字或雙字。例如:

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

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

ADD[EBP],AL ;((EBP))←((EBP))?+?(AL)

ADDAX,[EBX+2*ECX] ;將(EBX+2*ECX)所指向的存儲(chǔ)

;單元中的內(nèi)容加上AX的內(nèi)容,

;并將結(jié)果存入AX中下邊3條指令是非法的。

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

SUB[DI],[BP] ;不允許兩操作數(shù)都為存儲(chǔ)單元

ADD34H,EAX ;目的操作數(shù)不能為立即數(shù)

2)?ADC/SBB——帶進(jìn)/借位加/減法指令(additionwithcarry/subtractionwithcarry)

指令格式:ADCDST,SRC ;SBBDST,SRC

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

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ù)不得為立即數(shù)。存儲(chǔ)單元可通過數(shù)據(jù)尋址的各種尋址方式尋址。對(duì)于非立即數(shù)存儲(chǔ)器增減量,數(shù)據(jù)必須用字節(jié)、字、雙字這些類型來描述。例如,DEC[SI]這條指令,可以是一個(gè)字節(jié)、字或雙字大小的減量,指令DECBYTEPTR[SI]清楚地表明是一個(gè)字節(jié)型的存儲(chǔ)器數(shù)據(jù),指令DECWORDPTR[SI]毫無疑問是指一個(gè)字型的存儲(chǔ)器數(shù)據(jù),指令DECDWORDPTR[SI]指的是一個(gè)雙字型的存儲(chǔ)器數(shù)據(jù)。

【例3.34】求26584336H+3619FECAH=??內(nèi)存中數(shù)據(jù)存放形式如圖3.18所示。請(qǐng)給出使用8位加法指令完成兩數(shù)之和的程序段。圖3.18多字節(jié)加法運(yùn)算

8086指令程序段為:

LEA SI,ARY1 ;ARY1偏移地址送SI

LEADI,ARY2 ;ARY2偏移地址送DI

LEABX,SUM ;SUM偏移地址送BX

MOVCX,4 ;循環(huán)4次

CLC ;清進(jìn)位CF標(biāo)志

AGAIN:MOVAL,[SI]

ADCAL,[DI] ;帶進(jìn)位加

MOV[BX],AL;結(jié)果存入SUM

INCSI ;調(diào)整指針

INCDI

INCBX

DECCX ;循環(huán)計(jì)數(shù)器減1

JNZAGAIN ;若未處理完,則轉(zhuǎn)AGAIN圖3.19給出第0字節(jié)相加之后標(biāo)志位的值;圖3.20給出第0、1字節(jié)相加過程中進(jìn)位如何將2個(gè)字節(jié)加法組合成字相加。圖3.19加法結(jié)果對(duì)標(biāo)志位的影響圖3.20進(jìn)位將2個(gè)8位加法組合成16位相加

【例3.35】若(AL)?=?11H,請(qǐng)給出執(zhí)行SUBAL,33H指令后對(duì)標(biāo)志位的影響。

圖3.21給出減指令執(zhí)行后標(biāo)志位的值。圖3.21減法結(jié)果對(duì)標(biāo)志位的影響

4)求補(bǔ)指令(negate)——NEG

指令格式:NEG DST

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

【例3.36】若(AX)?=?0FF0EH?=?[-242]補(bǔ),則執(zhí)行NEGAX后,即得到

(AX)?=?00F2H?=│-242│=?+242

請(qǐng)給出執(zhí)行NEGAX指令后對(duì)標(biāo)志位的影響。指令執(zhí)行后標(biāo)志位的值為:

CF?=?1(最高位D15向前有借位)SF=0(符號(hào)位為0)

AF?=?1(D3位有借位) PF=0(奇數(shù)個(gè)‘1’)

OF?=?0(無溢出)? ZF?=?0(結(jié)果非零)

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

指令格式:CMP DST ,SRC

指令功能:比較指令是一個(gè)只改變標(biāo)志位的減法,而目的操作數(shù)、源操作數(shù)不發(fā)生改變。指令中兩操作數(shù)類型必須一致,目的操作數(shù)不為立即數(shù),兩操作數(shù)之一必為寄存器。兩操作數(shù)不允許為段寄存器。例如:

CMPBX,8000H

CMPAX,BX

CMP[DI],CH

CMPBX,[EDI+ESI]比較指令后面常常會(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è)無符號(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)。

2.乘法指令

乘法指令有單操作數(shù)的無符號(hào)數(shù)乘法指令MUL和有符號(hào)數(shù)乘法指令I(lǐng)MUL指令。386及其后繼機(jī)型中還增加了雙操作數(shù)和三操作數(shù)有符號(hào)數(shù)乘法指令I(lǐng)MUL指令。乘法指令的操作數(shù)的類型可以是字節(jié)、字或者雙字。僅80386及其后繼機(jī)型可以對(duì)32位的雙字型數(shù)據(jù)使用乘法指令。

1)無符號(hào)數(shù)乘法指令(multiple)——MUL

指令格式:MULSRC

指令功能:將目的操作數(shù)乘以源操作數(shù),結(jié)果存放到目的操作數(shù)中。目的操作數(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中;當(dāng)兩個(gè)32位數(shù)相乘時(shí),64位乘積存放在EDX:EAX中,其中高位字存放在EDX中,低位字存放在EAX中。當(dāng)乘法指令執(zhí)行完后,一些標(biāo)志位(CF和OF)會(huì)改變,產(chǎn)生預(yù)期的結(jié)果。其他的標(biāo)志位也會(huì)改變,不過它們的結(jié)果是無法預(yù)知的,因而不能被利用。CF、OF表示乘積值的范圍。對(duì)于無符號(hào)數(shù),若CF?=?OF?=?0,則表示AH(字節(jié)乘)/DX(字乘)/EDX(雙字乘)乘積值高位為零。

【例3.37】若(AL)?=?0C5H,(BL)?=?11H,求執(zhí)行指令MULBL后的乘積值。

(AL)?=?0C5H為無符號(hào)數(shù)的197;

(BL)?=11H為無符號(hào)數(shù)的17,

則執(zhí)行后,(AX)?=?0D15H為無符號(hào)數(shù)的3349。

CF?=?OF?=?1,表示AH中存有積的有效值。

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

●有符號(hào)單操作數(shù)乘法指令

指令格式:IMULSRC

指令功能:與MUL相同,只是必須是有符號(hào)數(shù)。對(duì)于有符號(hào)數(shù),IMUL執(zhí)行后,CF?=?OF?=?0,AH(字節(jié)乘)/DX(字乘)/EDX(雙字乘)乘積值高位為符號(hào)擴(kuò)展。若CF?=?OF?=?1,則積的高位存在其有效值,表示積的有效值不僅存在于低位字節(jié)/字/雙字,而且也存在于高位字節(jié)/字/雙字。有符號(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ǔ)碼。此過程由計(jì)算機(jī)執(zhí)行指令時(shí)自動(dòng)完成。

【例3.38】若(AL)?=?0C5H,(BL)?=?11H,求執(zhí)行指令I(lǐng)MULBL后的乘積值。

(AL)?=?0C5H為有符號(hào)數(shù)-59的補(bǔ)碼,將C5H變補(bǔ)即可求得其絕對(duì)值,即

[C5H]變補(bǔ)

=?3BH=?59

(BL)=11H為有符號(hào)數(shù)的17,則執(zhí)行后,(AX)=3EBH為有符號(hào)數(shù)的-1003。

CF?=?OF?=?1,表示AH中存有積的有效值。●有符號(hào)雙操作數(shù)乘法指令

指令格式:IMULREG,SRC

指令功能:源操作數(shù)與目的操作數(shù)相乘,結(jié)果送到目的操作數(shù)中。目的操作數(shù)為16位或32位寄存器,源操作數(shù)長度要保持與目的操作數(shù)長度一致,可用任一尋址方式獲得。如果源操作數(shù)為8位立即數(shù),則數(shù)據(jù)位數(shù)在指令執(zhí)行前自動(dòng)將符號(hào)擴(kuò)展到與目的操作數(shù)長度一致。例如:

IMULEAX,LIST[EDI*4] ;根據(jù)比例變址尋址方式從

;LIST+EDI*4所指雙字存儲(chǔ)區(qū)中取

;出相應(yīng)單元的32位字乘以EAX的內(nèi)容,

;結(jié)果送到EAX寄

;存器中●有符號(hào)三操作數(shù)乘法指令

指令

溫馨提示

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