微機(jī)原理課件-第3章指令系統(tǒng)_第1頁
 微機(jī)原理課件-第3章指令系統(tǒng)_第2頁
 微機(jī)原理課件-第3章指令系統(tǒng)_第3頁
 微機(jī)原理課件-第3章指令系統(tǒng)_第4頁
 微機(jī)原理課件-第3章指令系統(tǒng)_第5頁
已閱讀5頁,還剩102頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第3章指令系統(tǒng)12№

2

概述

尋址方式

指令系統(tǒng)第3章

指令系統(tǒng)33.1概述3.1.1指令的格式圖3-180x86指令的格式43.1概述3.1.2指令的編碼格式圖3-28086指令的編碼格式53.2尋址方式3.2.1指令的尋址方式順序?qū)ぶ讽樞蚪Y(jié)構(gòu)的程序,執(zhí)行時(shí)按照其代碼編寫順序(內(nèi)存存儲(chǔ)順序)執(zhí)行。CPU根據(jù)IP指向的地址取出指令,分析該指令的長(zhǎng)度,將IP的值加上指令的長(zhǎng)度,形成下一條指令的地址,這種尋找下一條指令的方法稱為指令的順序?qū)ぶ贰^D(zhuǎn)移尋址遇到除順序結(jié)構(gòu)外的其他結(jié)構(gòu)時(shí),下一條指令的地址本條指令(轉(zhuǎn)移指令,過程調(diào)用指令,返回指令等)給出的,本條指令執(zhí)行時(shí),由CPU將下一條指令的地址傳送至CS和IP,實(shí)現(xiàn)程序的轉(zhuǎn)移,這種尋找下一條指令地址的方法稱為指令的轉(zhuǎn)移尋址。63.2.1操作數(shù)的尋址方式1.操作數(shù)分類。源操作數(shù)在指令中只參與運(yùn)算,指令執(zhí)行后源操作數(shù)不發(fā)生改變。目的操作數(shù)在指令中既要參見運(yùn)算,一般還用于保存運(yùn)算的結(jié)果,指令執(zhí)行后目的操作數(shù)的值通常會(huì)發(fā)生改變。72.操作數(shù)的尋址方式1)立即尋址:操作數(shù)存放在指令的地址碼字段,即操作數(shù)是指令的一部分,操作數(shù)存放在存儲(chǔ)器的代碼段,取指令的同時(shí)連同操作數(shù)一起取至CPU。操作數(shù)可以是8位,16位,存放時(shí)高位存放在高地址存儲(chǔ)單元,低位存放在低地址存儲(chǔ)單元。例:MOVAX,1A2BH82)寄存器尋址(RegisterAddressing)操作數(shù)存放在CPU內(nèi)部的寄存器中,則操作數(shù)的尋址方式稱為寄存器尋址。可以存放操作數(shù)的寄存器包括8位寄存器AL,AH,BL,BH,CL,CH,DL,DH,16位通用寄存器AX,BX,CX,DX,SI,DI,SP,BP或16位段寄存器CS,SS,DS,ES。例:MOVAX,BX93)直接尋址(DirectAddressing)

指令的地址碼字段給出的是操作數(shù)在存儲(chǔ)器中的16位偏移地址,這個(gè)偏移地址也被稱為有效地址EA(EffectiveAddress)。如果指令前沒有加操作數(shù)限制前綴,則操作數(shù)默認(rèn)存放在存儲(chǔ)器的數(shù)據(jù)段,操作數(shù)的段地址為DS的值,如果指令前有操作數(shù)限制前綴,則操作數(shù)的段地址由操作數(shù)限制前綴中給定的段寄存器確定。這種操作數(shù)尋址方式稱為直接尋址。10例:MOVAX,[2000H]假設(shè)指令執(zhí)行前(DS)=1000H,(12000H)=12H,(12001H)=34H。源操作數(shù)的物理地址1000H×10H+2000H=12000H11例:MOVBX,ES:[1000H]源操作數(shù)的物理地址=1200H×10H+1000H=13000H124)寄存器間接尋址(RegisterIndirectAddressing)操作數(shù)存放在存儲(chǔ)器中,其偏移地址存放在16位寄存器中,可以存放操作數(shù)偏移地址的寄存器有4個(gè),BX,BP,SI和DI。當(dāng)操作數(shù)的偏移地址存放于BX,SI或DI寄存器中時(shí),其默認(rèn)的段為數(shù)據(jù)段,即段地址是DS的值,當(dāng)操作數(shù)的偏移地址存放在BP中時(shí),其默認(rèn)的段為堆棧段,即段地址是SS的值。13例:MOV[BX],AX假設(shè)(DS)=1000H,(BX)=1100H。目的操作數(shù)的物理地址=1000H×10H+1100H=11100H14例:MOV[BP],AX假設(shè)(SS)=2000H,(BP)=6100H。目的操作數(shù)的偏移地址是6100H,段地址是2000H,物理地址=2000H×10H+6100H=26100H155)寄存器相對(duì)尋址方式(RegisterRelativeAddressing)操作數(shù)存放在存儲(chǔ)器中,操作數(shù)的偏移地址是基址寄存器或者變址寄存器的內(nèi)容加上8位或者16位的位移量。即操作數(shù)的有效地址EA=SIDI+8位disp16位dispBXBP16例MOV[BX+100H],AX假設(shè)(DS)=1000H,(BX)=1100H,目的操作數(shù)采用寄存器相對(duì)尋址方式,目的操作數(shù)的偏移地址=(BX)+100H=1200H,目的操作數(shù)的段地址為DS的內(nèi)容1000H,目的操作數(shù)的物理地址=(DS)×10H+(BX)+100H=11200H17例MOVAX,[BP+100H]假設(shè)(SS)=2000H,(BP)=6100H,源操作數(shù)采用了寄存器相對(duì)尋址方式,源操作數(shù)的偏移地址=(BP)+10H=6110H,目的操作數(shù)的段地址為SS的內(nèi)容2000H,目的操作數(shù)的物理地址=(SS)×10H+(BP)+100H=26110H186)基址變址尋址(BasedIndexedAddressing)操作數(shù)存放在存儲(chǔ)器中,操作數(shù)的偏移地址是一個(gè)基址寄存器的內(nèi)容和一個(gè)變址寄存器的內(nèi)容之和,即有效地址EA=(SI)(DI)

