




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1第3章80x86匯編語言程序設計(中)23.4順序結構程序設計順序結構是最簡單也是最基本的程序結構。程序按順序執行,不發生任何轉移,通常非控制轉移類指令都可編寫順序結構程序。語句1語句n語句2
..33.4.1數據傳送指令通用數據傳送指令地址傳送指令標志寄存器傳送指令輸入輸出指令類型轉換指令4PUSHA/PUSHAD(pushallregisters)所有寄存器進棧POPA/POPAD(popallregisters)所有寄存器出棧1、通用數據傳送指令MOV(move)傳送MOVSX(movewithsigh-extend)帶符號擴展傳送MOVZX(movewithzero-extend)帶零擴展傳送PUSH(pushontothestack)進棧POP(popfromthestack)出棧XCHG(exchange)交換XLAT(translate) 換碼(查表)MOV傳送指令格式:MOVDST,SRC操作:DST<--(SRC)
即把源操作數的內容送入目的操作數說明:1)可以進行8位、16位或32位數據的傳送
2)SRC可為立即數、寄存器、存儲器操作數
3)DST可為寄存器、存儲器操作數
4)該指令不影響任何狀態標志位存儲器段寄存器CSDSSSES立即數通用寄存器AXBXCXDXBPSPSIDI5MOV指令示例MOVAX,[BX+DI];存儲器操作數MOVAX,ARRAY[SI];傳送到寄存器MOVAX,0B00H;立即數傳送到寄存器MOVCL,10000000BMOVVALUE,100H;立即數傳送到存儲單元MOVES:[BX],4BHMOV[BX],CX;寄存器內容傳送到存儲器MOVBUFF[BP][DI],AXMOVAL,BL;寄存器之間傳送MOVBP,SI6MOV指令注意事項:(1)兩個操作數長度必須一致
MOVAL,BX;不合法例外:源是16進制立即數,位數小于目的操作數時,高位按0擴展,源是10進制立即數,位數小于目的操作數時,高位按符號位擴展
MOVAX,0D8H
執行后,(AX)=00D8HMOVAX,-40
執行后,(AX)=FFD8H(2)不允許用立即數為段寄存器賦值例:MOVES,10A0H;不合法7(3)不允許兩個操作數均是存儲器操作數
MOVX,Y;不合法可以通過一個寄存器傳送:
MOVAX,YMOVX,AX(4)不允許兩個操作數均為段寄存器
MOVES,DS;不合法(5)不允許CS、IP和立即數做目標操作數
MOVCS,AX ;不合法
MOV100H,AX ;不合法
MOVIP,BX ;不合法89MOVSX帶符號擴展傳送指令格式:MOVSXDST,SRC操作:DST<--符號擴展(SRC)MOVZX帶零擴展傳送指令格式:MOVSXDST,SRC操作:DST<--零擴展(SRC)說明:
1)源操作數是8位或16位寄存器或存儲器的內容
2)目的操作數必須是16位或32位寄存器10MOVSX指令示例
MOVSXEAX,CL
設(CL)=0ABH,執行后(EAX)=0FFFFFFABH
負號擴展若(CL)=57H,執行后(EAX)=00000057H
正號擴展MOVZX指令示例
MOVZXEAX,DATA
設(DATA)=87ADH,執行后(EAX)=000087ADH0擴展11PUSH壓棧指令格式:PUSHSRC操作:
SP<--(SP)-2((SP)+1,(SP))<--(SRC)32位指令:
ESP(ESP)-4((ESP)+3,(ESP)+2,(ESP)+1,(ESP))(SRC)說明:1)源操作數可以是寄存器或存儲器操作數
2)必須以字或雙字為單位操作
3)32位指令允許SRC是16位或32位立即數,也容許是32位寄存器和存儲器操作數舉例:PUSHAXPUSHDAT[BX][SI]
PUSH1234H PUSH87654321H PUSHEAX12
壓棧指令示例
PUSHAX
執行前
AXAX
25H31HSP52500H 3125H3125H低地址低地址進棧方向SP3125H524FEH524FFH52500H執行后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
執行前執行后
BXBX75C1H
低地址低地址
SP6Bh51000H6Bh51000H48h1H48h1H9Ah2H9Ah2H28h3H28h3H出棧方向48h6Bh48h48h6BhSP15PUSHA所有寄存器進棧格式:PUSHAPUSHA:(286及其后繼機型)
16位通用寄存器依次進棧,次序為:AX,CX,DX,BX,指令執行前的SP,BP,SI,DI
指令執行后SP(SP)-16仍指向棧頂操作:PUSHAD:
(386及其后繼機型)
32位通用寄存器依次進棧,次序為:EAX,ECX,
EDX,EBX,指令執行前的ESP,EBP,ESI,EDI
指令執行后ESP(ESP)-32仍指向棧頂16PUSHA指令示例(DI)-16(SI)-14(BP)-12(SP)原
-10(BX)-8(DX)-6(CX)-4(AX)-20(SP)原(SP)執行前執行后17POPA所有寄存器出棧格式:POPAPOPA:(286及其后繼機型)
16位通用寄存器依次出棧,次序為:
DI,SI,BP,SP,BX,DX,CX,AX
指令執行后SP(SP)+16仍指向棧頂操作:POPAD:
(386及其后繼機型)
32位通用寄存器依次出棧,次序為:EDI,ESI,
EBP,ESP,EBX,EDX,ECX,EAX
指令執行后ESP(ESP)+32仍指向棧頂18XCHG交換指令格式:XCHGOPR1,OPR2操作:(OPR1)(OPR2)說明:
1)操作數不允許為段寄存器
2)兩個操作數長度必須相同
3)本指令不影響狀態標志位
4)兩個操作數不能同時為存儲器操作數如:
XCHGAX,BX;寄存器之間交換
XCHGBX,[BP+DI];寄存器與存儲器之間交換
XCHG[SI],DX19交換指令示例
XCHGDX,DATA[BP]設(SS)=5000H,(BP)=0400H,DATA=1800H
物理地址=5000H×16+0400H+1800H=51C00H
執行前執行后
DXDX37CDH
51C00H42H51C00H1H6DH1H
CDH37H6D42H20XLAT查表指令(換碼指令)格式:XLATTABLE或
XLAT操作:AL<--((BX)+(AL))或AL((EBX)+(AL))
將AL中的當前內容轉換為表中某一種代碼。執行前一定要將表(TABLE)的EA賦給BX
(或EBX)寄存器,將代碼在表中距首址的偏移放在AL寄存器中。XLAT指令示例
TABLE30HMOVBX,OFFSETTABLE+131H
;表首址給BX +232HMOVAL,4 +333H
;待轉換內容到AL +434H
XLAT +535H+636H+737H34HAL21LDS(loadDSwithpointer)
指針送寄存器和DSLES(loadESwithpointer)
指針送寄存器和ESLFS(loadFSwithpointer)
指針送寄存器和FSLGS(loadGSwithpointer)
指針送寄存器和GSLSS(loadSSwithpointer)
指針送寄存器和SS2、地址傳送指令LEA(loadeffectiveaddress)
有效地址送寄存器22LEA指令示例設(DS)=2000H,(BX)=1234HLEADI,[BX] MOVSI,[BX]執行后執行后
21234H78H 5H56H1234H1234HBXLEA裝載有效地址指令格式:LEADST,SRC操作:DST<--SRC的有效地址EA說明:SRC必須是存儲器操作數,而DST則必須是一個16位或32位的通用寄存器(AX..DI..)
DI5678HSI78H1234H56235678HLEADI,BUFFER;將變量BUFFER的;有效地址送到DI,;而不是將BUFFER;變量的值送DI78H562000H:1234H5HBUFFERDI1234HDIMOVDI,BUFFER;將變量BUFFER的有效地址;所指單元的值送DI執行后執行后1234H78H56H注意LEA與OFFSET的區別24LDS裝載數據段指針指令
格式:LDSDST,SRC
操作:DST(SRC)DS(SRC+2)或
DS(SRC+4)LES、LFS、LGS、LSS
格式:同LDS,目標分別是ES,FS,GS,和SS寄存器說明:
1)源操作數必須是32位或48位存儲器操作數
2)目的操作數必須是寄存器
3)完成一個邏輯地址的傳送,該邏輯地址須用偽指令預先定義在當前數據段中257659H2000HH45HHD6HH00HH50HD645H5000HDSDIDIDSLDS指令示例
LDSDI,[BX]設(DS)=2000H,(BX)=1000H執行前執行后
再比如:LDSBX,BUFF[SI]LDSDI,BUFF4550D60026LEA與LDS的區別LEASI,BUFFLDSDI,BUFFBUFF(21000H)45H+1D6H+200H+350H設(DS)=2000HEABUFF=1000H執行后:SI=1000HDI=D645HDS=5000H思考:LDSDI,BX是合法指令嗎?27
LAHF(loadAHwithflags)
標志送AHSAHF(storeAHintoflags)AH送標志寄存器3、標志寄存器傳送指令PUSHF/PUSHFD(pushtheflagsoreflags)
標志進棧POPF/POPFD(poptheflagsoreflags)
標志出棧28LAHF標志寄存器送AH指令格式:LAHF
操作:AH<--FLAGS7-0
即將標志寄存器的最低8位送AH中SAHF送標志寄存器指令格式:SAHF操作:FLAGS7-0<--(AH)
即將AH寄存器內容送FLAGS最低8位說明:1)無操作數
2)FLAGS中含若干標志位,但LAHF指令本身不影響標志位29PUSHF標志進棧指令格式:PUSHF操作:PUSHF:SP(SP)-2((SP)+1,(SP))(FLAGS)PUSHFD:(ESP)(ESP)-4((ESP)+3,(ESP)+2,(ESP)+1,(ESP))(EFLAGSAND0FCFFFFH)
(清除VM和RF位)說明:無操作數30POPF標志出棧指令格式: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輸入指令(從接口電路的端口輸入數據)說明:用Port指明8位端口地址時,地址范圍為00H-FFH
以DX間接給出端口地址時,最大地址為0FFFFH操作:AL/AX/EAX<--(Port)
從外設讀入字節或字或雙字數據
AL/AX/EAX<--(DX)
以DX內容為端口地址,讀入數據格式2:INAL,DX(字節)
INAX,DX(字)
INEAX,DX(雙字)格式1:INAL,Port(字節)(Port是0-FFH的立即數)INAX,Port(字)(Port是0-FFH的立即數)
INEAX,Port(雙字)
(Port是0-FFH的立即數)33OUT輸出指令(向接口電路的端口輸出數據)格式1:OUTPort,AL(字節)
OUTPort,AX(字)
OUTPort,EAX(雙字)格式2:OUTDX,AL(字節)
OUTDX,AX(字)
OUTDX,EAX(雙字)操作:(Port)<--(AL)/(AX)/(EAX)
傳送數據到Port端口
(DX)<--(AL)/(AX)/(EAX)
傳送數據到DX指出的端口說明:用Port指明8位端口地址時,地址范圍為00H-FFH
以DX間接給出端口地址時,最大地址為0FFFFH34IN指令示例
INAL,20H;從20H端口讀入字節數據-->ALINAX,48H;從48H端口讀入字數據-->AX
MOVDX,3FCHINAX,DX;從03FCH端口讀入字數據-->AXOUT指令示例
OUT32H,AX;傳送字數據到32H端口
MOVDX,400HMOVAL,86HOUTDX,AL;傳送字節數據到DX指出的端口355、類型轉換指令CBW(convertbytetoword)
字節轉換為字CWD/CWDE(convertwordtodoubleword)
字轉換為雙字CDQ(convertdoubletoquad)
雙字轉換為4字BSWAP(byteswap)
字節交換36CBW字節轉換為字格式:CBW
操作:擴展AL中的符號至AH中,將8位數擴展成等效的16位數CWD/CWDE字轉換為雙字格式:CWD操作:擴展AX中的符號至DX中,將16位數擴展成等效的32位數格式:CWDE操作:AX的內容符號擴展到EAX說明:
用于在符號數除之前,形成雙倍長度的被除數37CDQ雙字轉換為4字格式:CDQ操作:EAX的內容符號擴展到EDX,形成EDX:EAX
中的4字BSWAP字節交換格式:BSWAPr32操作:使32位寄存器的字節次序變反(1、4字節交換,2、3字節交換)BSWAP指令示例
BSWAPEAX
執行前(EAX)=11223344H
執行后(EAX)=44332211H38數據傳送指令小結1、數據傳送指令不影響標志位(除SAHF)2、除XCHG指令外,都是從源到目的的單向傳送3、注意MOV指令與LEA指令的區別4、堆棧的存取在16位指令中必須以字為單位,5、8086不允許PUSH指令使用立即數尋址方式如:PUSH12;8086中不合法但286及其后繼機型中允許6、POP指令不允許使用立即數尋址方式,不允許使用CS寄存器
例:POP12
;不合法
POPCS;不合法397、段寄存器只能在MOV、PUSH、POP指令中作為操作數出現例:MOVES,AXPUSHCSPOPDS
但下列指令不合法:
MOVCS,regPOPCS8、指令有多種格式,一般都遵循以下規則:雙操作數指令中不允許兩個操作數均為存儲器操作數單操作數指令不允許立即尋址方式目的操作數不允許使用立即尋址方式3.4.2算術運算指令40加法指令
ADDADCINCXADD除法指令
DIVIDIV乘法指令
MULIMUL減法指令
SUBSBBDECNEGCMPCMPXCHGCMPXCHG8B算術運算中關于溢出的結論:OF——表示有符號數的溢出
CF——表示無符號數的溢出(進位)ADD常規加指令格式:ADDDST,SRC操作:DST<--(DST)+(SRC)指令構成方式:ADDreg,imme;寄存器與立即數相加ADDreg,reg;寄存器之間ADDreg,mem;寄存器加存儲器操作數ADDmem,imme;存儲器加立即數ADDmem,reg;存儲器操作數加寄存器
說明:運行結果對CF、SF、OF、PF、ZF、AF都會影響41ADD指令示例1
ADDDX,BX
設(DX)=4652H,(BX)=0F0F0H4652H+F0F0H13742H0100011001010010+111100001111000010011011101000010進位進位執行后
(DX)=3742H
ZF=0結果不為0SF=0結果為正
CF=1有進位
OF=0不溢出42ADD指令示例2
ADDWORDPTR[BX],9F76H
設(DS)=2000H,(BX)=1000H
執行前:
2100088HA988HA9H+9F76H
148FEH
執行后:
21000FEHCF=1有進位
48H
OF=1溢出
ZF=0結果不為0SF=0結果為正進位43ADC帶進位加指令格式:ADCDST,SRC操作:DST<--(DST)+(SRC)+(CF)說明:該指令除了多一個進位標志外,同ADD指令。常用于多字節運算INC增1指令格式:INCDST操作:DST<--(DST)+1說明:1)DST可以是寄存器或存儲器操作數
2)DST不允許是立即數
3)運行結果對SF、OF、PF、ZF、AF都會影響,但不影響CF44ADC指令示例——雙字加法設32位的目的操作數存放在DX和AX中,DX存放高位字,32位源操作數存放在BX和CX中,BX存放高位字
CFADCADDDXAXBXCXDXAX+指令序列為:
ADDAX,CX;低位加
ADCDX,BX;高位加45
執行前(DX)=0418H,(AX)=0F365H(BX)=1005H,(CX)=0E024H0418HDX0F365HAX1005HBX+0E024HCX+1CF141EHDX1D389HAX
CF=1如:DX:AX=37A1FFFFH,則DX:AX+1能否用:
INCAXADCDX,0來實現?46INC指令示例LEABX,ARRAYMOVAL,[BX]……INCBXARRAYa1+1a2+2a3+3a4
MOVBX,0MOVAL,ARRAY[BX]……INCBX8088中,執行INCBYTEPTR[BX]指令(指令已在指令隊列中)需要
個總線周期。24748XADD交換并相加指令格式:XADDDST,SRC操作:TEMP(SRC)+(DST)SRC(DST)DST(TEMP)說明:1)僅用于486及其后繼機型,
2)源操作數只能是寄存器XADD指令示例
XADDBL,DL
如執行前(BL)=12H,(DL)=02H
則執行后(BL)=14H,(DL)=12HSUB常規減指令格式:SUBDST,SRC操作:DST<--(DST)-(SRC)指令構成如下:
SUBreg,imme;寄存器減立即數
SUBreg,reg;寄存器之間相減
SUBreg,mem;寄存器減存儲器操作數
SUBmem,imme;存儲器操作數減立即數
SUBmem,reg;存儲器操作數減寄存器說明:運行結果對CF、SF、OF、PF、ZF、AF都會影響49SUB指令示例
SUBBX,CX
執行前:
(BX)=9543H(CX)=28A7H9543H-28A7H6C9CH
執行后:
(BX)=6C9CH
CF=0OF=1ZF=0SF=050SBB帶進位減指令格式:SBBDST,SRC操作:DST<--(DST)-(SRC)-(CF)說明:該指令除了多一個進位標志外,同SUB指令。常用于多字節運算SBB指令示例——雙字減法
SUBAX,CX;低16位減
SBB
DX,BX;高16位減
7456HAX0012HDX-9428HCX0010HBX
1E11EH-1HCF0001HCF=151DEC減1指令格式:DECDST操作:DST<--(DST)-1說明:用法同INC指令NEG求補指令格式:NEGDST操作:DST<---(DST)說明:1)-(DST)表示操作數按位求反后末位加1。
2)執行時,用零減去操作數52NEG指令示例1
NEGDX
執行前:
(DX)=6780H0000-6780
19880
執行后:
(DX)=9880HCF=1NEG指令示例2
NEGAL
;AL求補
ADDAL,100;(AL)+100-->AL
實現的功能為:100-(AL)借位53CMP比較指令格式:CMPDST,SRC操作:(DST)-(SRC)說明:
1、兩個操作數相減,但結果不回送2、影響標志位的值,下一指令常是條件轉移指令3、必須區分無符號數比較與有符號數比較如比較11111111B與00000000B
無符號數比較:255>0
有符號數比較:-1<04、比較兩數是否相等,根據標志位ZF判斷若相等,則ZF=1;否則ZF=05、指令構成同SUB指令54比較兩數的大小CMPDST,SRC無符號數比較結論:
用標志位CF判斷無符號數的大小
CF=0,則DST≥SRCCF=1,則DST<SRC55有符號數比較結論:
用標志位SF和OF判斷有符號數的大小
SF、OF值相同,則
DST>SRCSF、OF值不同,則
DST<SRCCMP指令示例1
CMPAL,BL
令(AL)=-64(BL)=10-64-10-74OF=0SF=1結論:(DST)<(SRC)CMP指令示例2
CMPCL,[100H]
令(CL)=-100(DS:100)=-110-100-(-110)10OF=0SF=0結論:
(DST)>(SRC)
5657CMPXCHG比較并交換指令格式:CMPXCHGDST,SRC操作:累加器AC與DST比較如(AC)=(DST)
則ZF1,DST(SRC)
否則ZF0,AC(DST)說明:1)只用于486及其后繼機型
2)累加器可為AL、AX或EAX寄存器
3)SRC只能用寄存器,DST可用寄存器或存儲器尋址方式MUL無符號數乘指令
格式:MULSRCIMUL有符號數乘指令
格式:IMULSRC操作:字節數乘,AX<--(AL)×(SRC)byte
字數據乘,DX:AX<--(AX)×(SRC)word
雙字數乘,EDX:EAX(EAX)×(SRC)DW說明:
1)SRC可用寄存器或存儲器尋址方式
2)無符號數乘與有符號數乘不同如(11111111B)×(11111111B)無符號數乘:255×255
有符號數乘:(-1)×(-1)
3)本指令影響標志位CF和OF58MUL,IMUL指令示例
MULBL(AL)=0B4H=180(BL)=11H=1710110100×000100011011010010110100101111110100(AX)=0BF4H=3060IMULBL(AL)=0B4H=-76,(BL)=11H=17-76補=4CH01001100×000100010100110001001100010100001100(AX)=(-050C)補
=FAF4H=-1292硬件上怎么判斷有符號數乘法結果符號5960格式:IMULREG,SRC或IMM操作:REG16(REG16)*(SRC或IMM)
REG32(REG32)*(SRC或IMM)格式:IMULREG,SRC,IMM操作:REG16(SRC)*IMM
REG32(SRC)*IMM說明:1)乘積的字長和源、目的操作數的字長一致
2)可能溢出
3)SRC可用寄存器或存儲器尋址方式
REG只能是寄存器尋址方式
IMM是立即數
4)這些指令是80186后新增加的DIV無符號數除指令格式:DIVSRCIDIV符號數除指令格式:IDIVSRC操作:AL(商),AH(余數)<--(AX)/(SRC)byteAX(商),DX(余數)<--(DX:AX)/(SRC)word
EAX(商),EDX(余數)<--(EDX:EAX)/(SRC)DW說明:
1)被除數的長度是指令中操作數的兩倍
2)源操作數可用除立即數以外的尋址方式
3)如果SRC=0或者商大于存放商的寄存器的最大數值范圍,都會引發“Divideerror”錯誤。因此,當被除數為AX,DX:AX時,商最大是255和6553561DIV指令示例
N1DW?N2DW?……
MOVAX,0000H;裝入被除數10000HMOVDX,0001HMOVBX,100H;裝入除數
DIVBX;10000H/100HMOVN1,AX;存商
MOVN2,DX;存余數62IDIV指令示例
計算-127/15,商存入RESULT單元
RESILTDB?……
MOVAL,-127;裝入被除數(81H)
CBW
;字節擴充到字
MOVBL,15;裝入除數
IDIVBL;-127/15MOVRESULT,AL;存商63算術運算指令綜合例計算(V-(X*Y+Z))/X,其中X,Y,Z,V均為16位有符號數,要求商存入AX,余數存入DXMOVAX,X
IMULY;X*YMOVCX,AXMOVBX,DX;積存BX:CXMOVAX,Z
CWD
;Z擴展
ADDCX,AX;X*Y+Z
ADCBX,DXMOVAX,V
CWD
;V擴展
SUBAX,CX;相減
SBBDX,BXIDIVX;除以X64
十進制BCD碼運算調整指令為什么需要調整?BCD碼的1010~1111是無意義的。例:非壓縮十進數6和7相加
00000110+0000011100001101+110;調整
00010011調整指令有兩類:1、非壓縮BCD碼調整指令
AAAAASAAMAAD2、壓縮BCD碼調整指令
DAADAS65AAA非壓縮BCD碼加調整格式:AAA操作:將存放在AL中的兩個非壓縮BCD碼的和進行調整,正確和在AX中調整過程:如果(AL&0FH)>9或(AF)=1
則(AL)+6-->AL(AH)+1-->AH1-->AF,AF-->CF(AL)&0FH-->AL
否則(AL)&0FH-->AL0-->AF,(AF)-->CF說明:該指令放在二進制加法指令ADD之后AHAL正確和的有效位數66AAA指令示例計算十進制數9+4
MOVAL,9H09HMOVBL,4H+04HADDAL,BL0DH;>9
AAA
+06H;調整
13H&0FH03H(AH)+1-->AH結果:
(AH)=01H(AL)=03HCF=AF=16768AAA指令示例計算十進制數9+9
MOVAL,9H09HMOVBL,9H+09HADDAL,BL12H;AF=1
AAA
+06H;調整
18H&0FH08H(AH)+1-->AH結果:
(AH)=01H(AL)=08HCF=AF=1AAS非壓縮BCD碼減調整指令格式:AAS操作:將AL中的兩個非壓縮BCD碼的差進行調整,正確結果送AX中
調整過程:如果(AL&0FH)>9或(AF)=1
則(AL)-6-->AL(AH)-1-->AH(AL)&0FH-->AL1-->AF,AF-->CF
否則(AL)&0FH-->AL0-->AF,(AF)-->CFAHAL正確差的有效位數69AAS指令示例計算十進制數16-7MOVAX,0106H06HMOVBL,7H-07HSUBAL,BLFFH;(AL)&0FH>9
AAS-6H;調整
F9H&0FH09H
(AH)-1-->AH結果:
(AL)=09HCF=AF=1(AH)=00H70AAM非壓縮BCD碼乘調整指令格式:AAM操作:將AX中的兩個非壓縮BCD碼之積進行調整調整過程:將AL除以10,商送AH,余數送ALAAM指令示例
MOVAL,07H;取被乘數
MOVCL,09H;取乘數0111
MULCL×1001
AAM
;調整011100000000011100111111調整后,(AH)=6(AL)=371AAD非壓縮BCD碼除調整指令格式:AAD操作:在除法運算前,用該指令將AX中的非壓縮BCD碼形式的被除數調整為二進制數,然后做除法運算調整過程:
(AL)+(AH)×10-->AL0-->AH(AX)/除數,商-->AL,余數-->AH72AAD指令示例
MOVAX,0208H;AX<--被除數
MOVCL,4;除數
AAD
;調整,(AX)=28DIVCL
結果:(AL)=7(AH)=073DAA壓縮的BCD碼加調整
格式:DAA操作:對AL寄存器中的壓縮BCD碼之和進行調整,結果在AL寄存器中調整過程:如果(AL&0FH)>9或(AF)=1
則(AL)+6-->AL1-->AF
如果(AL)>9FH或(CF)=1
則(AL)+60H-->AL1-->CFAHAL正確和的有效位數74DAA指令示例1
計算十進制數29+18MOVAL,29H29HMOVBL,18H+18HADDAL,BL41H;AF=1DAA+6;調整
47HDAA指令示例2
計算十進制數54+63MOVAL,54H54HMOVBL,63H+63HADDAL,BLB7H;>9FDAA
+60H;調整
117H75DAS壓縮的BCD碼減調整格式:DAS操作:對AL中的壓縮BCD碼差進行調整,結果在AL中調整過程:如果(AL&0FH)>9或(AF)=1
則(AL)-6-->AL1-->AF
如果(AL)>9FH或(CF)=1
則(AL)-60H-->AL1-->CFAHAL正確和的有效位數76DAS指令示例計算十進數A-BA=4612B=3576
MOVAL,A12HSUBAL,B-76H
DAS
19CH;AF,CF均=1MOVD,AL-66H;所以用-66H調整
MOVAL,A+136HDSBBAL,B+1CF=1
DASMOVD+1,AL46H35H-110HD+1結果=103677783.4.3邏輯運算指令邏輯非指令NOT邏輯與指令AND邏輯或指令OR邏輯異或指令XOR測試指令TESTNOT邏輯非指令格式:NOTOPR操作:OPR按位取反后送回原處說明:本指令不影響標志位NOT指令示例2MOVAL,1;1-->AL
NOTAL
;求反
INCAL;NOT指令示例1MOVAL,52H
NOTAL
執行前AL01010010
執行后AL10101101-1-->AL79示例2和哪個指令類似?有無區別?AND邏輯與指令格式:ANDDST,SRC操作:(DST)<--(DST)&(SRC)說明:本指令影響標志位PF、SF、ZF,使CF=0、OF=0AND指令示例1MOVAL,32H
ANDAL,0FH
;屏蔽高四位操作執行前AL00110010(2的ASCII碼)執行后AL00000010AND指令示例2
ANDAX,AX
執行后
AX內容不變,CF=0、OF=080OR邏輯或指令
格式:ORDST,SRC操作:(DST)<--(DST)或(SRC)說明:本指令影響標志位PF、SF、ZF,使CF=0、OF=0OR指令示例1MOVAL,02H
ORAL,0F0H
;高四位置位執行前AL00000010
執行后AL11110010OR指令示例2
MOVAL,02H
ORAL,30H
執行前AL00000010
執行后AL00110010;’2’的ASCII碼81XOR指令示例1MOVAL,0B6H10110110XORAL,0FH00001111
1011
1001
不變變反XOR指令示例2XORAL,AL
;XOR異或指令格式:XORDST,SRC操作:(DST)<--(DST)與(SRC)按位異或說明:本指令影響標志位PF、SF、ZF,使CF=0、OF=0
思考:讓AX寄存器清0,有幾種辦法,在X86不同的CPU中,哪種方案最好?清零操作,且CF=082指令時鐘數指令字節數8088286386486PentiumMOVAX,0432112ANDAX,0432113XORAX,AX322112SUBAX,AX322113MOVBL,0MULBL43211214321384211383TEST測試指令格式:TESTOPR1,OPR2操作:(OPR1)&(OPR2)說明:本指令影響標志位PF、SF、ZF,使CF=0、OF=0
TEST指令示例1
測試AL中的數是否為奇數,若是則轉移
TESTAL,01H
JNZNEXT;ZF=0轉TEST指令示例2
測試AX中的有符號數是否為正數,若是則轉移
TESTAX,8000
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 樂器清潔保養考核試卷
- 2024年行政管理師考試中的解題策略試題及答案
- 行政管理師考前心理預備試題及答案
- 2025年【湖南省汽車修理工(中級)】考試題及答案
- 索道制動系統設計與優化考核試卷
- 材料科學與工程基礎考核試卷
- 礦產勘查經濟學考核試卷
- 糖果與巧克力產品創新設計考核試卷
- 路基工程挖土施工方案
- 花藝師個人創意題目及答案
- 江西卷-2025屆高考歷史4月模擬預測卷(解析版)
- bim安全教育試題及答案
- 運輸公司機務管理制度
- 婦科管理制度
- 初中數學課標培訓
- 2025年濟源職業技術學院單招職業技能測試題庫附答案
- 《浙江省中藥飲片炮制規范》 2015年版
- 新晉管理者培訓
- 廣東省清遠市清新區2025年中考一模語文試題(含答案)
- 防高處墜落 物體打擊專項施工方案
- ISO9001-2015版質量管理體系標準培訓教程
評論
0/150
提交評論