第3章 指令系統(tǒng)-D13_第1頁
第3章 指令系統(tǒng)-D13_第2頁
第3章 指令系統(tǒng)-D13_第3頁
第3章 指令系統(tǒng)-D13_第4頁
第3章 指令系統(tǒng)-D13_第5頁
已閱讀5頁,還剩79頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1

第3章80X86的尋址方式和指令系統(tǒng)第1節(jié)

80X86的數(shù)據(jù)類型第2節(jié)

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

80X86的指令系統(tǒng)2學(xué)習(xí)指導(dǎo)和要求掌握80486的七種數(shù)據(jù)類型;熟練掌握7(11)種尋址方式;熟記各種類型的指令格式及功能,并能編寫簡單程序。3

第1節(jié)80X86的數(shù)據(jù)類型

80486匯編語言中可使用的數(shù)據(jù)類型有以下七種:

無符號二進制數(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é)地址為該雙字的地址。4有符號二進制數(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.”。5雙精度數(shù)(64位):數(shù)據(jù)格式如下:1位符號,11位階碼,53位有效數(shù)(顯式52位,外加1位隱含的整數(shù)“1.”。636252510

階碼有效數(shù)符號位1.擴展精度數(shù)(80位):數(shù)據(jù)格式如下:79786463620

階碼1有效數(shù)符號位1位符號,15位階碼,64位有效數(shù)(內(nèi)含1位整數(shù)1,小數(shù)點是隱含的。.6BCD碼壓縮BCD碼:1字節(jié)存放兩個BCD碼,格式如圖a74307430

(a)(b)非壓縮BCD碼:1字節(jié)存放一個BCD碼(低4位),格式如圖b字符串位串:從任何字節(jié)的任何位開始的相鄰位序列,最長可達(dá)232-1位字節(jié)/字/雙字串:是字節(jié)、字、雙字的相鄰序列,最長可達(dá)232-1字節(jié)。十位個位0或任意個位7ASCII碼

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位偏移量組成,段間尋址時使用。返回8

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

80X86的尋址方式共有7種:1.立即尋址2.寄存器尋址3.直接尋址4.寄存器間接尋址5.相對寄存器間接尋址6.基址加變址尋址7.相對基址加變址尋址9立即尋址

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

立即數(shù)只能作源操作數(shù)。不能作目的操作數(shù)。寄存器尋址操作數(shù)在CPU的寄存器中,而寄存器的名由指令指出。如:INCCL;CL(CL)+1MOVAX,BX;AX(BX)10直接尋址操作數(shù)有效地址(16位或32位)直接包含在指令中,它位于操作碼之后,存放在代碼段中。如果指令無前綴指明在那一段中,則默認(rèn)操作數(shù)存放在數(shù)據(jù)段。如:MOVAX,[2000H];DS段2000H的內(nèi)容送AL,

2001H的內(nèi)容送AHMOVAX,ES:[2000H];ES段2000H的內(nèi)容送AL,

2001H的內(nèi)容送AH寄存器間接尋址操作數(shù)的偏移地址存放在寄存器中,而操作數(shù)存放在存儲器中。(1)16位尋址

EA=[DI]、[SI]、[BX]、[BP]

無前綴默認(rèn)操作數(shù)存放在數(shù)據(jù)段無前綴默認(rèn)操作數(shù)存放在堆棧段11例如:

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=[EDI]、[ESI]、[EBX]、[EAX]、[ECX]、[EDX]、[ESP]、[EBP]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

12相對寄存器間接尋址寄存器內(nèi)容與位移量之和形成操作數(shù)的有效地址。即:

EA=[寄存器]+位移量

(1)16位尋址

EA={[BX]、[BP]、[DI]、[SI]}+位移量(帶符號8或16位整數(shù))如:MOVAX,2040H[BX]

或MOVAX,[BX+2040H];DS段(BX)+2040H中的字?jǐn)?shù)據(jù)送AX。

(2)32位尋址

EA={[EAX]、[EBX]、...、[ESI]、[ESP]、[EBP]}+位移量(帶符號8或32位整數(shù))

如:MOVECX,1500H[EAX];DS段(EAX)+1500H

或MOVECX,[EAX+1500H]中的雙字?jǐn)?shù)據(jù)送ECX。13基址加變址尋址基址寄存器內(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。

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

14相對基址加變址尋址基址寄存器內(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。15與跳轉(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]16

第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è)置DS17二、指令系統(tǒng)

80486的指令大致分為:整數(shù)指令:數(shù)據(jù)傳送、算術(shù)運算、邏輯運算與移位、串操作、位操作指令、控制轉(zhuǎn)移、標(biāo)志操作、按條件設(shè)置字節(jié)、處理器控制指令、高級語言指令等浮點數(shù)指令:數(shù)據(jù)傳送、算術(shù)運算、比較、超越函數(shù)、常量、控制等指令操作系統(tǒng)型指令18

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

OP1,OP2,OP3:操作數(shù)

reg:通用寄存器。長度可以是8位、16位、32位

Sreg:段寄存器(段選擇符)

reg8:8位通用寄存器

reg16:16位通用寄存器

reg32:32位通用寄存器

mem:存儲器。長度可以是8位、16位、32位

mem8:8位存儲器

mem16:16位存儲器

mem32:32位存儲器

imm:立即數(shù)。長度可以是8位、16位、32位

imm8:8位立即數(shù)19與運算有關(guān)的標(biāo)志標(biāo)志寄存器FLAGS中存放運算結(jié)果的屬性。CF:進位/借位標(biāo)志。加、減運算最高位產(chǎn)生進位/借位時置1。AF:輔助進位/借位標(biāo)志。加、減運算時低半字節(jié)位產(chǎn)生進位/借位時置1。OF:溢出標(biāo)志。有符號二進制加、減運算結(jié)果超出范圍時置1。ZF:零標(biāo)志。結(jié)果為零時置1。SF:符號標(biāo)志。結(jié)果為負(fù)時置1。PF:奇偶標(biāo)志。結(jié)果“1”的個數(shù)為偶數(shù)時置1。20

指令執(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)隨機

-:表示相應(yīng)標(biāo)志位狀態(tài)不受影響,保持原狀態(tài)21數(shù)據(jù)傳送類指令用于實現(xiàn)存儲器與寄存器、寄存器與寄存器、累加器與I/O端口之間字節(jié)、字或雙字的傳送,也可將立即數(shù)傳送到存儲器或寄存器。這類指令基本上不影響標(biāo)志位。傳送指令MOV

指令格式:MOVOP1,OP2reg/Sreg,regreg,Sregreg/Sreg,memmem,reg/Sregreg,immmem,imm22

功能:把OP2的內(nèi)容傳送到OP1中,OP1和OP2為字節(jié)、字或雙字說明:立即數(shù)只能作為源操作數(shù),而其他三種既可作源操作數(shù)又可作目的操作數(shù);存儲器和存儲器之間以及段寄存器和段寄存器之間不允許傳數(shù),而通用寄存器之間則允許相互傳數(shù)。例如:用如下指令可給數(shù)據(jù)段寄存器DS賦初值

MOVAX,DATAMOVDS,AX再如:MOVEBX,12345678HMOVAX,[BX+24]23交換指令XCHG

指令格式:XCHGOP1,OP2reg,regmem,regreg,mem

功能:用于交換兩個操作數(shù)。說明:指令中的兩個操作數(shù)可以是兩個寄存器操作數(shù),或一個寄存器與一個存儲器操作數(shù)。例如:XCHGAX,BXXCHGAX,[BX]XCHG[BX+20H],AX24I/O指令I(lǐng)N和OUT

指令格式:

INOP1,OP2OUTOP1,OP2AL,imm8imm8,ALAX,imm8imm8,AXEAX,imm8imm8,EAXAL,DXDX,ALAX,DXDX,AXEAX,DXDX,EAX

功能:用于在I/O端口和AL、AX或EAX累加器之間交換數(shù)據(jù)。

2526

例如:

INAL,0FAH;從端口FAH輸入8位數(shù)到ALINEAX,28H;將端口28H、29H、2AH和

2BH的32位數(shù)送EAX

MOVDX,3AEH;I/O地址大于255時.應(yīng)通過

DX間接尋址

INAX,DX;從DX指出的端口輸入16位數(shù)AXOUT21H,AL;將8位數(shù)從AL輸出到端口21HOUTDX,EAX;將32位數(shù)從EAX輸出到DX指出的端口27裝入有效地址指令LEA

格式:LEAOp1,OP2reg32,memreg16,mem

功能:將有效地址(即偏移地址)送通用寄存器。例如:LEAECX,DOLLAR[ESI*4+EDX]

設(shè):EDX=30H,ESI=32H,DOLLAR=7580H,

則(ECX)=7678H(32H*4+30H+7580H)28裝入全地址指令LDS,LES,LFS.LGS,LSS

格式:LDSreg,memLESreg,memLFSreg,memLGSreg,memLSSreg,mem

功能:取mem指示的32位或48位全地址指針(即一個16位段選擇符和一個16位或32位偏移地址)裝入段寄存器和16位或32位reg中。

29

對于實地址方式和虛擬8086方式,段基址和偏移地址都是16位,段基址送段寄存器,偏移地址送reg中。例如:XDD12345678HLDSSI,X;DS=1234H,SI=5678H

對于16位和32位保護方式,選擇符送段寄存器,偏移地址送reg中。例如:XDD12345678H;32位偏移值

DW0010H;16位選擇符

LDSESI,X;ESI=12345678H,

DS=0010H30壓棧/彈棧指令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。31例如: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

堆棧為“先進后出”的數(shù)據(jù)結(jié)構(gòu)。32棧底棧底SPSP00H20H60H30H40H60H棧頂SSSS圖A圖B設(shè):AX=6040H,BX=3060H,CX=2000H

執(zhí)行PUSH指令后,堆棧狀態(tài)如圖A,執(zhí)行POP指令后,堆棧狀態(tài)如圖B。33全部通用寄存器壓棧和出棧指令格式:PUSHA/POPA;16位通用寄存器壓棧和出棧指令。入棧順序為:

AX、CX、BX、DX、

SP、BP、SI和DI。

PUSHAD/POPAD;32位通用寄存器壓棧和出棧指令。入棧順序為:

EAX、ECX、EBX、EDX、

ESP、EBP、ESI和EDI。其中:SP和ESP為操作前的棧頂指針。34

標(biāo)志寄存器傳送指令指令格式:LAHF;F寄存器內(nèi)容送AH指令SAHF;AH內(nèi)容送F寄存器指令PUSHF;16位F內(nèi)容進棧指令(保存F)POPF;16位F內(nèi)容出棧指令(恢復(fù)F)PUSHFD;32位F內(nèi)容進棧指令(保存F)POPFD;32位F內(nèi)容出棧指令(恢復(fù)F)35查表轉(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)

LEABX,TABLE;DS段表的首地址送BXMOVAL,3;要轉(zhuǎn)換的代碼在表中的序號3送ALXLAT;AL((BX)+(AL)),查找到的3的

ASCII碼33H保存在AL中序號01234...TABLE30H31H32H

33H34H..

36算術(shù)運算指令支持加、減、乘、除四種基本算術(shù)運算,其操作對象可以是字節(jié)、字、雙字的有符號和無符號二進制整數(shù),也可以是無符號的壓縮、非壓縮BCD碼。算術(shù)運算指令一般會影響FLAGS寄存器中的狀態(tài)標(biāo)志。加法和減法指令A(yù)DD/SUB格式:ADDOP1,OP2;OP1OP1+OP2,置標(biāo)志位

reg,regreg,memreg,immmem,regmem,imm37ADD的功能:將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,imm38SUB的功能:從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

10000110012D00001139(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-65D11000040帶進/借位的加、減法指令A(yù)DC/SBB格式:ADCOP1,OP2;OP1OP1+OP2+CF

,置標(biāo)志位

reg,regreg,memreg,immmem,regmem,immADC的功能:將OP1、OP2和進位標(biāo)志位CF相加,結(jié)果存放在OP1。例:ADCAX,375;AX(AX)+375+CFADCEBX,ECX;EBX(EBX)+(ECX)+CF41SBBOP1,OP2;OP1OP1-OP2-CF

,置標(biāo)志位

reg,regreg,memreg,immmem,regmem,immSBB的功能:從OP1中減去OP2,再減去借位標(biāo)志CF,結(jié)果存OP1中。例:SBBAX,BX;AX(AX)-(BX)-CFSUBECX,456789ABH;

ADC和SBB對標(biāo)志位的影響:

OFSFZFAFPFCFXXXXXX42ADD和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

43格式: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ù)44INC和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ù)。45例: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)。A-BCFZFSFOFA=B0100A<B10--無符號數(shù)A>B00--A<B-010

