計(jì)算機(jī)組成與匯編課件-第4章指令系統(tǒng)層_第1頁(yè)
計(jì)算機(jī)組成與匯編課件-第4章指令系統(tǒng)層_第2頁(yè)
計(jì)算機(jī)組成與匯編課件-第4章指令系統(tǒng)層_第3頁(yè)
計(jì)算機(jī)組成與匯編課件-第4章指令系統(tǒng)層_第4頁(yè)
計(jì)算機(jī)組成與匯編課件-第4章指令系統(tǒng)層_第5頁(yè)
已閱讀5頁(yè),還剩107頁(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)介

1第4章指令系統(tǒng)層本章主要內(nèi)容:

4.180x86CPU

4.2CPU的寄存器和主存儲(chǔ)器4.380x86指令系統(tǒng)。24.1.180×86CPU內(nèi)部結(jié)構(gòu)4.180x86CPU3(1)執(zhí)行部件EU包括一個(gè)16位算術(shù)邏輯運(yùn)算部件ALU、一組通用寄存器、暫存器、標(biāo)志寄存器,以及EU控制器。各寄存器和內(nèi)部數(shù)據(jù)通路都是16位。EU的主要任務(wù)是執(zhí)行指令功能為:ⅰ:從指令隊(duì)列中取出指令代碼,由EU控制器進(jìn)行譯碼后產(chǎn)生對(duì)應(yīng)的控制信號(hào)到各部件以完成指令規(guī)定的操作。ⅱ:對(duì)操作數(shù)進(jìn)行算術(shù)和邏輯運(yùn)算,并將運(yùn)算結(jié)果的特征狀態(tài)存放在標(biāo)志寄存器中。ⅲ:由于EU不直接與系統(tǒng)總線連接,因此當(dāng)需要與主存儲(chǔ)器或I/O端口傳送數(shù)據(jù)時(shí),EU向BIU發(fā)出命令,并提供給BIU16位有效地址與傳送的數(shù)據(jù)。4(2)總線接口部件BIU包括一組段寄存器、指令指針、6字節(jié)的指令隊(duì)列(8088是4字節(jié))、20位總線地址形成部件,以及總線控制邏輯。BIU的主要任務(wù):完成CPU與主存儲(chǔ)器或I/O端口之間的信息傳送。BIU主要功能:從主存取出指令送到指令隊(duì)列中排隊(duì)。從主存或I/O端口取操作數(shù)或存放運(yùn)算結(jié)果。計(jì)算并形成訪問(wèn)主存的20位物理地址。5段基值:20位段起始地址的高16位,稱為段基值(SegmentBaseValue),存放在BIU的相應(yīng)段寄存器中。偏移地址(偏移量):一個(gè)主存單元與所在段的段基址之間的字節(jié)距離。當(dāng)CPU訪問(wèn)某個(gè)主存單元時(shí),必須指明由哪個(gè)段寄存器提供段基值,同時(shí)又給出偏移地址。然后由BIU將16位段基值左移4位后與16位偏移地址相加,形成20位主存單元的物理地址。物理地址=段基址+偏移地址(3)80×86主存地址的形成

段基址:將1MB主存空間劃分為若干段,每個(gè)段的最大長(zhǎng)度為64KB。段的20位段起始地址稱為段基址。674.2.180x86CPU的寄存器1.80x86CPU的寄存器分類80x86CPU的內(nèi)部寄存器可分為以下3大類:基本結(jié)構(gòu)寄存器組:通用寄存器、指令指針寄存器、標(biāo)志寄存器、段寄存器。系統(tǒng)級(jí)寄存器組:系統(tǒng)地址寄存器、控制寄存器、測(cè)試寄存器、調(diào)試寄存器。浮點(diǎn)寄存器組:數(shù)據(jù)寄存器、標(biāo)記字寄存器、指令和數(shù)據(jù)指針寄存器、控制字寄存器。4.280x86CPU的寄存器和主存儲(chǔ)器82.基本結(jié)構(gòu)寄存器組

寄存器組構(gòu)成:通用寄存器;指令指針寄存器;標(biāo)志寄存器;段寄存器。9(1)通用寄存器圖中除陰影區(qū)以外的寄存器是8086/8088和80286所具有的寄存器,它們都是16位寄存器。其中4個(gè)16位的寄存器AX、BX、CX、DX可稱為數(shù)據(jù)寄存器。這4個(gè)寄存器都是通用寄存器,但它們又可以用于各自的專用目的。

AX(Accumulator)作為累加器用。在乘除等指令中指定用來(lái)存放操作數(shù)。另外,所有的I/O指令都使用這一寄存器與外部設(shè)備傳送信息。

BX(Base)可以作為通用寄存器使用。此外,在計(jì)算存儲(chǔ)器地址時(shí),它經(jīng)常用作基址寄存器。

CX(Count)可以作為通用寄存器使用。此外,它還常用來(lái)保存計(jì)數(shù)值,如在移位指令、循環(huán)(LOOP)和串處理指令中用作隱含的計(jì)數(shù)器。DX可以作為通用寄存器使用。一般在做雙字長(zhǎng)運(yùn)算時(shí)把DX和AX組合在一起存放一個(gè)雙字長(zhǎng)數(shù),DX用來(lái)存放高位字。此外,對(duì)某些I/O操作,DX可用來(lái)存放I/O的端口地址。10

SP、BP、DI、SI

這4個(gè)16位寄存器可以像數(shù)據(jù)寄存器一樣在運(yùn)算過(guò)程中存放操作數(shù),但它們只能以字(16位)為單位使用。此外,它們更經(jīng)常的用途是在存儲(chǔ)器尋址時(shí),提供偏移地址。因此,可稱它們?yōu)橹羔樆蜃冎芳拇嫫鳌#?)指令指針寄存器和標(biāo)志寄存器

IP(InstructionPointer)為指令指針寄存器,它用來(lái)存放代碼段中的偏移地址。IP作為指令的地址指針,其作用類似于其他計(jì)算機(jī)中的程序計(jì)數(shù)器PC,當(dāng)現(xiàn)行指令執(zhí)行完畢時(shí),由IP提供下一條指令地址。FLAGS為標(biāo)志寄存器,又稱PSW(ProgramStatusWord),即程序狀態(tài)寄存器。這是一個(gè)存放條件碼標(biāo)志、控制標(biāo)志和系統(tǒng)標(biāo)志的寄存器。80386及其后繼機(jī)型的指令指針寄存器EIP和標(biāo)志寄存器EFLAGS是32位的,其作用和相應(yīng)的16位寄存器相同。