+(BX)(BP)19例MOVAX,[BX+SI]假設(shè)(DS)=1000H,(BX)=1100H,(SI)=1200H,源操作數(shù)采用基址變址尋址方式,源操作數(shù)的偏移地址=(BX)+(SI)=2300H,源操作數(shù)的段地址為DS的內(nèi)容1000H,源操作數(shù)的物理地址=(DS)×10H+(BX)+(SI)=12300H。20例MOV[BP+DI],AX假設(shè)(SS)=2000H,(BP)=6100H,(DI)=1300H,目的操作數(shù)采用基址變址尋址方式,目的操作數(shù)的偏移地址=(BP)+(DI)=7400H,目的操作數(shù)的段地址為SS的內(nèi)容2000H,目的操作數(shù)的物理地址=(SS)×10H+(BP)+(DI)=27400H217)相對(duì)基址變址尋址操作數(shù)存放在存儲(chǔ)器中,操作數(shù)的偏移地址是一個(gè)基址寄存器的內(nèi)容加一個(gè)變址寄存器的內(nèi)容再加一個(gè)8位或16位的位移量形成,即+18位disp8位dispEA=(SI)(DI)

+(BX)(BP)22例MOVAX,[BX+SI+10H]假設(shè)(DS)=1000H,(BX)=1100H,(SI)=1200H,源操作數(shù)采用相對(duì)基址變址尋址方式,源操作數(shù)的偏移地址=(BX)+(SI)+10H=2310H,源操作數(shù)的段地址為DS的內(nèi)容1000H,源操作數(shù)的物理地址=(DS)×10H+(BX)+(SI)+10H=12310H23例MOV[BP+DI+100H],AX假設(shè)(SS)=2000H,(BP)=6100H,(DI)=1300H,目的操作數(shù)采用相對(duì)基址變址尋址方式,目的操作數(shù)的偏移地址=(BP)+(DI)+100H=7500H,目的操作數(shù)的段地址為SS的內(nèi)容2000H,目的操作數(shù)的物理地址=(SS)×10H+(BP)+(DI)+100H=27500H24按照操作數(shù)存放的位置,操作數(shù)可以分為立即數(shù)操作數(shù),寄存器操作數(shù)和存儲(chǔ)器操作數(shù)3類。立即數(shù)操作數(shù):立即數(shù)存放在存儲(chǔ)器的代碼段,是指令的一部分。立即數(shù)操作數(shù)只能做為源操作數(shù),不能做為目的操作數(shù)。寄存器操作數(shù):寄存器操作數(shù)存放在CPU內(nèi)部的寄存器中,指令執(zhí)行時(shí)無需訪問存儲(chǔ)器,指令的執(zhí)行速度快寄存器操作數(shù)在指令中既可以作為源操作數(shù),也可以作為目的操作數(shù)。存儲(chǔ)器操作數(shù):直接尋址,寄存器間接尋址,寄存器相對(duì)尋址,基址變址尋址和相對(duì)基址變址尋址五種尋址方式對(duì)應(yīng)的操作數(shù)為存儲(chǔ)器操作數(shù),存儲(chǔ)器操作數(shù)存放在存儲(chǔ)器中,其偏移地址通過尋址方式給出,其段地址在指令中隱含給出或者通過段超越前綴給出。存儲(chǔ)器操作數(shù)在指令中可以作為源操作數(shù)或者目的操作數(shù),但是8086CPU指令中,不允許兩個(gè)操作數(shù)同時(shí)為存儲(chǔ)器操作數(shù)。253.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送指令1.

通用數(shù)據(jù)傳送指令1)基本的傳送指令MOV指令一般形式:MOVDST,SRC指令功能:SRCDST(字節(jié)或字);26立即數(shù)操作數(shù)到寄存器的傳送注意:MOV指令不能完成立即數(shù)到段寄存器的數(shù)據(jù)傳送MOV指令可以實(shí)現(xiàn)如下數(shù)據(jù)傳送立即數(shù)操作數(shù)到存儲(chǔ)器的傳送將立即數(shù)操作數(shù)傳送到存儲(chǔ)器,由于在數(shù)據(jù)傳送過程中沒有寄存器,CPU無法確定立即數(shù)的大小(字節(jié)數(shù)據(jù)或者字?jǐn)?shù)據(jù)),也無法確定存儲(chǔ)單元的大小(字節(jié)存儲(chǔ)單元或者字存儲(chǔ)單元),在此類傳送中必須指明存儲(chǔ)單元的大小。寄存器操作數(shù)到寄存器的傳送寄存器分為通用寄存器和段寄存器。因此MOV指令可以實(shí)現(xiàn)通用寄存器間的數(shù)據(jù)傳送,段寄存器與通用寄存器間的數(shù)據(jù)傳送。注意:MOV指令不能實(shí)現(xiàn)段寄存器到段寄存器間的數(shù)據(jù)傳送。27寄存器操與存儲(chǔ)器之間的數(shù)據(jù)傳送例:MOVAX,[BX+DI]MOV[BX+1000H],DL存儲(chǔ)器操與存儲(chǔ)器之間的數(shù)據(jù)傳送注意:存儲(chǔ)器與存儲(chǔ)器之間的數(shù)據(jù)傳送是不允許的,要實(shí)現(xiàn)數(shù)據(jù)從存儲(chǔ)單元到存儲(chǔ)單元的傳送,必須借助CPU內(nèi)部的寄存器作為“橋梁”來完成。282)數(shù)據(jù)交換指令XCHG格式:XCHGOPRD1,OPRD2功能:將操作數(shù)OPRD1和OPRD2進(jìn)行交換,即將操作數(shù)OPRD1送至操作數(shù)OPRD2,同時(shí)將操作數(shù)OPRD2送至操作數(shù)OPRD1,是一個(gè)雙向數(shù)據(jù)傳送,可以實(shí)現(xiàn)字節(jié)數(shù)據(jù)或字?jǐn)?shù)據(jù)的交換。注意:操作數(shù)OPRD1和OPRD2不能同時(shí)為存儲(chǔ)器操作數(shù)立即數(shù)操作數(shù)不能參與交換段寄存器的內(nèi)容不能參與交換29

