![匯編語(yǔ)言程序設(shè)計(jì)-第3章 80x86指令系統(tǒng)課件_第1頁(yè)](http://file4.renrendoc.com/view/1161d7ca6abf6d9c834d386347281bd4/1161d7ca6abf6d9c834d386347281bd41.gif)
![匯編語(yǔ)言程序設(shè)計(jì)-第3章 80x86指令系統(tǒng)課件_第2頁(yè)](http://file4.renrendoc.com/view/1161d7ca6abf6d9c834d386347281bd4/1161d7ca6abf6d9c834d386347281bd42.gif)
![匯編語(yǔ)言程序設(shè)計(jì)-第3章 80x86指令系統(tǒng)課件_第3頁(yè)](http://file4.renrendoc.com/view/1161d7ca6abf6d9c834d386347281bd4/1161d7ca6abf6d9c834d386347281bd43.gif)
![匯編語(yǔ)言程序設(shè)計(jì)-第3章 80x86指令系統(tǒng)課件_第4頁(yè)](http://file4.renrendoc.com/view/1161d7ca6abf6d9c834d386347281bd4/1161d7ca6abf6d9c834d386347281bd44.gif)
![匯編語(yǔ)言程序設(shè)計(jì)-第3章 80x86指令系統(tǒng)課件_第5頁(yè)](http://file4.renrendoc.com/view/1161d7ca6abf6d9c834d386347281bd4/1161d7ca6abf6d9c834d386347281bd45.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第3章80x86指令系統(tǒng)講授要點(diǎn)3種操作數(shù)(立即數(shù)、寄存器和內(nèi)存操作數(shù))的形式。常用指令的格式、功能以及對(duì)CF、OF、SF、ZF的影響。使用指令時(shí)容易犯的錯(cuò)誤。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)第3章80x86指令系統(tǒng)講授要點(diǎn)3種操作數(shù)(立即數(shù)、寄13.1指令格式1.指令的書寫格式 標(biāo)號(hào): 指令助記符 操作數(shù) ;注釋2.操作數(shù)的3種形式:立即操作數(shù):指令的操作數(shù)是立即數(shù),并直接出現(xiàn)在指令中。寄存器操作數(shù):操作數(shù)是寄存器的值,指令中使用寄存器名。內(nèi)存操作數(shù):操作數(shù)是某個(gè)內(nèi)存單元的值,指令中給出有效地址EA,段地址在某個(gè)段寄存器中。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)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]
說(shuō)明:Variable是變量名或變量名±整數(shù)表達(dá)式。reg為BX、BP、SI、DI。disp可以是常量或變量,匯編后為一個(gè)常數(shù),若是變量,則取其偏移地址。base為BX或BP,index為SI或DI。有效地址為各項(xiàng)之和。如disp[base][index]形式,EA=base+index+disp。若使用了BP,則隱含段地址在SS,否則在DS。當(dāng)段地址不在隱含的段寄存器時(shí),可使用段超越前綴,形式為: 段寄存器名:11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.2操作數(shù)的形式3.2.18086指令的操作數(shù)形式33.2.232位CPU擴(kuò)展的操作數(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]說(shuō)明:base、index為任一32位通用寄存器(index不能取ESP)。n為比例因子,取1、2、4或8。若包含base且base為EBP或ESP,則隱含段地址在SS;否則,隱含段地址在DS。若在16位CPU上編程,則不能使用這些尋址方式。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.2.232位CPU擴(kuò)展的操作數(shù)形式1.立即數(shù):343.3指令系統(tǒng)介紹設(shè)計(jì)完整程序所需的常用指令,對(duì)于其余指令,一部分在后續(xù)章節(jié)中講授,一部分自學(xué)。介紹常用指令的格式、功能以及對(duì)CF、OF、SF、ZF的影響。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3指令系統(tǒng)介紹設(shè)計(jì)完整程序所需的常用指令,對(duì)于其余5為了描述方便,采用下列符號(hào)約定:dest —目的操作數(shù)src —源操作數(shù)oprdn —第n個(gè)操作數(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匯編語(yǔ)言程序設(shè)計(jì)為了描述方便,采用下列符號(hào)約定:mem —mem8/me63.3.1數(shù)據(jù)傳送指令1.MOV(Move):傳送一般形式: MOV dest,src ;dest=src。將源操作數(shù)src復(fù)制到目的操作數(shù)dest,src不變。語(yǔ)法格式: MOV reg/mem/seg,reg/mem/seg/imm對(duì)標(biāo)志位的影響:無(wú)。說(shuō)明:dest與src不能作如下搭配: MOV mem,mem ;錯(cuò)誤 MOV seg,seg ;錯(cuò)誤 MOV seg,imm ;錯(cuò)誤dest不能是CS。dest與src必須類型匹配,即同時(shí)是字節(jié)、字或雙字類型。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令1.MOV(Move):傳73.3.1數(shù)據(jù)傳送指令2.XCHG(Exchange):交換一般形式: XCHG oprd1,oprd2 ;交換oprd1與oprd2的內(nèi)容語(yǔ)法格式: XCHG reg/mem,reg/mem對(duì)標(biāo)志位的影響:無(wú)。說(shuō)明:oprd1與oprd2不能作如下搭配: XCHG mem,mem ;錯(cuò)誤oprd1與oprd2類型必須匹配。、【例】
xchg ebx,edx xchg [ebp][eax*4],edx11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令2.XCHG(Exchang83.3.1數(shù)據(jù)傳送指令3.LEA(LoadEffectiveAddress):裝入有效地址
語(yǔ)法格式: LEA reg16,mem ;reg16=mem的有效地址 對(duì)標(biāo)志位的影響:無(wú)?!纠吭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
語(yǔ)法格式: LDS reg16,mem32 ;reg16=mem32的低字,DS=mem32的高字 LES reg16,mem32 ;reg16=mem32的低字,ES=mem32的高字 對(duì)標(biāo)志位的影響:無(wú)。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令3.LEA(LoadEffe93.3.1數(shù)據(jù)傳送指令5.堆棧操作指令 80x86系統(tǒng)的堆棧具有如下特點(diǎn):堆棧是在內(nèi)存的堆棧段中,具有“先進(jìn)后出”的特點(diǎn)。堆棧只有一個(gè)出入口,即當(dāng)前棧頂。當(dāng)堆棧為空時(shí),棧頂和棧底指向同一內(nèi)存單元。堆棧有兩個(gè)基本操作:PUSH(進(jìn)棧)和POP(出棧)。PUSH操作使棧頂向低地址方向移動(dòng),而POP操作則剛好相反。堆棧操作只能以字或雙字為單位。SS:SP指向棧頂。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令5.堆棧操作指令11/2/2103.3.1數(shù)據(jù)傳送指令(1)PUSH與POP:進(jìn)棧與出棧
語(yǔ)法格式: 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對(duì)標(biāo)志位的影響:無(wú)。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令(1)PUSH與POP:進(jìn)棧與出棧113.3.1數(shù)據(jù)傳送指令(2)PUSHF與POPF:標(biāo)志寄存器進(jìn)棧和出棧語(yǔ)法格式: PUSHF ;FLAGS進(jìn)棧 POPF ;棧頂字出棧到FLAGS對(duì)標(biāo)志位的影響:只有POPF指令會(huì)以彈出值設(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匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令(2)PUSHF與POPF:標(biāo)志寄123.3.1數(shù)據(jù)傳送指令6.標(biāo)志寄存器傳送指令(1)LAHF(LoadAHfromFlags) 語(yǔ)法格式: LAHF ;AH=FLAGS的低8位 對(duì)標(biāo)志位的影響:無(wú)。
(2)SAHF(StoreAHintoFlags) 語(yǔ)法格式: SAHF ;FLAGS的低8位=AH 對(duì)標(biāo)志位的影響:由新裝入值確定。
11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令6.標(biāo)志寄存器傳送指令11/2133.3.1數(shù)據(jù)傳送指令符號(hào)擴(kuò)展與零擴(kuò)展指令 對(duì)標(biāo)志位的影響:無(wú)。(1)CBW、CWD、CWDE與CDQ 語(yǔ)法格式: CBW ;AL符號(hào)擴(kuò)展為AX CWD ;AX符號(hào)擴(kuò)展為32位數(shù)DX:AX CWDE ;AX符號(hào)擴(kuò)展為EAX;386新增 CDQ ;EAX符號(hào)擴(kuò)展為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匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令符號(hào)擴(kuò)展與零擴(kuò)展指令11/2/20143.3.1數(shù)據(jù)傳送指令(2)MOVSX一般形式: MOVSX dest,src ;src符號(hào)擴(kuò)展為dest;386新增語(yǔ)法格式: MOVSX reg16,reg8/mem8 MOVSX reg32,reg8/mem8/reg16/mem16功能描述:MOVSX是CBW、CWD和CWDE的一般形式,用來(lái)將8位數(shù)符號(hào)擴(kuò)展為16位或32位數(shù),或者將16位數(shù)符號(hào)擴(kuò)展為32位數(shù)?!纠緾BW和CWDE的功能可由MOVSX指令實(shí)現(xiàn)。 movsx ax,al ;等價(jià)于cbw movsx eax,ax ;等價(jià)于cwde movsx eax,al ;等價(jià)于順序執(zhí)行cbw與cwde
11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令(2)MOVSX11/2/2022153.3.1數(shù)據(jù)傳送指令(3)MOVZX一般形式: MOVZX dest,src ;src零擴(kuò)展為dest;386新增語(yǔ)法格式: MOVZX reg16,reg8/mem8 MOVZX reg32,reg8/mem8/reg16/mem16
11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令(3)MOVZX11/2/2022163.3.1數(shù)據(jù)傳送指令8.XLAT(Translate):換碼語(yǔ)法格式: XLAT ;AL=DS:[BX+AL]功能描述:將DS:BX所指內(nèi)存區(qū)中、由AL指定位移處的一個(gè)字節(jié)賦給AL。對(duì)標(biāo)志位的影響:無(wú)。
11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)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語(yǔ)法格式: ADD reg/mem,reg/mem/imm ADC reg/mem,reg/mem/imm INC reg/mem對(duì)標(biāo)志位的影響:ADD、ADC:按一般規(guī)則影響CF、OF、SF和ZF。INC:不影響CF,其它同ADD。說(shuō)明:ADD與ADC的2個(gè)操作數(shù)必須類型匹配,且不能同時(shí)是內(nèi)存操作數(shù)。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)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語(yǔ)法格式: SUB reg/mem,reg/mem/imm SBB reg/mem,reg/mem/imm CMP reg/mem,reg/mem/imm DEC reg/mem NEG reg/mem對(duì)標(biāo)志位的影響:SUB、SBB、CMP、NEG:按一般規(guī)則影響CF、OF、SF和ZF。CF表示借位。DEC:不影響CF,其它同SUB。說(shuō)明:2個(gè)操作數(shù)必須類型匹配,且不能同時(shí)是內(nèi)存操作數(shù)。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.2算術(shù)指令2.減法11/2/202280x86193.3.2算術(shù)指令3.乘法(1)MUL(UnsignedMultiplication):無(wú)符號(hào)乘法一般形式: MUL src 語(yǔ)法格式: MUL reg8/mem8 ;AX=AL×src MUL reg16/mem16 ;DX:AX=AX×src MUL reg32/mem32 :EDX:EAX=EAX×src對(duì)標(biāo)志位的影響:若8位×8位、16位×16位或32位×32位的結(jié)果分別能由8、16或32位容納(即結(jié)果的高一半為0),則CF=OF=0,否則,CF=OF=1;其余標(biāo)志無(wú)定義。說(shuō)明:由于2個(gè)n位數(shù)的乘積可能需要2n位,因此,若操作數(shù)是8位,則結(jié)果為16位;同樣,16位操作數(shù)相乘結(jié)果為32位,32位數(shù)相乘結(jié)果為64位。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.2算術(shù)指令3.乘法11/2/202280x86203.3.2算術(shù)指令(2)IMUL(IntegerMultiplication):帶符號(hào)乘法一般形式: IMUL src 語(yǔ)法格式: IMUL reg8/mem8 ;AX=AL×src。執(zhí)行帶符號(hào)乘法,下同。 IMUL reg16/mem16 ;DX:AX=AX×src IMUL reg32/mem32 :EDX:EAX=EAX×src對(duì)標(biāo)志位的影響:若結(jié)果的高一半為低一半的符號(hào)擴(kuò)展,則CF=OF=0,否則,CF=OF=1;其余標(biāo)志無(wú)定義。說(shuō)明:由于2個(gè)n位數(shù)的乘積可能需要2n位,因此,若操作數(shù)是8位,則結(jié)果為16位;同樣,16位操作數(shù)相乘結(jié)果為32位,32位數(shù)相乘結(jié)果為64位。【例】對(duì)于同一個(gè)二進(jìn)制數(shù),采用MUL與IMUL執(zhí)行的結(jié)果可能不同。設(shè)AL=0FFH,BL=1,分別執(zhí)行下列指令,會(huì)得出不同結(jié)果。 mul bl ;ax=0ffh(255) imul bl ;ax=0ffffh(-1)11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.2算術(shù)指令(2)IMUL(IntegerMul213.3.2算術(shù)指令4.除法一般形式: DIV src ;無(wú)符號(hào)數(shù)除法 IDIV src ;帶符號(hào)數(shù)除法語(yǔ)法格式: 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。對(duì)標(biāo)志位的影響:無(wú)定義。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.2算術(shù)指令4.除法11/2/202280x86223.3.2算術(shù)指令5.十進(jìn)制調(diào)整指令
(1)壓縮BCD碼調(diào)整指令語(yǔ)法格式: DAA ;調(diào)整AL中的和為壓縮BCD碼 DAS ;調(diào)整AL中的差為壓縮BCD碼功能描述:DAA:通常先執(zhí)行ADD/ADC指令,將2個(gè)壓縮BCD碼相加,結(jié)果存放在AL中。然后使用該指令將AL調(diào)整為壓縮BCD碼格式。DAS:通常先執(zhí)行SUB/SBB指令,將2個(gè)壓縮BCD碼相減,結(jié)果存放在AL中。然后使用該指令將AL調(diào)整為壓縮BCD碼格式。對(duì)標(biāo)志位的影響:OF不確定;CF反映壓縮BCD碼相加/相減的進(jìn)位/借位狀態(tài);按一般規(guī)則影響SF和ZF。說(shuō)明:若使用DAA/DAS指令,則參加加法/減法運(yùn)算的操作數(shù)應(yīng)該是壓縮BCD碼。如果將任意2個(gè)二進(jìn)制數(shù)相加/減,然后調(diào)整,將得不到正確結(jié)果。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)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匯編語(yǔ)言程序設(shè)計(jì)3.3.2算術(shù)指令DAA的調(diào)整算法如下:DAS的調(diào)整算法243.3.2算術(shù)指令(2)非壓縮BCD碼調(diào)整指令語(yǔ)法格式: 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個(gè)非壓縮BCD碼(高4位無(wú)關(guān))相加。然后使用AAA將AL調(diào)整為非壓縮BCD碼格式,且高4位=0,同時(shí)將調(diào)整產(chǎn)生的進(jìn)位加到AH中。AAS:通常先執(zhí)行SUB/SBB指令,以AL為目的操作數(shù),將2個(gè)非壓縮BCD碼(高4位無(wú)關(guān))相減。然后使用AAS將AL調(diào)整為非壓縮BCD碼格式,且高4位=0,同時(shí)將調(diào)整產(chǎn)生的借位從AH中減去。AAM與AAD:略。對(duì)標(biāo)志位的影響:AAA與AAS:CF反映非壓縮BCD碼加/減的進(jìn)位/借位;OF、SF和ZF不確定。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)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匯編語(yǔ)言程序設(shè)計(jì)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操作但不存儲(chǔ)結(jié)果到dest語(yǔ)法格式: 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 對(duì)標(biāo)志位的影響:NOT:無(wú)。其它指令:CF=OF=0,按一般規(guī)則影響SF和ZF。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)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ù)右移語(yǔ)法格式: SHL reg/mem,1/CL SHL reg/mem,imm8 ;286新增 SAL、SHR與SAR格式同SHL11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.3位操作指令1.移位指令11/2/202280283.3.3位操作指令功能描述:SHL/SAL:左移。最高位移出到CF,最低位移入0。SAR:算術(shù)右移。最低位移入CF,最高位不變。SHR:邏輯右移。最低位移入CF,最高位移入0。對(duì)標(biāo)志位的影響:若移位后符號(hào)位發(fā)生了變化,則OF=1,否則OF=0;CF為最后移入位;按一般規(guī)則影響ZF與SF。然而,若移位次數(shù)為0,則不影響標(biāo)志位;若移位次數(shù)>1,則OF無(wú)定義?!纠吭O(shè)AX的值為一個(gè)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匯編語(yǔ)言程序設(shè)計(jì)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)右移語(yǔ)法格式: ROL reg/mem,1/CL ROL reg/mem,imm8 ;286新增 ROR、RCL、RCR格式同ROL11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.3位操作指令2.循環(huán)移位11/2/202280x303.3.3位操作指令功能描述:ROL:循環(huán)左移。最高位移出到CF,并同時(shí)移入最低位。RCL:帶進(jìn)位循環(huán)左移。最高位移出到CF,原CF移入最低位。ROR:循環(huán)右移。最低位移出到CF,并同時(shí)移入最高位。RCR:帶進(jìn)位循環(huán)右移。最低位移出到CF,原CF移入最高位。對(duì)標(biāo)志位的影響:若移位后符號(hào)位發(fā)生了變化,則OF=1,否則OF=0;CF為最后移入位;不影響ZF與SF。然而,若移位次數(shù)為0,則不影響標(biāo)志位;若移位次數(shù)>1,則OF無(wú)定義?!纠繉X:AX中的32位數(shù)左移1位。 shl ax,1 rcl dx,111/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.3位操作指令功能描述:11/2/202280x8313.3.3位操作指令3.位測(cè)試指令
位測(cè)試指令包括;BT(BitTest):位測(cè)試BTS(BitTestandSet):位測(cè)試并置位BTR(BitTestandReset):位測(cè)試并復(fù)位BTC(BitTestandComplement):位測(cè)試并取反)這些指令均為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匯編語(yǔ)言程序設(shè)計(jì)3.3.3位操作指令3.位測(cè)試指令11/2/20228323.3.3位操作指令語(yǔ)法格式: BT reg16/mem16,reg16/imm8 BT reg32/mem32,reg32/imm8 BTR、BTS、BTC格式同BT對(duì)標(biāo)志位的影響:影響CF;其余標(biāo)志無(wú)定義?!纠课粶y(cè)試。 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匯編語(yǔ)言程序設(shè)計(jì)3.3.3位操作指令語(yǔ)法格式:11/2/202280x8333.3.4控制轉(zhuǎn)移指令1.JMP(Jump):無(wú)條件轉(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的值即可實(shí)現(xiàn)。段間轉(zhuǎn)移:可在不同代碼段之間進(jìn)行,又稱遠(yuǎn)(Far)轉(zhuǎn)移,需要同時(shí)修改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í)行到該條指令時(shí)才能確定。因此,JMP指令共有下列4種轉(zhuǎn)移方式:段內(nèi)直接轉(zhuǎn)移(Intrasegment/DirectJump)段間直接轉(zhuǎn)移(Intersegment/DirectJump)段內(nèi)間接轉(zhuǎn)移(Intrasegment/IndirectJump)段間間接轉(zhuǎn)移(Intersegment/IndirectJump)在匯編語(yǔ)言程序中,通常使用標(biāo)號(hào)(Label)來(lái)指定直接轉(zhuǎn)移的目標(biāo)地址。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.4控制轉(zhuǎn)移指令1.JMP(Jump):無(wú)條件轉(zhuǎn)343.3.4控制轉(zhuǎn)移指令語(yǔ)法格式: 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)號(hào)label處 JMP reg16/mem16;段內(nèi)間接轉(zhuǎn)移 ;目標(biāo)地址:同一代碼段,偏移地址=reg16/[mem16] JMP mem32 ;段間間接轉(zhuǎn)移 ;目標(biāo)地址:段地址=mem32高字,偏移地址=mem32低字對(duì)標(biāo)志位的影響:無(wú)。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.4控制轉(zhuǎn)移指令語(yǔ)法格式:11/2/202280x353.3.4控制轉(zhuǎn)移指令2.條件轉(zhuǎn)移指令
為簡(jiǎn)化描述,用Jcc表示所有條件轉(zhuǎn)移指令的助記符。一般形式: Jcc label ;若條件成立,則IP=label的偏移地址。其中,label是標(biāo)號(hào)功能描述:若條件成立,則轉(zhuǎn)移到目標(biāo)地址label;否則,CPU忽略該條件轉(zhuǎn)移,繼續(xù)執(zhí)行下一條指令。對(duì)標(biāo)志位的影響:無(wú)。Jcc指令包括下列3類:(1)測(cè)試單個(gè)標(biāo)志位的Jcc指令。(2)用于帶符號(hào)數(shù)比較的Jcc指令。常用在CMP指令之后,以判斷帶符號(hào)數(shù)的大小。(3)用于無(wú)符號(hào)數(shù)比較的Jcc指令。常用在CMP指令之后,以判斷無(wú)符號(hào)數(shù)的大小。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.4控制轉(zhuǎn)移指令2.條件轉(zhuǎn)移指令11/2/202363.3.4控制轉(zhuǎn)移指令3.JCXZ/JECXZ(JumpifCX/ECXisZero)
語(yǔ)法格式: JCXZ label ;若CX=0,則轉(zhuǎn)移到label JECXZ label ;若ECX=0,則轉(zhuǎn)移到label;386新增對(duì)標(biāo)志位的影響:無(wú)說(shuō)明:label相對(duì)位移量必須在-128~127之間,所有80x86CPU都一樣。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)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完全等價(jià),只是同一指令的不同助記符。語(yǔ)法格式: 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對(duì)標(biāo)志位的影響:無(wú)。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.4控制轉(zhuǎn)移指令4.循環(huán)指令11/2/20228383.3.4控制轉(zhuǎn)移指令5.中斷指令I(lǐng)NT本章只簡(jiǎn)單引入軟件中斷調(diào)用指令I(lǐng)NT。詳細(xì)介紹參見第8章。語(yǔ)法格式: INT n ;調(diào)用中斷n的中斷服務(wù)程序。n為中斷號(hào),取值0~255。對(duì)標(biāo)志位的影響:不影響CF、OF、SF、ZF。MSDOS使用中斷號(hào)21H作為系統(tǒng)調(diào)用,為程序員提供了上百種系統(tǒng)服務(wù)功能,對(duì)這些功能的調(diào)用步驟如下:(1)由AH給出功能號(hào)。(2)根據(jù)相應(yīng)功能的要求,設(shè)置入口參數(shù)。(3)INT21H。(4)分析和使用出口參數(shù)。其中,最常用的是功能號(hào)4CH,用來(lái)實(shí)現(xiàn)程序退出、并返回DOS。使用方法如下: mov ah,4ch int 21h11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)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,開中斷)。語(yǔ)法格式: CLC ;CF=0 STC ;CF=1 CMC ;CF=NOTCF CLD ;DF=0 STD ;DF=1 CLI ;IF=0 STI ;IF=1對(duì)標(biāo)志位的影響:只影響指定標(biāo)志。注意,在程序中應(yīng)慎重使用CLI指令,錯(cuò)誤的使用會(huì)導(dǎo)致系統(tǒng)無(wú)法正常工作。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.5標(biāo)志處理指令標(biāo)志處理指令包括C403.3.6處理器控制指令1.NOP(NoOperation):無(wú)操作語(yǔ)法格式: NOP功能描述:NOP指令不做任何事情,只占用1個(gè)字節(jié),耗費(fèi)1個(gè)指令執(zhí)行周期。說(shuō)明:程序員經(jīng)常使用NOP作為占位符(PlaceHolder),以預(yù)留內(nèi)存空間。當(dāng)然,可以使用其它指令實(shí)現(xiàn)類似功能,如XCHGAX,AX指令。事實(shí)上,NOP與XCHGAX,AX的機(jī)器碼完全一樣,都是90H。對(duì)標(biāo)志位的影響:無(wú)。
11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.6處理器控制指令1.NOP(NoOperati413.3.6處理器控制指令2.HLT(Halt):暫停語(yǔ)法格式: HLT功能描述:使CPU進(jìn)入暫停狀態(tài),這時(shí)CPU不執(zhí)行任何操作,直到系統(tǒng)復(fù)位或發(fā)生外部中斷為止。中斷使CPU繼續(xù)執(zhí)行HLT后的下一條指令。說(shuō)明:HLT不能用來(lái)終止程序。通常,應(yīng)用程序不使用該指令。對(duì)標(biāo)志位的影響:無(wú)。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.6處理器控制指令2.HLT(Halt):暫停11423.4容易犯的錯(cuò)誤1.操作數(shù)類型不匹配例如,將BL的值送AX。錯(cuò)誤方法: mov ax,bl ;類型不匹配正確方法:(1)作為無(wú)符號(hào)數(shù)。 mov al,bl mov ah,0(2)作為帶符號(hào)數(shù)。 mov al,bl cbw
11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.4容易犯的錯(cuò)誤1.操作數(shù)類型不匹配11/2/202433.4容易犯的錯(cuò)誤2.憑空構(gòu)造指令例如:(1)實(shí)現(xiàn)AX=AL*5。錯(cuò)誤方法: mul 5 ;MUL的操作數(shù)不能是立即數(shù)(2)將內(nèi)存單元(段地址在DS,偏移地址在AX)的一個(gè)字節(jié)送BL。錯(cuò)誤方法: mov bl,[ax] ;內(nèi)存操作數(shù)不能用[AX]正確方法: mov si,ax mov bl,[si]11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.4容易犯的錯(cuò)誤2.憑空構(gòu)造指令11/2/2022443.4容易犯的錯(cuò)誤3.對(duì)標(biāo)志位的錯(cuò)誤使用例如:判斷AX的值,若AX=0FFFFH,則轉(zhuǎn)移到標(biāo)號(hào)L。錯(cuò)誤方法: not ax ;NOT不影響標(biāo)志位 jz l正確方法: xor ax,0ffffh jz l或 cmp ax,0ffffh je l11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.4容易犯的錯(cuò)誤3.對(duì)標(biāo)志位的錯(cuò)誤使用11/2/20453.5實(shí)例舉例說(shuō)明指令的使用方法。如例3.41、3.42、3.43、3.46等。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.5實(shí)例舉例說(shuō)明指令的使用方法。如例3.41、3.446本章小結(jié)80x86指令的操作數(shù)包括3種形式:立即數(shù)、寄存器(通用寄存器和段寄存器)與內(nèi)存操作數(shù)。對(duì)于內(nèi)存操作數(shù),由操作數(shù)的形式可計(jì)算出有效地址。在缺省情況下,其段地址隱含在段寄存器DS或SS中,除非由段超越前綴明確給出。80386以下的16位CPU只能使用16位指令系統(tǒng)。32位80x86CPU在兼容16位指令系統(tǒng)的基礎(chǔ)上,支持32位操作數(shù)與32位內(nèi)存尋址方式。在實(shí)模式下,可以使用32位立即數(shù)、32位通用寄存器和擴(kuò)展的內(nèi)存操作數(shù)形式,但計(jì)算出的有效地址只能是16位。大多數(shù)指令(如傳送類指令)的執(zhí)行不影響標(biāo)志位,某些指令(如算術(shù)指令)的執(zhí)行按一般規(guī)則影響標(biāo)志位,還有一部分指令(如邏輯指令)會(huì)按特定方式(清0、置1等)影響標(biāo)志位。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)本章小結(jié)80x86指令的操作數(shù)包括3種形式:立即數(shù)、寄存47第3章80x86指令系統(tǒng)講授要點(diǎn)3種操作數(shù)(立即數(shù)、寄存器和內(nèi)存操作數(shù))的形式。常用指令的格式、功能以及對(duì)CF、OF、SF、ZF的影響。使用指令時(shí)容易犯的錯(cuò)誤。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)第3章80x86指令系統(tǒng)講授要點(diǎn)3種操作數(shù)(立即數(shù)、寄483.1指令格式1.指令的書寫格式 標(biāo)號(hào): 指令助記符 操作數(shù) ;注釋2.操作數(shù)的3種形式:立即操作數(shù):指令的操作數(shù)是立即數(shù),并直接出現(xiàn)在指令中。寄存器操作數(shù):操作數(shù)是寄存器的值,指令中使用寄存器名。內(nèi)存操作數(shù):操作數(shù)是某個(gè)內(nèi)存單元的值,指令中給出有效地址EA,段地址在某個(gè)段寄存器中。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)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]
說(shuō)明:Variable是變量名或變量名±整數(shù)表達(dá)式。reg為BX、BP、SI、DI。disp可以是常量或變量,匯編后為一個(gè)常數(shù),若是變量,則取其偏移地址。base為BX或BP,index為SI或DI。有效地址為各項(xiàng)之和。如disp[base][index]形式,EA=base+index+disp。若使用了BP,則隱含段地址在SS,否則在DS。當(dāng)段地址不在隱含的段寄存器時(shí),可使用段超越前綴,形式為: 段寄存器名:11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.2操作數(shù)的形式3.2.18086指令的操作數(shù)形式503.2.232位CPU擴(kuò)展的操作數(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]說(shuō)明:base、index為任一32位通用寄存器(index不能取ESP)。n為比例因子,取1、2、4或8。若包含base且base為EBP或ESP,則隱含段地址在SS;否則,隱含段地址在DS。若在16位CPU上編程,則不能使用這些尋址方式。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.2.232位CPU擴(kuò)展的操作數(shù)形式1.立即數(shù):3513.3指令系統(tǒng)介紹設(shè)計(jì)完整程序所需的常用指令,對(duì)于其余指令,一部分在后續(xù)章節(jié)中講授,一部分自學(xué)。介紹常用指令的格式、功能以及對(duì)CF、OF、SF、ZF的影響。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3指令系統(tǒng)介紹設(shè)計(jì)完整程序所需的常用指令,對(duì)于其余52為了描述方便,采用下列符號(hào)約定:dest —目的操作數(shù)src —源操作數(shù)oprdn —第n個(gè)操作數(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匯編語(yǔ)言程序設(shè)計(jì)為了描述方便,采用下列符號(hào)約定:mem —mem8/me533.3.1數(shù)據(jù)傳送指令1.MOV(Move):傳送一般形式: MOV dest,src ;dest=src。將源操作數(shù)src復(fù)制到目的操作數(shù)dest,src不變。語(yǔ)法格式: MOV reg/mem/seg,reg/mem/seg/imm對(duì)標(biāo)志位的影響:無(wú)。說(shuō)明:dest與src不能作如下搭配: MOV mem,mem ;錯(cuò)誤 MOV seg,seg ;錯(cuò)誤 MOV seg,imm ;錯(cuò)誤dest不能是CS。dest與src必須類型匹配,即同時(shí)是字節(jié)、字或雙字類型。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令1.MOV(Move):傳543.3.1數(shù)據(jù)傳送指令2.XCHG(Exchange):交換一般形式: XCHG oprd1,oprd2 ;交換oprd1與oprd2的內(nèi)容語(yǔ)法格式: XCHG reg/mem,reg/mem對(duì)標(biāo)志位的影響:無(wú)。說(shuō)明:oprd1與oprd2不能作如下搭配: XCHG mem,mem ;錯(cuò)誤oprd1與oprd2類型必須匹配。、【例】
xchg ebx,edx xchg [ebp][eax*4],edx11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令2.XCHG(Exchang553.3.1數(shù)據(jù)傳送指令3.LEA(LoadEffectiveAddress):裝入有效地址
語(yǔ)法格式: LEA reg16,mem ;reg16=mem的有效地址 對(duì)標(biāo)志位的影響:無(wú)?!纠吭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
語(yǔ)法格式: LDS reg16,mem32 ;reg16=mem32的低字,DS=mem32的高字 LES reg16,mem32 ;reg16=mem32的低字,ES=mem32的高字 對(duì)標(biāo)志位的影響:無(wú)。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令3.LEA(LoadEffe563.3.1數(shù)據(jù)傳送指令5.堆棧操作指令 80x86系統(tǒng)的堆棧具有如下特點(diǎn):堆棧是在內(nèi)存的堆棧段中,具有“先進(jìn)后出”的特點(diǎn)。堆棧只有一個(gè)出入口,即當(dāng)前棧頂。當(dāng)堆棧為空時(shí),棧頂和棧底指向同一內(nèi)存單元。堆棧有兩個(gè)基本操作:PUSH(進(jìn)棧)和POP(出棧)。PUSH操作使棧頂向低地址方向移動(dòng),而POP操作則剛好相反。堆棧操作只能以字或雙字為單位。SS:SP指向棧頂。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令5.堆棧操作指令11/2/2573.3.1數(shù)據(jù)傳送指令(1)PUSH與POP:進(jìn)棧與出棧
語(yǔ)法格式: 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對(duì)標(biāo)志位的影響:無(wú)。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令(1)PUSH與POP:進(jìn)棧與出棧583.3.1數(shù)據(jù)傳送指令(2)PUSHF與POPF:標(biāo)志寄存器進(jìn)棧和出棧語(yǔ)法格式: PUSHF ;FLAGS進(jìn)棧 POPF ;棧頂字出棧到FLAGS對(duì)標(biāo)志位的影響:只有POPF指令會(huì)以彈出值設(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匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令(2)PUSHF與POPF:標(biāo)志寄593.3.1數(shù)據(jù)傳送指令6.標(biāo)志寄存器傳送指令(1)LAHF(LoadAHfromFlags) 語(yǔ)法格式: LAHF ;AH=FLAGS的低8位 對(duì)標(biāo)志位的影響:無(wú)。
(2)SAHF(StoreAHintoFlags) 語(yǔ)法格式: SAHF ;FLAGS的低8位=AH 對(duì)標(biāo)志位的影響:由新裝入值確定。
11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令6.標(biāo)志寄存器傳送指令11/2603.3.1數(shù)據(jù)傳送指令符號(hào)擴(kuò)展與零擴(kuò)展指令 對(duì)標(biāo)志位的影響:無(wú)。(1)CBW、CWD、CWDE與CDQ 語(yǔ)法格式: CBW ;AL符號(hào)擴(kuò)展為AX CWD ;AX符號(hào)擴(kuò)展為32位數(shù)DX:AX CWDE ;AX符號(hào)擴(kuò)展為EAX;386新增 CDQ ;EAX符號(hào)擴(kuò)展為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匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令符號(hào)擴(kuò)展與零擴(kuò)展指令11/2/20613.3.1數(shù)據(jù)傳送指令(2)MOVSX一般形式: MOVSX dest,src ;src符號(hào)擴(kuò)展為dest;386新增語(yǔ)法格式: MOVSX reg16,reg8/mem8 MOVSX reg32,reg8/mem8/reg16/mem16功能描述:MOVSX是CBW、CWD和CWDE的一般形式,用來(lái)將8位數(shù)符號(hào)擴(kuò)展為16位或32位數(shù),或者將16位數(shù)符號(hào)擴(kuò)展為32位數(shù)?!纠緾BW和CWDE的功能可由MOVSX指令實(shí)現(xiàn)。 movsx ax,al ;等價(jià)于cbw movsx eax,ax ;等價(jià)于cwde movsx eax,al ;等價(jià)于順序執(zhí)行cbw與cwde
11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令(2)MOVSX11/2/2022623.3.1數(shù)據(jù)傳送指令(3)MOVZX一般形式: MOVZX dest,src ;src零擴(kuò)展為dest;386新增語(yǔ)法格式: MOVZX reg16,reg8/mem8 MOVZX reg32,reg8/mem8/reg16/mem16
11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令(3)MOVZX11/2/2022633.3.1數(shù)據(jù)傳送指令8.XLAT(Translate):換碼語(yǔ)法格式: XLAT ;AL=DS:[BX+AL]功能描述:將DS:BX所指內(nèi)存區(qū)中、由AL指定位移處的一個(gè)字節(jié)賦給AL。對(duì)標(biāo)志位的影響:無(wú)。
11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)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語(yǔ)法格式: ADD reg/mem,reg/mem/imm ADC reg/mem,reg/mem/imm INC reg/mem對(duì)標(biāo)志位的影響:ADD、ADC:按一般規(guī)則影響CF、OF、SF和ZF。INC:不影響CF,其它同ADD。說(shuō)明:ADD與ADC的2個(gè)操作數(shù)必須類型匹配,且不能同時(shí)是內(nèi)存操作數(shù)。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)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語(yǔ)法格式: SUB reg/mem,reg/mem/imm SBB reg/mem,reg/mem/imm CMP reg/mem,reg/mem/imm DEC reg/mem NEG reg/mem對(duì)標(biāo)志位的影響:SUB、SBB、CMP、NEG:按一般規(guī)則影響CF、OF、SF和ZF。CF表示借位。DEC:不影響CF,其它同SUB。說(shuō)明:2個(gè)操作數(shù)必須類型匹配,且不能同時(shí)是內(nèi)存操作數(shù)。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.2算術(shù)指令2.減法11/2/202280x86663.3.2算術(shù)指令3.乘法(1)MUL(UnsignedMultiplication):無(wú)符號(hào)乘法一般形式: MUL src 語(yǔ)法格式: MUL reg8/mem8 ;AX=AL×src MUL reg16/mem16 ;DX:AX=AX×src MUL reg32/mem32 :EDX:EAX=EAX×src對(duì)標(biāo)志位的影響:若8位×8位、16位×16位或32位×32位的結(jié)果分別能由8、16或32位容納(即結(jié)果的高一半為0),則CF=OF=0,否則,CF=OF=1;其余標(biāo)志無(wú)定義。說(shuō)明:由于2個(gè)n位數(shù)的乘積可能需要2n位,因此,若操作數(shù)是8位,則結(jié)果為16位;同樣,16位操作數(shù)相乘結(jié)果為32位,32位數(shù)相乘結(jié)果為64位。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.2算術(shù)指令3.乘法11/2/202280x86673.3.2算術(shù)指令(2)IMUL(IntegerMultiplication):帶符號(hào)乘法一般形式: IMUL src 語(yǔ)法格式: IMUL reg8/mem8 ;AX=AL×src。執(zhí)行帶符號(hào)乘法,下同。 IMUL reg16/mem16 ;DX:AX=AX×src IMUL reg32/mem32 :EDX:EAX=EAX×src對(duì)標(biāo)志位的影響:若結(jié)果的高一半為低一半的符號(hào)擴(kuò)展,則CF=OF=0,否則,CF=OF=1;其余標(biāo)志無(wú)定義。說(shuō)明:由于2個(gè)n位數(shù)的乘積可能需要2n位,因此,若操作數(shù)是8位,則結(jié)果為16位;同樣,16位操作數(shù)相乘結(jié)果為32位,32位數(shù)相乘結(jié)果為64位?!纠繉?duì)于同一個(gè)二進(jìn)制數(shù),采用MUL與IMUL執(zhí)行的結(jié)果可能不同。設(shè)AL=0FFH,BL=1,分別執(zhí)行下列指令,會(huì)得出不同結(jié)果。 mul bl ;ax=0ffh(255) imul bl ;ax=0ffffh(-1)11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.2算術(shù)指令(2)IMUL(IntegerMul683.3.2算術(shù)指令4.除法一般形式: DIV src ;無(wú)符號(hào)數(shù)除法 IDIV src ;帶符號(hào)數(shù)除法語(yǔ)法格式: 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。對(duì)標(biāo)志位的影響:無(wú)定義。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)3.3.2算術(shù)指令4.除法11/2/202280x86693.3.2算術(shù)指令5.十進(jìn)制調(diào)整指令
(1)壓縮BCD碼調(diào)整指令語(yǔ)法格式: DAA ;調(diào)整AL中的和為壓縮BCD碼 DAS ;調(diào)整AL中的差為壓縮BCD碼功能描述:DAA:通常先執(zhí)行ADD/ADC指令,將2個(gè)壓縮BCD碼相加,結(jié)果存放在AL中。然后使用該指令將AL調(diào)整為壓縮BCD碼格式。DAS:通常先執(zhí)行SUB/SBB指令,將2個(gè)壓縮BCD碼相減,結(jié)果存放在AL中。然后使用該指令將AL調(diào)整為壓縮BCD碼格式。對(duì)標(biāo)志位的影響:OF不確定;CF反映壓縮BCD碼相加/相減的進(jìn)位/借位狀態(tài);按一般規(guī)則影響SF和ZF。說(shuō)明:若使用DAA/DAS指令,則參加加法/減法運(yùn)算的操作數(shù)應(yīng)該是壓縮BCD碼。如果將任意2個(gè)二進(jìn)制數(shù)相加/減,然后調(diào)整,將得不到正確結(jié)果。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)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匯編語(yǔ)言程序設(shè)計(jì)3.3.2算術(shù)指令DAA的調(diào)整算法如下:DAS的調(diào)整算法713.3.2算術(shù)指令(2)非壓縮BCD碼調(diào)整指令語(yǔ)法格式: 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個(gè)非壓縮BCD碼(高4位無(wú)關(guān))相加。然后使用AAA將AL調(diào)整為非壓縮BCD碼格式,且高4位=0,同時(shí)將調(diào)整產(chǎn)生的進(jìn)位加到AH中。AAS:通常先執(zhí)行SUB/SBB指令,以AL為目的操作數(shù),將2個(gè)非壓縮BCD碼(高4位無(wú)關(guān))相減。然后使用AAS將AL調(diào)整為非壓縮BCD碼格式,且高4位=0,同時(shí)將調(diào)整產(chǎn)生的借位從AH中減去。AAM與AAD:略。對(duì)標(biāo)志位的影響:AAA與AAS:CF反映非壓縮BCD碼加/減的進(jìn)位/借位;OF、SF和ZF不確定。11/4/202280x86匯編語(yǔ)言程序設(shè)計(jì)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匯編語(yǔ)言程序設(shè)計(jì)3.3.2算術(shù)指令A(yù)AA的調(diào)整算法如下:AAS的調(diào)整算法733.3.3位操作指令1.邏輯指令一般形式: AND dest,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 雙邊教育合作諒解協(xié)議書模板
- 2025年市場(chǎng)調(diào)研與分析咨詢服務(wù)委托協(xié)議
- 2025年供應(yīng)商與裝修企業(yè)合作框架協(xié)議
- 2025年企業(yè)合同解除操作規(guī)范
- 2025年勞動(dòng)合同標(biāo)準(zhǔn)范本分享
- 2025年倉(cāng)儲(chǔ)糧食管理協(xié)議
- 2025年住宅物業(yè)購(gòu)買補(bǔ)充協(xié)議
- 2025年勞動(dòng)人員雇傭協(xié)議
- 2025年八人合伙企業(yè)股權(quán)分配協(xié)議書
- 2025年合伙人利潤(rùn)分配及責(zé)任承擔(dān)協(xié)議規(guī)范
- 地理-廣東省上進(jìn)聯(lián)考領(lǐng)航高中聯(lián)盟2025屆高三下學(xué)期開學(xué)考試題和答案
- 2025年熱管換熱氣行業(yè)深度研究分析報(bào)告
- 華為采購(gòu)質(zhì)量?jī)?yōu)先及三化一穩(wěn)定推進(jìn)
- 職業(yè)學(xué)院學(xué)生晚出、晚歸、不歸管理辦法
- 2025年高三歷史高考第二輪復(fù)習(xí)知識(shí)梳理中國(guó)史部分復(fù)習(xí)提綱
- 《安利蛋白質(zhì)粉》課件
- 護(hù)理三基三嚴(yán)習(xí)題+參考答案
- 2025門診護(hù)理工作計(jì)劃
- 員工互評(píng)表(含指標(biāo))
- 電氣領(lǐng)域知識(shí)培訓(xùn)課件
- 山東省部分學(xué)校2024-2025學(xué)年高一上學(xué)期12月選科指導(dǎo)聯(lián)合測(cè)試地理試題( 含答案)
評(píng)論
0/150
提交評(píng)論