1180x86CPU中標(biāo)志寄存器的內(nèi)容:12①條件碼標(biāo)志包括以下6位:OF(OverFlowFlag)溢出標(biāo)志。將參加算術(shù)運(yùn)算的數(shù)看作帶符號(hào)數(shù),如運(yùn)算結(jié)果超出補(bǔ)碼表示數(shù)的范圍N,即溢出時(shí),則OF置1;否則OF置0。對(duì)于字節(jié)運(yùn)算有128≤N≤+127;對(duì)于字運(yùn)算有32768≤N≤。SF(SignFlag)符號(hào)標(biāo)志。把指令執(zhí)行結(jié)果看作帶符號(hào)數(shù),如結(jié)果為負(fù),則SF置1;結(jié)果為正,則SF置0。ZF(ZeroFlag)零標(biāo)志。如指令執(zhí)行結(jié)果各位全為0時(shí),則ZF置1;否則ZF置0。CF(CarryFlag)進(jìn)位標(biāo)志。在進(jìn)行算術(shù)運(yùn)算時(shí),如最高位(對(duì)字操作是第15位,對(duì)字節(jié)操作是第7位)產(chǎn)生進(jìn)位或借位時(shí),則CF置1;否則置0。在移位類指令中,CF用來(lái)存放移出的代碼(0或1)。AF(AuxiliaryCarryFlag)輔助進(jìn)位標(biāo)志。在進(jìn)行算術(shù)運(yùn)算時(shí),如低字節(jié)中低4位(第3位)產(chǎn)生進(jìn)位或借位時(shí),則AF置1;否則AF置0。AF可用于十進(jìn)制運(yùn)算的校正。PF(ParityFlag)奇偶標(biāo)志。用來(lái)為機(jī)器中傳送信息時(shí)可能產(chǎn)生的代碼出錯(cuò)情況提供檢驗(yàn)條件。當(dāng)運(yùn)算結(jié)果中1的個(gè)數(shù)為偶數(shù)時(shí)置1,否則置0。13

②控制標(biāo)志位1位

DF(DirectionFlag)方向標(biāo)志,用來(lái)在串處理指令中控制處理信息的方向。當(dāng)DF位為1時(shí),每次操作后使變址寄存器SI和DI減小,這樣就使串處理從高地址向低地址方向處理。當(dāng)DF位為0時(shí),則使SI和DI增大,使串處理從低地址向高地址方向處理。③系統(tǒng)標(biāo)志位有10位:

TF(TrapFlag)陷阱標(biāo)志,用于調(diào)試時(shí)的單步方式操作。

IF(InterruptFlag)中斷標(biāo)志。

IOPL(I/OPrivilegeLevel)I/O特權(quán)級(jí)標(biāo)志。

NT(NestedTask)嵌套任務(wù)標(biāo)志,用來(lái)表示當(dāng)前的任務(wù)是否嵌套在另一任務(wù)內(nèi)。

14

RF(ResumeFlag)恢復(fù)標(biāo)志位,它與調(diào)試寄存器的斷點(diǎn)一起使用,以保證不重復(fù)處理斷點(diǎn)。

VM(Virtual-8086Mode)虛擬8086模式位。AC(AlignmentCheckmode)對(duì)準(zhǔn)檢查方式位。VIF(VirtualInterruptFlag)虛擬中斷標(biāo)志。VIP(VirtualInterruptPendingflag)虛擬中斷未決標(biāo)志。ID(IDentificationflag)標(biāo)識(shí)標(biāo)志,程序有設(shè)置和清除ID標(biāo)識(shí)的能力,以指示處理機(jī)對(duì)CPUID指令的支持。15

在調(diào)試程序DEBUG中提供了測(cè)試標(biāo)志位的手段,它用符號(hào)表示某些標(biāo)志位的值:標(biāo)志名標(biāo)志為1標(biāo)志為0OF溢出(是/否)OVNVDF方向(增量/減量)DNUPIF中斷(允許/關(guān)閉)EIDISF符號(hào)(正/負(fù))NGPLZF零(是/否)ZRNZAF輔助進(jìn)位(是/否)ACNAPF奇偶(偶/奇)PEPOCF進(jìn)位(是/否)CYNC16(3)段寄存器

段寄存器用于存儲(chǔ)器尋址,用來(lái)直接或間接地存放段地址。段寄存器的長(zhǎng)度為16位,在80286以前的處理器中,只有代碼段CS(CodeSegment)、數(shù)據(jù)段DS(DataSegment)、堆棧段SS(StackSegment)和附加段ES(ExtraSegment)4個(gè)寄存器。從80386起,增加了FS和GS兩個(gè)段寄存器,它們也屬于附加的數(shù)據(jù)段。174.2.280x86的主存儲(chǔ)器

1.存儲(chǔ)單元的地址和內(nèi)容

18

在存儲(chǔ)器里以字節(jié)為單位存儲(chǔ)信息。為了正確地存放或取得信息,每一個(gè)字節(jié)單元給予一個(gè)唯一的編號(hào)即存儲(chǔ)器地址,稱為物理地址。地址從0開(kāi)始編號(hào),順序地每次加1,因此存儲(chǔ)器的物理地址空間呈線性增長(zhǎng)。在機(jī)器里,地址也是用二進(jìn)制數(shù)來(lái)表示的。當(dāng)然它是無(wú)符號(hào)整數(shù),書(shū)寫(xiě)格式為十六進(jìn)制數(shù)。

8086/8088的地址總線20位:可訪問(wèn)的字節(jié)單元地址范圍為00000H~FFFFFH;80286的地址總線24位:可訪問(wèn)的地址范圍為000000H~FFFFFFH;80386/80486和Pentium地址總線32位:地址范圍為00000000H~FFFFFFFFH;PentiumPro和PⅡ地址總線36位:地址范圍為000000000H~FFFFFFFFFH。

19

一個(gè)存儲(chǔ)單元中存放的信息稱為該存儲(chǔ)單元的內(nèi)容,右圖表示了存儲(chǔ)器里存放信息的情況。

0004H號(hào)字節(jié)單元中存放的信息為78H,表示為:(0004H)=78H

兩個(gè)字節(jié)單元就構(gòu)成了一個(gè)字單元,字單元的地址采用它的低地址來(lái)表示。右圖中0004H字單元的內(nèi)容為5678H,表示為(0004H)=5678H

雙字單元的地址由其最低字節(jié)的地址指定,因此0004H雙字單元的內(nèi)容為:(0004H)=12345678H。

20

2.實(shí)模式存儲(chǔ)器尋址80x86中除8086/8088只能在實(shí)模式下工作外,其他的CPU均可在實(shí)模式或保護(hù)模式下工作。(1)存儲(chǔ)器的分段實(shí)模式下允許的最大尋址空間為1MB。8086/8088的地址總線寬度為20位,因而其最大尋址空間正好是1MB。在1MB的存儲(chǔ)器里,每個(gè)存儲(chǔ)單元都有一個(gè)唯一的20位地址,稱為物理地址。而對(duì)于其他微處理器在實(shí)模式下只能訪問(wèn)前1MB的存儲(chǔ)器地址。21實(shí)模式存儲(chǔ)器尋址過(guò)程如下圖所示:22(2)段寄存器在8086~80286中,有4個(gè)專門存放段基值的寄存器,稱為段寄存器。它們分別是代碼段CS、數(shù)據(jù)段DS、堆棧段SS和附加段ES寄存器。每個(gè)段寄存器可以確定一個(gè)段的起始地址,而這些段則各有各的用途。代碼段存放當(dāng)前正在運(yùn)行的程序。數(shù)據(jù)段存放當(dāng)前運(yùn)行程序所用的數(shù)據(jù)。堆棧段定義了堆棧的所在區(qū)域。附加段是附加的數(shù)據(jù)段,它是一個(gè)輔助的數(shù)據(jù)區(qū),也是串處理指令的目的操作數(shù)存放區(qū)。

在80386及其后繼的80x86中,除上述4個(gè)段寄存器外,又增加了2個(gè)段寄存器FS和GS,它們也是附加的數(shù)據(jù)段寄存器,所以8086~80286的程序允許4個(gè)存儲(chǔ)段,而后繼的80x86程序可允許6個(gè)存儲(chǔ)段。

23一般情況下,各段在存儲(chǔ)器中的分配是由操作系統(tǒng)負(fù)責(zé)的。每個(gè)段可以獨(dú)立地占用小于或等于64KB的存儲(chǔ)區(qū),如右圖所示。