有符號數(shù)A>B-000表A

比較并交換指令CMPXCHG

格式:CMPXCHGOP1,OP2

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

則CX(DX),否則AX(CX)47無符號數(shù)乘法指令MUL

格式:MULOP1regmem

功能:被乘數(shù)隱含在累加器中(AL,AX,EAX),OP1為乘數(shù)。字節(jié)運算時乘積返回到AX;字運算時乘積返回到DX:AX;雙字運算時乘積返回到EDX:EAX。例: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”。48

有符號乘法指令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中。49(3)三操作數(shù):IMULOP1,OP2,OP3reg,reg,immreg,mem,imm

功能:OP2乘以O(shè)P3,積存放在OP1中。例如:IMULDL;AX(AL)*(DL)IMULEBX;EDX:EAX(EAX)*(EBX)IMULBL,CL;BL(BL)*(CL)IMULBL,CL,4;BL(BL)*(CL)*4IMUL指令影響標(biāo)志位OF和CF若積的高字節(jié)、字或雙字不是積的符號位擴展,則OF、CF置“1”,否則OF、CF清“0”。50除法指令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。51

例如:

DIVBL;(AX)/(BL),商存入AL,余數(shù)存入AH。

IDIVECX;(EDX:EAX)/(ECX)商存入EAX,余數(shù)存入EDX。符號擴展指令格式:

