




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 淋浴間防滑工程施工方案
- 太陽能曝氣設(shè)施施工方案
- 取水 引水接入施工方案
- 9 2025年營養(yǎng)學(xué)與疾病預(yù)防試題
- 破損道路切割施工方案
- 授權(quán)使用協(xié)議書
- 荒山菱形鋼絲網(wǎng)施工方案
- 公墓磚砌焚燒爐施工方案
- 冷水機(jī)組水泵拆除施工方案
- 高中開學(xué)典禮發(fā)言稿
- 2024年全國職業(yè)院校技能大賽高職組(社區(qū)服務(wù)實(shí)務(wù)賽項(xiàng))考試題庫(含答案)
- 中醫(yī)治療男科疾病的方法
- 2025年度花卉產(chǎn)業(yè)大數(shù)據(jù)服務(wù)平臺建設(shè)合同2篇
- 2025年度花卉產(chǎn)業(yè)大數(shù)據(jù)平臺建設(shè)合同3篇
- YY 0790-2024血液灌流設(shè)備
- 魚骨圖培訓(xùn)課件
- 《基于STM32的公交車智能終端設(shè)計與實(shí)現(xiàn)》
- 護(hù)理禮儀與人文關(guān)懷
- 護(hù)-學(xué)-崗-簽-到-簿
- 運(yùn)維服務(wù)體系建立實(shí)施方案(5篇)
- 路面基層(級配碎石)施工方案
評論
0/150
提交評論