24

【例】如果代碼段中的程序占有8KB(2000H)存儲(chǔ)區(qū),數(shù)據(jù)段占有2KB(800H)存儲(chǔ)區(qū),堆棧段只占有256B的存儲(chǔ)區(qū),此時(shí)段區(qū)的分配如右圖所示。從圖中可以看出,代碼段的區(qū)域可以是02000H~03FFFH,但由于程序區(qū)只需要8KB,所以程序區(qū)結(jié)束后的第一個(gè)小段的首地址就作為數(shù)據(jù)段的起始地址。也就是說(shuō),在這里,代碼段和數(shù)據(jù)段可以重疊在一起。當(dāng)然每個(gè)存儲(chǔ)單元的內(nèi)容是不允許發(fā)生沖突的。這里所謂的重疊只是指每個(gè)段區(qū)的大小允許根據(jù)實(shí)際需要來(lái)分配,而不一定要占有64KB的最大段空間。254.380x86CPU的指令系統(tǒng)

80x86CPU采用了變字長(zhǎng)的機(jī)器指令格式,由1~15個(gè)字節(jié)組成一條指令。一般格式如下圖所示:264.3.180x86尋址方式

指令中的尋址方式是用來(lái)確定操作數(shù)地址以找到指令所需的操作數(shù)。

1.立即尋址方式和寄存器尋址方式

(1)立即尋址方式(ImmediateAddressing)

立即數(shù)尋址是指指令所需的操作數(shù)直接在指令代碼中,隨著取指令一起取到CPU中。這種操作數(shù)稱為立即數(shù)。立即數(shù)可以是8位或16位的。對(duì)于80386及其后繼機(jī)型則可以是8位或32位的。這種尋址方式如下圖所示:27

作用:立即數(shù)用來(lái)表示常數(shù),它經(jīng)常用于給寄存器賦初值,并且只能用于源操作數(shù)字段,不能用于目的操作數(shù)字段,且源操作數(shù)長(zhǎng)度應(yīng)與目的操作數(shù)長(zhǎng)度一致。注意:在匯編指令中,立即數(shù)若是數(shù)值常數(shù)可直接書(shū)寫(xiě),若是字符常數(shù)則應(yīng)加上引號(hào)。28【例】下述匯編指令的源操作數(shù)都采用立即尋址方式。MOVAL,05H將8位立即數(shù)05H送入AL中

MOVAX,0B064HMOVBX,"AB"MOVEAX,12345678H

在匯編指令中,立即數(shù)若是以A~F開(kāi)始的十六進(jìn)制數(shù),則必須在數(shù)前面加上0,如上述第二條指令,否則匯編程序會(huì)將立即數(shù)當(dāng)作符號(hào)處理。29

寄存器尋址是指指令所需的操作數(shù)存放在CPU的寄存器(通用寄存器或段寄存器)中,通過(guò)指令中的寄存器地址去找到操作數(shù)。

(2)寄存器尋址方式(RegisterAddressing)

在匯編指令中,寄存器地址直接用寄存器名表示,如用AX、BX、AL、BH、EAX、EBX、DS、ES等,這些寄存器可以是8位的、16位的或32位。這種尋址方式如下圖所示:30

【例】MOVBL,AL將AL中的內(nèi)容送到BL中

MOVDS,AXMOVECX,EDX【例】指令“MOVAX,BX”的源和目的操作數(shù)都采用寄存器尋址方式,該指令完成將BX中的內(nèi)容送到AX中。如指令執(zhí)行前(AX)

3064H,(BX)

1234H;則指令執(zhí)行后,(AX)

1234H,(BX)保持不變。312.存儲(chǔ)器尋址方式

操作數(shù)地址(物理地址)是根據(jù)段基值(或段選擇器)和偏移地址通過(guò)一定的方法得到。段基址在實(shí)模式和保護(hù)模式下可從不同的途徑取得。偏移地址是指存放操作數(shù)的存儲(chǔ)單元與段起始地址(段基址)之間的字節(jié)距離。在80x86里,把按尋址方式計(jì)算出來(lái)的操作數(shù)偏移地址稱為有效地址EA(EffectiveAddress)。

在匯編語(yǔ)言程序中,一個(gè)存儲(chǔ)單元的地址采用邏輯地址來(lái)表示,其形式為:段基值(或選段擇器):偏移地址32

存儲(chǔ)器操作數(shù)的尋址方式不同,則形成有效地址EA的方法就不同。有效地址EA可以由4個(gè)地址分量的某種組合求得,它們分別是:①位移量它是指令代碼中的一個(gè)8位、16位或32位二進(jìn)制數(shù),但它不是立即數(shù),而是一個(gè)地址量。在源程序中,位移量通常以符號(hào)地址(變量名或標(biāo)號(hào))的形式出現(xiàn),也可以是常數(shù),經(jīng)匯編后,這些符號(hào)地址的偏移地址或常數(shù)就轉(zhuǎn)換為指令代碼中的位移量。②基地址即基址寄存器或基址指針的內(nèi)容。③變址量即變址寄存器的內(nèi)容。④比例因子(ScaleFactor)它是80386及其后繼機(jī)型新增加的尋址方式中的一個(gè)術(shù)語(yǔ),其值可為1,2,4或8。在含比例因子的尋址方式中,可用變址寄存器的內(nèi)容乘以比例因子來(lái)取得變址值。

33地址分量16位尋址32位尋址位移量0,8,16位0,8,32位基址寄存器BX,BP任何32位通用寄存器(包括ESP)變址寄存器SI,DI除ESP以外的32位通用寄存器比例因子無(wú)1,2,4,816/32位尋址時(shí)有效地址4種分量的組成

8086/80286只能使用16位尋址,而80386及其后繼機(jī)型則既可用32位尋址,也可用16位尋址。在這兩種情況下,對(duì)以上4個(gè)地址分量的組成有不同的規(guī)定,如下表所示:34

對(duì)不同的存儲(chǔ)器尋址方式,構(gòu)成其有效地址EA的地址分量是不同的,但這些尋址方式的有效地址的計(jì)算都可以用下式表示:EA=基地址+(變址量

比例因子)+位移量(1)直接尋址方式(DirectAddressing)

直接尋址是指指令所需的操作數(shù)存放在存儲(chǔ)單元中,操作數(shù)的有效地址EA直接由指令代碼中的位移量提供,即EA只包含位移量這一種地址分量。此時(shí),位移量的值就是操作數(shù)的有效地址,如下圖所示:

上式中的每一個(gè)地址分量均可空缺,但比例因子只能與變址寄存器同時(shí)使用。35

①用數(shù)值地址表示EA在采用直接尋址方式的匯編指令中,如用數(shù)值表示操作數(shù)的有效地址,則操作數(shù)所在段的段寄存器必須指明,不能省略。例如,傳送指令源操作數(shù)的有效地址用數(shù)值地址表示:MOVBX,DS:[1000H]這條指令完成將當(dāng)前數(shù)據(jù)段偏移1000H個(gè)字節(jié)的字單元內(nèi)容1234H送入BX中,如上圖所示,其中源操作數(shù)的有效地址EA是1000H。“MODR/M”是指令代碼中的尋址字段。36②用符號(hào)地址表示EA在源程序中,常用符號(hào)地址表示存放操作數(shù)的存儲(chǔ)單元,因此在匯編指令中,可用符號(hào)地址表示的直接尋址方式來(lái)存取操作數(shù)。