CBW;將AL中8位帶符號數(shù)擴展為16位存入AX。

CWD;將AX中16位帶符號數(shù)擴展為32位存入DX:AXCWDE;將AX中16位帶符號數(shù)擴展為32位存入EAX。

CDQ;將EAX中32位帶符號數(shù)擴展為64位存入

EDX:EAX。52符號擴展指令常用于帶符號數(shù)除法運算時,對被除數(shù)位數(shù)的擴展。當(dāng)兩個帶符號數(shù)的字節(jié)/字/雙字?jǐn)?shù)相除時,必須將被除數(shù)擴展為雙倍長度。例如:編寫程序,計算789AH/1234H。BUFFERDW789AH;被除數(shù)

DW1234H;除數(shù)

DD0;存結(jié)果START:MOVBX,OFFSETBUFFERMOVAX,[BX];取被除數(shù)

CDW;字?jǐn)U展為雙字,AX符號位擴展到DX各位

IDIV2[BX];帶符號除

MOV4[BX],AX;存商

MOV6[BX],DX;存余數(shù)

十進制(BCD碼)調(diào)整指令壓縮BCD碼運算:將壓縮BCD數(shù)用二進制加、減指令

(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ù)用二進制加、減、乘、除指令運算,配合相應(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ù)54BCD碼運算編程舉例例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é)例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邏輯運算與移位指令這類指令包括與、或、非、異或、測試和左移、右移、循環(huán)左/右移指令。除NOT外,都影響某些標(biāo)志位。邏輯與/或/異或指令A(yù)ND/OR/XOR格式:AND/OR/XOROP1,OP2reg,memreg,immmem,regmem,imm功能:兩操作數(shù)按位與、或、異或,結(jié)果存入OP1中。57例如:MOVAL,‘6’ANDAL,0FH;(AL)=06H

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

