微機(jī)原理與接口技術(shù):第3章 80x86匯編語言程序設(shè)計(中)_第1頁
微機(jī)原理與接口技術(shù):第3章 80x86匯編語言程序設(shè)計(中)_第2頁
微機(jī)原理與接口技術(shù):第3章 80x86匯編語言程序設(shè)計(中)_第3頁
微機(jī)原理與接口技術(shù):第3章 80x86匯編語言程序設(shè)計(中)_第4頁
微機(jī)原理與接口技術(shù):第3章 80x86匯編語言程序設(shè)計(中)_第5頁
已閱讀5頁,還剩99頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1第3章80x86匯編語言程序設(shè)計(中)23.4順序結(jié)構(gòu)程序設(shè)計順序結(jié)構(gòu)是最簡單也是最基本的程序結(jié)構(gòu)。程序按順序執(zhí)行,不發(fā)生任何轉(zhuǎn)移,通常非控制轉(zhuǎn)移類指令都可編寫順序結(jié)構(gòu)程序。語句1語句n語句2

..33.4.1數(shù)據(jù)傳送指令通用數(shù)據(jù)傳送指令地址傳送指令標(biāo)志寄存器傳送指令輸入輸出指令類型轉(zhuǎn)換指令4PUSHA/PUSHAD(pushallregisters)所有寄存器進(jìn)棧POPA/POPAD(popallregisters)所有寄存器出棧1、通用數(shù)據(jù)傳送指令MOV(move)傳送MOVSX(movewithsigh-extend)帶符號擴(kuò)展傳送MOVZX(movewithzero-extend)帶零擴(kuò)展傳送PUSH(pushontothestack)進(jìn)棧POP(popfromthestack)出棧XCHG(exchange)交換XLAT(translate) 換碼(查表)MOV傳送指令格式:MOVDST,SRC操作:DST<--(SRC)

即把源操作數(shù)的內(nèi)容送入目的操作數(shù)說明:1)可以進(jìn)行8位、16位或32位數(shù)據(jù)的傳送

2)SRC可為立即數(shù)、寄存器、存儲器操作數(shù)

3)DST可為寄存器、存儲器操作數(shù)

4)該指令不影響任何狀態(tài)標(biāo)志位存儲器段寄存器CSDSSSES立即數(shù)通用寄存器AXBXCXDXBPSPSIDI5MOV指令示例MOVAX,[BX+DI];存儲器操作數(shù)MOVAX,ARRAY[SI];傳送到寄存器MOVAX,0B00H;立即數(shù)傳送到寄存器MOVCL,10000000BMOVVALUE,100H;立即數(shù)傳送到存儲單元MOVES:[BX],4BHMOV[BX],CX;寄存器內(nèi)容傳送到存儲器MOVBUFF[BP][DI],AXMOVAL,BL;寄存器之間傳送MOVBP,SI6MOV指令注意事項(xiàng):(1)兩個操作數(shù)長度必須一致

MOVAL,BX;不合法例外:源是16進(jìn)制立即數(shù),位數(shù)小于目的操作數(shù)時,高位按0擴(kuò)展,源是10進(jìn)制立即數(shù),位數(shù)小于目的操作數(shù)時,高位按符號位擴(kuò)展

MOVAX,0D8H

執(zhí)行后,(AX)=00D8HMOVAX,-40

執(zhí)行后,(AX)=FFD8H(2)不允許用立即數(shù)為段寄存器賦值例:MOVES,10A0H;不合法7(3)不允許兩個操作數(shù)均是存儲器操作數(shù)

MOVX,Y;不合法可以通過一個寄存器傳送:

MOVAX,YMOVX,AX(4)不允許兩個操作數(shù)均為段寄存器

MOVES,DS;不合法(5)不允許CS、IP和立即數(shù)做目標(biāo)操作數(shù)

MOVCS,AX ;不合法

MOV100H,AX ;不合法

MOVIP,BX ;不合法89MOVSX帶符號擴(kuò)展傳送指令格式:MOVSXDST,SRC操作:DST<--符號擴(kuò)展(SRC)MOVZX帶零擴(kuò)展傳送指令格式:MOVSXDST,SRC操作:DST<--零擴(kuò)展(SRC)說明:

1)源操作數(shù)是8位或16位寄存器或存儲器的內(nèi)容

2)目的操作數(shù)必須是16位或32位寄存器10MOVSX指令示例

MOVSXEAX,CL

設(shè)(CL)=0ABH,執(zhí)行后(EAX)=0FFFFFFABH

負(fù)號擴(kuò)展若(CL)=57H,執(zhí)行后(EAX)=00000057H