30PUSH指令執(zhí)行前堆棧段PUSH指令執(zhí)行后堆棧段

31

32出棧指令執(zhí)行前堆棧段

出棧指令執(zhí)行后堆棧段

333.地址傳送指令1)取有效地址指令LEA格式:LEAREG16,MEM;功能:將源操作數(shù)的16位偏移地址傳送至目的操作數(shù)。指令中要求源操作數(shù)必須是存儲(chǔ)器操作數(shù),目的操作數(shù)必須是一個(gè)16位的寄存器操作數(shù)。

343)地址指針裝入ES指令格式:LESREG16,MEM32功能:將源操作數(shù)地址所對(duì)應(yīng)的32位存儲(chǔ)器操作數(shù)送入到ES和指令中指定的寄存器。32位的存儲(chǔ)器操作數(shù)是一個(gè)邏輯地址,其高字部分為段地址,低字部分為偏移地址,指令執(zhí)行時(shí)將32位存儲(chǔ)器操作數(shù)的高字(段地址)送入到附加段寄存器ES,低字(偏移地址)送入到目的操作數(shù)給出的16位寄存器。例:LESSI,[BX];將BX指向的存儲(chǔ)單元中的字?jǐn)?shù)據(jù)送入BX,;將(BX)+2指向的存儲(chǔ)單元中的字?jǐn)?shù)據(jù)送入ES已知(DS)=2000H,(BX)=2000H,存儲(chǔ)單元(22000H)=0A0H,(22001H)=10H,(22002H)=00H,(22003H)=18H。指令執(zhí)行結(jié)果:(ES)=1800H,(BX)=10A0H。354.輸入輸出指令輸入輸出指令實(shí)現(xiàn)的是CPU與I/O端口之間的數(shù)據(jù)傳送。其中輸入指令I(lǐng)N是將8位或16位數(shù)據(jù)從I/O端口傳送至累加器(AL或AX),輸出指令是將累加器(AL或AX)中的8位或16位數(shù)據(jù)輸出到I/O端口。I/O端口的尋址方式直接尋址:在指令中直接給出I/O端口的地址對(duì)I/O端口進(jìn)行訪問。只有部分I/O端口可以直接訪問,其地址范圍為00H~FFH。間接尋址:在訪問I/O端口時(shí),不直接給出I/O端口的地址,而是將I/O端口的地址送入到DX寄存器,通過DX寄存器間接訪問I/O端口。所有的I/O端口都可以采用間接尋址方式進(jìn)行訪問。361)輸入指令I(lǐng)N格式:INACC,PORTINACC,DX功能:將端口中的8位或16位數(shù)據(jù)輸入至累加器AL或AX,即傳送8位數(shù)據(jù)時(shí)累加器用AL,傳送16位數(shù)據(jù)時(shí)累加器用AX。例:INAL,80HMOVDX,2100HINAL,DX372)輸出指令OUT格式:OUTPORT,ACCOUTDX,ACC功能:將累加器AL或AX中的8位或16位數(shù)據(jù)輸出至I/O端口,即傳送8位數(shù)據(jù)時(shí)累加器用AL,傳送16位數(shù)據(jù)時(shí)累加器用AX。例:OUT78H,ALMOVDX,183HOUTDX,AL385.標(biāo)志寄存器傳送指令1)標(biāo)志寄存器裝入AH指令LAHF(loadAHwithflags)格式:LAHF功能:將標(biāo)志寄存器的低8位送入到AH寄存器,不影響標(biāo)志寄存器中的標(biāo)志位。2)AH寫入標(biāo)志寄存器指令SAHF(storeAHintoflags)格式:SAHF功能:將AH的數(shù)據(jù)傳送到標(biāo)志寄存器的低8位,會(huì)按照傳入的值影響標(biāo)志寄存器的標(biāo)志位。393)標(biāo)志寄存器壓入堆棧指令PUSHF(pushtheflags)格式:PUSHF功能:將標(biāo)志寄存器FLAGS中的內(nèi)容壓入到堆棧,壓入堆棧過程參考PUSH指令,不影響標(biāo)志位。4)標(biāo)志寄存器出棧指令POPF(poptheflags)格式:POPF功能:將堆棧棧頂?shù)淖謫卧獢?shù)據(jù)彈出到標(biāo)志寄存器FLAGS,彈出過程參考POP指令,按照彈出到標(biāo)志寄存器的內(nèi)容影響標(biāo)志位。40

413.3.2算術(shù)運(yùn)算指令01110110+0100010110111011指令的執(zhí)行結(jié)果:(AL)=0BBHSF=1ZF=0OF=1PF=1AF=0CF=0

42

43例:已知內(nèi)存數(shù)據(jù)區(qū)DATA1和DATA2開始的區(qū)域存放有5字節(jié)數(shù)據(jù)36E340FA32H和184DA2397EH,要求編程求兩個(gè)多字節(jié)數(shù)據(jù)的和并保存至DATA1開始的存儲(chǔ)器。程序代碼如下:MOVCX,5MOVSI,0CLCAGAIN:MOVAL,DATA2[SI]ADCDATA1[SI],ALINCSIDECCX JNZAGAIN44

