工學(xué)第3章-指令系統(tǒng)-課件2_第1頁
工學(xué)第3章-指令系統(tǒng)-課件2_第2頁
工學(xué)第3章-指令系統(tǒng)-課件2_第3頁
工學(xué)第3章-指令系統(tǒng)-課件2_第4頁
工學(xué)第3章-指令系統(tǒng)-課件2_第5頁
已閱讀5頁,還剩207頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章80X86的尋址方式和指令系統(tǒng)第1節(jié)80X86的數(shù)據(jù)類型第2節(jié)80X86的尋址方式第3節(jié)80X86的指令系統(tǒng)1第3章80X86的尋址方式和指令系統(tǒng)第學(xué)習(xí)指導(dǎo)和要求掌握80486的七種數(shù)據(jù)類型;熟練掌握九種尋址方式;熟記各種類型的指令格式及功能,并能編寫簡單程序。2學(xué)習(xí)指導(dǎo)和要求掌握80486的七種數(shù)據(jù)類型;2第1節(jié)80X86的數(shù)據(jù)類型80486匯編語言中可使用的數(shù)據(jù)類型有以下七種:

無符號二進(jìn)制數(shù)

字節(jié)(8位):0~255(0~0FFH),占用一字節(jié)存儲單元。

字(16位):0~65535(0~0FFFFH),占用連續(xù)的兩字節(jié)存儲單元,低地址存儲單元存放低8位數(shù)據(jù),高地址存儲單元存放高8位數(shù)據(jù),低字節(jié)地址為該字的地址。

雙字(32位):0~4294967299(0~0FFFFFFFFH),占用連續(xù)的四字節(jié)存儲單元,最低地址存儲單元存放最低8位數(shù)據(jù),最高地址存儲單元存放最高8位數(shù)據(jù),最低字節(jié)地址為該雙字的地址。3第1節(jié)80X86的數(shù)據(jù)類型字節(jié)(8位):0~有符號二進(jìn)制數(shù)

字節(jié):-128~+127(80H~FFH,00H~7FH)字:-32768~+32767(8000H~FFFFH,00000H~7FFFH)雙字:-2147483650~+2147483649(80000000H~FFFFFFFFH,000000000H~7FFFFFFFH)以補碼形式存儲,地址單元分配與無符號數(shù)類似。浮點數(shù)(實數(shù))單精度數(shù)(32位):數(shù)據(jù)格式如下:階碼有效數(shù)313023220符號位1.1位符號,8位階碼,24位有效數(shù)(顯式23位,外加1位隱含的整數(shù)“1.”。4有符號二進(jìn)制數(shù) 階碼雙精度數(shù)(64位):數(shù)據(jù)格式如下:1位符號,11位階碼,53位有效數(shù)(顯式52位,外加1位隱含的整數(shù)“1.”。636252510階碼有效數(shù)符號位1.擴(kuò)展精度數(shù)(80位):數(shù)據(jù)格式如下:79786463620階碼1有效數(shù)符號位1位符號,15位階碼,64位有效數(shù)(內(nèi)含1位整數(shù)1,小數(shù)點是隱含的。.5雙精度數(shù)(64位):數(shù)據(jù)格式如下:1位符號,11位階碼,BCD碼壓縮BCD碼:1字節(jié)存放兩個BCD碼,格式如圖a74307430(a)(b)非壓縮BCD碼:1字節(jié)存放一個BCD碼(低4位),格式如圖b串?dāng)?shù)據(jù)位串:從任何字節(jié)的任何位開始的相鄰位序列,最長可達(dá)232-1位字節(jié)/字/雙字串:是字節(jié)、字、雙字的相鄰序列,最長可達(dá)232-1字節(jié)。十位個位0或任意個位6BCD碼743ASCII碼數(shù)據(jù)

ASCII碼字符串:如‘ABC123’

ASCII碼數(shù):如30H~39H(0~9),41H~46H(A~F)指針數(shù)據(jù)近指針(32位):是一個32位的段內(nèi)偏移地址,段內(nèi)尋址時使用。遠(yuǎn)指針(48位):是一個由16位選擇符和32位偏移量組成,段間尋址時使用。返回7ASCII碼數(shù)據(jù)返回7

第2節(jié)80X86的尋址方式

尋找指令中所需操作數(shù)或操作數(shù)地址的方式稱為尋址方式。指令的操作數(shù)來自:(1)操作數(shù)包含在指令中。(2)操作數(shù)包含在CPU的某個內(nèi)部寄存器中。(3)操作數(shù)在內(nèi)存儲器中。尋找此操作數(shù),先找到該操作數(shù)在內(nèi)存中存放的地址,再從該地址中取操作數(shù)。內(nèi)存單元的地址由段基址和偏移地址組成。偏移地址由基址寄存器、間(變)址寄存器、比例因子、位移量組合而成。8第2節(jié)80X86的尋址方式尋找指令中所需操作由偏移地址元素按某種計算方法組合形成的偏移地址稱為有效地址EA(EffectiveAddress)。計算方法:EA=基址+(間址×比例因子)+位移量采用16位尋址,位移量是8位或16位,用BX和BP作基址寄存器,SI和DI作間址寄存器,比例因子為1。采用32位尋址,可使用8位和32位的位移量,32位的通用寄存器都可作基址寄存器或間址寄存器(ESP不用于間址),可采用1、2、4、8幾種比例因子。9由偏移地址元素按某種計算方法組合形成的偏移地址稱為有效地址E80X86的尋址方式共有11種:1.立即數(shù)尋址2.寄存器尋址3.直接尋址4.寄存器間接尋址5.(帶位移的)基址尋址6.(帶位移的)間址尋址7.(帶位移的)比例間址尋址8.基址加間址尋址9.基址加比例間址尋址10.帶位移的基址加間址尋址11.帶位移的基址加比例間址尋址1080X86的尋址方式共有11種:101立即尋址

指定的操作數(shù)緊跟在操作碼之后,直接存放在代碼段中。如:MOVBL,56H;BL56HMOVAX,2056H;AX2056HMOVECX,12345678H;ECX12345678H

立即數(shù)只能作源操作數(shù)。不能作目的操作數(shù)。2寄存器尋址操作數(shù)在CPU的寄存器中,而寄存器的名由指令指出。如:INCCL;CL(CL)+1MOVAX,BX;AX(BX)111立即尋址113直接尋址操作數(shù)有效地址(16位或32位)直接包含在指令中,它位于操作碼之后,存放在代碼段中。如果指令無前綴指明在那一段中,則默認(rèn)操作數(shù)存放在數(shù)據(jù)段。如:MOVAX,[2000H];DS段2000H的內(nèi)容送AL,2001H的內(nèi)容送AHMOVAX,F(xiàn)S:[2000H];FS段2000H的內(nèi)容送AL,2001H的內(nèi)容送AH4寄存器間接尋址操作數(shù)的偏移地址存放在寄存器中,而操作數(shù)存放在存儲器中。(1)16位尋址EA=(SI)、(DI)、(BX)、(BP)

無前綴默認(rèn)操作數(shù)存放在數(shù)據(jù)段無前綴默認(rèn)操作數(shù)存放在堆棧段123直接尋址無前綴默認(rèn)操作數(shù)存放在數(shù)據(jù)段無前綴默認(rèn)操作數(shù)存例如:MOVAX,[BX];AX((DS)*10H+(BX))MOVAX,[BP];AX((SS)*10H+(BP))MOVAX,ES:[BX];AX((ES)*10H+(BX))MOVAX,DS:[BP];AX((DS)*10H+(BP))(2)32位尋址EA=(EAX)、(EBX)、(ECX)、(EDX)、(ESP)、(EBP)、(ESI)、(EDI)ESP、EBP默認(rèn)操作數(shù)存放在堆棧段,其它默認(rèn)操作數(shù)存放在數(shù)據(jù)段。例如:MOVAX,[EBX];DS段字?jǐn)?shù)據(jù)送AXMOVAX,[EBP];SS段字?jǐn)?shù)據(jù)送AX