正號擴(kuò)展MOVZX指令示例

MOVZXEAX,DATA

設(shè)(DATA)=87ADH,執(zhí)行后(EAX)=000087ADH0擴(kuò)展11PUSH壓棧指令格式:PUSHSRC操作:

SP<--(SP)-2((SP)+1,(SP))<--(SRC)32位指令:

ESP(ESP)-4((ESP)+3,(ESP)+2,(ESP)+1,(ESP))(SRC)說明:1)源操作數(shù)可以是寄存器或存儲器操作數(shù)

2)必須以字或雙字為單位操作

3)32位指令允許SRC是16位或32位立即數(shù),也容許是32位寄存器和存儲器操作數(shù)舉例:PUSHAXPUSHDAT[BX][SI]

PUSH1234H PUSH87654321H PUSHEAX12

壓棧指令示例

PUSHAX

執(zhí)行前

AXAX

25H31HSP52500H 3125H3125H低地址低地址進(jìn)棧方向SP3125H524FEH524FFH52500H執(zhí)行后13POP出棧指令格式:POPDST操作:

16位指令:

DST<--((SP)+1,(SP))SP<--(SP)+2

32位指令:

DST((ESP)+3,(ESP)+2,(ESP)+1,(ESP))(ESP)(ESP)+4舉例:POPAXPOPDAT[BX][SI] POPDS

POPECX14出棧指令示例

POPBX

執(zhí)行前執(zhí)行后

BXBX75C1H

低地址低地址

SP6Bh51000H6Bh51000H48h1H48h1H9Ah2H9Ah2H28h3H28h3H出棧方向48h6Bh48h48h6BhSP15PUSHA所有寄存器進(jìn)棧格式:PUSHAPUSHA:(286及其后繼機(jī)型)

16位通用寄存器依次進(jìn)棧,次序?yàn)椋篈X,CX,DX,BX,指令執(zhí)行前的SP,BP,SI,DI

指令執(zhí)行后SP(SP)-16仍指向棧頂操作:PUSHAD:

(386及其后繼機(jī)型)

32位通用寄存器依次進(jìn)棧,次序?yàn)椋篍AX,ECX,

EDX,EBX,指令執(zhí)行前的ESP,EBP,ESI,EDI

指令執(zhí)行后ESP(ESP)-32仍指向棧頂16PUSHA指令示例(DI)-16(SI)-14(BP)-12(SP)原

-10(BX)-8(DX)-6(CX)-4(AX)-20(SP)原(SP)執(zhí)行前執(zhí)行后17POPA所有寄存器出棧格式:POPAPOPA:(286及其后繼機(jī)型)

16位通用寄存器依次出棧,次序?yàn)椋?/p>

DI,SI,BP,SP,BX,DX,CX,AX

指令執(zhí)行后SP(SP)+16仍指向棧頂操作:POPAD:

(386及其后繼機(jī)型)

32位通用寄存器依次出棧,次序?yàn)椋篍DI,ESI,

EBP,ESP,EBX,EDX,ECX,EAX

指令執(zhí)行后ESP(ESP)+32仍指向棧頂18XCHG交換指令格式:XCHGOPR1,OPR2操作:(OPR1)(OPR2)說明:

1)操作數(shù)不允許為段寄存器

2)兩個操作數(shù)長度必須相同

3)本指令不影響狀態(tài)標(biāo)志位

4)兩個操作數(shù)不能同時為存儲器操作數(shù)如:

XCHGAX,BX;寄存器之間交換

XCHGBX,[BP+DI];寄存器與存儲器之間交換

XCHG[SI],DX19交換指令示例

XCHGDX,DATA[BP]設(shè)(SS)=5000H,(BP)=0400H,DATA=1800H

物理地址=5000H×16+0400H+1800H=51C00H

執(zhí)行前執(zhí)行后

DXDX37CDH

51C00H42H51C00H1H6DH1H

CDH37H6D42H20XLAT查表指令(換碼指令)格式:XLATTABLE或

XLAT操作:AL<--((BX)+(AL))或AL((EBX)+(AL))

將AL中的當(dāng)前內(nèi)容轉(zhuǎn)換為表中某一種代碼。執(zhí)行前一定要將表(TABLE)的EA賦給BX

(或EBX)寄存器,將代碼在表中距首址的偏移放在AL寄存器中。XLAT指令示例

TABLE30HMOVBX,OFFSETTABLE+131H

;表首址給BX +232HMOVAL,4 +333H

;待轉(zhuǎn)換內(nèi)容到AL +434H