操作數(shù)如果存放在數(shù)據(jù)段中,則指令中不必給出數(shù)據(jù)段寄存器名(即默認(rèn)使用DS);如果操作數(shù)不是存放在數(shù)據(jù)段中,則必須給出段寄存器名。例如:MOVBX,VAR

;將VAR指向的字單元內(nèi)容送到BX中MOVDA_BYTE,0FH

;將立即數(shù)0FH置入DA_BYTE指向的字節(jié)單元MOVCL,DA+3

;把由DA地址偏移3個(gè)字節(jié)的字節(jié)單元內(nèi)容送到CL中

上述3條指令分別等價(jià)于:MOVBX,DS:VARMOVDS:DA_BYTE,0FHMOVCL,DS:DA+3

37(2)寄存器間接尋址方式(RegisterIndirectAddressing)

寄存器間接尋址是指指令所需的操作數(shù)在存儲(chǔ)單元中,操作數(shù)的有效地址EA直接從基址寄存器或變址寄存器中獲得,即EA是包含基址寄存器內(nèi)容(或變址寄存器內(nèi)容)的一個(gè)地址分量。這種尋址方式如下圖所示:這種尋址方式實(shí)際上是將有效地址事先存放在一個(gè)寄存器中,因此這個(gè)寄存器就如同一個(gè)地址指針。38

由于用寄存器作為地址指針,因此在程序中只要修改間址寄存器的內(nèi)容,就可以用同一條指令訪問(wèn)不同的存儲(chǔ)單元。這種尋址方式的使用格式如下:

MOVCH,[SI]MOV[DI],BXMOVAL,[BX]MOVCX,[BP]上述指令分別等價(jià)于:

MOVCH,DS:[SI] MOVDS:[DI],BX MOVAL,DS:[BX] MOVCX,SS:[BP]

寄存器尋址方式在16位尋址時(shí)可用的寄存器是BX、BP、SI和DI;在32位尋址時(shí)可用EAX、EBX、ECX、EDX、ESP、EBP、ESI和EDI等8個(gè)通用寄存器。凡使用BP、ESP和EBP時(shí),其默認(rèn)段為SS段。其他寄存器的默認(rèn)段為DS寄存器。39(3)寄存器相對(duì)尋址方式(RegisterRelativeAddressing)(也稱變址尋址方式或基址尋址方式)

指令所需的操作數(shù)在存儲(chǔ)單元中,操作數(shù)的有效地址EA是兩個(gè)地址分量之和:基址寄存器(或變址寄存器)的內(nèi)容與指令中指定的位移量之和。這種尋址方式如下圖所示:

這種尋址方式若使用的是變址寄存器稱為變址尋址方式;若使用的是基址寄存器稱為基址尋址方式。它所允許使用的寄存器及與其對(duì)應(yīng)的默認(rèn)段情況與寄存器間接尋址方式中所說(shuō)明的相同。40

在匯編指令中,位移量部分可用數(shù)值表示,也可用符號(hào)地址表示(此時(shí)用符號(hào)地址的偏移地址作為位移量),其尋址方式的使用格式如下:MOVAX,10H[SI];位移量為8位常數(shù),EA=10H+(SI),默認(rèn)段寄存器DSMOVTAB1[BP],CL;位移量為符號(hào)地址TAB1的16位偏移地址,默認(rèn)段寄存器是SS

寄存器相對(duì)尋址方式常用來(lái)訪問(wèn)順序存放在主存中的一維數(shù)組、表、字符串等。其典型用法是將指令中不能修改的位移量作為基準(zhǔn)地址,而將變址或基址寄存器內(nèi)容作為修改量。例如數(shù)組的起始單元位置是固定的,因此由指令中的位移量給出;而被訪問(wèn)的數(shù)組元素相對(duì)其起始單元的距離由變址或基址寄存器提供,通過(guò)修改寄存器的內(nèi)容就可以訪問(wèn)數(shù)組中不同的元素。41【例】如右圖所示,一維數(shù)組ARY存放在主存的數(shù)據(jù)段中,數(shù)組的每個(gè)元素長(zhǎng)度相同且都占2個(gè)字節(jié)單元。從數(shù)組的首址起依次存放各數(shù)組元素ARY(0)、ARY(1)、ARY(2)…、ARY(i)、…。傳送指令:

MOVAX,ARY[SI]

可用來(lái)訪問(wèn)數(shù)組中的元素,指令中的符號(hào)地址ARY指向該數(shù)組的首址;變址寄存器SI的內(nèi)容表示所訪問(wèn)元素與數(shù)組首址之間的字節(jié)距離,則所訪問(wèn)元素的有效地址:EA=ARY的偏移地址+(SI)當(dāng)SI內(nèi)容為0時(shí),將訪問(wèn)ARY(0)元素;SI內(nèi)容為1*2時(shí)訪問(wèn)ARY(1)元素;SI內(nèi)容為i*2時(shí)訪問(wèn)ARY(i),即通過(guò)修改SI的內(nèi)容可以訪問(wèn)數(shù)組中任何一個(gè)元素。右圖給出了訪問(wèn)數(shù)組元素ARY(2)的尋址過(guò)程。用寄存器相對(duì)尋址方式訪問(wèn)一維數(shù)組42(4)基址變址尋址方式(BasedIndexedAddressing)

指令所需的操作數(shù)在主存單元中,操作數(shù)的有效地址EA是三個(gè)地址分量之和:基址寄存器內(nèi)容、變址寄存器內(nèi)容與指令中的位移量(0位、8位、16位或32位)之和,稱為基址變址尋址方式,如下圖所示:

43

基址變址尋址方式的位移量可用數(shù)值或符號(hào)地址表示,其使用格式如下:

MOVAX,200H[BX][SI];位移量為16位常數(shù),EA=200H+(BX)+(SI),默認(rèn)段寄存器為DS

MOVAX,ARRAY[BP][SI];位移量為符號(hào)地址ARRAY的16位偏移地址,默認(rèn)段寄存器為SS

MOV[BP][DI],DL;位移量為0,EA=(BP)+(DI),默認(rèn)段寄存器為SS

由于基址變址尋址方式中有兩個(gè)地址分量可以在程序執(zhí)行過(guò)程中進(jìn)行修改,因此常用來(lái)訪問(wèn)存放在主存中的二維數(shù)組。44【例】如右圖所示,ARRAY數(shù)組是10行、10列的二維數(shù)組,按行存放在主存堆棧段中。從數(shù)組的首址ARRAY起依次存放各數(shù)組元素:第0行元素為ARRAY(0,0)~ARRAY(0,9)共10個(gè),第1行元素為ARRAY(1,0)~ARRAY(1,9),…。每個(gè)元素占用一個(gè)字節(jié)單元。可以用指令:MOVAXARRAY[BP][SI]EAARRAY的偏移地址+(BP)+(SI),段基值隱含由SS給出。右上圖給出了訪問(wèn)數(shù)組第1行第8列元素ARRAY(1,8)的尋址過(guò)程。45

(5)比例變址尋址方式(ScaledIndexedAddressing)

指令所需的操作數(shù)在主存單元中,操作數(shù)的有效地址EA是變址寄存器的內(nèi)容乘以指令中指定的比例因子再加上位移量之和,所以EA由3種成分組成。這種尋址方式如下圖所示:

這種尋址方式與相對(duì)寄存器尋址相比,增加了比例因子,其優(yōu)點(diǎn)在于:對(duì)于元素大小為2,4,8字節(jié)的數(shù)組,可以在變址寄存器中給出數(shù)組元素下標(biāo),而由尋址方式控制直接用比例因子把下標(biāo)轉(zhuǎn)換為變址值。46