MOVECX,ES:[EBX];ES段雙字?jǐn)?shù)據(jù)送ECX

13例如:135(帶位移的)基址尋址基址寄存器內(nèi)容與位移量之和形成操作數(shù)的有效地址。即:EA=(基址寄存器)+位移量

(1)16位尋址EA={(BX)、(BP)}+位移量(帶符號8或16位整數(shù)),BX默認(rèn)段寄存器DS,BP默認(rèn)段寄存器SS如:MOVAX,2040H[BX]或MOVAX,[BX+2040H];DS段(BX)+2040H中的字?jǐn)?shù)據(jù)送AX。

(2)32位尋址EA={(8個32位通用寄存器)}+位移量(帶符號8或32位整數(shù))如:MOVECX,1500H[EAX];DS段(EAX)+1500H或MOVECX,[EAX+1500H]中的雙字?jǐn)?shù)據(jù)送ECX。145(帶位移的)基址尋址146(帶位移的)間址尋址間址寄存器內(nèi)容與位移量之和形成操作數(shù)的有效地址。即:EA=(間接寄存器)+位移量

(1)16位尋址EA={(SI)、(DI)}+位移量(帶符號8或16位整數(shù))如:MOVAX,2040H[SI]或MOVAX,[SI+2040H];DS段(BX)+2040H中的字?jǐn)?shù)據(jù)送AX。MOVDX,COUNT[DI]

(2)32位尋址EA={(除ESP外的其他7個寄存器)}+位移量(帶符號8或32位整數(shù))如:MOVECX,1500H[EAX];DS段(EAX)+1500H或MOVECX,[EAX+1500H]中的雙字?jǐn)?shù)據(jù)送ECX。(帶位移的)基址尋址、間址尋址合稱為相對寄存器間址156(帶位移的)間址尋址157(帶位移的)比例間(變)址尋址(32位尋址)間址寄存器內(nèi)容乘以比例因子再加位移量之和形成操作數(shù)的32位有效地址。即:EA=(變址寄存器)*比例因子+位移量如:MOVEAX,1200H[ESI*4]8基址加間(變)址尋址基址寄存器內(nèi)容與間址寄存器內(nèi)容之和形成操作數(shù)的有效地址。即:EA=(基址寄存器)+(變址寄存器)

(1)16位尋址基址寄存器:BX、BP;變址寄存器:DI、SI如:MOVAX,[BX+SI]或MOVAX,[BX][SI];DS段(BX)+(SI)中的字?jǐn)?shù)據(jù)送AX。

167(帶位移的)比例間(變)址尋址(32位尋址)16

(2)32位尋址基址寄存器:任何一個32位通用寄存器變址寄存器:除ESP之外的任一個32位通用寄存器如:MOVAX,[EBX+ECX];DS段(EBX)+(ECX)中或MOVAX,[EBX][ECX]的字?jǐn)?shù)據(jù)送AX。

