指令系統(tǒng)4(邏輯運(yùn)算和移位指令、串操作指令)(樓俊君.ppt
1,4.3.3邏輯運(yùn)算和移位指令,邏輯運(yùn)算指令(與/或/異或/非)運(yùn)算規(guī)則:按位操作,無(wú)進(jìn)/借位對(duì)標(biāo)志位的影響(除NOT指令外):,CFOFSFZFPFAF00*無(wú)定義,根據(jù)運(yùn)算結(jié)果設(shè)置,注意:非指令NOT對(duì)標(biāo)志無(wú)影響,2,邏輯運(yùn)算類指令表,3,(1)邏輯”與”AND,對(duì)兩個(gè)操作數(shù)進(jìn)行按位邏輯“與”操作。格式:ANDdest,src用途:保留操作數(shù)的某幾位,清零其他位。例1:保留AL中低4位,高4位清0。ANDAL,0FH例2:AL中有字符az,將其轉(zhuǎn)換成大寫。ANDAL,01011111B,4,例3:測(cè)試AL的bit7,bit5,bit2是否都是1。ANDAL,10100100BCMPAL,10100100BJZYES;ifmatch,gotoYES;ifnotmatchYES:;goeshereifall1,5,對(duì)兩個(gè)操作數(shù)進(jìn)行按位邏輯”或”操作。格式:ORdest,src用途:對(duì)操作數(shù)的某幾位置1;對(duì)兩操作數(shù)進(jìn)行組合。例1:把AL中的非壓縮BCD碼變成相應(yīng)十進(jìn)制數(shù)的ASCII碼。ORAL,30H,(2)邏輯”或”O(jiān)R,6,例2:把AH和AL中的非壓縮BCD碼組合成壓縮的BCD碼,放到AL中。MOVCL,4SHLAH,CLORAL,AH例3:把AL的第5位置為1ORAL,00100000B,7,對(duì)操作數(shù)進(jìn)行按位邏輯”非”操作。格式:NOTmem/reg例:NOTCXNOTBYTEPTRDI,(3)邏輯“非”(取反)NOT,8,對(duì)兩個(gè)操作數(shù)按位進(jìn)行”異或”操作。格式:XORdest,src用途:對(duì)reg清零(自身異或)把reg/mem的某幾位變反(與1異或)例1:把AX寄存器清零。例2:把DH的bit4,3變反MOVAX,0XORDH,18HXORAX,AXANDAX,0SUBAX,AX,(4)邏輯”異或”XOR,9,操作與AND指令類似,但不將”與”的結(jié)果送回,只影響標(biāo)志位。AND與TEST間的區(qū)別類似于SUB與CMP間的區(qū)別作用:TEST指令常用于位測(cè)試,與條件轉(zhuǎn)移指令一起用。例:測(cè)試AL的內(nèi)容是否為負(fù)數(shù)。TESTAL,80H;檢查AL中D7=1?JNZMINUS;是1(負(fù)數(shù)),轉(zhuǎn)MINUS;否則(正數(shù))不轉(zhuǎn)移MINUS:,(5)測(cè)試指令TEST,10,移位操作類指令表,2.移位指令,11,移位指令功能示意,算術(shù)左移指令,算術(shù)右移指令,邏輯左移指令,邏輯右移指令,小循環(huán)右移指令,小循環(huán)左移指令,大循環(huán)左移指令,大循環(huán)右移指令,CF=,12,2.移位指令,(1)非循環(huán)移位指令算術(shù)左移指令SAL(ShiftArithmeticLeft)算術(shù)右移指令SAR(ShiftArithmeticRight)邏輯左移指令SHL(ShiftLeft)邏輯右移指令SHR(ShiftRight)這4條指令的格式相同,以SAL為例:SALmem/reg,CL;移位位數(shù)>1時(shí)1;移位位數(shù)=1時(shí),13,移位指令執(zhí)行的操作如下圖所示:,最低位,最高位,CF,0,(a)算術(shù)/邏輯左移SAL/SHL,最低位,最高位,CF,(b)算術(shù)右移SAR,最低位,最高位,CF,(c)邏輯右移SHR,0,非循環(huán)移位指令功能示意圖,14,算術(shù)移位把操作數(shù)看做有符號(hào)數(shù);邏輯移位把操作數(shù)看做無(wú)符號(hào)數(shù)。移位位數(shù):一般放在CL寄存器中,但如果只移1位,也可以直接寫在指令中。例如:MOVCL,4SHRAL,CL;AL中的內(nèi)容右移4位對(duì)Flags影響:影響CF,PF,SF,ZF,OF標(biāo)志。移位效果:結(jié)果未溢出時(shí):左移1位操作數(shù)2右移1位操作數(shù)2,15,例:把AL中的數(shù)x10因?yàn)?0=8+2=23+21,所以可用移位實(shí)現(xiàn)乘10操作。程序如下:SALAL,1;2xMOVAH,ALSALAL,1;4xSALAL,1;8xADDAL,AH;8x+2x=10 x,16,不含CF的(小)循環(huán)左移指令ROL不含CF的(小)循環(huán)右移指令ROR含CF的(大)循環(huán)左移指令RCL含CF的(大)循環(huán)右移指令RCR格式同非循環(huán)移位指令。移位位數(shù)一般放在CL寄存器中但如果只移1位,也可直接寫在指令中。對(duì)Flags的影響:只影響標(biāo)志位CF和OF。,(2)循環(huán)移位指令,17,這4條指令的功能如下圖示:,最低位,最高位,CF,(a)ROL,最低位,最高位,CF,(c)RCL,最低位,最高位,CF,(b)ROR,最低位,最高位,CF,(d)RCR,循環(huán)移位指令功能示意圖,18,用移位操作代替乘除法可提高運(yùn)算速度例:前例中計(jì)算x10。(1)采用乘法指令:MOVBL,10MULBL共需7077個(gè)T周期。(2)采用移位和加法指令:SALAL,1;2TMOVAH,AL;2TSALAL,1;2TSALAL,1;2TADDAL,AH;3T只需11個(gè)T周期,僅相當(dāng)于乘法的1/7。,19,循環(huán)移位舉例:,例1:將AL的高4位與低4位互換。MOVCL,4ROLAL,CL例2:MOVAL,82HRORAL,1執(zhí)行結(jié)果為:AL=41H,CF=0,OF=1,20,4.3.4串操作指令,串:順序放在內(nèi)存中的一組相同類型的數(shù)據(jù)。串操作:對(duì)串中的元素進(jìn)行相同的操作。串操作的尋址方式:源操作數(shù)指針DS:SI(DS可超越)目的操作數(shù)指針ES:DI數(shù)據(jù)塊長(zhǎng)度CX功能:可完成兩個(gè)存儲(chǔ)單元之間的傳送MOVS、比較CMPS、搜索SANS、讀LODS、寫STOS5種操作(也僅是串指令可以)。一次操作對(duì)象為16位(W)或8位(B)數(shù)據(jù),但為下一次操作做了準(zhǔn)備。,21,串操作指令執(zhí)行動(dòng)作示意圖,自動(dòng)循環(huán)-加前綴REPREPE/REPZREPNE/REPNZ,(a)方向標(biāo)志DF=0,(b)方向標(biāo)志位DF=1,22,每次串操作后(輔助動(dòng)作):串操作指令自動(dòng)修改SI和DI字節(jié)1,字2。DF標(biāo)志決定,DF=0增地址方向;DF=1減地址方向。(注意:退出串操作后,指針指向最后操作的元素的下一個(gè)元素)重復(fù)前綴有的串操作指令前面可加上重復(fù)前綴REP。當(dāng)使用REP前綴時(shí),該指令重復(fù)執(zhí)行,重復(fù)執(zhí)行次數(shù)由CX決定(帶有REP前綴的串操作指令每執(zhí)行一次,CX自動(dòng)減1)。重復(fù)前綴包括:REPCX0時(shí)重復(fù)執(zhí)行REPE/REPZCX0ZF=1時(shí)重復(fù)執(zhí)行REPNE/REPNZCX0ZF=0時(shí)重復(fù)執(zhí)行,23,串操作指令表,24,串指令使用的一般方法:,設(shè)置源串地址,設(shè)置目標(biāo)串地址,設(shè)置串長(zhǎng)度,設(shè)置操作方向DF,串指令,MOVSI,源串首地址(或LEASI,源串),MOVDI,目的串首地址(或LEADI,目的串),MOVCX,串長(zhǎng)度,CLD(或STD),串指令,注意:DS與ES一般在完整程序的開(kāi)始處設(shè)置,在此串指令的程序段中不必重復(fù)設(shè)置,25,指令執(zhí)行的操作為:MOVSB:ES:DIDS:SISISI1,DIDI1MOVSW:ES:DI+1DIDS:SI+1SISISI2,DIDI2指令也可寫成:MOVSdest,src(即無(wú)B或W標(biāo)識(shí))但要求:src用DS:SI尋址,dest用ES:DI尋址傳送是字節(jié)還是字,由操作數(shù)的類型決定,串傳送指令MOVSB/MOVSW,26,串傳送指令使用舉例,用串傳送指令實(shí)現(xiàn)200個(gè)字節(jié)的數(shù)據(jù)傳送:LEASI,MEM1LEADI,MEM2MOVCX,200CLDREPMOVSBHLT,27,串比較指令CMPSB/CMPSW,指令執(zhí)行的操作為:CMPSB:ES:DI-DS:SISISI1,DIDI1CMPSW:ES:DI+1DI-DS:SI+1SISISI2,DIDI2比較的結(jié)果只反映在標(biāo)志位上,串本身無(wú)變化。本指令可用來(lái)檢查兩個(gè)串是否相等。,格式:CMPSOPRD1,OPRD2CMPSBCMPSW,28,串比較指令舉例,JZSTOPDECSIMOVAL,SIMOVBX,SISTOP:HLT,測(cè)試內(nèi)存中兩塊200個(gè)字節(jié)數(shù)據(jù)是否相同,并找出第一個(gè)不相等字符的地址,將該地址和字符存貯起來(lái)。,LEASI,MEM1LEADI,MEM2MOVCX,200CLDREPECMPSB,29,串掃描SCASB/SCASW,執(zhí)行的操作:對(duì)字節(jié):ALES:DIDIDI1對(duì)字:AXES:DI1DIDIDI2搜索指令執(zhí)行的仍是比較(減法)操作,結(jié)果只影響標(biāo)志位。要搜索的關(guān)鍵字放在AL(字節(jié))或AX(字)中。本指令用于在串中查找指定的信息。,格式:SCASOPRDSCASBSCASW,30,SCAS指令加上重復(fù)前綴后,可對(duì)串進(jìn)行連續(xù)掃描比較:若前綴為REPZ,則表示比較結(jié)果相等且(ZF=1)且串未結(jié)束(CX0),則繼續(xù)比較。若前綴為REPNZ,則表示比較結(jié)果不相等(ZF=0)且串未結(jié)束(CX0)就繼續(xù)比較。,31,例:在ES段的偏移1000H開(kāi)始處存有10個(gè)ASCII碼。搜索E,若找到則記下搜索次數(shù)及存放地址,并在屏幕上顯示Y;若未找到則顯示N。(見(jiàn)右圖)在屏幕上顯示一個(gè)字符的指令段如下:(參見(jiàn)附錄C.3DOS功能調(diào)用)MOVDL,MOVAH,2INT21H實(shí)現(xiàn)題目要求的程序段見(jiàn)下頁(yè):,1000H,41,42,43,44,45,46,A,B,C,D,F,.,ES段,E,32,MOVDI,1000H;(DI)串偏移地址MOVCX,0AH;(CX)串長(zhǎng)度MOVAL,E;搜索關(guān)鍵字=ECLD;從低地址到高地址進(jìn)行搜索REPNZSCASB;若未找到,繼續(xù)搜索JZFOUND;找到,轉(zhuǎn)至FOUNDMOVDL,N;串中無(wú)E,(DL)NJMPDONE;轉(zhuǎn)至DONEFOUND:DECDI;指針回退MOVADDR,DI;ADDRE的地址SUBDI,1000HMOVNUM,DI;NUM搜索次數(shù)MOVDL,Y;(DL)YDONE:MOVAH,2INT21H;顯示字符HLT,33,執(zhí)行的操作為:對(duì)字節(jié):ALDS:SISISI1對(duì)字:AXDS:SI+1SISISI2串裝入指令通常不加重復(fù)前綴。LODSB等價(jià)于:LODSW等價(jià)于:MOVAL,SIMOVAX,SIINCSIINCSIINCSI,串裝入指令LODSB/LODSW,格式:LODSOPRDLODSBLODSW,34,36H,32H,39H,31H,STRING1,STRING2,38H,35H,36H,33H,被加數(shù),加數(shù),數(shù)據(jù)段,8,5,6,2,9,1,6,3,SUM,結(jié)果,.,.,07H,07H,02H,06H,265836196277,LEASI,STRING1LEADI,STRING2LEABX,SUMMOVCX,4CLCAGAIN:MOVAL,SIADCAL,DIAAAMOVBX,ALINCSIINCDIINCBXDECCXJNZAGAIN,35,下面要求將兩個(gè)4字節(jié)的ASCII碼數(shù)據(jù)求和,并將和的結(jié)果送顯示。為此,要先化成ASCII碼再送顯示,程序段如下:LEASI,SUM+3;(SI)SUM+3MOVCX,4;(CX)和長(zhǎng)度STD;置DF=1,減量修改SIMOVAH,02;(AH)功能號(hào)LP:LODSB;取BCD碼至AL,且SISI-1ADDAL,30H;轉(zhuǎn)換為ASCII碼MOVDL,AL;(DL)字符INT21H;顯示字符DECCXJNZLP,36,指令的操作為:對(duì)字節(jié):ES:DIALDIDI1對(duì)字:ES:DI+1DIAXDIDI2本指令用于把一塊存儲(chǔ)區(qū)域填充成某一初始值(即對(duì)存儲(chǔ)區(qū)進(jìn)行初始化)。存儲(chǔ)區(qū)域的首地址要預(yù)先設(shè)置到ES:DI中。要存儲(chǔ)到串中的數(shù)據(jù)要預(yù)先存到AL(AX)中。,串存儲(chǔ)指令STOSB/STOSW,格式:STOSOPRDSTOSBSTOSW,37,例:把從A000H開(kāi)始的2KB內(nèi)存單元清零。程序段如下:MOVDI,0A000HMOVAX,0MOVCX,1024CLDREPSTOSW,