【例】MOVEAX,COUNT[ESI*4];如要求把雙字?jǐn)?shù)組COUNT中的元素3送到EAX中,用這種尋址方式可直接在ESI中放入3,選擇比例因子4(數(shù)組元素為4字節(jié)長(zhǎng))就可以方便地達(dá)到目的,如下圖所示,而不必像在相對(duì)寄存器尋址方式中那樣,要把變址值直接裝入寄存器中。47

(6)基址比例變址尋址方式(BasedScaledIndexedAddressing)

指令所需的操作數(shù)在主存單元中,操作數(shù)的有效地址是變址寄存器的內(nèi)容乘以比例因子,加上基址寄存器的內(nèi)容,再加上位移量(0位、8位或32位)之和,所以有效地址EA由4種成分組成。這種尋址方式如下圖所示。

這種尋址方式比基址變址方式增加了比例因子,便于對(duì)元素為2,4,8字節(jié)的二維數(shù)組進(jìn)行處理?!纠?】MOVEAX,TABLE[EBP][EDI*4]48

3.串操作尋址方式(StringAddressing)

80x86提供專門的串操作指令,這些指令所用的操作數(shù)也在存儲(chǔ)器中,但它們不能使用上述尋址方式,而是隱含使用變址寄存器SI、ESI、DI或EDI,如下圖所示。串操作指令規(guī)定,隱含使用SI或ESI作為在數(shù)據(jù)段中的源串(即源操作數(shù))的地址指針;隱含使用DI或EDI作為在附加段中的目的串的地址指針。在完成一次串操作后,指令自動(dòng)修改SI或ESI、DI或EDI兩個(gè)地址指針,使SI或ESI、DI或EDI指向下一個(gè)串元素的存儲(chǔ)單元。4.I/O端口尋址方式49無(wú)操作數(shù)指令單操作數(shù)指令雙操作數(shù)指令OPDST,SRC;雙操作數(shù)指令OPSRC;單操作數(shù)指令OP;無(wú)操作數(shù)指令4.3.280x86CPU指令系統(tǒng)50指令分類:數(shù)據(jù)傳送指令、算術(shù)運(yùn)算指令位操作指令、串操作指令轉(zhuǎn)移指令、標(biāo)志處理指令處理器控制指令等

1.通用數(shù)據(jù)傳送指令包括:數(shù)據(jù)傳送指令、符號(hào)擴(kuò)展傳送指令、字/雙字壓棧和出棧指令、寄存器壓棧和出棧指令、交換指令以及換碼指令。51(1)數(shù)據(jù)傳送指令(MOV指令)指令格式:

其中:DST:目的操作數(shù)可以是存儲(chǔ)器、通用寄存器、段寄存器(CS除外)操作數(shù);

SRC:源操作數(shù)可以是立即數(shù)、存儲(chǔ)器、通用寄存器、段寄存器(包括CS)操作數(shù)。執(zhí)行操作:DST←SRC;指令功能:把一個(gè)字節(jié)或字或雙字從源操作數(shù)送目的操作數(shù)。

MOVDST,SRC521)通用寄存器之間數(shù)據(jù)傳送(MOVreg,reg)【例】MOVAL,BL;8位通用寄存器之間數(shù)據(jù)傳送MOVAX,BX;16位通用寄存器之間數(shù)據(jù)傳送

2)立即數(shù)送通用寄存器(MOVreg,data)立即數(shù)不能在目的操作數(shù)位置。立即數(shù)不能超出目的操作數(shù)所指定的大小?!纠縈OVCL,4;立即數(shù)4送字節(jié)寄存器CL中MOVAX,03FFH;立即數(shù)03FFH送字寄存器AX中53

3)通用寄存器和存儲(chǔ)器之間傳送(MOVreg,mem/MOVmem,reg)

【例】MOVAX,X;設(shè)X為變量,存儲(chǔ)器到寄存器MOVSI,ES:[BP];存儲(chǔ)器到寄存器

4)立即數(shù)送存儲(chǔ)器(MOVmem,data)【例】MOVA,3;A為已定義的變量

MOVWORDPTR[BX],3;3為16位數(shù)5)段寄存器與通用寄存器傳送(除IP以外)(MOVsegreg,reg/MOVreg,segreg)CS段寄存器不能為目的操作數(shù)

【例3】MOVAX,ES;段寄存器送通用寄存器

MOVDS,AX;通用寄存器送段寄存器546)段寄存器與存儲(chǔ)器傳送(MOVsegreg,mem/MOVmem,segreg)

【例】MOVDS,DATA[BX+SI];存儲(chǔ)器送段寄存器【例】要實(shí)現(xiàn)在數(shù)據(jù)段中的存儲(chǔ)器2000H單元中的一個(gè)字送存儲(chǔ)器1000H單元中。

MOVAX,DS:[2000H]MOVDS:[1000],AX需要注意的問(wèn)題:1)

源操作數(shù)和目操作數(shù)的類型要匹配

2)

目的操作數(shù)不能是立即數(shù),立即數(shù)不能直接送段寄存器

3)

源操作數(shù)、目的操作數(shù)不能同時(shí)為內(nèi)存操作數(shù)

4)

源操作數(shù)和目的操作數(shù)不能同時(shí)為段寄存器

5)

不能將任何數(shù)據(jù)傳送給CS寄存器6)指令指針I(yè)P不能作為操作數(shù)7)

MOV指令不影響標(biāo)志寄存器55(2)符號(hào)擴(kuò)展傳送指令(MOVSX)指令格式:

其中:SRC:源操作數(shù)可以是8位或16位的寄存器或存儲(chǔ)器單元的內(nèi)容。

DST:目的操作數(shù)則必須是16位或32位寄存器。執(zhí)行操作:DST←符號(hào)擴(kuò)展/零擴(kuò)展(SRC)。指令功能:把源操作數(shù)符號(hào)擴(kuò)展后送入目的寄存器(MOVSX)。把源操作數(shù)零擴(kuò)展后送入目的寄存器(MOVZX)。符號(hào)擴(kuò)展傳送指令只有2種格式:

MOVSX/MOVZXDST,SRC

MOVSX/MOVZXreg1,reg2MOVSX/MOVZXreg,mem56需要注意的問(wèn)題:1)

必須是8位符號(hào)擴(kuò)展到16位或32位,也可以是16位符號(hào)擴(kuò)展到32位。2)

MOVSX的源操作數(shù)是帶符號(hào)數(shù),所以作符號(hào)擴(kuò)展。3)

MOVZX的源操作數(shù)應(yīng)是無(wú)符號(hào)整數(shù),不論源操作數(shù)的符號(hào)位是否為1,擴(kuò)展時(shí)高位均為零。4)

MOVSX和MOVZX的源操作數(shù)長(zhǎng)度一定要小于目的操作數(shù)長(zhǎng)度。5)

MOVSX/MOVZX不影響標(biāo)志寄存器。

57【例】設(shè)寄存器EAX=OOFFFFFFH,BL=86H,執(zhí)行下列指令后EAX中存放的內(nèi)容?

MOVSXEAX,BL(MOVSXreg,reg)執(zhí)行指令后EAX=FFFFFF86H【例】設(shè)寄存器EAX=OOFFFFFFH,BL=86H,執(zhí)行下列指令后EAX中存放的內(nèi)容?

MOVZXEAX,BL(MOVSXreg,reg)執(zhí)行指令后EAX=00000086H58