XLAT +535H+636H+737H34HAL21LDS(loadDSwithpointer)

指針?biāo)图拇嫫骱虳SLES(loadESwithpointer)

指針?biāo)图拇嫫骱虴SLFS(loadFSwithpointer)

指針?biāo)图拇嫫骱虵SLGS(loadGSwithpointer)

指針?biāo)图拇嫫骱虶SLSS(loadSSwithpointer)

指針?biāo)图拇嫫骱蚐S2、地址傳送指令LEA(loadeffectiveaddress)

有效地址送寄存器22LEA指令示例設(shè)(DS)=2000H,(BX)=1234HLEADI,[BX] MOVSI,[BX]執(zhí)行后執(zhí)行后

21234H78H 5H56H1234H1234HBXLEA裝載有效地址指令格式:LEADST,SRC操作:DST<--SRC的有效地址EA說明:SRC必須是存儲器操作數(shù),而DST則必須是一個16位或32位的通用寄存器(AX..DI..)

DI5678HSI78H1234H56235678HLEADI,BUFFER;將變量BUFFER的;有效地址送到DI,;而不是將BUFFER;變量的值送DI78H562000H:1234H5HBUFFERDI1234HDIMOVDI,BUFFER;將變量BUFFER的有效地址;所指單元的值送DI執(zhí)行后執(zhí)行后1234H78H56H注意LEA與OFFSET的區(qū)別24LDS裝載數(shù)據(jù)段指針指令

格式:LDSDST,SRC

操作:DST(SRC)DS(SRC+2)或

DS(SRC+4)LES、LFS、LGS、LSS

格式:同LDS,目標(biāo)分別是ES,F(xiàn)S,GS,和SS寄存器說明:

1)源操作數(shù)必須是32位或48位存儲器操作數(shù)

2)目的操作數(shù)必須是寄存器

3)完成一個邏輯地址的傳送,該邏輯地址須用偽指令預(yù)先定義在當(dāng)前數(shù)據(jù)段中257659H2000HH45HHD6HH00HH50HD645H5000HDSDIDIDSLDS指令示例

LDSDI,[BX]設(shè)(DS)=2000H,(BX)=1000H執(zhí)行前執(zhí)行后

再比如:LDSBX,BUFF[SI]LDSDI,BUFF4550D60026LEA與LDS的區(qū)別LEASI,BUFFLDSDI,BUFFBUFF(21000H)45H+1D6H+200H+350H設(shè)(DS)=2000HEABUFF=1000H執(zhí)行后:SI=1000HDI=D645HDS=5000H思考:LDSDI,BX是合法指令嗎?27

LAHF(loadAHwithflags)

標(biāo)志送AHSAHF(storeAHintoflags)AH送標(biāo)志寄存器3、標(biāo)志寄存器傳送指令PUSHF/PUSHFD(pushtheflagsoreflags)

標(biāo)志進(jìn)棧POPF/POPFD(poptheflagsoreflags)

標(biāo)志出棧28LAHF標(biāo)志寄存器送AH指令格式:LAHF

操作:AH<--FLAGS7-0

即將標(biāo)志寄存器的最低8位送AH中SAHF送標(biāo)志寄存器指令格式:SAHF操作:FLAGS7-0<--(AH)

即將AH寄存器內(nèi)容送FLAGS最低8位說明:1)無操作數(shù)

2)FLAGS中含若干標(biāo)志位,但LAHF指令本身不影響標(biāo)志位29PUSHF標(biāo)志進(jìn)棧指令格式:PUSHF操作:PUSHF:SP(SP)-2((SP)+1,(SP))(FLAGS)PUSHFD:(ESP)(ESP)-4((ESP)+3,(ESP)+2,(ESP)+1,(ESP))(EFLAGSAND0FCFFFFH)

(清除VM和RF位)說明:無操作數(shù)30POPF標(biāo)志出棧指令格式:POPF操作:POPF:FLAGS((SP)+1,(SP))SP(SP)+2POPFD:EFLAGS((ESP)+3,(ESP)+2,(ESP)+1,(ESP))ESP(ESP)+4314、輸入輸出指令

IN(input)輸入

OUT(output)輸出32

IN輸入指令(從接口電路的端口輸入數(shù)據(jù))說明:用Port指明8位端口地址時,地址范圍為00H-FFH

以DX間接給出端口地址時,最大地址為0FFFFH操作:AL/AX/EAX<--(Port)

從外設(shè)讀入字節(jié)或字或雙字?jǐn)?shù)據(jù)

AL/AX/EAX<--(DX)

以DX內(nèi)容為端口地址,讀入數(shù)據(jù)格式2:INAL,DX(字節(jié))