9基址加比例間(變)址尋址(32位尋址)基址寄存器的內(nèi)容加變址寄存器內(nèi)容乘以比例因子,形成操作數(shù)的32位有效地址。即:EA=(基址寄存器)+(間址寄存器)*比例因子如:MOVAX,[EBX*4+ESI](默認(rèn)段DS)17(2)32位尋址1710帶位移的基址加間址尋址基址寄存器內(nèi)容與變址寄存器內(nèi)容再加偏移量之和形成操作數(shù)的有效地址。即:EA=(基址寄存器)+(變址寄存器)+偏移量如:MOVAX,1234H[BX+DI]或MOVAX,[BX+DI+1234H]或MOVAX,1234H[BX][DI];DS段(BX)+(DI)+1234H中的字?jǐn)?shù)據(jù)送AX。1810帶位移的基址加間址尋址1811帶位移的基址加比例間(變)址尋址(32位尋址)基址寄存器的內(nèi)容加變址寄存器內(nèi)容乘以比例因子再加上位移量之和,形成操作數(shù)的32位有效地址。即:EA=(基址寄存器)+(變址寄存器)*比例因子+位移量如:MOVAX,[EDI*8+EBX+40H]MOVECX,2000H[EDX*4][EAX]比例變址尋址、基址加比例變址尋址、帶位移的基址加比例變址尋址只有32位尋址一種情況。1911帶位移的基址加比例間(變)址尋址(32位尋址)19與跳轉(zhuǎn)有關(guān)的尋址方式與跳轉(zhuǎn)有關(guān)的尋址方式用于確定程序轉(zhuǎn)移或調(diào)用的目標(biāo)。如:無條件轉(zhuǎn)移語句:JMPdstdst:轉(zhuǎn)移目標(biāo)調(diào)用語句:CALLdst

dst:調(diào)用目標(biāo)

參見轉(zhuǎn)移和調(diào)用指令一節(jié)。練習(xí)題:假設(shè)(DS)=2000H,(ES)=2100H,(SS)=1500H,(SI)=00A0H,(BX)=0100H,(BP)=0040H,指令MOVAX,src中,以下src為何種尋址方式?有效地址和物理地址各是多少?(1)100H[BX] (2)[BX] (3)[BP](4)ES:[BX+10H](5)BX(6)[1000H](7)[SI] (8)1000H[BX+SI] (9)1000H[BP][SI](10)[BX][SI]20與跳轉(zhuǎn)有關(guān)的尋址方式20

第3節(jié)80X86的指令系統(tǒng)一、指令格式指令格式:[標(biāo)號:]操作碼[操作數(shù),…] [;注釋]

其中:標(biāo)號:確定匯編語句的位置,提供跳轉(zhuǎn)、循環(huán)的目標(biāo)。操作碼:匯編語句操作。操作數(shù):操作數(shù)據(jù)項,數(shù)目因操作碼而異。注釋:程序注解。 如:START:MOVAX,DATAMOVDS,AX;設(shè)置DS21第3節(jié)80X86的指令系統(tǒng)21一條指常由6個字段組成,字段1為前綴字段,字段2~6為基本字段。1.前綴字段前綴字段用于修改指令操作的某些屬性,為可選字段。(1)段超越前綴:用于指明某個段寄存器取代指令中默認(rèn)的段寄存器。(2)操作數(shù)寬度前綴:用于改變當(dāng)前操作數(shù)的默認(rèn)寬度值。(3)地址寬度前綴:用于改變當(dāng)前地址的默認(rèn)寬度值。(4)重復(fù)前綴:用于重復(fù)串的操作。(5)總線鎖定前綴:用于產(chǎn)生LOCK信號,防止其他設(shè)備中斷CPU在總線上的操作。22一條指常由6個字段組成,字段1為前綴字段,字段2~6為基本字2.操作碼字段(OPCode)它規(guī)定了指令的操作性質(zhì)。此字段不可省咯。3.尋址方式字段(modr/m和s-i-b)此兩個字段稱為尋址方式說明符字段。modr/m為主尋址字節(jié),而s-i-b為第二尋址字節(jié)。4.位移量字段(Displ)當(dāng)尋址方式中需要位移量時,指令中將出現(xiàn)此字段。其長度為1,2,4個字節(jié),通常用帶符號數(shù)(補碼)表示。5.立即數(shù)字段(Data)當(dāng)尋址方式是立即數(shù)尋址時需用此字段,其長度為I,2,4個字節(jié),立即效字段總是該指令的最后字段。操作碼字段是必選字段,其它各字段可根據(jù)不同的尋址方式選用。232.操作碼字段(OPCode)23二、指令系統(tǒng)80X86的指令系統(tǒng)分為整數(shù)指令、浮點數(shù)指令和操作系統(tǒng)指令。整數(shù)指令:數(shù)據(jù)傳送類、算術(shù)運算類、邏輯運算類、串操作類、控制轉(zhuǎn)移類、處理器控制類、高級和保護(hù)控制類指令等浮點數(shù)指令:數(shù)據(jù)傳送、算術(shù)運算、比較、超越函數(shù)、常量、控制等指令操作系統(tǒng)型指令24二、指令系統(tǒng)24

指令操作數(shù)符號說明:

OP1,OP2,OP3:操作數(shù)reg:通用寄存器。長度可以是8位、16位、32位reg8:8位通用寄存器reg16:16位通用寄存器reg32:32位通用寄存器Sreg:段寄存器(段選擇符)mem:存儲器。長度可以是8位、16位、32位mem8:8位存儲器mem16:16位存儲器mem32:32位存儲器imm:立即數(shù)。長度可以是8位、16位、32位imm8:8位立即數(shù)累加器:AccI/O端口:Portsrc(源):源操作數(shù)dst(目標(biāo)):目標(biāo)操作數(shù)25指令操作數(shù)符號說明:OP1,OP2,與運算有關(guān)的標(biāo)志標(biāo)志寄存器FLAGS中存放運算結(jié)果的屬性。CF:進(jìn)位/借位標(biāo)志。加、減運算最高位產(chǎn)生進(jìn)位/借位時置1。AF:輔助進(jìn)位/借位標(biāo)志。加、減運算時低半字節(jié)位產(chǎn)生進(jìn)位/借位時置1。OF:溢出標(biāo)志。有符號數(shù)二進(jìn)制加、減運算結(jié)果超出范圍時置1。ZF:零標(biāo)志。結(jié)果為零時置1。SF:符號標(biāo)志。結(jié)果為負(fù)時置1。PF:奇偶標(biāo)志。結(jié)果最低字節(jié)“1”的個數(shù)為偶數(shù)時置1。26與運算有關(guān)的標(biāo)志26