45

011101101011101100110001指令執(zhí)行結(jié)果:(AL)=31HSF=0ZF=0OF=0PF=0AF=0CF=046

47

48

49例:內(nèi)存數(shù)據(jù)段存放了10個(gè)帶符號(hào)數(shù),數(shù)據(jù)的首地址為DATA1,將數(shù)據(jù)取絕對(duì)值后存入以DATA2為首地址的內(nèi)存區(qū)。程序代碼:LEASI,DATA1LEADI,DATA2MOVCX,10CHECK:MOVAL,[SI]CMPAL,0JGEPOSIZERONEGALPOSIZERO:MOV[DI],ALINCSIINCDILOOPCHECKHLT50例:在內(nèi)存數(shù)據(jù)段從DATA開始的兩個(gè)單元分別存放了兩個(gè)8位無符號(hào)數(shù),試比較它們的大小,并將其中較大的數(shù)送至數(shù)據(jù)區(qū)1000H單元。LEABX,DATAMOVAL,[BX]INCBXCMPAL,[BX]JNCNEXTMOVAL,[BX]NEXT:MOV[1000H],AL

51

52

53例:MOVAL,87HMOVBL,35HMULBL執(zhí)行結(jié)果:(AX)=1BF3H,CF=OF=1表明乘積AH中包含了有效數(shù)字。例:MOVAX,35E3HMOVBX,2487HIMULBX執(zhí)行結(jié)果:(DX)=07B0H,(AX)=56B5H,CF=OF=1,表明DX中包含有效數(shù)字,而不僅僅是符號(hào)位的擴(kuò)展。54

55注意:1指令中的源操作數(shù)只能是寄存器操作數(shù)或者存儲(chǔ)器操作數(shù),不能為立即數(shù)操作數(shù),當(dāng)操作數(shù)為存儲(chǔ)器操作數(shù)時(shí),需要規(guī)定存儲(chǔ)單元的屬性。2除法指令對(duì)標(biāo)志位的影響無定義。3除法指令中要求被除數(shù)為除數(shù)長(zhǎng)度的2倍,在使用除法指令進(jìn)行除法運(yùn)算時(shí),如果被除數(shù)和除數(shù)長(zhǎng)度相同,需要使用符號(hào)擴(kuò)展指令對(duì)被除數(shù)的長(zhǎng)度進(jìn)行擴(kuò)展。4在使用除法運(yùn)算指令時(shí),必須考慮除法的溢出問題。商超出AL(AX)表示范圍時(shí)發(fā)生溢出。5在執(zhí)行帶符號(hào)數(shù)除法指令時(shí),余數(shù)的符號(hào)與被除數(shù)相同。56例:MOVAX,87MOVCL,10DIVCL執(zhí)行結(jié)果:(AL)=8(AH)=7例:MOVAX,-87MOVCL,10IDIVCL執(zhí)行結(jié)果:(AL)=0F8H(-8)(AH)=0F9H(-7)575.符號(hào)擴(kuò)展指令字節(jié)擴(kuò)展成字指令CBW(ConvertBytetoWord)格式:CBW;將AL中的數(shù)據(jù)符號(hào)位擴(kuò)展到AH中,形成字?jǐn)?shù)據(jù)(AX)字?jǐn)U展成雙字指令CWD(ConvertWordtoDoubleWord)格式:CWD;將AX中數(shù)據(jù)的符號(hào)位擴(kuò)展到DX中,形成雙字?jǐn)?shù)據(jù)(DX:AX)583.3.3邏輯運(yùn)算與移位指令

59

60

61

62

632.移位類指令(1)一般移位類指令1)邏輯/算術(shù)左移指令SHL/SAL(Shiftlogicleft/shiftarithmeticleft)格式:SHL/SALDST,1/CL功能:將目的操作數(shù)邏輯左移/算術(shù)左移一位或者CL寄存器中指定的位數(shù)。邏輯/算術(shù)移位指令左移一位時(shí),目的操作數(shù)的每一位左移一位,最高位進(jìn)入進(jìn)位標(biāo)志CF,最低位補(bǔ)0。