INAX,DX(字)

INEAX,DX(雙字)格式1:INAL,Port(字節(jié))(Port是0-FFH的立即數(shù))INAX,Port(字)(Port是0-FFH的立即數(shù))

INEAX,Port(雙字)

(Port是0-FFH的立即數(shù))33OUT輸出指令(向接口電路的端口輸出數(shù)據(jù))格式1:OUTPort,AL(字節(jié))

OUTPort,AX(字)

OUTPort,EAX(雙字)格式2:OUTDX,AL(字節(jié))

OUTDX,AX(字)

OUTDX,EAX(雙字)操作:(Port)<--(AL)/(AX)/(EAX)

傳送數(shù)據(jù)到Port端口

(DX)<--(AL)/(AX)/(EAX)

傳送數(shù)據(jù)到DX指出的端口說明:用Port指明8位端口地址時,地址范圍為00H-FFH

以DX間接給出端口地址時,最大地址為0FFFFH34IN指令示例

INAL,20H;從20H端口讀入字節(jié)數(shù)據(jù)-->ALINAX,48H;從48H端口讀入字?jǐn)?shù)據(jù)-->AX

MOVDX,3FCHINAX,DX;從03FCH端口讀入字?jǐn)?shù)據(jù)-->AXOUT指令示例

OUT32H,AX;傳送字?jǐn)?shù)據(jù)到32H端口

MOVDX,400HMOVAL,86HOUTDX,AL;傳送字節(jié)數(shù)據(jù)到DX指出的端口355、類型轉(zhuǎn)換指令CBW(convertbytetoword)

字節(jié)轉(zhuǎn)換為字CWD/CWDE(convertwordtodoubleword)

字轉(zhuǎn)換為雙字CDQ(convertdoubletoquad)

雙字轉(zhuǎn)換為4字BSWAP(byteswap)

字節(jié)交換36CBW字節(jié)轉(zhuǎn)換為字格式:CBW

操作:擴(kuò)展AL中的符號至AH中,將8位數(shù)擴(kuò)展成等效的16位數(shù)CWD/CWDE字轉(zhuǎn)換為雙字格式:CWD操作:擴(kuò)展AX中的符號至DX中,將16位數(shù)擴(kuò)展成等效的32位數(shù)格式:CWDE操作:AX的內(nèi)容符號擴(kuò)展到EAX說明:

用于在符號數(shù)除之前,形成雙倍長度的被除數(shù)37CDQ雙字轉(zhuǎn)換為4字格式:CDQ操作:EAX的內(nèi)容符號擴(kuò)展到EDX,形成EDX:EAX

中的4字BSWAP字節(jié)交換格式:BSWAPr32操作:使32位寄存器的字節(jié)次序變反(1、4字節(jié)交換,2、3字節(jié)交換)BSWAP指令示例

BSWAPEAX

執(zhí)行前(EAX)=11223344H

執(zhí)行后(EAX)=44332211H38數(shù)據(jù)傳送指令小結(jié)1、數(shù)據(jù)傳送指令不影響標(biāo)志位(除SAHF)2、除XCHG指令外,都是從源到目的的單向傳送3、注意MOV指令與LEA指令的區(qū)別4、堆棧的存取在16位指令中必須以字為單位,5、8086不允許PUSH指令使用立即數(shù)尋址方式如:PUSH12;8086中不合法但286及其后繼機(jī)型中允許6、POP指令不允許使用立即數(shù)尋址方式,不允許使用CS寄存器

例:POP12

;不合法

POPCS;不合法397、段寄存器只能在MOV、PUSH、POP指令中作為操作數(shù)出現(xiàn)例:MOVES,AXPUSHCSPOPDS

但下列指令不合法:

MOVCS,regPOPCS8、指令有多種格式,一般都遵循以下規(guī)則:雙操作數(shù)指令中不允許兩個操作數(shù)均為存儲器操作數(shù)單操作數(shù)指令不允許立即尋址方式目的操作數(shù)不允許使用立即尋址方式3.4.2算術(shù)運(yùn)算指令40加法指令

ADDADCINCXADD除法指令

DIVIDIV乘法指令

MULIMUL減法指令

SUBSBBDECNEGCMPCMPXCHGCMPXCHG8B算術(shù)運(yùn)算中關(guān)于溢出的結(jié)論:OF——表示有符號數(shù)的溢出