指令執(zhí)行對標(biāo)志位影響的符號說明:

X:表示相應(yīng)標(biāo)志位狀態(tài)依運算或操作結(jié)果決定0:表示相應(yīng)標(biāo)志位無條件清“0”1:表示相應(yīng)標(biāo)志位無條件置“1”U:表示相應(yīng)標(biāo)志位狀態(tài)未定義,狀態(tài)隨機(jī)-:表示相應(yīng)標(biāo)志位狀態(tài)不受影響,保持原狀態(tài)r:恢復(fù)原來保存的值27指令執(zhí)行對標(biāo)志位影響的符號說明:27數(shù)據(jù)傳送類指令用于實現(xiàn)存儲器與寄存器、寄存器與寄存器、累加器與I/O端口之間字節(jié)、字或雙字的傳送,也可將立即數(shù)傳送到存儲器或寄存器。這類指令基本上不影響標(biāo)志位。傳送指令MOV指令格式:MOVOP1,OP2reg/Sreg,regreg,Sregreg/Sreg,memmem,reg/Sregreg,immmem,imm28數(shù)據(jù)傳送類指令28功能:把OP2的內(nèi)容傳送到OP1中,OP1和OP2為字節(jié)、字或雙字說明:立即數(shù)只能作為源操作數(shù),而其他三種既可作源操作數(shù)又可作目的操作數(shù);存儲器和存儲器之間(串操作除外)以及段寄存器和段寄存器之間不允許傳數(shù),CS不能作目的操作數(shù),立即數(shù)不能直接送段寄存器,源操作數(shù)和目標(biāo)操作數(shù)不能一個是字節(jié)一個是字,類型要一致,立即數(shù)只能出現(xiàn)在源操作數(shù)位置。

例如:用如下指令可給數(shù)據(jù)段寄存器DS賦初值MOVAX,DATAMOVDS,AX再如:MOVEBX,12345678HMOVAX,[BX+24]29功能:把OP2的內(nèi)容傳送到OP1中,OP1和OP2為字交換指令XCHG指令格式:XCHGOP1,OP2reg,regmem,regreg,mem功能:用于交換兩個操作數(shù)。說明:指令中的兩個操作數(shù)可以是兩個寄存器操作數(shù),或一個寄存器與一個存儲器操作數(shù)。例如:XCHGAX,BXXCHGAX,[BX]XCHG[BX+20H],AX3030I/O指令I(lǐng)N和OUT指令格式:INOP1,OP2OUTOP1,OP2AL,imm8imm8,ALAX,imm8imm8,AXEAX,imm8imm8,EAXAL,DXDX,ALAX,DXDX,AXEAX,DXDX,EAX功能:用于在I/O端口和CPU之間的信息交換,只能用AL、AX或EAX接收或發(fā)送數(shù)據(jù)。

31I/O指令I(lǐng)N和OUT31例如:INAL,0FAH;從端口FAH讀一個字節(jié)到ALINEAX,28H;從端口28H讀一個雙字到EAXMOVDX,3AEH;I/O地址大于255時.應(yīng)通過DX間接尋址INAX,DX;從DX指定的端口讀入一個字到AXOUT21H,AL;將8位數(shù)從AL輸出到端口21HOUTDX,EAX;將32位數(shù)從EAX輸出到DX指定的端口32例如:32裝入有效地址指令LEA格式:LEAOP1,OP2reg32,memreg16,mem功能:將有效地址(即偏移地址)送通用寄存器。例如:LEAECX,DOLLAR[ESI*4+EDX]設(shè):EDX=30H,ESI=32H,DOLLAR=7580H,則(ECX)=7678H(32H*4+30H+7580H)33裝入有效地址指令LEA33裝入全地址指令LDS,LES,LFS.LGS,LSS格式:LDSreg,memLESreg,memLFSreg,memLGSreg,memLSSreg,mem功能:取mem指示的32位或48位全地址指針,裝入段寄存器和16位或32位reg中。

34裝入全地址指令LDS,LES,LFS.LGS,LSS34

對于實地址方式和虛擬8086方式,段基址和偏移地址都是16位,段基址送段寄存器,偏移地址送reg中。例如:XDD12345678HLDSSI,X;DS=1234H,SI=5678H對于16位和32位保護(hù)方式,選擇符送段寄存器,偏移地址送reg中。例如:X1DF123456780010H;32位偏移值+16位選擇符LDSESI,X1;DS=1234H,ESI=56780010H

35對于實地址方式和虛擬8086方式,段基址和偏壓棧/彈棧指令PUSH/POP格式:PUSHOP1POPOP1imm16mem16imm32mem32mem16reg16mem32reg32reg16功能:reg32

PUSH指令使(E)SP的內(nèi)容減2或減4,然后把16位或32位的立即數(shù)、存儲器操作數(shù)或寄存器操作數(shù)壓入堆棧,SS:[(E)SP]指向新的棧頂。

POP指令從堆棧把字或雙字彈出至16位或32位存儲器或通用寄存器中,(E)SP的內(nèi)容加2或加4。36壓棧/彈棧指令PUSH/POP36例如:PUSHAX;(SP)-2SP,(AX)(SP)PUSHBX;(SP)-2SP,(BX)(SP)PUSHCX;(SP)-2SP,(CX)(SP)...POPCX;((SP))CX,(SP)+2SPPOPBX;((SP))BX,(SP)+2SPPOPAX;((SP))AX,(SP)+2SP