(3)入棧/出棧(PUSH/POP)指令格式:

其中:SRC源操作數(shù)可以是16位或32位的寄存器、存儲(chǔ)器、段寄存器、立即數(shù)。功能:PUSH指令可以將通用寄存器,段寄存器、存儲(chǔ)器、立即數(shù)中的一個(gè)字或雙字推進(jìn)棧頂。執(zhí)行操作:16位指令:SP←SP一2[SP+1,SP]←SRC32位指令:ESP←ESP一4[ESP+3,ESP+2,ESP+1,ESP]←SRC

PUSHSRC59指令格式:

其中:DST:目的操作數(shù)則必須是16位或32位寄存器、存儲(chǔ)器、段寄存器(除CS以外)。功能:將現(xiàn)行的SP/ESP所指棧頂?shù)囊粋€(gè)字/雙字傳到寄存器、存儲(chǔ)器、段寄存器(除CS以外)。執(zhí)行操作:16位指令:DST←[SP+l,SP]SP←SP+232位指令:DST←[ESP+3,ESP+2,ESP+1,ESP]ESP←ESP+4POPDST60需要注意的問(wèn)題:1)

當(dāng)堆棧地址長(zhǎng)度為16位時(shí)用SP,堆棧地址長(zhǎng)度為32位時(shí)用ESP。2)堆棧的存取在16位指令中必須以字為單位,在32位指令中必須以雙字為單位,所以PUSH和POP指令只能作字或雙字操作。3)

PUSH指令可以有4種格式:

PUSHregPUSHsegregPUSHmem(386以上)

PUSHdata(286以上)4)POP指令可以有3種格式:

POPreg

POPmemPOPsegreg(除CS以外)5)SP/ESP總是指向棧頂,棧底是高地址。6)當(dāng)?shù)刂烽L(zhǎng)度為16位時(shí),使用SP作為堆棧指針,進(jìn)出棧只能是字;當(dāng)?shù)刂烽L(zhǎng)度為32位時(shí),使用ESP作為堆棧指針,進(jìn)出棧的可以是字,也可以是雙字。7)

PUSH和POP指令不影響標(biāo)志寄存器。61【例】設(shè)AX=1234H,SP=0100,請(qǐng)畫(huà)出執(zhí)行PUSHAX前后的堆棧圖,執(zhí)行這條指令后SP=?執(zhí)行步驟:SP=SP-2;

[SP+1,SP]←AX62

(5)交換指令(XCHG)指令格式:

功能:把一個(gè)字或一個(gè)字節(jié)的源操作數(shù)與目的操作數(shù)進(jìn)行互換。執(zhí)行操作:DST←→SCR

需要注意的問(wèn)題:

1)

只能通用寄存器與通用寄存器互換

2)

只能通用寄存器與存儲(chǔ)器互換

3)

段寄存器不能作為XCHG的操作數(shù)

4)

該指令不影響標(biāo)志

5)

交換指令的約束與MOV相同(除立即數(shù)尋址方式)

6)

386以上機(jī)型允許雙字操作

XCHGDST,SCR63【例】XCHGAX,BX;通用寄存器間互換,字互換XCHGAL,BL;字節(jié)互換XCHGWORD,DX;存儲(chǔ)器通用寄存器互換,字互換XCHGDL,BYTE;字節(jié)互換

642.算術(shù)運(yùn)算類指令算術(shù)運(yùn)算類指令包括加、減、乘、除4種指令。這類指令可以對(duì)字節(jié)、字或雙字?jǐn)?shù)據(jù)進(jìn)行運(yùn)算,參加運(yùn)算的數(shù)可以是無(wú)符號(hào)數(shù)或帶符號(hào)數(shù)。由于80x86提供十進(jìn)制數(shù)運(yùn)算校正指令,因此參加運(yùn)算的數(shù)也可以是BCD碼表示的十進(jìn)制數(shù)。這類指令中既有雙操作數(shù)指令,也有單操作數(shù)指令。如前所述,雙操作數(shù)指令的兩個(gè)操作數(shù)不能同時(shí)為存儲(chǔ)器操作數(shù),且只有源操作數(shù)可為立即數(shù)。單操作數(shù)指令不允許使用立即數(shù)尋址方式。(1)加法運(yùn)算指令

ADD(ADD)加法ADC(ADDwithCarry)帶進(jìn)位加法INC(INCrement)加1XADD(eXchangeandADD)交換并相加65①ADD加法指令

指令格式:ADDDEST,SRC

指令功能:DEST(SRC)+(DEST),即源操作數(shù)與目的操作數(shù)相加,其和送入目的地址中。并根據(jù)相加結(jié)果設(shè)置FLAGS的OF、SF、ZF、AF、PF和CF標(biāo)志位。該指令執(zhí)行后,源操作數(shù)保持不變?!纠?-29】加法指令的常用格式有: ADDBX,SI ADDDA_WORD,0F8CH ADDDL,TAB[BX] ADDEAX,EDX

66下面以指令“ADDDL,0A4H”為例,給出該指令的相加及標(biāo)志位設(shè)置過(guò)程。設(shè)DL的內(nèi)容為0E5H:結(jié)果不為零,則ZF0;結(jié)果無(wú)溢出,則OF0;結(jié)果中有奇數(shù)個(gè)1,則PF0。

需要指出,溢出位OF表示帶符號(hào)數(shù)的溢出,它是根據(jù)數(shù)的符號(hào)及其變化來(lái)設(shè)置的。而CF位可以表示無(wú)符號(hào)數(shù)的溢出。67②ADC帶進(jìn)位加法指令

指令格式:ADCDEST,SRC

指令功能:DEST(SRC)+(DEST)+CF,即在完成兩個(gè)操作數(shù)相加的同時(shí),將標(biāo)志位CF的值加上,求出的和數(shù)送入目的地址中;并根據(jù)相加的結(jié)果設(shè)置標(biāo)志位OF、SF、ZF、AF、PF和CF?!纠?-30】在8086/80286中實(shí)現(xiàn)兩個(gè)雙精度數(shù)的加法。有一個(gè)32位無(wú)符號(hào)數(shù)存放在DX(高16位)、AX(低16位)中,若要加上常數(shù)76F1A23H,則用以下指令來(lái)實(shí)現(xiàn): ADDAX,1A23H ADCDX,76FH其中第一條指令完成把16位常數(shù)加在AX中,若產(chǎn)生進(jìn)位,則記錄在CF中。由ADC指令在完成高16位相加的同時(shí),將低16位的進(jìn)位也加上。

68③INC加1指令

指令格式:INCDEST

指令功能:DEST(DEST)+1,即目的操作數(shù)加1后送回目的地址中,并根據(jù)執(zhí)行結(jié)果設(shè)置標(biāo)志位OF、SF、ZF、AF和PF,但不影響CF。INC指令只有一個(gè)操作數(shù),操作數(shù)可以是字節(jié)、字或雙字,且被當(dāng)作無(wú)符號(hào)數(shù)。④XADD交換并相加指令

指令格式:XADDDEST,SRC

指令功能:TEMP(SRC)+(DEST)SRC(DEST)DEST(TEMP)該指令的源操作數(shù)只能用寄存器尋址方式,目的操作數(shù)則可用寄存器或任一種存儲(chǔ)器尋址方式。對(duì)標(biāo)志位的影響同ADD指令,且只能用于80486及其后繼機(jī)型。

【例4-31】指令“XADDBL,DL”執(zhí)行前,如果(BL)

12H,(DL)