CF——表示無符號數(shù)的溢出(進(jìn)位)ADD常規(guī)加指令格式:ADDDST,SRC操作:DST<--(DST)+(SRC)指令構(gòu)成方式:ADDreg,imme;寄存器與立即數(shù)相加ADDreg,reg;寄存器之間ADDreg,mem;寄存器加存儲器操作數(shù)ADDmem,imme;存儲器加立即數(shù)ADDmem,reg;存儲器操作數(shù)加寄存器

說明:運(yùn)行結(jié)果對CF、SF、OF、PF、ZF、AF都會影響41ADD指令示例1

ADDDX,BX

設(shè)(DX)=4652H,(BX)=0F0F0H4652H+F0F0H13742H0100011001010010+111100001111000010011011101000010進(jìn)位進(jìn)位執(zhí)行后

(DX)=3742H

ZF=0結(jié)果不為0SF=0結(jié)果為正

CF=1有進(jìn)位

OF=0不溢出42ADD指令示例2

ADDWORDPTR[BX],9F76H

設(shè)(DS)=2000H,(BX)=1000H

執(zhí)行前:

2100088HA988HA9H+9F76H

148FEH

執(zhí)行后:

21000FEHCF=1有進(jìn)位

48H

OF=1溢出

ZF=0結(jié)果不為0SF=0結(jié)果為正進(jìn)位43ADC帶進(jìn)位加指令格式:ADCDST,SRC操作:DST<--(DST)+(SRC)+(CF)說明:該指令除了多一個進(jìn)位標(biāo)志外,同ADD指令。常用于多字節(jié)運(yùn)算INC增1指令格式:INCDST操作:DST<--(DST)+1說明:1)DST可以是寄存器或存儲器操作數(shù)

2)DST不允許是立即數(shù)

3)運(yùn)行結(jié)果對SF、OF、PF、ZF、AF都會影響,但不影響CF44ADC指令示例——雙字加法設(shè)32位的目的操作數(shù)存放在DX和AX中,DX存放高位字,32位源操作數(shù)存放在BX和CX中,BX存放高位字

CFADCADDDXAXBXCXDXAX+指令序列為:

ADDAX,CX;低位加

ADCDX,BX;高位加45

執(zhí)行前(DX)=0418H,(AX)=0F365H(BX)=1005H,(CX)=0E024H0418HDX0F365HAX1005HBX+0E024HCX+1CF141EHDX1D389HAX

CF=1如:DX:AX=37A1FFFFH,則DX:AX+1能否用:

INCAXADCDX,0來實(shí)現(xiàn)?46INC指令示例LEABX,ARRAYMOVAL,[BX]……INCBXARRAYa1+1a2+2a3+3a4

MOVBX,0MOVAL,ARRAY[BX]……INCBX8088中,執(zhí)行INCBYTEPTR[BX]指令(指令已在指令隊列中)需要

個總線周期。24748XADD交換并相加指令格式:XADDDST,SRC操作:TEMP(SRC)+(DST)SRC(DST)DST(TEMP)說明:1)僅用于486及其后繼機(jī)型,

2)源操作數(shù)只能是寄存器XADD指令示例

XADDBL,DL

如執(zhí)行前(BL)=12H,(DL)=02H

則執(zhí)行后(BL)=14H,(DL)=12HSUB常規(guī)減指令格式:SUBDST,SRC操作:DST<--(DST)-(SRC)指令構(gòu)成如下:

SUBreg,imme;寄存器減立即數(shù)

SUBreg,reg;寄存器之間相減

SUBreg,mem;寄存器減存儲器操作數(shù)

SUBmem,imme;存儲器操作數(shù)減立即數(shù)

SUBmem,reg;存儲器操作數(shù)減寄存器說明:運(yùn)行結(jié)果對CF、SF、OF、PF、ZF、AF都會影響49SUB指令示例

SUBBX,CX

執(zhí)行前:

(BX)=9543H(CX)=28A7H9543H-28A7H6C9CH

執(zhí)行后:

(BX)=6C9CH

CF=0OF=1ZF=0SF=050SBB帶進(jìn)位減指令格式:SBBDST,SRC操作:DST<--(DST)-(SRC)-(CF)說明:該指令除了多一個進(jìn)位標(biāo)志外,同SUB指令。常用于多字節(jié)運(yùn)算SBB指令示例——雙字減法

SUBAX,CX;低16位減

SBB

DX,BX;高16位減

7456HAX0012HDX-9428HCX0010HBX

1E11EH-1HCF0001HCF=151DEC減1指令格式:DECDST操作:DST<--(DST)-1說明:用法同INC指令NEG求補(bǔ)指令格式:NEGDST操作:DST<---(DST)說明:1)-(DST)表示操作數(shù)按位求反后末位加1。