堆棧為“先進(jìn)后出”的數(shù)據(jù)結(jié)構(gòu)。37例如:PUSHAX;(SP)-2SP,(AX)棧底棧底SPSP00H20H60H30H40H60H棧頂SSSS圖A圖B設(shè):AX=6040H,BX=3060H,CX=2000H執(zhí)行PUSH指令后,堆棧狀態(tài)如圖A,執(zhí)行POP指令后,堆棧狀態(tài)如圖B。38棧底棧底SPSP00H棧頂SSSS圖A圖B設(shè):AX=60已知(IP)=1000H,(SP)=2000H,(BX)=283FH,CALLWORDPTR[BX]指令的機(jī)器碼是FF17H,試問執(zhí)行該指令后,SS:[1FFEH]的值是多少?()(A)28H(B)3FH(C)00(D)02H39已知(IP)=1000H,(SP)=2000H,(BX)=2全部通用寄存器壓棧和出棧指令格式:PUSHA/POPA;16位通用寄存器壓棧和出棧指令。入棧順序為:AX、CX、DX、BX、SP、BP、SI和DI。PUSHAD/POPAD;32位通用寄存器壓棧和出棧指令。入棧順序為:EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI。其中:SP和ESP為操作前的棧頂指針。40全部通用寄存器壓棧和出棧指令40

標(biāo)志寄存器傳送指令指令格式:LAHF;F寄存器內(nèi)容送AH指令SAHF;AH內(nèi)容送F寄存器指令PUSHF;16位F內(nèi)容進(jìn)棧指令(保存F)POPF;16位F內(nèi)容出棧指令(恢復(fù)F)PUSHFD;32位F內(nèi)容進(jìn)棧指令(保存F)POPD;32位F內(nèi)容出棧指令(恢復(fù)F)41標(biāo)志寄存器傳送指令41查表轉(zhuǎn)換指令XLAT格式:XLAT;AL((BX)+(AL))功能:完成一個字節(jié)的查表轉(zhuǎn)換

BX指向表的首地址(DS段內(nèi)),AL裝入要轉(zhuǎn)換的代碼在表中的序號,并XLAT指令執(zhí)行的結(jié)果存于AL中。例如:查找ASCII碼表中,(BX)3的ASCII碼。程序如下:(BX)+(AL)MOVDS,AXLEABX,TABLE;DS段表的首地址送BXMOVAL,3;要轉(zhuǎn)換的代碼在表中的序號3送ALXLAT;AL((BX)+(AL)),查找到的3的ASCII碼33H保存在AL中序號01234...TABLE30H31H32H

33H34H..

42查表轉(zhuǎn)換指令XLAT序號0TABLE30H42算術(shù)運算指令支持加、減、乘、除四種基本算術(shù)運算,其操作對象可以是字節(jié)、字、雙字的二進(jìn)制整數(shù),也可以是壓縮、非壓縮BCD碼。算術(shù)運算指令一般會影響FLAGS寄存器中的狀態(tài)標(biāo)志。加法和減法指令A(yù)DD/SUB格式:ADDOP1,OP2;OP1OP1+OP2,置標(biāo)志位reg,regreg,memreg,immmem,regmem,imm43算術(shù)運算指令43ADD的功能:將OP1和OP2相加,結(jié)果存放在OP1。例:ADDAX,BX;AX(AX)+(BX)ADDEBX,ECX;EBX(EBX)+(ECX)ADD[3000H],AX;3000H(3000H)+(AX)ADD[3000H],23;3000H(3000H)+23SUBOP1,OP2;OP1OP1-OP2,置標(biāo)志位reg,regreg,memreg,immmem,regmem,imm44ADD的功能:將OP1和OP2相加,結(jié)果存放在OP1。例:4SUB的功能:從OP1中減去OP2,結(jié)果存OP1中。例:SUBAX,BX;AX(AX)-(BX)SUBEAX,ECX;EAX(EAX)-(ECX)SUBN,12345678H;N(N)-12345678HADD和SUB對標(biāo)志位的影響:OFSFZFAFPFCFXXXXXX例:設(shè)AL=64H,AH=0A8H,求執(zhí)行下列指令的結(jié)果和標(biāo)志位的狀態(tài)。(1)ADDAL,AH;AL(AL)+(AH),有符號數(shù).解:01100100100D得:(AL)=0CH(正確)+10101000-88DOFSFZFAFPFCF

10000110012D00001145SUB的功能:從OP1中減去OP2,結(jié)果存OP1中。45(2)SUBAL,AH;AL(AL)-(AH),有符號數(shù).解:|01100100100D得:(AL)=BCH(不正確)-10101000-88DOFSFZFAFPFCF10111100-68D110101

有符號數(shù)加、減的結(jié)果有“溢出”的判斷規(guī)則:對于加法:正數(shù)+正數(shù)=負(fù)數(shù),負(fù)數(shù)+負(fù)數(shù)=正數(shù)對于減法:正數(shù)-負(fù)數(shù)=負(fù)數(shù),負(fù)數(shù)-正數(shù)=正數(shù)例:設(shè)(AL)=7FH,(BL)=40H,判斷執(zhí)行ADDAL,BL指令的結(jié)果是否正確。解:01111111127D得:(AL)=0BFH(不正確)+0100000064DOFSFZFAFPFCF10111111-65D11000046(2)SUBAL,AH;AL(AL)帶進(jìn)/借位的加、減法指令A(yù)DC/SBB格式:ADCOP1,OP2;OP1OP1+OP2+CF,置標(biāo)志位reg,regreg,memreg,immmem,regmem,immADC的功能:將OP1、OP2和進(jìn)位標(biāo)志位CF相加,結(jié)果存放在OP1。例:ADCAX,375;AX(AX)+375+CFADCEBX,ECX;EBX(EBX)+(ECX)+CF47帶進(jìn)/借位的加、減法指令A(yù)DC/SBB47SBBOP1,OP2;OP1OP1-OP2-CF,置標(biāo)志位reg,regreg,memreg,immmem,regmem,immSBB的功能:從OP1中減去OP2,再減去借位標(biāo)志CF,結(jié)果存OP1中。例:SBBAX,BX;AX(AX)-(BX)-CFSBBECX,456789ABH;