02H,則指令執(zhí)行后(BL)

14H,(DL)

12H。69(2)減法運(yùn)算指令

SUB(SUBtract)減法。

SBB(SuBtractwithBorrow)帶借位減法。

DEC(DECrement)減1。

NEG(NEGate)求補(bǔ)。

CMP(CoMPare)比較。

CMPXCHG(CoMPareandeXCHanGe)比較并交換。

CMPXCHG8B(CoMPareandeXCHanGe8Byte)比較并交換8字節(jié)。70①SUB減法指令

指令格式:SUBDEST,SRC

指令功能:DEST(DEST)(SRC),即完成從目的操作數(shù)中減去源操作數(shù),其差值送入目的地址中;并按相減結(jié)果設(shè)置標(biāo)志位OF、SF、ZF、AF、PF和CF。【例4-32】SUB指令的常用格式如下: SUBAL,3FH SUBBX,AX SUBDA,EDX71

下面以指令“SUBAL,DAB”為例,給出該指令的相減及設(shè)置標(biāo)志位過(guò)程。設(shè)AL內(nèi)容為B7H,DAB字節(jié)單元內(nèi)容為A8H:結(jié)果不為零,則ZF0;結(jié)果無(wú)溢出,則OF0;結(jié)果中有偶數(shù)個(gè)1,則PF1。72②SBB帶借位減法指令

指令格式:SBBDEST,SRC

指令功能:DEST(DEST)(SRC)

CF,即在完成兩個(gè)操作數(shù)相減的同時(shí),還要減去借位位CF,相減結(jié)果送入目的地址中;并設(shè)置標(biāo)志位OF、SF、ZF、AF、PF和CF。③DEC減1指令

指令格式:DECDEST指令功能:DEST(DEST)1,即目的操作數(shù)減1后送回目的地址中;并根據(jù)執(zhí)行結(jié)果設(shè)置標(biāo)志位OF、SF、ZF、AF和PF,但不影響CF。73④NEG求補(bǔ)指令指令格式:NEGDEST指令功能:DEST0(DEST),即用零減去目的操作數(shù),相減結(jié)果送回目的地址中;并按結(jié)果設(shè)置標(biāo)志位OF、SF、ZF、AF、PF和CF。NEG指令屬單操作數(shù)指令,操作數(shù)可以是字節(jié)、字或雙字,且被當(dāng)作補(bǔ)碼表示的帶符號(hào)數(shù)。如果字節(jié)操作數(shù)是128、字操作數(shù)是32768,在執(zhí)行NEG指令后,操作數(shù)不變,但溢出標(biāo)志OF置1。這是由于+128或超出了8位或16位帶符號(hào)數(shù)的表示范圍,即產(chǎn)生了溢出。如操作數(shù)為零,求負(fù)的結(jié)果仍為零,則標(biāo)志位CF置0;否則CF置1。74NEGALNEGBL以上指令執(zhí)行后,AL中為負(fù)數(shù)25H的補(bǔ)碼:(AL)

DBH11011011B。BL中則為正數(shù):(BL)

58H01011000B?!纠?-34】設(shè)AL中存放一正數(shù):(AL)

25H00100101B。BL中存放負(fù)數(shù)58H的補(bǔ)碼:(BL)

A8H10101000B??捎靡韵轮噶瞰@得AL、BL中數(shù)的負(fù)數(shù):75⑤CMP比較指令

指令格式:CMPDEST,SRC

指令功能:(DEST)(SRC),兩個(gè)操作數(shù)相減后,僅按相減結(jié)果設(shè)置標(biāo)志位OF、SF、ZF、AF、PF和CF,而不保留兩數(shù)相減的差。CMP指令與SUB指令的不同之處是,運(yùn)算結(jié)果不送回目的地址中。因此CMP指令執(zhí)行后,兩個(gè)操作數(shù)都不變,只影響狀態(tài)標(biāo)志位。CMP指令后往往跟著一個(gè)條件轉(zhuǎn)移指令,根據(jù)比較結(jié)果產(chǎn)生不同的程序分支。例如: CMPAL,BL JZEQLCMP指令可利用所設(shè)標(biāo)志位的狀態(tài)來(lái)反映兩個(gè)操作數(shù)的大小。CMP指令執(zhí)行后,若ZF1,表示(DEST)(SRC)。對(duì)于無(wú)符號(hào)數(shù),若CF0,表示(DEST)≥(SRC);若CF1,則(DEST)<(SRC)。76⑥CMPXCHG比較并交換指令

指令格式:CMPXCHGDEST,SRC

指令功能:累加器AC與(DEST)相比較,如果(AC)(DEST),則ZF1,DEST(SRC);否則ZF0,AC(DEST)

該指令只能用于80486及其后繼機(jī)型。累加器可為AL、AX或EAX寄存器。SRC只能用8位、16位或32位寄存器。DEST則可用寄存器或任一種存儲(chǔ)器尋址方式。該指令對(duì)其他標(biāo)志位的影響與CMP指令相同。77

⑦CMPXCHG8B比較并交換8字節(jié)指令

指令格式:CMPXCHG8BDEST

指令功能:

EDX:EAX與DEST相比較,如果(EDX:EAX)(DEST),則ZFl,DEST(ECX:EBX)否則ZF0,EDX:EAX(DEST)該指令只影響ZF位,但不影響其他標(biāo)志位。該指令只能用于Pentium及其后繼機(jī)型。操作數(shù)均為64位數(shù),目的操作數(shù)必須采用存儲(chǔ)器尋址方式確定一個(gè)64位數(shù)。78(3)乘法運(yùn)算指令

MUL(unsignedMULtiple)無(wú)符號(hào)數(shù)乘法。IMUL(sIgnedMULtiple)帶符號(hào)數(shù)乘法。①M(fèi)UL無(wú)符號(hào)數(shù)乘法指令

指令格式:MULSRC

指令功能:字節(jié)操作數(shù) AX(AL)*(SRC)字操作數(shù) DX:AX(AX)*(SRC)雙字操作數(shù) EDX:EAX(EAX)*(SRC)其中(SRC)是乘法運(yùn)算的一個(gè)操作數(shù),它只能在通用寄存器或存儲(chǔ)單元中(不能是立即數(shù)),而另一個(gè)操作數(shù)隱含在AL(字節(jié)乘)、AX(字乘)或EAX(雙字乘)寄存器中。

MUL指令只影響標(biāo)志寄存器中CF、OF標(biāo)志位。MUL指令執(zhí)行后,如果乘積的高一半為0,即AH(字節(jié)乘)、DX(字乘法)或EAX(雙字乘)全為0,則CF0和OF0;否則CF1,OF1(表示AH、DX或EDX中有乘積的有效數(shù)字)。79②IMUL帶符號(hào)數(shù)乘法指令

指令格式:IMULSRC

指令功能:與MUL相同,但操作數(shù)和乘積必須是帶符號(hào)數(shù)且用補(bǔ)碼表示,而MUL的操作數(shù)和乘積均是無(wú)符號(hào)數(shù)。執(zhí)行IMUL指令后,如果乘積的高一半是低一半的符號(hào)擴(kuò)展,則CF和OF均為0;否則均為1。【例4-35】設(shè)(AL)

0B4H

76D,(BL)

11H17D;執(zhí)行指令“IMULBL”后:乘積為(AX)

0FAF4H

1292D,CFOF1?!纠?-36】設(shè)(AL)

0AH10D,(BL)

11H17D;執(zhí)行指令“MULBL“后:乘積為(AX)