2)執(zhí)行時,用零減去操作數(shù)52NEG指令示例1

NEGDX

執(zhí)行前:

(DX)=6780H0000-6780

19880

執(zhí)行后:

(DX)=9880HCF=1NEG指令示例2

NEGAL

;AL求補(bǔ)

ADDAL,100;(AL)+100-->AL

實(shí)現(xiàn)的功能為:100-(AL)借位53CMP比較指令格式:CMPDST,SRC操作:(DST)-(SRC)說明:

1、兩個操作數(shù)相減,但結(jié)果不回送2、影響標(biāo)志位的值,下一指令常是條件轉(zhuǎn)移指令3、必須區(qū)分無符號數(shù)比較與有符號數(shù)比較如比較11111111B與00000000B

無符號數(shù)比較:255>0

有符號數(shù)比較:-1<04、比較兩數(shù)是否相等,根據(jù)標(biāo)志位ZF判斷若相等,則ZF=1;否則ZF=05、指令構(gòu)成同SUB指令54比較兩數(shù)的大小CMPDST,SRC無符號數(shù)比較結(jié)論:

用標(biāo)志位CF判斷無符號數(shù)的大小

CF=0,則DST≥SRCCF=1,則DST<SRC55有符號數(shù)比較結(jié)論:

用標(biāo)志位SF和OF判斷有符號數(shù)的大小

SF、OF值相同,則

DST>SRCSF、OF值不同,則

DST<SRCCMP指令示例1

CMPAL,BL

令(AL)=-64(BL)=10-64-10-74OF=0SF=1結(jié)論:(DST)<(SRC)CMP指令示例2

CMPCL,[100H]

令(CL)=-100(DS:100)=-110-100-(-110)10OF=0SF=0結(jié)論:

(DST)>(SRC)

5657CMPXCHG比較并交換指令格式:CMPXCHGDST,SRC操作:累加器AC與DST比較如(AC)=(DST)

則ZF1,DST(SRC)

否則ZF0,AC(DST)說明:1)只用于486及其后繼機(jī)型

2)累加器可為AL、AX或EAX寄存器

3)SRC只能用寄存器,DST可用寄存器或存儲器尋址方式MUL無符號數(shù)乘指令

格式:MULSRCIMUL有符號數(shù)乘指令

格式:IMULSRC操作:字節(jié)數(shù)乘,AX<--(AL)×(SRC)byte

字?jǐn)?shù)據(jù)乘,DX:AX<--(AX)×(SRC)word

雙字?jǐn)?shù)乘,EDX:EAX(EAX)×(SRC)DW說明:

1)SRC可用寄存器或存儲器尋址方式

2)無符號數(shù)乘與有符號數(shù)乘不同如(11111111B)×(11111111B)無符號數(shù)乘:255×255

有符號數(shù)乘:(-1)×(-1)

3)本指令影響標(biāo)志位CF和OF58MUL,IMUL指令示例

MULBL(AL)=0B4H=180(BL)=11H=1710110100×000100011011010010110100101111110100(AX)=0BF4H=3060IMULBL(AL)=0B4H=-76,(BL)=11H=17-76補(bǔ)=4CH01001100×000100010100110001001100010100001100(AX)=(-050C)補(bǔ)

=FAF4H=-1292硬件上怎么判斷有符號數(shù)乘法結(jié)果符號5960格式:IMULREG,SRC或IMM操作:REG16(REG16)*(SRC或IMM)

REG32(REG32)*(SRC或IMM)格式:IMULREG,SRC,IMM操作:REG16(SRC)*IMM

REG32(SRC)*IMM說明:1)乘積的字長和源、目的操作數(shù)的字長一致

2)可能溢出

3)SRC可用寄存器或存儲器尋址方式

REG只能是寄存器尋址方式

IMM是立即數(shù)

4)這些指令是80186后新增加的DIV無符號數(shù)除指令格式:DIVSRCIDIV符號數(shù)除指令格式:IDIVSRC操作:AL(商),AH(余數(shù))<--(AX)/(SRC)byteAX(商),DX(余數(shù))<--(DX:AX)/(SRC)word

EAX(商),EDX(余數(shù))<--(EDX:EAX)/(SRC)DW說明:

1)被除數(shù)的長度是指令中操作數(shù)的兩倍

2)源操作數(shù)可用除立即數(shù)以外的尋址方式

3)如果SRC=0或者商大于存放商的寄存器的最大數(shù)值范圍,都會引發(fā)“Divideerror”錯誤。因此,當(dāng)被除數(shù)為AX,DX:AX時,商最大是255和6553561DIV指令示例