ADC和SBB對標(biāo)志位的影響:OFSFZFAFPFCFXXXXXX48SBBOP1,OP2;OP1OP1-OP2-CF格式:DECOP1;OP1OP1-1,置標(biāo)志位memreg功能:INC使操作數(shù)的值加1;DEC使操作數(shù)的值減1,常用于修改計數(shù)器或地址指針。例:下面是從300H端口輸出256個字節(jié)數(shù)據(jù)的程序段:BUFFERDB12,34,…MOVCX,256MOVSI,OFFSETBUFFERMOVDX,300HNEXT:MOVAL,[SI]OUTDX,AL

INCSI;地址加1,取下一個數(shù)LOOPNEXT;未完,繼續(xù)49格式:DECOP1;OP1OP1-INC和DEC對標(biāo)志位的影響:OFSFZFAFPFXXXXX交換加法指令XADD格式:XADDOP1,OP2;OP1OP1+OP2OP2OP1功能:OP1與OP2相加,結(jié)果存于OP1中,并將OP1的值送OP2中。例:XADDEAX,ECX;EAX(EAX)+(ECX)ECX(EAX)變反指令NEG格式:NEGOP1;OP10-OP1,置標(biāo)志位功能:求OP1的相反數(shù)。50INC和DEC對標(biāo)志位的影響:50ADD和ADC、SUB和SBB經(jīng)常配合使用,完成64位加、減法運算。例:ADDEAX,ECX;EAX(EAX)+(ECX)ADCEBX,EDX;EBX(EBX)+(EDX)+CFSUBEAX,ECX;EAX(EAX)-(ECX)SBBEBX,EDX;EBX(EBX)-(EDX)-CF加1/減1指令I(lǐng)NC/DEC格式:INCOP1;OP1OP1+1,置標(biāo)志位memreg

51ADD和ADC、SUB和SBB經(jīng)常配合使用,完成64位加、例:NEGAL;AL0-(AL)若(AL)=13H,執(zhí)行NEG指令后,(AL)=EDH比較指令CMP格式:CMPOP1,OP2;OP1-OP2,置標(biāo)志位reg,regreg,memreg,immmem,regmem,imm功能:將OP1減去OP2,但結(jié)果不存在OP1中,只使結(jié)果影響標(biāo)志位。CMP指令用于比較OP1與OP2的大小,由標(biāo)志位來反映兩數(shù)的關(guān)系(見表A)。52例:NEGAL;AL0-(AL)52A-BCFZFSFOFA=B0100A<B10--無符號數(shù)A>B00--A<B-01/00/1有符號數(shù)A>B-00/10/1表A

比較并交換指令CMPXCHG格式:CMPXCHGOP1,OP2功能:將OP1與累加器(AL、AX或EAX)的內(nèi)容進(jìn)行比較,若相等則將OP2存于OP1中;否則將OP1送到累加器中。例:CMPXCHGCX,DX;若(CX)=(AX)

則CX(DX),否則AX(CX)A-B無符號數(shù)乘法指令MUL格式:MULOP1regmem功能:被乘數(shù)隱含在累加器中(AL,AX,EAX),OP1為乘數(shù)。字節(jié)運算時乘積返回到AX;字運算時乘積返回到DX:AX;雙字運算時乘積返回到EDX:EAX。源操作數(shù)不能是立即數(shù)。例:MULCL;AX(AL)*(CL)MULBX;DX:AX(AX)*(BX)MULDWORD[ESI];EDX:EAX(EAX)*(ESI)

MUL指令影響標(biāo)志位OF和CF:若積的高字節(jié)、字或雙字為“0”,則OF、CF清“0”,否則OF、CF置“1”。54無符號數(shù)乘法指令MUL54

有符號乘法指令I(lǐng)MUL指令格式有下列三種:(1)單操作數(shù):IMULOP1regmem功能:被乘數(shù)隱含在累加器中(AL,AX,EAX),OP1為乘數(shù)。字節(jié)運算時乘積返回到AX;字運算時乘積返回到DX:AX;雙字運算時乘積返回到EDX:EAX。(2)雙操作數(shù):IMULOP1,OP2reg,regreg,memreg,imm功能:OP1乘以O(shè)P2,積存放在OP1中。Reg為16或32位。55有符號乘法指令I(lǐng)MUL55(3)三操作數(shù):IMULOP1,OP2,OP3reg,reg,immreg,mem,imm功能:OP2乘以O(shè)P3,積存放在OP1中。reg為16位。例如:IMULDL;AX(AL)*(DL)IMULEBX;EDX:EAX(EAX)*(EBX)IMULBX,CX;BX(BX)*(CX)IMULBX,CX,4;BX(CX)*4IMUL指令影響標(biāo)志位OF和CF對(1)若乘積的高半部分是低半部分的符號位的擴(kuò)展,則CF=OF=0,否則CF=OF=1。對(2)、(3)如果乘積超過目標(biāo)寄存器所能存儲的范圍,則系統(tǒng)將置溢出標(biāo)志OF為1。56(3)三操作數(shù):IMULOP1,OP2,OP356除法指令DIV/IDIV