0CFDST642)邏輯右移指令SHR(shiftlogicalright)格式:SHRDST,1/CL功能:將目的操作數(shù)邏輯右移一位或者CL寄存器中指定的位數(shù)。邏輯右移一位時(shí),目的操作數(shù)的每一位右移一位,最低位進(jìn)入進(jìn)位標(biāo)志CF,最高位補(bǔ)0。653)算術(shù)右移指令SAR(shiftarithmeticright)格式:SARDST,1/CL功能:將目的操作數(shù)算術(shù)右移一位或者CL寄存器中指定的位數(shù)。算術(shù)右移一位時(shí),目的操作數(shù)的每一位右移一位,最低位進(jìn)入進(jìn)位標(biāo)志CF,最高位補(bǔ)原來的最高位。66(2)循環(huán)移位指令1)循環(huán)左移指令ROL(rotateleft)和循環(huán)右移指令ROR(rotateright)循環(huán)左移指令格式:ROLDST,1/CL功能:將目的操作數(shù)循環(huán)左移一位或者左移CL寄存器指定的位數(shù),最高位移至CF,最低位補(bǔ)原來操作數(shù)的最高位,目的操作數(shù)本身形成一個(gè)封閉循環(huán)。67循環(huán)右移指令格式:RORDST,1/CL功能:將目的操作數(shù)循環(huán)右移一位或者左移CL寄存器指定的位數(shù),最低位移至CF,最高位補(bǔ)原來操作數(shù)的最低位,目的操作數(shù)本身形成一個(gè)封閉循環(huán)。注意:循環(huán)移位指令影響標(biāo)志位CF和OF。當(dāng)循環(huán)左移指令移位位數(shù)為一位時(shí),移位完成后目的操作數(shù)的最高位和CF相等,則OF=0,否則OF=1。當(dāng)循環(huán)右移指令移位位數(shù)為一位時(shí),移位完成后目的操作數(shù)的最高位和次高位相等,則OF=0,否則OF=1。CF總是等于最后移入到CF的值。682)帶進(jìn)位循環(huán)左移指令RCL(rotateleftthroughcarry)和帶進(jìn)位循環(huán)右移指令RCL(rotaterightthroughcarry)帶進(jìn)位循環(huán)左移指令RCL格式:RCLDST,1/CL功能:將目的操作數(shù)循環(huán)左移一位或者左移CL寄存器指定的位數(shù),最高位移至CF,最低位補(bǔ)指令執(zhí)行前CF的值,目的操作數(shù)和CF共同形成一個(gè)封閉循環(huán)。69帶進(jìn)位循環(huán)右移指令RCR格式:RCRDST,1/CL功能:將目的操作數(shù)循環(huán)右移一位或者左移CL寄存器指定的位數(shù),最低位移至CF,最高位補(bǔ)指令執(zhí)行前CF的值,目的操作數(shù)和CF共同形成一個(gè)封閉循環(huán)。注意:帶進(jìn)位循環(huán)移位指令影響標(biāo)志位CF和OF。當(dāng)循環(huán)左移指令移位位數(shù)為一位時(shí),移位完成后目的操作數(shù)的最高位和CF相等,則OF=0,否則OF=1。當(dāng)循環(huán)右移指令移位位數(shù)為一位時(shí),移位完成后目的操作數(shù)的最高位和次高位相等,則OF=0,否則OF=1。CF總是等于最后移入到CF的值。70例:將存放于DX:AX中32位數(shù)乘以8。分析:32位數(shù)據(jù)的低16位D0~D15存放在AX中,高16位D16~D31存放在DX中a原始數(shù)據(jù)b處理后數(shù)據(jù)程序代碼:MOVCL,3AGAIN:SALAX,1RCLDX,1DECCXJNZAGAIN713.3.4串操作指令源操作數(shù)的偏移地址存放于源變址寄存器SI,其默認(rèn)的段地址為當(dāng)前的數(shù)據(jù)段,即DS的值,允許段超越;目的操作數(shù)的偏移地址存放于目的變址寄存器DI,其默認(rèn)的段地址為當(dāng)前的附加段,不允許段超越。串操作指令執(zhí)行后,會(huì)根據(jù)情況修改地址指針。當(dāng)DF=0時(shí),按照地址遞增的順序處理數(shù)據(jù),每執(zhí)行一次字節(jié)串操作指令,地址指針加1,每執(zhí)行一次字串操作指令,地址指針加2。