N1DW?N2DW?……

MOVAX,0000H;裝入被除數(shù)10000HMOVDX,0001HMOVBX,100H;裝入除數(shù)

DIVBX;10000H/100HMOVN1,AX;存商

MOVN2,DX;存余數(shù)62IDIV指令示例

計算-127/15,商存入RESULT單元

RESILTDB?……

MOVAL,-127;裝入被除數(shù)(81H)

CBW

;字節(jié)擴(kuò)充到字

MOVBL,15;裝入除數(shù)

IDIVBL;-127/15MOVRESULT,AL;存商63算術(shù)運(yùn)算指令綜合例計算(V-(X*Y+Z))/X,其中X,Y,Z,V均為16位有符號數(shù),要求商存入AX,余數(shù)存入DXMOVAX,X

IMULY;X*YMOVCX,AXMOVBX,DX;積存BX:CXMOVAX,Z

CWD

;Z擴(kuò)展

ADDCX,AX;X*Y+Z

ADCBX,DXMOVAX,V

CWD

;V擴(kuò)展

SUBAX,CX;相減

SBBDX,BXIDIVX;除以X64

十進(jìn)制BCD碼運(yùn)算調(diào)整指令為什么需要調(diào)整?BCD碼的1010~1111是無意義的。例:非壓縮十進(jìn)數(shù)6和7相加

00000110+0000011100001101+110;調(diào)整

00010011調(diào)整指令有兩類:1、非壓縮BCD碼調(diào)整指令

AAAAASAAMAAD2、壓縮BCD碼調(diào)整指令

DAADAS65AAA非壓縮BCD碼加調(diào)整格式:AAA操作:將存放在AL中的兩個非壓縮BCD碼的和進(jìn)行調(diào)整,正確和在AX中調(diào)整過程:如果(AL&0FH)>9或(AF)=1

則(AL)+6-->AL(AH)+1-->AH1-->AF,AF-->CF(AL)&0FH-->AL

否則(AL)&0FH-->AL0-->AF,(AF)-->CF說明:該指令放在二進(jìn)制加法指令A(yù)DD之后AHAL正確和的有效位數(shù)66AAA指令示例計算十進(jìn)制數(shù)9+4

MOVAL,9H09HMOVBL,4H+04HADDAL,BL0DH;>9

AAA

+06H;調(diào)整

13H&0FH03H(AH)+1-->AH結(jié)果:

(AH)=01H(AL)=03HCF=AF=16768AAA指令示例計算十進(jìn)制數(shù)9+9

MOVAL,9H09HMOVBL,9H+09HADDAL,BL12H;AF=1

AAA

+06H;調(diào)整

18H&0FH08H(AH)+1-->AH結(jié)果:

(AH)=01H(AL)=08HCF=AF=1AAS非壓縮BCD碼減調(diào)整指令格式:AAS操作:將AL中的兩個非壓縮BCD碼的差進(jìn)行調(diào)整,正確結(jié)果送AX中

調(diào)整過程:如果(AL&0FH)>9或(AF)=1

則(AL)-6-->AL(AH)-1-->AH(AL)&0FH-->AL1-->AF,AF-->CF

否則(AL)&0FH-->AL0-->AF,(AF)-->CFAHAL正確差的有效位數(shù)69AAS指令示例計算十進(jìn)制數(shù)16-7MOVAX,0106H06HMOVBL,7H-07HSUBAL,BLFFH;(AL)&0FH>9

AAS-6H;調(diào)整

F9H&0FH09H

(AH)-1-->AH結(jié)果:

(AL)=09HCF=AF=1(AH)=00H70AAM非壓縮BCD碼乘調(diào)整指令格式:AAM操作:將AX中的兩個非壓縮BCD碼之積進(jìn)行調(diào)整調(diào)整過程:將AL除以10,商送AH,余數(shù)送ALAAM指令示例

MOVAL,07H;取被乘數(shù)

MOVCL,09H;取乘數(shù)0111

MULCL×1001

AAM

;調(diào)整011100000000011100111111調(diào)整后,(AH)=6(AL)=371AAD非壓縮BCD碼除調(diào)整指令格式:AAD操作:在除法運(yùn)算前,用該指令將AX中的非壓縮BCD碼形式的被除數(shù)調(diào)整為二進(jìn)制數(shù),然后做除法運(yùn)算調(diào)整過程:

(AL)+(AH)×10-->AL0-->AH(AX)/除數(shù),商-->AL,余數(shù)-->AH72AAD指令示例

MOVAX,0208H;AX<--被除數(shù)

MOVCL,4;除數(shù)