測試指令TEST

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

58TEST常用于測試某位的狀態(tài)。例如測試打印機是否空閑的程序段如下:

MOVDX,3BDHPRTBUSY:INAL,DX;讀打印機狀態(tài)

TESTAL,80H;測試是否空閑

JZPRTBUSY;忙,繼續(xù)測試

...邏輯非指令NOT格式:NOTOP1regmem功能:將操作數(shù)各位求反,對標(biāo)志位沒有影響.59算術(shù)/邏輯左移指令SAL/SHL格式:SAL/SHLOP1,OP2reg,imm8mem,imm8reg,CLmem,CL功能:將OP1向左移位,移動的次數(shù)由OP2決定,若移動的次數(shù)為1,OP2為立即數(shù),其它情況將移動的次數(shù)送入CL中。操作數(shù)每左移一位,在最低位補0,最高位移進CF中。例:設(shè)(AL)=01010011B,將AL的內(nèi)容左移3位。

MOVCL,3SHLAL,CL;(AL)=1001100060算術(shù)/邏輯右移指令SAR/SHR

格式:SAR/SHROP1,OP2reg,imm8mem,imm8reg,CLmem,CL

功能:將OP1向右移位,移動的次數(shù)由OP2決定,若移動的次數(shù)為1,OP2為立即數(shù),其它情況將移動的次數(shù)送入CL中。對于SHR指令,操作數(shù)為無符號數(shù),每右移一位,在最高位補0,最低位移進CF中。對于SAR指令,操作數(shù)為有符號數(shù),每右移一位,最高位保持不變,最低位移進CF中。61例:設(shè)(AL)=10101001B,將AL的內(nèi)容算術(shù)/邏輯右移3位。算術(shù)右移3位:

MOVCL,3SARAL,CL;(AL)=11110101B邏輯右移3位:

MOVCL,3SHRAL,CL;(AL)=00010101B

62循環(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)移位指令。CFCFCFCFROLRORRCLRCR63串操作指令串操作是指對存儲器中的一個或多個長度為字節(jié)、字或雙字的字符串進行操作,包括串傳送、串裝入、串存儲、串比較、串掃描、串輸入、串輸出等。

串操作指令采用隱含尋址方式,約定:

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(雙字)64串傳送指令格式:MOVSB;字節(jié)傳送

MOVSW;字傳送

MOVSD;雙字傳送功能:將DS:SI(ESI)指定源串中的數(shù)據(jù)傳送到ES:DI(EDI)指定的目的串中,并修自動改源、目指針。串裝入指令格式:LODSB;裝入字節(jié)串

LODSW;裝入字串

LODSD;裝入雙字串功能:將DS:SI(ESI)指定源串中的數(shù)據(jù)傳送到AL、AX或EAX中,并自動修改源指針。65串存儲指令格式:STOSB;存字節(jié)串

STOSW;存字串

STOSD;存雙字串功能:將AL、AX或EAX中的數(shù)據(jù)傳送到由ES:DI(EDI)指定的目的串中,并修改指針。串比較指令格式:CMPSB;字節(jié)串比較

CMPSW;字串比較

CMPSD;雙字串比較功能:將DS:SI(ESI)指定源串中的數(shù)據(jù)與ES:DI(EDI)指定的目的串中的數(shù)據(jù)進行比較,置標(biāo)志位并自動修改指針。66串掃描指令格式: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)指定的目的串中,并自動修改目的指針。67串輸出指令格式:OUTSB;輸出字節(jié)串

OUTSW;輸出字串

OUTSD;輸出雙字串功能:將DS:SI(ESI)指定源串中的數(shù)據(jù)輸出到由DX指定的端口,并自動修改源指針。

重復(fù)前綴REP/REPZ/REPE/REPNE/REPNZ