格式:DIVOP1;無符號除法regmemIDIVOP1;有符號除法regmem功能:字節(jié)運算時,被除數(shù)隱含在AX中,OP1為字節(jié)除數(shù),商存入AL,余數(shù)存入AH。字運算時,被除數(shù)隱含在DX:AX中,OP1為字除數(shù),商存入AX,余數(shù)存入DX雙字運算時,被除數(shù)隱含在EDX:EAX中,OP1為雙字除數(shù),商存入EAX,余數(shù)存入EDX。57除法指令DIV/IDIV57例如:DIVBL;(AX)/(BL),商存入AL,余數(shù)存入AH。IDIVECX;(EDX:EAX)/(ECX)商存入EAX,余數(shù)存入EDX。符號擴(kuò)展指令格式:CBW;將AL中8位帶符號數(shù)擴(kuò)展為16位存入AX。CWD;將AX中16位帶符號數(shù)擴(kuò)展為32位存入DX:AX

CWDE;將AX中16位帶符號數(shù)擴(kuò)展為32位存入EAX。CDQ;將EAX中32位帶符號數(shù)擴(kuò)展為64位存入EDX:EAX。58例如:58符號擴(kuò)展指令常用于帶符號數(shù)除法運算時,對被除數(shù)位數(shù)的擴(kuò)展。當(dāng)兩個帶符號數(shù)的字節(jié)/字/雙字?jǐn)?shù)相除時,必須將被除數(shù)擴(kuò)展為雙倍長度。例如:編寫程序,計算789AH/1234H。BUFFERDW789AH;被除數(shù)DW1234H;除數(shù)DD0;存結(jié)果START:MOVBX,OFFSETBUFFERMOVAX,[BX];取被除數(shù)CWD;字?jǐn)U展為雙字,AX符號位擴(kuò)展到DX各位IDIV2[BX];帶符號除MOV4[BX],AX;存商MOV6[BX],DX;存余數(shù)59符號擴(kuò)展指令常用于帶符號數(shù)除法運算時,對被除數(shù)位數(shù)的擴(kuò)展。當(dāng)十進(jìn)制(BCD碼)調(diào)整指令壓縮BCD碼運算:將壓縮BCD數(shù)用二進(jìn)制加、減指令(ADD,SUB,ADC,SBC)運算,運算結(jié)果必須用以下調(diào)整指令調(diào)整為壓縮BCD數(shù)的結(jié)果。指令格式及功能:

DAA;將AL中的和調(diào)整為壓縮BCD數(shù)

DAS;將AL中的差調(diào)整為壓縮BCD數(shù)非壓縮BCD字節(jié)數(shù)加、減、乘、除(ASCII調(diào)整)非壓縮BCD碼運算:將非壓縮BCD數(shù)用二進(jìn)制加、減、乘、除指令運算,配合相應(yīng)的調(diào)整。

AAA;將AL中的和調(diào)整為非壓縮BCD數(shù)

AAS;將AL中的差調(diào)整為非壓縮BCD數(shù)

AAM;將AL中的積調(diào)整為非壓縮BCD數(shù)

AAD;調(diào)整AX中的被除數(shù),相除的商即為非壓縮BCD數(shù)十進(jìn)制(BCD碼)調(diào)整指令DAA:若AL的低4位>9∨AF=1,則:(AL)←(AL)+6,AF←1;

若AL的高4位>9∨CF=1,則:(AL)←(AL)+60H,CF←1。

DAS:若AL的低4位>9∨AF=1,則:AL←(AL)-6,AF←1;

若AL的高4位>9∨CF=1,則:AL←(AL)-60H,CF←1。

61DAA:DAS:61AAA:如果AL的低4位>9或AF=1,則:

①AL←(AL)+6,AH←(AH)+1,AF←1

②AL←((AL)∧0FH)

③CF←AF

否則AL←(AL)∧0FHAAS:如果AL的低4位>9或AF=1,則:

①AL←(AL)-6,AH←(AH)-1,AF←1

②AL←(AL)∧0FH

③CF←AF

否則AL←(AL)∧0FH。

62AAA:AAS:62AAM:AH←(AL)/0AH,AL←(AL)%0AH

AAD:AL←(AH)×10+(AL),AH←0

63AAM:AH←(AL)/0AH,AL←(AL)%0AHAABCD碼運算編程舉例例1求組合BCD數(shù)1283+2574=3857BCD1DB83H,12HBCD2DB74H,25HBCD3DB?,?START:MOVAL,BCD1ADDAL,BCD2

DAA;調(diào)整,(AL)=57HMOVBCD3,AL;存和的底字節(jié)MOVAL,BCD1+1ADCAL,BCD2+1

DAA;調(diào)整,(AL)=38HMOVBCD+1,AL;存和的高字節(jié)64BCD碼運算編程舉例64例2兩個ASCII碼數(shù)(7-5)相減MOVAL,’7’;37HSUBAL,’5’;37H-35H

AAS;調(diào)整,(AL)=02H例3非組合BCD數(shù)6*8=48MOVAL,06HMOVBL,08HMULBL;AX(AL)*(BL)

AAM;調(diào)整,(AX)=0408H例4非組合BCD數(shù)17/5=3余2MOVAX,0107HMOVBL,05H

AAD;調(diào)整被除數(shù),(AX)=0011HDIVBL;相除,(AL)=03,(AH)=02例2兩個ASCII碼數(shù)(7-5)相減邏輯運算與移位指令這類指令包括與、或、非、異或、測試和左移、右移、循環(huán)左/右移指令。除NOT外,都影響某些標(biāo)志位(OF、CF、PF、SF、ZF),對AF無影響或隨機(jī)。邏輯與/或/異或指令A(yù)ND/OR/XOR格式:AND/OR/XOROP1,OP2reg,memreg,immmem,regmem,imm功能:兩操作數(shù)按位與、或、異或,結(jié)果存入OP1中。邏輯運算與移位指令例如:MOVAL,‘6’ANDAL,0FH;(AL)=06H