AAD

;調(diào)整,(AX)=28DIVCL

結(jié)果:(AL)=7(AH)=073DAA壓縮的BCD碼加調(diào)整

格式:DAA操作:對AL寄存器中的壓縮BCD碼之和進(jìn)行調(diào)整,結(jié)果在AL寄存器中調(diào)整過程:如果(AL&0FH)>9或(AF)=1

則(AL)+6-->AL1-->AF

如果(AL)>9FH或(CF)=1

則(AL)+60H-->AL1-->CFAHAL正確和的有效位數(shù)74DAA指令示例1

計算十進(jìn)制數(shù)29+18MOVAL,29H29HMOVBL,18H+18HADDAL,BL41H;AF=1DAA+6;調(diào)整

47HDAA指令示例2

計算十進(jìn)制數(shù)54+63MOVAL,54H54HMOVBL,63H+63HADDAL,BLB7H;>9FDAA

+60H;調(diào)整

117H75DAS壓縮的BCD碼減調(diào)整格式:DAS操作:對AL中的壓縮BCD碼差進(jìn)行調(diào)整,結(jié)果在AL中調(diào)整過程:如果(AL&0FH)>9或(AF)=1

則(AL)-6-->AL1-->AF

如果(AL)>9FH或(CF)=1

則(AL)-60H-->AL1-->CFAHAL正確和的有效位數(shù)76DAS指令示例計算十進(jìn)數(shù)A-BA=4612B=3576

MOVAL,A12HSUBAL,B-76H

DAS

19CH;AF,CF均=1MOVD,AL-66H;所以用-66H調(diào)整

MOVAL,A+136HDSBBAL,B+1CF=1

DASMOVD+1,AL46H35H-110HD+1結(jié)果=103677783.4.3邏輯運(yùn)算指令邏輯非指令NOT邏輯與指令A(yù)ND邏輯或指令OR邏輯異或指令XOR測試指令TESTNOT邏輯非指令格式:NOTOPR操作:OPR按位取反后送回原處說明:本指令不影響標(biāo)志位NOT指令示例2MOVAL,1;1-->AL

NOTAL

;求反

INCAL;NOT指令示例1MOVAL,52H

NOTAL

執(zhí)行前AL01010010

執(zhí)行后AL10101101-1-->AL79示例2和哪個指令類似?有無區(qū)別?AND邏輯與指令格式:ANDDST,SRC操作:(DST)<--(DST)&(SRC)說明:本指令影響標(biāo)志位PF、SF、ZF,使CF=0、OF=0AND指令示例1MOVAL,32H

ANDAL,0FH

;屏蔽高四位操作執(zhí)行前AL00110010(2的ASCII碼)執(zhí)行后AL00000010AND指令示例2

ANDAX,AX

執(zhí)行后

AX內(nèi)容不變,CF=0、OF=080OR邏輯或指令

格式:ORDST,SRC操作:(DST)<--(DST)或(SRC)說明:本指令影響標(biāo)志位PF、SF、ZF,使CF=0、OF=0OR指令示例1MOVAL,02H

ORAL,0F0H

;高四位置位執(zhí)行前AL00000010

執(zhí)行后AL11110010OR指令示例2

MOVAL,02H

ORAL,30H

執(zhí)行前AL00000010

執(zhí)行后AL00110010;’2’的ASCII碼81XOR指令示例1MOVAL,0B6H10110110XORAL,0FH00001111

1011

1001

不變變反XOR指令示例2XORAL,AL

;XOR異或指令格式:XORDST,SRC操作:(DST)<--(DST)與(SRC)按位異或說明:本指令影響標(biāo)志位PF、SF、ZF,使CF=0、OF=0

思考:讓AX寄存器清0,有幾種辦法,在X86不同的CPU中,哪種方案最好?清零操作,且CF=082指令時鐘數(shù)指令字節(jié)數(shù)8088286386486PentiumMOVAX,0432112ANDAX,0432113XORAX,AX322112SUBAX,AX322113MOVBL,0MULBL43211214321384211383TEST測試指令格式:TESTOPR1,OPR2操作:(OPR1)&(OPR2)說明:本指令影響標(biāo)志位PF、SF、ZF,使CF=0、OF=0

TEST指令示例1

測試AL中的數(shù)是否為奇數(shù),若是則轉(zhuǎn)移

TESTAL,01H

JNZNEXT;ZF=0轉(zhuǎn)TEST指令示例2

測試AX中的有符號數(shù)是否為正數(shù),若是則轉(zhuǎn)移

TESTAX,8000

溫馨提示

  • 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

提交評論