當(dāng)DF=1時(shí),按照地址遞減的順序處理數(shù)據(jù),每執(zhí)行一次字節(jié)串操作指令,地址指針減1,每執(zhí)行一次字串操作指令,地址指針減2。有些串操作指令前面可以加重復(fù)前綴,加入重復(fù)前綴的指令將按照規(guī)定重復(fù)執(zhí)行。72加入重復(fù)前綴REP的串操作指令執(zhí)行過程如下:1檢查CX,若(CX)=0,則退出串操作指令,(CX)≠0,則轉(zhuǎn)入22執(zhí)行串操作指令3根據(jù)DF和操作數(shù)據(jù)類型(字節(jié)或字)修改地址指針4(CX)=(CX)-15轉(zhuǎn)至第一步731.字符串傳送指令MOVS(Movestring)格式:MOVSDST_String,SRC_String一般形式:MOVSB;字節(jié)串?dāng)?shù)據(jù)傳送MOVSW;字串?dāng)?shù)據(jù)傳送指令的功能:將DS:SI指向的存儲(chǔ)單元中的的一個(gè)字節(jié)數(shù)據(jù)或一個(gè)字?jǐn)?shù)據(jù)傳送至ES:DI指定的存儲(chǔ)單元,并按照DF的值和指令修改地址SI和DI,字符串傳送指令不影響標(biāo)志位。74例:將內(nèi)存數(shù)據(jù)區(qū)自2000H開始的20個(gè)字節(jié)數(shù)據(jù),傳送至內(nèi)存數(shù)據(jù)區(qū)自6000H開始的存儲(chǔ)區(qū)。分析:20個(gè)字節(jié)數(shù)據(jù)的傳送可以使用字符串傳送指令實(shí)現(xiàn),源串的位置由DS:SI確定,目的串的位置由ES:DI確定。程序代碼:方法一:MOVAX,DSMOVES,AX;讓附加段和數(shù)據(jù)段重疊MOVSI,2000HMOVDI,6000HCLD;DF=0MOVCX,20;傳送的字節(jié)數(shù)AGAIN:MOVSB;字節(jié)串傳送DECCX;循環(huán)次數(shù)減1JNZAGAIN;循環(huán)次數(shù)不為0,跳至AGAIN75方法二:MOVAX,DSMOVES,AX;讓附加段和數(shù)據(jù)段重疊MOVSI,2000HMOVDI,6000HCLD;DF=0MOVCX,20;傳送的字節(jié)數(shù)REPMOVSB;字節(jié)串傳送762.字符串比較指令CMPS(Comparestring)格式:CMPSSRC_String,DST_String一般形式:CMPSB;字節(jié)串比較CMPSW;字串比較指令功能:將目的字符串和源字符串進(jìn)行比較,即ES:DI指向的存儲(chǔ)單元存放的字節(jié)/字?jǐn)?shù)據(jù)減DS:SI指向的存儲(chǔ)單元存放的字節(jié)/字?jǐn)?shù)據(jù),結(jié)果不送回目的串,影響標(biāo)志位,兩者相同,ZF=1,兩者不同,ZF=0,同時(shí)根據(jù)DF和處理的串?dāng)?shù)據(jù)類型修改地址指針SI和DI。77例:比較兩個(gè)長(zhǎng)度相等的字符串STR1和STR2是否相等,如果兩個(gè)字符串相等,將RESULT單元清0,如果兩個(gè)字符串不相等,則將RESULT單元置1。STR1DB‘COMPUTER’;定義字符串STR1STR2DB‘COMPUTER’;定義字符串STR2RESULTDB?;定義變量RESULT,預(yù)留保存結(jié)果的存儲(chǔ)單元MOVSI,OFFSETSTR1;將字符串STR1的偏移地址送至SIMOVDI,OFFSETSTR2;將字符串STR2的偏移地址送至DIMOVCX,8;將字符串的長(zhǎng)度送至CXCLD;將DF清0CHECK:CMPSB;將字符串STR1和STR2對(duì)應(yīng)的字符進(jìn)行比較JNZNEXT;字符串不相等,跳至NEXTDECCX;循環(huán)次數(shù)減1JNZCHECK;循環(huán)次數(shù)不為0,跳至CHECKMOVAL,0JMPOUTPUTNEXT:MOVAL,1OUTPUT:MOVRESULT,AL;將結(jié)果送至RESULT單元78方法二:STR1DB‘COMPUTER’;定義字符串STR1STR2DB‘COMPUTER’;定義字符串STR2RESULTDB?;定義變量RESULT,預(yù)留保存結(jié)果的存儲(chǔ)單元MOVSI,OFFSETSTR1;將字符串STR1的偏移地址送至SIMOVDI,OFFSETSTR2;將字符串STR2的偏移地址送至DIMOVCX,8;將字符串的長(zhǎng)度送至CXCLD;將DF清0REPECMPSB;將字符串STR1和STR2對(duì)應(yīng)的字符進(jìn)行比較JNZNEXT;字符串不相等,跳至NEXTMOVAL,0JMPOUTPUTNEXT:MOVAL,1OUTPUT:MOVRESULT,AL;將結(jié)果送至RESULT單元793.字符串掃描指令SCANS(Scanstring)格式:SCANSDST_String一般形式:SCANSB;字節(jié)串掃描SCANSW;字串掃描指令功能:將目的字符串和累加器(AL或AX)進(jìn)行比較,即AL或AX中存放的字節(jié)/字?jǐn)?shù)據(jù)減ES:DI指向的存儲(chǔ)單元存放的字節(jié)/字?jǐn)?shù)據(jù),按照結(jié)果影響標(biāo)志位,兩者相同,ZF=1,兩者不同,ZF=0,同時(shí)根據(jù)DF和處理的串?dāng)?shù)據(jù)類型修改地址指針DI。80例:查找長(zhǎng)度為50的字符串STR中是日含有字符’*’,如果有字符’*’,則將字符’Y’送至DL,否則,將字符’N’送至DL。程序代碼如下:方法一:MOVDI,OFFSETSTR;字符串首地址送至DIMOVAX,SEGSTRMOVES,AX;字符串段地址送至ESMOVAL,’*’;被搜索的字符送至ALMOVCX,50;字符串長(zhǎng)度送至CXCLD;DF=0CHECK:SCASB;字符串掃描JZFIND;找到字符’*’,跳轉(zhuǎn)至FINDDECCX;(CX)-1CXJNZCHECK;字符串沒有搜索完,跳至CHECKMOVDL,’N’;沒有搜索到’*’,’N’DLJMPOUTPUTFIND:MOVDL,’y’;搜索到’*’,’y’DLOUTPUT:HLT81方法二:MOVDI,OFFSETSTR;字符串首地址送至DIMOVAX,SEGSTRMOVES,AX;字符串段地址送至ESMOVAL,’*’;被搜索的字符送至ALMOVCX,50;字符串長(zhǎng)度送至CXCLD;DF=0REPNESCASB;字符串掃描JZFIND;找到字符’*’,跳轉(zhuǎn)至FINDMOVDL,’N’;沒有搜索到’*’,’N’DLJMPOUTPUTFIND:MOVDL,’y’;搜索到’*’,’y’DLOUTPUT:HLT824.字符串轉(zhuǎn)入指令LODS(loadfromstring)格式:LODSSRC_String一般形式:LODSB;字節(jié)串裝入((DS):(SI))ALLODSW;字串裝入((DS):(SI))AX指令功能:將(DS):(SI)指向的源串?dāng)?shù)據(jù)裝入到累加器AL或AX中,同時(shí)根據(jù)DF和裝入數(shù)據(jù)的類型修改地址指針SI,不影響標(biāo)志位。83例:要求將內(nèi)存數(shù)據(jù)區(qū)1000H開始的10個(gè)字?jǐn)?shù)據(jù)裝入到累加器,求其絕對(duì)值后送回到內(nèi)存數(shù)據(jù)區(qū)1000H開始的存儲(chǔ)區(qū)。程序代碼如下:CLD;DF=0MOVDI,1000H;設(shè)置目的存儲(chǔ)區(qū)地址指針MOVSI,1000H;設(shè)置源存儲(chǔ)區(qū)地址指針MOVCX,10;設(shè)置循環(huán)次數(shù)AGAIN:LODSW;((DS):(SI))AXANDAX,AX;檢測(cè)累加器中數(shù)據(jù)是非負(fù)數(shù)還是負(fù)數(shù)JNSNNEG;累加器中數(shù)據(jù)非負(fù)轉(zhuǎn)至NNEGNEGAX;負(fù)數(shù)求絕對(duì)值NNEG:MOV[DI],AX;求絕對(duì)值后的數(shù)據(jù)送至目的存儲(chǔ)區(qū)INCDIINCDI;修改目的存儲(chǔ)區(qū)地址指針DECCXJNZAGAIN;數(shù)據(jù)未處理完,跳轉(zhuǎn)至AGAINHLT845.字符串送存指令STOS(Storestring)格式:STOSDST_String一般形式:STOSB;字節(jié)串送存AL((ES):(DI))STOSW;字串送存AX((ES):(DI))指令功能:將累加器AL或AX中存放的字節(jié)數(shù)據(jù)或者字?jǐn)?shù)據(jù)送至(ES):(DI)指向的存儲(chǔ)單元中,同時(shí)根據(jù)DF和裝入數(shù)據(jù)的類型修改地址指針DI,不影響標(biāo)志位。例:內(nèi)存數(shù)據(jù)區(qū)自1000H開始存放了長(zhǎng)度未知的字符串,字符串中包含大寫字母,小寫字母和其他字符,字符串以’$’結(jié)束,要求將字符串中的大寫字母轉(zhuǎn)換成對(duì)應(yīng)的小寫字母后將字符串傳送至內(nèi)存數(shù)據(jù)區(qū)自2000H開始的存儲(chǔ)區(qū)。85程序代碼如下:MOVAX,DSMOVES,AXMOVSI,1000H;設(shè)置源數(shù)據(jù)地址指針MOVDI,2000H;設(shè)置目標(biāo)地址指針CLD;DF=0AGAIN:LODSB;從源串取一個(gè)字符送至ALCMPAL,’$’;判斷是否是字符串結(jié)束字符’$’JZOUTPUT;是字符串結(jié)束字符,跳至OUTPUT,程序結(jié)束CMPAL,’A’;判斷是否為大寫字母JBTRANS;不是大寫字母,跳轉(zhuǎn)至TRANSCMPAL,’Z’;判斷是否為大寫字母JATRANS;不是大寫字母,跳轉(zhuǎn)至TRANSADDAL,20H;大寫字母轉(zhuǎn)換為小寫字母TRANS:STOSB;將字符送至目的存儲(chǔ)區(qū)存儲(chǔ)JMPAGAIN;跳轉(zhuǎn)至AGAINOUTPUT:HLT863.3.5控制轉(zhuǎn)移類指令轉(zhuǎn)移指令循環(huán)指令子程序調(diào)用和返回指令中斷指令和中斷返回指令871.轉(zhuǎn)移指令(1)無條件轉(zhuǎn)移指令JMP格式:JMPDST功能:程序在不需要滿足任何條件的情況下轉(zhuǎn)移到目的操作數(shù)指定的地址去執(zhí)行指令。注意:目的操作數(shù)可以是標(biāo)號(hào),立即數(shù)操作數(shù),也可以是寄存器操作數(shù)或者存儲(chǔ)器操作數(shù)。881)段內(nèi)直接轉(zhuǎn)移轉(zhuǎn)移目標(biāo)地址在轉(zhuǎn)移指令的操作數(shù)部分直接給出,并且轉(zhuǎn)移目標(biāo)地址和轉(zhuǎn)移指令地址位于同一個(gè)邏輯段,稱為段內(nèi)直接轉(zhuǎn)移。A.段內(nèi)直接短轉(zhuǎn)移格式:JMPSHORTLABEL功能:程序無條件轉(zhuǎn)移到LABEL標(biāo)號(hào)處執(zhí)行程序。段內(nèi)直接短轉(zhuǎn)移是指目標(biāo)指令的地址與轉(zhuǎn)移指令地址之間的相對(duì)偏移量范圍在-128~127之間,此時(shí)目標(biāo)指令的標(biāo)號(hào)是一個(gè)短標(biāo)號(hào),用關(guān)鍵字SHORT標(biāo)示。89B.段內(nèi)直接近轉(zhuǎn)移格式:JMPNEARPTRLABELJMP偏移地址功能:程序無條件轉(zhuǎn)移到LABEL標(biāo)號(hào)處執(zhí)行程序或者程序轉(zhuǎn)移到指令中給定的偏移地址處執(zhí)行。段內(nèi)直接近轉(zhuǎn)移是指目標(biāo)指令的地址與轉(zhuǎn)移指令地址之間的相對(duì)偏移量范圍在-32768~32767之間。指令匯編后,計(jì)算出目標(biāo)指令地址和轉(zhuǎn)移指令之間的16位相對(duì)偏移量,指令執(zhí)行時(shí),將當(dāng)前IP值加上一個(gè)16位偏移量形成新的IP值,實(shí)現(xiàn)程序的轉(zhuǎn)移。902)段內(nèi)間接轉(zhuǎn)移格式:JMPREG16JMPMEM16操作數(shù)說明:指令中的操作數(shù)可以是16位的寄存器操作數(shù)(寄存器尋址)或者16位的存儲(chǔ)器操作數(shù)(除立即尋址和寄存器尋址以外的其他尋址方式)。功能:程序無條件轉(zhuǎn)移到操作數(shù)指定的目標(biāo)地址。913)段間直接轉(zhuǎn)移格式:JMPFARPTRLABElJMP段地址:偏移地址功能:指令無條件轉(zhuǎn)移到LABEL標(biāo)號(hào)處執(zhí)行,LABEL標(biāo)號(hào)是一個(gè)屬性為FAR的標(biāo)號(hào),或者程序轉(zhuǎn)移到指令指定的邏輯地址處執(zhí)行。執(zhí)行的操作:將標(biāo)號(hào)的偏移地址送至IP,將標(biāo)號(hào)的的段地址送至CS,或者將指令中給定的偏移地址送至IP,段地址送至CS,使程序的執(zhí)行順序發(fā)生改變。924)段間間接轉(zhuǎn)移格式:JMPMEM32功能:指令無條件轉(zhuǎn)移到操作數(shù)指定的地址執(zhí)行。執(zhí)行的操作:指令的操作數(shù)是一個(gè)32位的存儲(chǔ)器操作數(shù),其高字部分為段地址,低字部分為偏移地址,將操作數(shù)低字送至IP,將操作數(shù)高字送至CS,使程序的執(zhí)行順序發(fā)生改變。93(2)條件轉(zhuǎn)移指令1)根據(jù)兩個(gè)操作數(shù)比較形成的條件轉(zhuǎn)移指令助記符測(cè)試條件轉(zhuǎn)移條件備注JA/JNBECF=0且ZF=0高于/不低于等于轉(zhuǎn)移無符號(hào)數(shù)JAE/JNBCF=0高于等于/不低于轉(zhuǎn)移JB/JNAECF=1低于/不不高于等于轉(zhuǎn)移JBE/JNACF=1或ZF=1低于等于/不高于轉(zhuǎn)移JG/JNLESF+OF=0且ZF=0大于/不小于等于轉(zhuǎn)移帶符號(hào)數(shù)JGE/JNLSF+OF=0大于等于/不小于轉(zhuǎn)移JL/JNGESF+OF=1且ZF=0小于/不大于等于轉(zhuǎn)移JLE/JNGSF+OF=1小于等于/不大于轉(zhuǎn)移942)根據(jù)一個(gè)標(biāo)志位形成的條件轉(zhuǎn)移指令助記符測(cè)試條件轉(zhuǎn)移條件JZ/JEZF=1結(jié)果為0或相等轉(zhuǎn)移JNZ/JNEZF=0結(jié)果不為0或不相等轉(zhuǎn)移JCCF=1有進(jìn)位時(shí)轉(zhuǎn)移JNCCF=0無進(jìn)位時(shí)轉(zhuǎn)移JSSF=1結(jié)果為負(fù)時(shí)轉(zhuǎn)移JNSSF=0結(jié)果為非負(fù)時(shí)轉(zhuǎn)移JP/JPEPF=1結(jié)果中1的個(gè)數(shù)為偶數(shù)時(shí)轉(zhuǎn)移