MOVAL,6ORAL,30H;(AL)=36HMOVAL,0F0HXORAL,0F0H;(AL)=00H

測試指令TEST格式:TESTOP1,OP2reg,regreg,memreg,imm功能:兩操作數(shù)按位與,置標(biāo)志位,不保存結(jié)果。

67例如:MOVAL,‘6’67TEST常用于測試某位的狀態(tài)。例如測試打印機(jī)是否空閑的程序段如下:MOVDX,3BDHPRTBUSY:INAL,DX;讀打印機(jī)狀態(tài)TESTAL,80H;測試是否空閑JZPRTBUSY;忙,繼續(xù)測試...邏輯非指令NOT格式:NOTOP1regmem功能:將操作數(shù)各位求反,對標(biāo)志位沒有影響.68TEST常用于測試某位的狀態(tài)。例如測試打印機(jī)是否空閑的程序段算術(shù)/邏輯左移指令SAL/SHL格式:SAL/SHLOP1,OP2reg,imm8mem,imm8reg,CLmem,CL功能:將OP1向左移位,移動的次數(shù)由OP2決定,若移動的次數(shù)為1,OP2為立即數(shù),其它情況將移動的次數(shù)送入CL中。操作數(shù)每左移一位,在最低位補0,最高位移進(jìn)CF中。例:設(shè)(AL)=01010011B,將AL的內(nèi)容左移3位。MOVCL,3SHLAL,CL;(AL)=1001100069算術(shù)/邏輯左移指令SAL/SHL69算術(shù)/邏輯右移指令SAR/SHR格式:SAR/SHROP1,OP2reg,imm8mem,imm8reg,CLmem,CL功能:將OP1向右移位,移動的次數(shù)由OP2決定,若移動的次數(shù)為1,OP2為立即數(shù),其它情況將移動的次數(shù)送入CL中。對于SHR指令,操作數(shù)為無符號數(shù),每右移一位,在最高位補0,最低位移進(jìn)CF中。對于SAR指令,操作數(shù)為有符號數(shù),每右移一位,最高位保持不變,最低位移進(jìn)CF中。70算術(shù)/邏輯右移指令SAR/SHR707171例:設(shè)(AL)=10101001B,將AL的內(nèi)容算術(shù)/邏輯右移3位。算術(shù)右移3位:MOVCL,3SARAL,CL;(AL)=11110101B邏輯右移3位:MOVCL,3SHRAL,CL;(AL)=00010101B

72例:設(shè)(AL)=10101001B,將AL的內(nèi)容算術(shù)/72循環(huán)移位指令ROL/ROR/RCL/RCR格式:ROL/ROR/RCL/RCROP1,OP2reg,imm8mem,imm8reg,CLmem,CL功能:ROL為左循環(huán)移位指令,ROR為右循環(huán)移位指令,RCL和RCR則分別為帶CF的左循環(huán)移位和右循環(huán)移位指令。CFCFCFCFROLRORRCLRCR73循環(huán)移位指令ROL/ROR/RCL/RCRCFCFCFCFR串操作指令串操作是指對存儲器中的一個或多個長度為字節(jié)、字或雙字的字符串進(jìn)行操作,包括串傳送、串裝入、串存儲、串比較、串掃描、串輸入、串輸出等。

串操作指令采用隱含尋址方式,約定:DS:SI(ESI)尋址源串,ES:DI(EDI)尋址目的串。且偏移指針SI(ESI),DI(EDI)可根據(jù)DF方向標(biāo)志自動增量或減量,以指向串中下一項。即:當(dāng)DF=0時,增1(字節(jié))、2(字)或4(雙字)當(dāng)DF=1時,減1(字節(jié))、2(字)或4(雙字)74串操作指令74串傳送指令格式:MOVSB;字節(jié)傳送MOVSW;字傳送MOVSD;雙字傳送功能:將DS:SI(ESI)指定源串中的數(shù)據(jù)傳送到ES:DI(EDI)指定的目的串中,并修自動改源、目指針。串裝入指令格式:LODSB;裝入字節(jié)串LODSW;裝入字串LODSD;裝入雙字串功能:將DS:SI(ESI)指定源串中的數(shù)據(jù)傳送到AL、AX或EAX中,并自動修改源指針。75串傳送指令75串比較指令格式:CMPSB;字節(jié)串比較CMPSW;字串比較CMPSD;雙字串比較功能:將DS:SI(ESI)指定源串中的數(shù)據(jù)與ES:DI(EDI)指定的目的串中的數(shù)據(jù)進(jìn)行比較,置標(biāo)志位并自動修改指針。串存儲指令格式:STOSB;存字節(jié)串STOSW;存字串STOSD;存雙字串功能:將AL、AX或EAX中的數(shù)據(jù)傳送到由ES:DI(EDI)指定的目的串中,并修改指針。76串比較指令76串掃描指令格式:SCASB;掃描字節(jié)串SCASW;掃描字串SCASD;掃描雙字串功能:用AL、AX或EAX中的數(shù)據(jù)減去由ES:DI(EDI)指定的目的串中的數(shù)據(jù),置標(biāo)志位并自動修改目的指針。串輸入指令格式:INSB;輸入字節(jié)串INSW;輸入字串INSD;輸入雙字串功能:從DX指定的端口輸入數(shù)據(jù)至由ES:DI(EDI)指定的目的串中,并自動修改目的指針。77串掃描指令77串輸出指令格式:OUTSB;輸出字節(jié)串OUTSW;輸出字串OUTSD;輸出雙字串功能:將DS:SI(ESI)指定源串中的數(shù)據(jù)輸出到由DX指定的端口,并自動修改源指針。

重復(fù)前綴R

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論