匯編語言程序設(shè)計-第3章 80x86指令系統(tǒng)課件_第1頁
匯編語言程序設(shè)計-第3章 80x86指令系統(tǒng)課件_第2頁
匯編語言程序設(shè)計-第3章 80x86指令系統(tǒng)課件_第3頁
匯編語言程序設(shè)計-第3章 80x86指令系統(tǒng)課件_第4頁
匯編語言程序設(shè)計-第3章 80x86指令系統(tǒng)課件_第5頁
已閱讀5頁,還剩89頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章80x86指令系統(tǒng)講授要點3種操作數(shù)(立即數(shù)、寄存器和內(nèi)存操作數(shù))的形式。常用指令的格式、功能以及對CF、OF、SF、ZF的影響。使用指令時容易犯的錯誤。11/4/202280x86匯編語言程序設(shè)計第3章80x86指令系統(tǒng)講授要點3種操作數(shù)(立即數(shù)、寄13.1指令格式1.指令的書寫格式 標(biāo)號: 指令助記符 操作數(shù) ;注釋2.操作數(shù)的3種形式:立即操作數(shù):指令的操作數(shù)是立即數(shù),并直接出現(xiàn)在指令中。寄存器操作數(shù):操作數(shù)是寄存器的值,指令中使用寄存器名。內(nèi)存操作數(shù):操作數(shù)是某個內(nèi)存單元的值,指令中給出有效地址EA,段地址在某個段寄存器中。11/4/202280x86匯編語言程序設(shè)計3.1指令格式1.指令的書寫格式11/2/202280x23.2操作數(shù)的形式3.2.18086指令的操作數(shù)形式1.立即數(shù):8位或16位立即數(shù)。2.寄存器操作數(shù):

8位/16位通用寄存器和段寄存器(除了FS和GS)。3.內(nèi)存操作數(shù)包括下列幾種形式。 Variable 或[Variable] [reg] disp[reg] [base][index] disp[base][index]

說明:Variable是變量名或變量名±整數(shù)表達(dá)式。reg為BX、BP、SI、DI。disp可以是常量或變量,匯編后為一個常數(shù),若是變量,則取其偏移地址。base為BX或BP,index為SI或DI。有效地址為各項之和。如disp[base][index]形式,EA=base+index+disp。若使用了BP,則隱含段地址在SS,否則在DS。當(dāng)段地址不在隱含的段寄存器時,可使用段超越前綴,形式為: 段寄存器名:11/4/202280x86匯編語言程序設(shè)計3.2操作數(shù)的形式3.2.18086指令的操作數(shù)形式33.2.232位CPU擴展的操作數(shù)形式1.立即數(shù):32位立即數(shù)。2.寄存器操作數(shù):32位通用寄存器以及FS和GS。3.內(nèi)存操作數(shù)包括下列幾種形式。 [base] disp[base] [base][index] disp[base][index] [index*n] disp[index*n] [base][index*n] disp[base][index*n]說明:base、index為任一32位通用寄存器(index不能取ESP)。n為比例因子,取1、2、4或8。若包含base且base為EBP或ESP,則隱含段地址在SS;否則,隱含段地址在DS。若在16位CPU上編程,則不能使用這些尋址方式。11/4/202280x86匯編語言程序設(shè)計3.2.232位CPU擴展的操作數(shù)形式1.立即數(shù):343.3指令系統(tǒng)介紹設(shè)計完整程序所需的常用指令,對于其余指令,一部分在后續(xù)章節(jié)中講授,一部分自學(xué)。介紹常用指令的格式、功能以及對CF、OF、SF、ZF的影響。11/4/202280x86匯編語言程序設(shè)計3.3指令系統(tǒng)介紹設(shè)計完整程序所需的常用指令,對于其余5為了描述方便,采用下列符號約定:dest —目的操作數(shù)src —源操作數(shù)oprdn —第n個操作數(shù),如oprd1,oprd2,oprd3= —賦值/ —或者reg8 —8位通用寄存器AH/AL/BH/BL/CH/CL/DH/DLreg16 —16位通用寄存器AX/BX/CX/DX/SI/DI/BP/SPreg32 —32位通用寄存器EAX/EBX/ECX/EDX/ESI/EDI/EBP/ESPreg —reg8/reg16/reg32seg —段寄存器CS/DS/SS/ES/FS/GSmem8 —8位內(nèi)存操作數(shù)mem16 —16位內(nèi)存操作數(shù)mem32 —32位內(nèi)存操作數(shù)mem —mem8/mem16/mem32mem64 —64位內(nèi)存操作數(shù)imm8 —8位立即數(shù)imm16 —16位立即數(shù)imm32 —32位立即數(shù)imm —imm8/imm16/imm3211/4/202280x86匯編語言程序設(shè)計為了描述方便,采用下列符號約定:mem —mem8/me63.3.1數(shù)據(jù)傳送指令1.MOV(Move):傳送一般形式: MOV dest,src ;dest=src。將源操作數(shù)src復(fù)制到目的操作數(shù)dest,src不變。語法格式: MOV reg/mem/seg,reg/mem/seg/imm對標(biāo)志位的影響:無。說明:dest與src不能作如下搭配: MOV mem,mem ;錯誤 MOV seg,seg ;錯誤 MOV seg,imm ;錯誤dest不能是CS。dest與src必須類型匹配,即同時是字節(jié)、字或雙字類型。11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令1.MOV(Move):傳73.3.1數(shù)據(jù)傳送指令2.XCHG(Exchange):交換一般形式: XCHG oprd1,oprd2 ;交換oprd1與oprd2的內(nèi)容語法格式: XCHG reg/mem,reg/mem對標(biāo)志位的影響:無。說明:oprd1與oprd2不能作如下搭配: XCHG mem,mem ;錯誤oprd1與oprd2類型必須匹配。、【例】

xchg ebx,edx xchg [ebp][eax*4],edx11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令2.XCHG(Exchang83.3.1數(shù)據(jù)傳送指令3.LEA(LoadEffectiveAddress):裝入有效地址

語法格式: LEA reg16,mem ;reg16=mem的有效地址 對標(biāo)志位的影響:無?!纠吭O(shè)BX=5678H,EAX=1,EDX=2。 lea si,2[bx] ;執(zhí)行后,SI=567AH lea si,2[eax][edx] ;執(zhí)行后,SI=54.LDS、LES

語法格式: LDS reg16,mem32 ;reg16=mem32的低字,DS=mem32的高字 LES reg16,mem32 ;reg16=mem32的低字,ES=mem32的高字 對標(biāo)志位的影響:無。11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令3.LEA(LoadEffe93.3.1數(shù)據(jù)傳送指令5.堆棧操作指令 80x86系統(tǒng)的堆棧具有如下特點:堆棧是在內(nèi)存的堆棧段中,具有“先進(jìn)后出”的特點。堆棧只有一個出入口,即當(dāng)前棧頂。當(dāng)堆棧為空時,棧頂和棧底指向同一內(nèi)存單元。堆棧有兩個基本操作:PUSH(進(jìn)棧)和POP(出棧)。PUSH操作使棧頂向低地址方向移動,而POP操作則剛好相反。堆棧操作只能以字或雙字為單位。SS:SP指向棧頂。11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令5.堆棧操作指令11/2/2103.3.1數(shù)據(jù)傳送指令(1)PUSH與POP:進(jìn)棧與出棧

語法格式: PUSH reg16/seg/mem16/reg32/mem32 POP reg16/seg/mem16/reg32/mem32 ;操作數(shù)不能是CS PUSH imm ;286新增功能描述: PUSH指令(16位): SP=SP-2 SS:[SP]=16位操作數(shù) POP指令(16位): 16位操作數(shù)=SS:[SP] SP=SP+2 PUSH指令(32位): SP=SP-4 SS:[SP]=32位操作數(shù) POP指令(32位): 32位操作數(shù)=SS:[SP] SP=SP+4對標(biāo)志位的影響:無。11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令(1)PUSH與POP:進(jìn)棧與出棧113.3.1數(shù)據(jù)傳送指令(2)PUSHF與POPF:標(biāo)志寄存器進(jìn)棧和出棧語法格式: PUSHF ;FLAGS進(jìn)棧 POPF ;棧頂字出棧到FLAGS對標(biāo)志位的影響:只有POPF指令會以彈出值設(shè)置標(biāo)志寄存器。

【例】設(shè)SP=100H,EBX=12345678H,給出下列指令依次執(zhí)行后的結(jié)果。 push bx ;ss:[00ffh]=56h,ss:[00feh]=78h,sp=0feh pop ax ;ax=5678h,sp=100h push ebx ;ss:[00feh]=1234h,ss:[00fch]=5678h,sp=0fch pop ax ;ax=5678h,sp=0feh pop ax ;ax=1234h,sp=100h

【例】交換AX與CX的值。 push ax push cx pop ax pop cx11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令(2)PUSHF與POPF:標(biāo)志寄123.3.1數(shù)據(jù)傳送指令6.標(biāo)志寄存器傳送指令(1)LAHF(LoadAHfromFlags) 語法格式: LAHF ;AH=FLAGS的低8位 對標(biāo)志位的影響:無。

(2)SAHF(StoreAHintoFlags) 語法格式: SAHF ;FLAGS的低8位=AH 對標(biāo)志位的影響:由新裝入值確定。

11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令6.標(biāo)志寄存器傳送指令11/2133.3.1數(shù)據(jù)傳送指令符號擴展與零擴展指令 對標(biāo)志位的影響:無。(1)CBW、CWD、CWDE與CDQ 語法格式: CBW ;AL符號擴展為AX CWD ;AX符號擴展為32位數(shù)DX:AX CWDE ;AX符號擴展為EAX;386新增 CDQ ;EAX符號擴展為64位數(shù)EDX:EAX;386新增【例】設(shè)AL=0FEH,給出依次執(zhí)行下列指令后的結(jié)果。 cbw ;ax=0fffeh cwd ;dx=0ffffh,ax不變,即dx:ax=-2 cwde ;eax=0fffffffeh(-2) cdq ;edx=0ffffffffh,eax不變,即edx:eax=-2

11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令符號擴展與零擴展指令11/2/20143.3.1數(shù)據(jù)傳送指令(2)MOVSX一般形式: MOVSX dest,src ;src符號擴展為dest;386新增語法格式: MOVSX reg16,reg8/mem8 MOVSX reg32,reg8/mem8/reg16/mem16功能描述:MOVSX是CBW、CWD和CWDE的一般形式,用來將8位數(shù)符號擴展為16位或32位數(shù),或者將16位數(shù)符號擴展為32位數(shù)。【例】CBW和CWDE的功能可由MOVSX指令實現(xiàn)。 movsx ax,al ;等價于cbw movsx eax,ax ;等價于cwde movsx eax,al ;等價于順序執(zhí)行cbw與cwde

11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令(2)MOVSX11/2/2022153.3.1數(shù)據(jù)傳送指令(3)MOVZX一般形式: MOVZX dest,src ;src零擴展為dest;386新增語法格式: MOVZX reg16,reg8/mem8 MOVZX reg32,reg8/mem8/reg16/mem16

11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令(3)MOVZX11/2/2022163.3.1數(shù)據(jù)傳送指令8.XLAT(Translate):換碼語法格式: XLAT ;AL=DS:[BX+AL]功能描述:將DS:BX所指內(nèi)存區(qū)中、由AL指定位移處的一個字節(jié)賦給AL。對標(biāo)志位的影響:無。

11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令8.XLAT(Translat173.3.2算術(shù)指令1.加法一般形式: ADD dest,src ;dest=dest+src ADC dest,src ;dest=dest+src+CF INC dest ;dest=dest+1語法格式: ADD reg/mem,reg/mem/imm ADC reg/mem,reg/mem/imm INC reg/mem對標(biāo)志位的影響:ADD、ADC:按一般規(guī)則影響CF、OF、SF和ZF。INC:不影響CF,其它同ADD。說明:ADD與ADC的2個操作數(shù)必須類型匹配,且不能同時是內(nèi)存操作數(shù)。11/4/202280x86匯編語言程序設(shè)計3.3.2算術(shù)指令1.加法11/2/202280x86183.3.2算術(shù)指令2.減法一般形式: SUB dest,src ;dest=dest–src SBB dest,src ;dest=dest-src–CF CMP dest,src ;dest–src。與SUB的區(qū)別在于,不將減法結(jié)果存入dest。 DEC dest ;dest=dest-1 NEG dest ;dest=0–dest語法格式: SUB reg/mem,reg/mem/imm SBB reg/mem,reg/mem/imm CMP reg/mem,reg/mem/imm DEC reg/mem NEG reg/mem對標(biāo)志位的影響:SUB、SBB、CMP、NEG:按一般規(guī)則影響CF、OF、SF和ZF。CF表示借位。DEC:不影響CF,其它同SUB。說明:2個操作數(shù)必須類型匹配,且不能同時是內(nèi)存操作數(shù)。11/4/202280x86匯編語言程序設(shè)計3.3.2算術(shù)指令2.減法11/2/202280x86193.3.2算術(shù)指令3.乘法(1)MUL(UnsignedMultiplication):無符號乘法一般形式: MUL src 語法格式: MUL reg8/mem8 ;AX=AL×src MUL reg16/mem16 ;DX:AX=AX×src MUL reg32/mem32 :EDX:EAX=EAX×src對標(biāo)志位的影響:若8位×8位、16位×16位或32位×32位的結(jié)果分別能由8、16或32位容納(即結(jié)果的高一半為0),則CF=OF=0,否則,CF=OF=1;其余標(biāo)志無定義。說明:由于2個n位數(shù)的乘積可能需要2n位,因此,若操作數(shù)是8位,則結(jié)果為16位;同樣,16位操作數(shù)相乘結(jié)果為32位,32位數(shù)相乘結(jié)果為64位。11/4/202280x86匯編語言程序設(shè)計3.3.2算術(shù)指令3.乘法11/2/202280x86203.3.2算術(shù)指令(2)IMUL(IntegerMultiplication):帶符號乘法一般形式: IMUL src 語法格式: IMUL reg8/mem8 ;AX=AL×src。執(zhí)行帶符號乘法,下同。 IMUL reg16/mem16 ;DX:AX=AX×src IMUL reg32/mem32 :EDX:EAX=EAX×src對標(biāo)志位的影響:若結(jié)果的高一半為低一半的符號擴展,則CF=OF=0,否則,CF=OF=1;其余標(biāo)志無定義。說明:由于2個n位數(shù)的乘積可能需要2n位,因此,若操作數(shù)是8位,則結(jié)果為16位;同樣,16位操作數(shù)相乘結(jié)果為32位,32位數(shù)相乘結(jié)果為64位?!纠繉τ谕粋€二進(jìn)制數(shù),采用MUL與IMUL執(zhí)行的結(jié)果可能不同。設(shè)AL=0FFH,BL=1,分別執(zhí)行下列指令,會得出不同結(jié)果。 mul bl ;ax=0ffh(255) imul bl ;ax=0ffffh(-1)11/4/202280x86匯編語言程序設(shè)計3.3.2算術(shù)指令(2)IMUL(IntegerMul213.3.2算術(shù)指令4.除法一般形式: DIV src ;無符號數(shù)除法 IDIV src ;帶符號數(shù)除法語法格式: DIV reg/mem IDIV reg/mem 功能描述:src是8位:AX÷src,結(jié)果商在AL、余數(shù)在AH。src是16位:DX:AX÷src,結(jié)果商在AX、余數(shù)在DX。src是32位:EDX:EAX÷src,結(jié)果商在EAX、余數(shù)在EDX。對標(biāo)志位的影響:無定義。11/4/202280x86匯編語言程序設(shè)計3.3.2算術(shù)指令4.除法11/2/202280x86223.3.2算術(shù)指令5.十進(jìn)制調(diào)整指令

(1)壓縮BCD碼調(diào)整指令語法格式: DAA ;調(diào)整AL中的和為壓縮BCD碼 DAS ;調(diào)整AL中的差為壓縮BCD碼功能描述:DAA:通常先執(zhí)行ADD/ADC指令,將2個壓縮BCD碼相加,結(jié)果存放在AL中。然后使用該指令將AL調(diào)整為壓縮BCD碼格式。DAS:通常先執(zhí)行SUB/SBB指令,將2個壓縮BCD碼相減,結(jié)果存放在AL中。然后使用該指令將AL調(diào)整為壓縮BCD碼格式。對標(biāo)志位的影響:OF不確定;CF反映壓縮BCD碼相加/相減的進(jìn)位/借位狀態(tài);按一般規(guī)則影響SF和ZF。說明:若使用DAA/DAS指令,則參加加法/減法運算的操作數(shù)應(yīng)該是壓縮BCD碼。如果將任意2個二進(jìn)制數(shù)相加/減,然后調(diào)整,將得不到正確結(jié)果。11/4/202280x86匯編語言程序設(shè)計3.3.2算術(shù)指令5.十進(jìn)制調(diào)整指令11/2/2022233.3.2算術(shù)指令DAA的調(diào)整算法如下:if(AL低4位>9或AF=1)then AL=AL+6; AF=1;endifif(AL高4位>9或CF=1)then AL=AL+60H; CF=1;endifDAS的調(diào)整算法如下:if(AL低4位>9或AF=1)then AL=AL–6; AF=1;endifif(AL高4位>9或CF=1)then AL=AL-60h; CF=1;endif11/4/202280x86匯編語言程序設(shè)計3.3.2算術(shù)指令DAA的調(diào)整算法如下:DAS的調(diào)整算法243.3.2算術(shù)指令(2)非壓縮BCD碼調(diào)整指令語法格式: AAA ;調(diào)整AL中的和為非壓縮BCD碼 ;調(diào)整后,AL高4位=0,AH=AH+產(chǎn)生的CF AAS ;調(diào)整AL中的差為非壓縮BCD碼 ;調(diào)整后,AL高4位=0,AH=AH-產(chǎn)生的CF AAM ;AH=AXdiv10,AL=AXmod10 AAD ;AL=AH×10+AL,AH=0功能描述:AAA:通常先執(zhí)行ADD/ADC指令,以AL為目的操作數(shù),將2個非壓縮BCD碼(高4位無關(guān))相加。然后使用AAA將AL調(diào)整為非壓縮BCD碼格式,且高4位=0,同時將調(diào)整產(chǎn)生的進(jìn)位加到AH中。AAS:通常先執(zhí)行SUB/SBB指令,以AL為目的操作數(shù),將2個非壓縮BCD碼(高4位無關(guān))相減。然后使用AAS將AL調(diào)整為非壓縮BCD碼格式,且高4位=0,同時將調(diào)整產(chǎn)生的借位從AH中減去。AAM與AAD:略。對標(biāo)志位的影響:AAA與AAS:CF反映非壓縮BCD碼加/減的進(jìn)位/借位;OF、SF和ZF不確定。11/4/202280x86匯編語言程序設(shè)計3.3.2算術(shù)指令(2)非壓縮BCD碼調(diào)整指令11/2/253.3.2算術(shù)指令A(yù)AA的調(diào)整算法如下:if(AL低4位>9或AF=1)then AL=AL+6; AH=AH+1; AF=1; CF=1;else AF=0; CF=0;endifAL=ALAND0FH;AL高4位清0AAS的調(diào)整算法如下:if(AL低4位>9或AF=1)thenAL=AL–6;AH=AH–1;AF=1;CF=1;elseAF=0;CF=0;endifAL=ALAND0FH;AL高4位清011/4/202280x86匯編語言程序設(shè)計3.3.2算術(shù)指令A(yù)AA的調(diào)整算法如下:AAS的調(diào)整算法263.3.3位操作指令1.邏輯指令一般形式: AND dest,src ;dest=destandsrc OR dest,src ;dest=destorsrc XOR dest,src ;dest=destxorsrc NOT dest ;dest=notdest TEST dest,src ;destandsrc,執(zhí)行AND操作但不存儲結(jié)果到dest語法格式: AND reg/mem,reg/mem/imm OR reg/mem,reg/mem/imm XOR reg/mem,reg/mem/imm NOT reg/mem TEST reg/mem,reg/mem/imm 對標(biāo)志位的影響:NOT:無。其它指令:CF=OF=0,按一般規(guī)則影響SF和ZF。11/4/202280x86匯編語言程序設(shè)計3.3.3位操作指令1.邏輯指令11/2/202280273.3.3位操作指令1.移位指令

移位指令包括:SHL(ShiftLeft):邏輯左移SAL(ShiftArithmeticLeft):算術(shù)左移SHR(ShiftRight):邏輯右移SAR(ShiftArithmeticRight):算術(shù)右移其中,SHL與SAL完全相同,只是同一指令的不同助記符而已。一般形式: SHL dest,count ;dest左移。其中,count為移位次數(shù)(下同) SAL dest,count ;同SHL SHR dest,count ;dest邏輯右移 SAR dest,count ;dest算術(shù)右移語法格式: SHL reg/mem,1/CL SHL reg/mem,imm8 ;286新增 SAL、SHR與SAR格式同SHL11/4/202280x86匯編語言程序設(shè)計3.3.3位操作指令1.移位指令11/2/202280283.3.3位操作指令功能描述:SHL/SAL:左移。最高位移出到CF,最低位移入0。SAR:算術(shù)右移。最低位移入CF,最高位不變。SHR:邏輯右移。最低位移入CF,最高位移入0。對標(biāo)志位的影響:若移位后符號位發(fā)生了變化,則OF=1,否則OF=0;CF為最后移入位;按一般規(guī)則影響ZF與SF。然而,若移位次數(shù)為0,則不影響標(biāo)志位;若移位次數(shù)>1,則OF無定義?!纠吭O(shè)AX的值為一個2字節(jié)非壓縮BCD碼,將其轉(zhuǎn)換為1字節(jié)壓縮BCD碼存入AL。 mov cl,4 shl ah,cl ;ah低4位移到高4位 and al,0fh ;al高4位清0 or al,ah 11/4/202280x86匯編語言程序設(shè)計3.3.3位操作指令功能描述:11/2/202280x8293.3.3位操作指令2.循環(huán)移位循環(huán)移位指令包括:ROL(RotateLeft):循環(huán)左移ROR(RotateRight):循環(huán)右移RCL(RotatethroughCarryLeft):帶進(jìn)位循環(huán)左移RCR(RotatethroughCarryRight):帶進(jìn)位循環(huán)右移一般形式: ROL dest,count ;dest循環(huán)左移。其中,count為移位次數(shù)(下同) ROR dest,count ;dest循環(huán)右移 RCL dest,count ;dest帶CF循環(huán)左移 RCR dest,count ;dest帶CF循環(huán)右移語法格式: ROL reg/mem,1/CL ROL reg/mem,imm8 ;286新增 ROR、RCL、RCR格式同ROL11/4/202280x86匯編語言程序設(shè)計3.3.3位操作指令2.循環(huán)移位11/2/202280x303.3.3位操作指令功能描述:ROL:循環(huán)左移。最高位移出到CF,并同時移入最低位。RCL:帶進(jìn)位循環(huán)左移。最高位移出到CF,原CF移入最低位。ROR:循環(huán)右移。最低位移出到CF,并同時移入最高位。RCR:帶進(jìn)位循環(huán)右移。最低位移出到CF,原CF移入最高位。對標(biāo)志位的影響:若移位后符號位發(fā)生了變化,則OF=1,否則OF=0;CF為最后移入位;不影響ZF與SF。然而,若移位次數(shù)為0,則不影響標(biāo)志位;若移位次數(shù)>1,則OF無定義?!纠繉X:AX中的32位數(shù)左移1位。 shl ax,1 rcl dx,111/4/202280x86匯編語言程序設(shè)計3.3.3位操作指令功能描述:11/2/202280x8313.3.3位操作指令3.位測試指令

位測試指令包括;BT(BitTest):位測試BTS(BitTestandSet):位測試并置位BTR(BitTestandReset):位測試并復(fù)位BTC(BitTestandComplement):位測試并取反)這些指令均為386新增指令。一般形式: BT dest,index ;CF=dest的第index位,dest不變 BTS dest,index ;CF=dest的第index位,dest的第index位=1 BTR dest,index ;CF=dest的第index位,dest的第index位=0 BTC dest,index ;CF=dest的第index位,dest的第index位取反11/4/202280x86匯編語言程序設(shè)計3.3.3位操作指令3.位測試指令11/2/20228323.3.3位操作指令語法格式: BT reg16/mem16,reg16/imm8 BT reg32/mem32,reg32/imm8 BTR、BTS、BTC格式同BT對標(biāo)志位的影響:影響CF;其余標(biāo)志無定義?!纠课粶y試。 bt eax,12 ;CF=eax的第12位 bts eax,12 ;CF=eax的第12位,eax的第12位=1 btr eax,12 ;CF=eax的第12位,eax的第12位=0 btc eax,12 ;CF=eax的第12位,eax的第12位取反11/4/202280x86匯編語言程序設(shè)計3.3.3位操作指令語法格式:11/2/202280x8333.3.4控制轉(zhuǎn)移指令1.JMP(Jump):無條件轉(zhuǎn)移

一般形式: JMP target ;轉(zhuǎn)移到target指定的目標(biāo)地址處根據(jù)轉(zhuǎn)移的距離,JMP指令可分為下列兩類:段內(nèi)轉(zhuǎn)移:在同一代碼段內(nèi)進(jìn)行,又稱近(Near)轉(zhuǎn)移,只要修改IP的值即可實現(xiàn)。段間轉(zhuǎn)移:可在不同代碼段之間進(jìn)行,又稱遠(yuǎn)(Far)轉(zhuǎn)移,需要同時修改CS和IP的值。根據(jù)目標(biāo)地址的指定方式,JMP指令又可分為直接轉(zhuǎn)移和間接轉(zhuǎn)移。所謂直接轉(zhuǎn)移,是指轉(zhuǎn)移的目標(biāo)地址直接出現(xiàn)在指令中,在程序執(zhí)行前就已確定。所謂間接轉(zhuǎn)移,指轉(zhuǎn)移的目標(biāo)地址是寄存器或內(nèi)存操作數(shù)的值,只有執(zhí)行到該條指令時才能確定。因此,JMP指令共有下列4種轉(zhuǎn)移方式:段內(nèi)直接轉(zhuǎn)移(Intrasegment/DirectJump)段間直接轉(zhuǎn)移(Intersegment/DirectJump)段內(nèi)間接轉(zhuǎn)移(Intrasegment/IndirectJump)段間間接轉(zhuǎn)移(Intersegment/IndirectJump)在匯編語言程序中,通常使用標(biāo)號(Label)來指定直接轉(zhuǎn)移的目標(biāo)地址。11/4/202280x86匯編語言程序設(shè)計3.3.4控制轉(zhuǎn)移指令1.JMP(Jump):無條件轉(zhuǎn)343.3.4控制轉(zhuǎn)移指令語法格式: JMPlabel ;若label與該指令位于同一代碼段:IP=label的偏移地址; ;若label與該指令不在同一代碼段:CS:IP=label的分段地址 JMPreg16/mem16 ;IP=reg16/[mem16] JMPmem32 ;CS=[mem32+2],IP=[mem32]功能描述: JMP label ;段內(nèi)/段間直接轉(zhuǎn)移 ;目標(biāo)地址:標(biāo)號label處 JMP reg16/mem16;段內(nèi)間接轉(zhuǎn)移 ;目標(biāo)地址:同一代碼段,偏移地址=reg16/[mem16] JMP mem32 ;段間間接轉(zhuǎn)移 ;目標(biāo)地址:段地址=mem32高字,偏移地址=mem32低字對標(biāo)志位的影響:無。11/4/202280x86匯編語言程序設(shè)計3.3.4控制轉(zhuǎn)移指令語法格式:11/2/202280x353.3.4控制轉(zhuǎn)移指令2.條件轉(zhuǎn)移指令

為簡化描述,用Jcc表示所有條件轉(zhuǎn)移指令的助記符。一般形式: Jcc label ;若條件成立,則IP=label的偏移地址。其中,label是標(biāo)號功能描述:若條件成立,則轉(zhuǎn)移到目標(biāo)地址label;否則,CPU忽略該條件轉(zhuǎn)移,繼續(xù)執(zhí)行下一條指令。對標(biāo)志位的影響:無。Jcc指令包括下列3類:(1)測試單個標(biāo)志位的Jcc指令。(2)用于帶符號數(shù)比較的Jcc指令。常用在CMP指令之后,以判斷帶符號數(shù)的大小。(3)用于無符號數(shù)比較的Jcc指令。常用在CMP指令之后,以判斷無符號數(shù)的大小。11/4/202280x86匯編語言程序設(shè)計3.3.4控制轉(zhuǎn)移指令2.條件轉(zhuǎn)移指令11/2/202363.3.4控制轉(zhuǎn)移指令3.JCXZ/JECXZ(JumpifCX/ECXisZero)

語法格式: JCXZ label ;若CX=0,則轉(zhuǎn)移到label JECXZ label ;若ECX=0,則轉(zhuǎn)移到label;386新增對標(biāo)志位的影響:無說明:label相對位移量必須在-128~127之間,所有80x86CPU都一樣。11/4/202280x86匯編語言程序設(shè)計3.3.4控制轉(zhuǎn)移指令3.JCXZ/JECXZ(Jum373.3.4控制轉(zhuǎn)移指令4.循環(huán)指令循環(huán)指令包括:LOOPLOOPE/LOOPZ(LoopwhileEqual/Zero)LOOPNE/LOOPNZ(LoopwhileNotEqual/NotZero)LOOPZ與LOOPE、LOOPNZ與LOOPNE完全等價,只是同一指令的不同助記符。語法格式: LOOP label ;CX=CX–1,若CX<>0,則轉(zhuǎn)移到label LOOPZ/LOOPE label ;CX=CX–1,若CX<>0且ZF=1,則轉(zhuǎn)移到label LOOPNZ/LOOPNE label ;CX=CX–1,若CX<>0且ZF=0,則轉(zhuǎn)移到label對標(biāo)志位的影響:無。11/4/202280x86匯編語言程序設(shè)計3.3.4控制轉(zhuǎn)移指令4.循環(huán)指令11/2/20228383.3.4控制轉(zhuǎn)移指令5.中斷指令I(lǐng)NT本章只簡單引入軟件中斷調(diào)用指令I(lǐng)NT。詳細(xì)介紹參見第8章。語法格式: INT n ;調(diào)用中斷n的中斷服務(wù)程序。n為中斷號,取值0~255。對標(biāo)志位的影響:不影響CF、OF、SF、ZF。MSDOS使用中斷號21H作為系統(tǒng)調(diào)用,為程序員提供了上百種系統(tǒng)服務(wù)功能,對這些功能的調(diào)用步驟如下:(1)由AH給出功能號。(2)根據(jù)相應(yīng)功能的要求,設(shè)置入口參數(shù)。(3)INT21H。(4)分析和使用出口參數(shù)。其中,最常用的是功能號4CH,用來實現(xiàn)程序退出、并返回DOS。使用方法如下: mov ah,4ch int 21h11/4/202280x86匯編語言程序設(shè)計3.3.4控制轉(zhuǎn)移指令5.中斷指令I(lǐng)NT11/2/20393.3.5標(biāo)志處理指令標(biāo)志處理指令包括CLC(ClearCarryFlag,CF清0)、STC(SetCarryFlag,CF置1)、CMC(ComplementCarryFlag,CF取反)、CLD(ClearDirectionFlag,DF清0)、STD(SetDirectionFlag,DF置1)、CLI(ClearInterruptFlag,關(guān)中斷)和STI(SetInterruptFlag,開中斷)。語法格式: CLC ;CF=0 STC ;CF=1 CMC ;CF=NOTCF CLD ;DF=0 STD ;DF=1 CLI ;IF=0 STI ;IF=1對標(biāo)志位的影響:只影響指定標(biāo)志。注意,在程序中應(yīng)慎重使用CLI指令,錯誤的使用會導(dǎo)致系統(tǒng)無法正常工作。11/4/202280x86匯編語言程序設(shè)計3.3.5標(biāo)志處理指令標(biāo)志處理指令包括C403.3.6處理器控制指令1.NOP(NoOperation):無操作語法格式: NOP功能描述:NOP指令不做任何事情,只占用1個字節(jié),耗費1個指令執(zhí)行周期。說明:程序員經(jīng)常使用NOP作為占位符(PlaceHolder),以預(yù)留內(nèi)存空間。當(dāng)然,可以使用其它指令實現(xiàn)類似功能,如XCHGAX,AX指令。事實上,NOP與XCHGAX,AX的機器碼完全一樣,都是90H。對標(biāo)志位的影響:無。

11/4/202280x86匯編語言程序設(shè)計3.3.6處理器控制指令1.NOP(NoOperati413.3.6處理器控制指令2.HLT(Halt):暫停語法格式: HLT功能描述:使CPU進(jìn)入暫停狀態(tài),這時CPU不執(zhí)行任何操作,直到系統(tǒng)復(fù)位或發(fā)生外部中斷為止。中斷使CPU繼續(xù)執(zhí)行HLT后的下一條指令。說明:HLT不能用來終止程序。通常,應(yīng)用程序不使用該指令。對標(biāo)志位的影響:無。11/4/202280x86匯編語言程序設(shè)計3.3.6處理器控制指令2.HLT(Halt):暫停11423.4容易犯的錯誤1.操作數(shù)類型不匹配例如,將BL的值送AX。錯誤方法: mov ax,bl ;類型不匹配正確方法:(1)作為無符號數(shù)。 mov al,bl mov ah,0(2)作為帶符號數(shù)。 mov al,bl cbw

11/4/202280x86匯編語言程序設(shè)計3.4容易犯的錯誤1.操作數(shù)類型不匹配11/2/202433.4容易犯的錯誤2.憑空構(gòu)造指令例如:(1)實現(xiàn)AX=AL*5。錯誤方法: mul 5 ;MUL的操作數(shù)不能是立即數(shù)(2)將內(nèi)存單元(段地址在DS,偏移地址在AX)的一個字節(jié)送BL。錯誤方法: mov bl,[ax] ;內(nèi)存操作數(shù)不能用[AX]正確方法: mov si,ax mov bl,[si]11/4/202280x86匯編語言程序設(shè)計3.4容易犯的錯誤2.憑空構(gòu)造指令11/2/2022443.4容易犯的錯誤3.對標(biāo)志位的錯誤使用例如:判斷AX的值,若AX=0FFFFH,則轉(zhuǎn)移到標(biāo)號L。錯誤方法: not ax ;NOT不影響標(biāo)志位 jz l正確方法: xor ax,0ffffh jz l或 cmp ax,0ffffh je l11/4/202280x86匯編語言程序設(shè)計3.4容易犯的錯誤3.對標(biāo)志位的錯誤使用11/2/20453.5實例舉例說明指令的使用方法。如例3.41、3.42、3.43、3.46等。11/4/202280x86匯編語言程序設(shè)計3.5實例舉例說明指令的使用方法。如例3.41、3.446本章小結(jié)80x86指令的操作數(shù)包括3種形式:立即數(shù)、寄存器(通用寄存器和段寄存器)與內(nèi)存操作數(shù)。對于內(nèi)存操作數(shù),由操作數(shù)的形式可計算出有效地址。在缺省情況下,其段地址隱含在段寄存器DS或SS中,除非由段超越前綴明確給出。80386以下的16位CPU只能使用16位指令系統(tǒng)。32位80x86CPU在兼容16位指令系統(tǒng)的基礎(chǔ)上,支持32位操作數(shù)與32位內(nèi)存尋址方式。在實模式下,可以使用32位立即數(shù)、32位通用寄存器和擴展的內(nèi)存操作數(shù)形式,但計算出的有效地址只能是16位。大多數(shù)指令(如傳送類指令)的執(zhí)行不影響標(biāo)志位,某些指令(如算術(shù)指令)的執(zhí)行按一般規(guī)則影響標(biāo)志位,還有一部分指令(如邏輯指令)會按特定方式(清0、置1等)影響標(biāo)志位。11/4/202280x86匯編語言程序設(shè)計本章小結(jié)80x86指令的操作數(shù)包括3種形式:立即數(shù)、寄存47第3章80x86指令系統(tǒng)講授要點3種操作數(shù)(立即數(shù)、寄存器和內(nèi)存操作數(shù))的形式。常用指令的格式、功能以及對CF、OF、SF、ZF的影響。使用指令時容易犯的錯誤。11/4/202280x86匯編語言程序設(shè)計第3章80x86指令系統(tǒng)講授要點3種操作數(shù)(立即數(shù)、寄483.1指令格式1.指令的書寫格式 標(biāo)號: 指令助記符 操作數(shù) ;注釋2.操作數(shù)的3種形式:立即操作數(shù):指令的操作數(shù)是立即數(shù),并直接出現(xiàn)在指令中。寄存器操作數(shù):操作數(shù)是寄存器的值,指令中使用寄存器名。內(nèi)存操作數(shù):操作數(shù)是某個內(nèi)存單元的值,指令中給出有效地址EA,段地址在某個段寄存器中。11/4/202280x86匯編語言程序設(shè)計3.1指令格式1.指令的書寫格式11/2/202280x493.2操作數(shù)的形式3.2.18086指令的操作數(shù)形式1.立即數(shù):8位或16位立即數(shù)。2.寄存器操作數(shù):

8位/16位通用寄存器和段寄存器(除了FS和GS)。3.內(nèi)存操作數(shù)包括下列幾種形式。 Variable 或[Variable] [reg] disp[reg] [base][index] disp[base][index]

說明:Variable是變量名或變量名±整數(shù)表達(dá)式。reg為BX、BP、SI、DI。disp可以是常量或變量,匯編后為一個常數(shù),若是變量,則取其偏移地址。base為BX或BP,index為SI或DI。有效地址為各項之和。如disp[base][index]形式,EA=base+index+disp。若使用了BP,則隱含段地址在SS,否則在DS。當(dāng)段地址不在隱含的段寄存器時,可使用段超越前綴,形式為: 段寄存器名:11/4/202280x86匯編語言程序設(shè)計3.2操作數(shù)的形式3.2.18086指令的操作數(shù)形式503.2.232位CPU擴展的操作數(shù)形式1.立即數(shù):32位立即數(shù)。2.寄存器操作數(shù):32位通用寄存器以及FS和GS。3.內(nèi)存操作數(shù)包括下列幾種形式。 [base] disp[base] [base][index] disp[base][index] [index*n] disp[index*n] [base][index*n] disp[base][index*n]說明:base、index為任一32位通用寄存器(index不能取ESP)。n為比例因子,取1、2、4或8。若包含base且base為EBP或ESP,則隱含段地址在SS;否則,隱含段地址在DS。若在16位CPU上編程,則不能使用這些尋址方式。11/4/202280x86匯編語言程序設(shè)計3.2.232位CPU擴展的操作數(shù)形式1.立即數(shù):3513.3指令系統(tǒng)介紹設(shè)計完整程序所需的常用指令,對于其余指令,一部分在后續(xù)章節(jié)中講授,一部分自學(xué)。介紹常用指令的格式、功能以及對CF、OF、SF、ZF的影響。11/4/202280x86匯編語言程序設(shè)計3.3指令系統(tǒng)介紹設(shè)計完整程序所需的常用指令,對于其余52為了描述方便,采用下列符號約定:dest —目的操作數(shù)src —源操作數(shù)oprdn —第n個操作數(shù),如oprd1,oprd2,oprd3= —賦值/ —或者reg8 —8位通用寄存器AH/AL/BH/BL/CH/CL/DH/DLreg16 —16位通用寄存器AX/BX/CX/DX/SI/DI/BP/SPreg32 —32位通用寄存器EAX/EBX/ECX/EDX/ESI/EDI/EBP/ESPreg —reg8/reg16/reg32seg —段寄存器CS/DS/SS/ES/FS/GSmem8 —8位內(nèi)存操作數(shù)mem16 —16位內(nèi)存操作數(shù)mem32 —32位內(nèi)存操作數(shù)mem —mem8/mem16/mem32mem64 —64位內(nèi)存操作數(shù)imm8 —8位立即數(shù)imm16 —16位立即數(shù)imm32 —32位立即數(shù)imm —imm8/imm16/imm3211/4/202280x86匯編語言程序設(shè)計為了描述方便,采用下列符號約定:mem —mem8/me533.3.1數(shù)據(jù)傳送指令1.MOV(Move):傳送一般形式: MOV dest,src ;dest=src。將源操作數(shù)src復(fù)制到目的操作數(shù)dest,src不變。語法格式: MOV reg/mem/seg,reg/mem/seg/imm對標(biāo)志位的影響:無。說明:dest與src不能作如下搭配: MOV mem,mem ;錯誤 MOV seg,seg ;錯誤 MOV seg,imm ;錯誤dest不能是CS。dest與src必須類型匹配,即同時是字節(jié)、字或雙字類型。11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令1.MOV(Move):傳543.3.1數(shù)據(jù)傳送指令2.XCHG(Exchange):交換一般形式: XCHG oprd1,oprd2 ;交換oprd1與oprd2的內(nèi)容語法格式: XCHG reg/mem,reg/mem對標(biāo)志位的影響:無。說明:oprd1與oprd2不能作如下搭配: XCHG mem,mem ;錯誤oprd1與oprd2類型必須匹配。、【例】

xchg ebx,edx xchg [ebp][eax*4],edx11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令2.XCHG(Exchang553.3.1數(shù)據(jù)傳送指令3.LEA(LoadEffectiveAddress):裝入有效地址

語法格式: LEA reg16,mem ;reg16=mem的有效地址 對標(biāo)志位的影響:無?!纠吭O(shè)BX=5678H,EAX=1,EDX=2。 lea si,2[bx] ;執(zhí)行后,SI=567AH lea si,2[eax][edx] ;執(zhí)行后,SI=54.LDS、LES

語法格式: LDS reg16,mem32 ;reg16=mem32的低字,DS=mem32的高字 LES reg16,mem32 ;reg16=mem32的低字,ES=mem32的高字 對標(biāo)志位的影響:無。11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令3.LEA(LoadEffe563.3.1數(shù)據(jù)傳送指令5.堆棧操作指令 80x86系統(tǒng)的堆棧具有如下特點:堆棧是在內(nèi)存的堆棧段中,具有“先進(jìn)后出”的特點。堆棧只有一個出入口,即當(dāng)前棧頂。當(dāng)堆棧為空時,棧頂和棧底指向同一內(nèi)存單元。堆棧有兩個基本操作:PUSH(進(jìn)棧)和POP(出棧)。PUSH操作使棧頂向低地址方向移動,而POP操作則剛好相反。堆棧操作只能以字或雙字為單位。SS:SP指向棧頂。11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令5.堆棧操作指令11/2/2573.3.1數(shù)據(jù)傳送指令(1)PUSH與POP:進(jìn)棧與出棧

語法格式: PUSH reg16/seg/mem16/reg32/mem32 POP reg16/seg/mem16/reg32/mem32 ;操作數(shù)不能是CS PUSH imm ;286新增功能描述: PUSH指令(16位): SP=SP-2 SS:[SP]=16位操作數(shù) POP指令(16位): 16位操作數(shù)=SS:[SP] SP=SP+2 PUSH指令(32位): SP=SP-4 SS:[SP]=32位操作數(shù) POP指令(32位): 32位操作數(shù)=SS:[SP] SP=SP+4對標(biāo)志位的影響:無。11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令(1)PUSH與POP:進(jìn)棧與出棧583.3.1數(shù)據(jù)傳送指令(2)PUSHF與POPF:標(biāo)志寄存器進(jìn)棧和出棧語法格式: PUSHF ;FLAGS進(jìn)棧 POPF ;棧頂字出棧到FLAGS對標(biāo)志位的影響:只有POPF指令會以彈出值設(shè)置標(biāo)志寄存器。

【例】設(shè)SP=100H,EBX=12345678H,給出下列指令依次執(zhí)行后的結(jié)果。 push bx ;ss:[00ffh]=56h,ss:[00feh]=78h,sp=0feh pop ax ;ax=5678h,sp=100h push ebx ;ss:[00feh]=1234h,ss:[00fch]=5678h,sp=0fch pop ax ;ax=5678h,sp=0feh pop ax ;ax=1234h,sp=100h

【例】交換AX與CX的值。 push ax push cx pop ax pop cx11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令(2)PUSHF與POPF:標(biāo)志寄593.3.1數(shù)據(jù)傳送指令6.標(biāo)志寄存器傳送指令(1)LAHF(LoadAHfromFlags) 語法格式: LAHF ;AH=FLAGS的低8位 對標(biāo)志位的影響:無。

(2)SAHF(StoreAHintoFlags) 語法格式: SAHF ;FLAGS的低8位=AH 對標(biāo)志位的影響:由新裝入值確定。

11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令6.標(biāo)志寄存器傳送指令11/2603.3.1數(shù)據(jù)傳送指令符號擴展與零擴展指令 對標(biāo)志位的影響:無。(1)CBW、CWD、CWDE與CDQ 語法格式: CBW ;AL符號擴展為AX CWD ;AX符號擴展為32位數(shù)DX:AX CWDE ;AX符號擴展為EAX;386新增 CDQ ;EAX符號擴展為64位數(shù)EDX:EAX;386新增【例】設(shè)AL=0FEH,給出依次執(zhí)行下列指令后的結(jié)果。 cbw ;ax=0fffeh cwd ;dx=0ffffh,ax不變,即dx:ax=-2 cwde ;eax=0fffffffeh(-2) cdq ;edx=0ffffffffh,eax不變,即edx:eax=-2

11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令符號擴展與零擴展指令11/2/20613.3.1數(shù)據(jù)傳送指令(2)MOVSX一般形式: MOVSX dest,src ;src符號擴展為dest;386新增語法格式: MOVSX reg16,reg8/mem8 MOVSX reg32,reg8/mem8/reg16/mem16功能描述:MOVSX是CBW、CWD和CWDE的一般形式,用來將8位數(shù)符號擴展為16位或32位數(shù),或者將16位數(shù)符號擴展為32位數(shù)?!纠緾BW和CWDE的功能可由MOVSX指令實現(xiàn)。 movsx ax,al ;等價于cbw movsx eax,ax ;等價于cwde movsx eax,al ;等價于順序執(zhí)行cbw與cwde

11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令(2)MOVSX11/2/2022623.3.1數(shù)據(jù)傳送指令(3)MOVZX一般形式: MOVZX dest,src ;src零擴展為dest;386新增語法格式: MOVZX reg16,reg8/mem8 MOVZX reg32,reg8/mem8/reg16/mem16

11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令(3)MOVZX11/2/2022633.3.1數(shù)據(jù)傳送指令8.XLAT(Translate):換碼語法格式: XLAT ;AL=DS:[BX+AL]功能描述:將DS:BX所指內(nèi)存區(qū)中、由AL指定位移處的一個字節(jié)賦給AL。對標(biāo)志位的影響:無。

11/4/202280x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令8.XLAT(Translat643.3.2算術(shù)指令1.加法一般形式: ADD dest,src ;dest=dest+src ADC dest,src ;dest=dest+src+CF INC dest ;dest=dest+1語法格式: ADD reg/mem,reg/mem/imm ADC reg/mem,reg/mem/imm INC reg/mem對標(biāo)志位的影響:ADD、ADC:按一般規(guī)則影響CF、OF、SF和ZF。INC:不影響CF,其它同ADD。說明:ADD與ADC的2個操作數(shù)必須類型匹配,且不能同時是內(nèi)存操作數(shù)。11/4/202280x86匯編語言程序設(shè)計3.3.2算術(shù)指令1.加法11/2/202280x86653.3.2算術(shù)指令2.減法一般形式: SUB dest,src ;dest=dest–src SBB dest,src ;dest=dest-src–CF CMP dest,src ;dest–src。與SUB的區(qū)別在于,不將減法結(jié)果存入dest。 DEC dest ;dest=dest-1 NEG dest ;dest=0–dest語法格式: SUB reg/mem,reg/mem/imm SBB reg/mem,reg/mem/imm CMP reg/mem,reg/mem/imm DEC reg/mem NEG reg/mem對標(biāo)志位的影響:SUB、SBB、CMP、NEG:按一般規(guī)則影響CF、OF、SF和ZF。CF表示借位。DEC:不影響CF,其它同SUB。說明:2個操作數(shù)必須類型匹配,且不能同時是內(nèi)存操作數(shù)。11/4/202280x86匯編語言程序設(shè)計3.3.2算術(shù)指令2.減法11/2/202280x86663.3.2算術(shù)指令3.乘法(1)MUL(UnsignedMultiplication):無符號乘法一般形式: MUL src 語法格式: MUL reg8/mem8 ;AX=AL×src MUL reg16/mem16 ;DX:AX=AX×src MUL reg32/mem32 :EDX:EAX=EAX×src對標(biāo)志位的影響:若8位×8位、16位×16位或32位×32位的結(jié)果分別能由8、16或32位容納(即結(jié)果的高一半為0),則CF=OF=0,否則,CF=OF=1;其余標(biāo)志無定義。說明:由于2個n位數(shù)的乘積可能需要2n位,因此,若操作數(shù)是8位,則結(jié)果為16位;同樣,16位操作數(shù)相乘結(jié)果為32位,32位數(shù)相乘結(jié)果為64位。11/4/202280x86匯編語言程序設(shè)計3.3.2算術(shù)指令3.乘法11/2/202280x86673.3.2算術(shù)指令(2)IMUL(IntegerMultiplication):帶符號乘法一般形式: IMUL src 語法格式: IMUL reg8/mem8 ;AX=AL×src。執(zhí)行帶符號乘法,下同。 IMUL reg16/mem16 ;DX:AX=AX×src IMUL reg32/mem32 :EDX:EAX=EAX×src對標(biāo)志位的影響:若結(jié)果的高一半為低一半的符號擴展,則CF=OF=0,否則,CF=OF=1;其余標(biāo)志無定義。說明:由于2個n位數(shù)的乘積可能需要2n位,因此,若操作數(shù)是8位,則結(jié)果為16位;同樣,16位操作數(shù)相乘結(jié)果為32位,32位數(shù)相乘結(jié)果為64位?!纠繉τ谕粋€二進(jìn)制數(shù),采用MUL與IMUL執(zhí)行的結(jié)果可能不同。設(shè)AL=0FFH,BL=1,分別執(zhí)行下列指令,會得出不同結(jié)果。 mul bl ;ax=0ffh(255) imul bl ;ax=0ffffh(-1)11/4/202280x86匯編語言程序設(shè)計3.3.2算術(shù)指令(2)IMUL(IntegerMul683.3.2算術(shù)指令4.除法一般形式: DIV src ;無符號數(shù)除法 IDIV src ;帶符號數(shù)除法語法格式: DIV reg/mem IDIV reg/mem 功能描述:src是8位:AX÷src,結(jié)果商在AL、余數(shù)在AH。src是16位:DX:AX÷src,結(jié)果商在AX、余數(shù)在DX。src是32位:EDX:EAX÷src,結(jié)果商在EAX、余數(shù)在EDX。對標(biāo)志位的影響:無定義。11/4/202280x86匯編語言程序設(shè)計3.3.2算術(shù)指令4.除法11/2/202280x86693.3.2算術(shù)指令5.十進(jìn)制調(diào)整指令

(1)壓縮BCD碼調(diào)整指令語法格式: DAA ;調(diào)整AL中的和為壓縮BCD碼 DAS ;調(diào)整AL中的差為壓縮BCD碼功能描述:DAA:通常先執(zhí)行ADD/ADC指令,將2個壓縮BCD碼相加,結(jié)果存放在AL中。然后使用該指令將AL調(diào)整為壓縮BCD碼格式。DAS:通常先執(zhí)行SUB/SBB指令,將2個壓縮BCD碼相減,結(jié)果存放在AL中。然后使用該指令將AL調(diào)整為壓縮BCD碼格式。對標(biāo)志位的影響:OF不確定;CF反映壓縮BCD碼相加/相減的進(jìn)位/借位狀態(tài);按一般規(guī)則影響SF和ZF。說明:若使用DAA/DAS指令,則參加加法/減法運算的操作數(shù)應(yīng)該是壓縮BCD碼。如果將任意2個二進(jìn)制數(shù)相加/減,然后調(diào)整,將得不到正確結(jié)果。11/4/202280x86匯編語言程序設(shè)計3.3.2算術(shù)指令5.十進(jìn)制調(diào)整指令11/2/2022703.3.2算術(shù)指令DAA的調(diào)整算法如下:if(AL低4位>9或AF=1)then AL=AL+6; AF=1;endifif(AL高4位>9或CF=1)then AL=AL+60H; CF=1;endifDAS的調(diào)整算法如下:if(AL低4位>9或AF=1)then AL=AL–6; AF=1;endifif(AL高4位>9或CF=1)then AL=AL-60h; CF=1;endif11/4/202280x86匯編語言程序設(shè)計3.3.2算術(shù)指令DAA的調(diào)整算法如下:DAS的調(diào)整算法713.3.2算術(shù)指令(2)非壓縮BCD碼調(diào)整指令語法格式: AAA ;調(diào)整AL中的和為非壓縮BCD碼 ;調(diào)整后,AL高4位=0,AH=AH+產(chǎn)生的CF AAS ;調(diào)整AL中的差為非壓縮BCD碼 ;調(diào)整后,AL高4位=0,AH=AH-產(chǎn)生的CF AAM ;AH=AXdiv10,AL=AXmod10 AAD ;AL=AH×10+AL,AH=0功能描述:AAA:通常先執(zhí)行ADD/ADC指令,以AL為目的操作數(shù),將2個非壓縮BCD碼(高4位無關(guān))相加。然后使用AAA將AL調(diào)整為非壓縮BCD碼格式,且高4位=0,同時將調(diào)整產(chǎn)生的進(jìn)位加到AH中。AAS:通常先執(zhí)行SUB/SBB指令,以AL為目的操作數(shù),將2個非壓縮BCD碼(高4位無關(guān))相減。然后使用AAS將AL調(diào)整為非壓縮BCD碼格式,且高4位=0,同時將調(diào)整產(chǎn)生的借位從AH中減去。AAM與AAD:略。對標(biāo)志位的影響:AAA與AAS:CF反映非壓縮BCD碼加/減的進(jìn)位/借位;OF、SF和ZF不確定。11/4/202280x86匯編語言程序設(shè)計3.3.2算術(shù)指令(2)非壓縮BCD碼調(diào)整指令11/2/723.3.2算術(shù)指令A(yù)AA的調(diào)整算法如下:if(AL低4位>9或AF=1)then AL=AL+6; AH=AH+1; AF=1; CF=1;else AF=0; CF=0;endifAL=ALAND0FH;AL高4位清0AAS的調(diào)整算法如下:if(AL低4位>9或AF=1)thenAL=AL–6;AH=AH–1;AF=1;CF=1;elseAF=0;CF=0;endifAL=ALAND0FH;AL高4位清011/4/202280x86匯編語言程序設(shè)計3.3.2算術(shù)指令A(yù)AA的調(diào)整算法如下:AAS的調(diào)整算法733.3.3位操作指令1.邏輯指令一般形式: AND dest,

溫馨提示

  • 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

提交評論