在串操作指令前加上重復(fù)前綴,可使該指令重復(fù)執(zhí)行。重復(fù)前綴的功能為:

REP:CX(CX)-1,當(dāng)(CX)≠0時重復(fù)。

REPZ/REPE:相等時重復(fù)。即:

CX(CX)-1,當(dāng)(CX)≠

0且ZF=1時重復(fù)。

REPNE/REPNZ:不相等時重復(fù)。即:

CX(CX)-1,當(dāng)(CX)≠

0且ZF=0時重復(fù)。

REP常與MOVS和STOS指令配合使用。

REPZ/REPE和REPNE/REPNZ常與CMPS和SCANS指令配合使用。68串操作指令應(yīng)用舉例使用串操作指令時,根據(jù)需要設(shè)置以下內(nèi)容:設(shè)置DS:SI(ESI);ES:DI(EDI)設(shè)置DF標(biāo)志設(shè)置CX(ECX)選用重復(fù)前綴REP、REPE/REPZ、REPNE/REPNZ69例1將數(shù)據(jù)段中的字符串‘ABC45’傳送到附加段中。程序如下:DATASEGMENTST:MOVAX,DATAYCHDB‘ABC45’MOVDS,AXDATAENDSMOVAX,EXTRAEXTRASEGMENTMOVES,AXMCHDB5DUP(?)LEASI,YCHEXTRAENDSLEADI,MCHCODESEGMENTMOVCX,5ASSUMECS:CODECLDASSUMEDS:DATAREPMOVSBASSUMEES:EXTRACODEENDSENDST70

控制轉(zhuǎn)移指令控制轉(zhuǎn)移指令包括:

?

無條件轉(zhuǎn)移指令(JMP)

?

條件轉(zhuǎn)移指令(JA、JB、JE……)

?

循環(huán)控制指令(LOOP、LOOPZ、LOOPNZ)

?

調(diào)用/返回指令(CALL、RET)

?中斷/中斷返回指令(INT、IRET)無條件轉(zhuǎn)移指令JMP格式:JMPOP1lable;標(biāo)號

regmem功能:無條件地控制程序轉(zhuǎn)移到OP1所指定的目標(biāo)地址。71JMP尋址方式:短轉(zhuǎn)移:在段內(nèi)的短距離(-128----127)轉(zhuǎn)移。段內(nèi)轉(zhuǎn)移:CS值不變,只給出地址偏移值。段間轉(zhuǎn)移:CS和(E)IP的值都發(fā)生改變的轉(zhuǎn)移為明確表示標(biāo)號或存儲單元的類型,可在操作數(shù)前加SHORT、NEAR、FAR、WORD、DWORD、FWORD等修飾符來限定。如:段內(nèi)直接短轉(zhuǎn)移:JMPSHORTPTR標(biāo)號段內(nèi)直接轉(zhuǎn)移:JMPNEARPTR標(biāo)號段內(nèi)間接轉(zhuǎn)移:JMPWORDPTRreg或mem段間直接轉(zhuǎn)移:JMPFARPTR標(biāo)號段間間接轉(zhuǎn)移:JMPDWORDPTRmem

72例如:

JMPNEARPTRTABLE[EBX];帶標(biāo)號的段內(nèi)轉(zhuǎn)移

JMPFARPTRTABLE[EBX];帶標(biāo)號的段間轉(zhuǎn)移

JMPSHORTPTRTABLE[EBX];帶標(biāo)號的短轉(zhuǎn)移

JMPWORDPTR[DX];16位尋址時不帶標(biāo)號的段內(nèi)轉(zhuǎn)移

JMPDWORDPTR[DX];16位尋址時不帶標(biāo)號的段間轉(zhuǎn)移

JMPDWORDPTR[EDX];32位尋址時不帶標(biāo)號的段內(nèi)轉(zhuǎn)移

JMPFWORDPTR[EDX];32位尋址時不帶標(biāo)號的段間轉(zhuǎn)移73條件轉(zhuǎn)移指令Jcc(p92表)格式:JccOP1

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論