00AAH0170D,CFOF0。80(4)除法運(yùn)算指令

DIV(unsignedDIVide) 無(wú)符號(hào)數(shù)除法。IDIV(sIgnedDIVide) 帶符號(hào)數(shù)除法。

①DIV無(wú)符號(hào)數(shù)除法指令

指令格式:DIVSRC

指令功能:將隱含存放在AX(字節(jié)除)、DX:AX(字除)或EDX:EAX(雙字除)中的被除數(shù)除以除數(shù)(SRC),除后的商和余數(shù)送入隱含指定的寄存器中。字節(jié)操作:AL(AX)/(SRC)的商AH(AX)/(SRC)的余數(shù)字操作:AX(DX:AX)/(SRC)的商DX(DX:AX)/(SRC)的余數(shù)雙字操作:EAX(EDX:EAX)/(SRC)的商EDX(EDX:EAX)/(SRC)的余數(shù)DIV指令中的被除數(shù)和除數(shù)必須是無(wú)符號(hào)數(shù),其商和余數(shù)也是無(wú)符號(hào)數(shù)。81DIV指令對(duì)標(biāo)志寄存器無(wú)有效標(biāo)志結(jié)果。但是以下兩種情況之一,將產(chǎn)生0型中斷(除法出錯(cuò)中斷)轉(zhuǎn)入除法出錯(cuò)中斷處理?!?/p>

?除數(shù)為0,即(SRC)=0。?商溢出,即(AL)中的商>0FFH,(AX)中的商>0FFFFH或(EAX)中的商>0FFFFFFFFH。②IDIV帶符號(hào)數(shù)除法指令指令格式:IDIVSRC指令功能:與DIV相同,但操作數(shù)、商和余數(shù)必須是帶符號(hào)數(shù)且用補(bǔ)碼表示,余數(shù)的符號(hào)與被除數(shù)的符號(hào)相同。帶符號(hào)數(shù)除法的商中,最大的正數(shù)商是+127(7FH)、(7FFFH)或(7FFFFFFFH),最小的負(fù)數(shù)商是127(81H)、32767(8001H)或65535(80000001H)。同DIV指令一樣,當(dāng)除數(shù)(SRC)0或商超出上述的最大值或最小值時(shí),均產(chǎn)生0型中斷。82

由于除法指令的字節(jié)操作要求被除數(shù)為16位,字操作要求被除數(shù)為32位,雙字操作要求被除數(shù)為64位,因此往往需要用符號(hào)擴(kuò)展的方法取得除法指令所需要的被除數(shù)格式。

【例4-39】

兩個(gè)8位帶符號(hào)數(shù)分別放在BYTE1、BYTE2字節(jié)存儲(chǔ)單元中,將BYTE1內(nèi)容除以BYTE2內(nèi)容,商放在QUOT字節(jié)單元中,可用以下指令實(shí)現(xiàn):MOV AL,BYTE1CBW功能是將字節(jié)轉(zhuǎn)換成字IDIV BYTE2MOV QUOT,AL833.邏輯類指令

這類指令包括邏輯運(yùn)算指令、位測(cè)試指令、位掃描指令和移位指令。(1)邏輯運(yùn)算指令邏輯運(yùn)算指令共有5條,其指令格式及功能分別如下:

AND邏輯與指令 指令格式:ANDDEST,SRC指令功能:DEST(SRC)∧(DEST)

OR邏輯或指令

指令格式:ORDEST,SRC指令功能:DEST(SRC)∨(DEST)84

XOR邏輯異或指令

指令格式:XORDEST,SRC指令功能:DEST(SRC)(DEST)NOT邏輯非指令 指令格式:NOTDEST 指令功能:DEST(DEST)

TEST測(cè)試指令

指令格式:TESTDEST,SRC指令功能:(SRC)∧(DEST)

上述指令對(duì)操作數(shù)都是按位進(jìn)行邏輯運(yùn)算的,操作數(shù)可以是字節(jié)、字或雙字。NOT指令對(duì)標(biāo)志位無(wú)影響,其余4條指令影響的標(biāo)志位是SF、ZF、PF,置CF、OF為0,AF不確定。TEST指令與AND指令的不同之處是,運(yùn)算結(jié)果不送回目的地址中。因此TEST指令執(zhí)行后,兩個(gè)操作數(shù)都不變,只影響標(biāo)志位。85這些指令常用于對(duì)操作數(shù)的某些位進(jìn)行分離、組合或設(shè)置,例如:AND AL,0F0H ;分離出AL中的高4位OR AL,80H ;將AL中最高位置1XOR AX,AX ;將AX內(nèi)容清零XOR AL,01H ;將AL中最低位變反【例4-40】可用以下程序段實(shí)現(xiàn)將標(biāo)志寄存器的第8位TF位置1: PUSHF標(biāo)志進(jìn)棧 POP AX OR AX,100H PUSH AX POPF86(2)位測(cè)試指令80386及其后繼機(jī)型增加了本組指令。

BT(BitTest) 位測(cè)試。BTS(BitTestandSet) 位測(cè)試并置1。BTR(BitTestandReset) 位測(cè)試并置0。BTC(BitTestandComplement) 位測(cè)試并變反。①BT位測(cè)試指令

指令格式:BTDEST,SRC

指令功能:把目的操作數(shù)中由源操作數(shù)所指定位的值送往標(biāo)志位CF。

②BTS位測(cè)試并置1指令

指令格式:BTSDEST,SRC

指令功能:把目的操作數(shù)中由源操作數(shù)所指定位的值送往標(biāo)志位CF,并將目的操作數(shù)中的該位置1。87

③BTR位測(cè)試并置0指令

指令格式:BTRDEST,SRC

指令功能:把目的操作數(shù)中由源操作數(shù)所指定位的值送往標(biāo)志位CF,并將目的操作數(shù)中的該位置0。④BTC位測(cè)試并變反指令

指令格式:BTCDEST,SRC

指令功能:把目的操作數(shù)中由源操作數(shù)所指定位的值送往標(biāo)志位CF,并將目的操作數(shù)中的該位變反。

本組指令影響CF值,其他標(biāo)志位則無(wú)定義?!纠?-42】

指令“BTAX,4”測(cè)試AX寄存器的位4。如指令執(zhí)行前(AX)=1234H,則指令執(zhí)行后(CF)=1;如指令執(zhí)行前(AX)=1224H,則指令執(zhí)行后(CF)=0。

88(3)位掃描指令80386及其后繼機(jī)型增加了本組指令。

BSF(BitScanForward)正向位掃描。

BSR(BitScanReverse)反向位掃描。

①BSF正向位掃描指令

指令格式:BSFREG,SRC

指令功能:指令從位0開(kāi)始自右向左掃描源操作數(shù),目的是檢索第一個(gè)為1的位。如遇到第一個(gè)為1的位則將ZF位置0,并把該位的位置裝入目的寄存器中;如源操作數(shù)為0,則將ZF位置1,目的寄存器無(wú)定義。89

②BSR反向位掃描指令

指令格式:BSRREG,SRC

指令功能:指令從最高位開(kāi)始自左向右掃描源操作數(shù),目的是檢索第一個(gè)為1的位。該指令除方向與BSF相反外,其他規(guī)定均與BSF相同。因此它們之間的差別是BSF指令檢索從低位開(kāi)始第一個(gè)出現(xiàn)的1,而B(niǎo)SR則檢索從高位開(kāi)始第一個(gè)出現(xiàn)的1?!纠?-43】

BSFECX,EAX

溫馨提示

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