JNPPF=0結(jié)果中1的個(gè)數(shù)為奇數(shù)時(shí)轉(zhuǎn)移JOOF=1結(jié)果溢出時(shí)轉(zhuǎn)移JNOOF=0結(jié)果不溢出時(shí)轉(zhuǎn)移95例:已知寄存器AX和DX中各存放了一個(gè)帶符號(hào)字?jǐn)?shù)據(jù),現(xiàn)要求將較大的字?jǐn)?shù)據(jù)存放在AX中,較小者存放在DX中。 CMPAX,DX JGENEXT MOVBX,AX MOVAX,DX MOVDX,BXNEXT:HLT96例:已知內(nèi)存數(shù)據(jù)區(qū)自2000H開始存放著10個(gè)帶符號(hào)字節(jié)數(shù)據(jù),統(tǒng)計(jì)其中正數(shù),負(fù)數(shù)和零的個(gè)數(shù),分別放入BL,DL和DH中。 MOVSX,2000H MOVDX,0 MOVBL,0 MOVCX,0CHECK:MOVAL,[SX] JSNEG JZZERO INCBL JMPNEXTNEG: INCDL JMPNEXTZERO: INCDH INCSI DECCX JNZCHECK HLT97指令助記符測(cè)試條件指令功能LOOPCX≠0(CX)-1(CX),CX≠0轉(zhuǎn)移到標(biāo)號(hào)LOOPZ/LOOPECX≠0且ZF=1(CX)-1(CX),CX≠0且ZF=1轉(zhuǎn)移到標(biāo)號(hào)LOOPNZ/LOOPNECX≠0且ZF=0(CX)-1(CX),CX≠0且ZF=0轉(zhuǎn)移到標(biāo)號(hào)JCXZCX≠0CX≠0轉(zhuǎn)移到標(biāo)號(hào)2.循環(huán)轉(zhuǎn)移指令983.過程調(diào)用和返回指令過程調(diào)用和返回執(zhí)行過程示意圖991.過程調(diào)用指令CALL(CallProcedure)(1)段內(nèi)直接調(diào)用格式:CALLNear_Proc;(SP)-2(SP),(IP)((SP)),(IP)+16disp(IP)功能:調(diào)用過程N(yùn)ear_Proc。指令執(zhí)行過程:指令的操作數(shù)是一個(gè)近過程,和調(diào)用指令CALL在同一個(gè)邏輯段。指令經(jīng)過匯編后,將得到斷點(diǎn)與過程入口地址之間的16位位移量16disp,首先將斷點(diǎn)偏移地址(即IP的值)壓入堆棧,然后將IP加上計(jì)算出的16位位移量,實(shí)現(xiàn)從主調(diào)程序到過程的切換。100(2)段內(nèi)間接調(diào)用格式:CALLREG16/MEM16;(SP)-2(SP),(IP)((SP)),(REG16)/(MEM16)(IP)功能:調(diào)用寄存器操作數(shù)或者存儲(chǔ)器操作數(shù)指向的過程。指令執(zhí)行過程:指令的操作數(shù)是一個(gè)16位的寄存器操作數(shù)或16位的存儲(chǔ)器操作數(shù),寄存器或存儲(chǔ)器的值是過程的入口地址,過程和調(diào)用指令CALL在同一個(gè)邏輯段。指令執(zhí)行時(shí),先將斷點(diǎn)偏移地址(即IP的值)壓入堆棧,然后將寄存器或者存儲(chǔ)器的值傳送到IP,實(shí)現(xiàn)從主調(diào)程序到過程的切換。101(3)段間直接調(diào)用格式:CALLFar_Proc

;(SP)-2(SP),(CS)((SP)),SEGFar_Proc(CS)

;(SP)-2(SP)(IP)((SP)),OFFSETFar_Proc

(IP)功能:調(diào)用過程Far_Proc。指令執(zhí)行過程:指令的操作數(shù)是一個(gè)遠(yuǎn)過程,和調(diào)用指令CALL不在同一個(gè)邏輯段。指令執(zhí)行時(shí),首先將斷點(diǎn)段地址(即CS的值)壓入堆棧,并將遠(yuǎn)過程的段地址送入CS,然后將斷點(diǎn)偏移地址(即IP的值

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論