工學(xué)微機(jī)原理與接口-第4章4邏輯運(yùn)算及串操作指令課件_第1頁(yè)
工學(xué)微機(jī)原理與接口-第4章4邏輯運(yùn)算及串操作指令課件_第2頁(yè)
工學(xué)微機(jī)原理與接口-第4章4邏輯運(yùn)算及串操作指令課件_第3頁(yè)
工學(xué)微機(jī)原理與接口-第4章4邏輯運(yùn)算及串操作指令課件_第4頁(yè)
工學(xué)微機(jī)原理與接口-第4章4邏輯運(yùn)算及串操作指令課件_第5頁(yè)
已閱讀5頁(yè),還剩91頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

三、邏輯類指令

(位操作指令)

這一類指令包括邏輯運(yùn)算指令、移位指令和循環(huán)移位指令等三組。位操作類指令以二進(jìn)制位為基本單位進(jìn)行數(shù)據(jù)的操作當(dāng)需要對(duì)字節(jié)或字?jǐn)?shù)據(jù)中的各個(gè)二進(jìn)制位操作時(shí),可以考慮采用位操作類指令注意這些指令對(duì)標(biāo)志位的影響邏輯運(yùn)算指令A(yù)NDORXORNOTTEST移位指令SHLSHRSAR循環(huán)移位指令ROLRORRCLRCR1三、邏輯類指令(位操作指令)

這一類指令包括邏輯運(yùn)算指令、1.邏輯運(yùn)算指令邏輯運(yùn)算類指令與算術(shù)運(yùn)算指令不同算術(shù)指令是按字節(jié)或字進(jìn)行算術(shù)運(yùn)算,而邏輯運(yùn)算指令是把操作數(shù)按位來(lái)進(jìn)行邏輯運(yùn)算?!芭c”運(yùn)算指令 格式:ANDdst,src“或”運(yùn)算指令 格式:ORdst,src“非”運(yùn)算指令 格式:NOTopr“異或”運(yùn)算指令 格式:XORdst,src測(cè)試指令 格式:TESTdst,src 說(shuō)明:TEST相當(dāng)于AND運(yùn)算,但是不保存結(jié)果,僅影響標(biāo)志。21.邏輯運(yùn)算指令21邏輯運(yùn)算指令邏輯運(yùn)算指令NOT目的;取反指令A(yù)ND目的,源;按位與指令OR目的,源;按位或指令XOR目的,源;按位異或指令TEST目的,源;測(cè)試指令,與AND指令操作相同,只是不改變目的操作數(shù)的內(nèi)容單操作數(shù)邏輯指令NOT不影響標(biāo)志位,操作數(shù)與INC、DEC和NEG一樣:31邏輯運(yùn)算指令邏輯運(yùn)算指令3邏輯與指令A(yù)ND對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯與運(yùn)算,結(jié)果送目的操作數(shù)ANDdest,src

;dest←dest∧src只有相“與”的兩位都是1,結(jié)果才是1;否則,“與”的結(jié)果為04邏輯與指令A(yù)ND對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯與運(yùn)算,結(jié)果送目的操作數(shù)邏輯或指令OR對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯或運(yùn)算,結(jié)果送目的操作數(shù)ORdest,src

;dest←dest∨src只要相“或”的兩位有一位是1,結(jié)果就是1;否則,結(jié)果為05邏輯或指令OR對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯或運(yùn)算,結(jié)果送目的操作數(shù)O邏輯異或指令XOR對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯異或運(yùn)算,結(jié)果送目的操作數(shù)XORdest,src

;dest←dest⊕src只有相“異或”的兩位不相同,結(jié)果才是1;否則,結(jié)果為06邏輯異或指令XOR對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯異或運(yùn)算,結(jié)果送目的操測(cè)試指令TEST對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯與運(yùn)算,結(jié)果并不送目的操作數(shù),僅按AND指令影響標(biāo)志TESTdest,src

;dest∧src

AND與TEST指令的關(guān)系,同SUB與CMP指令的關(guān)系一樣7測(cè)試指令TEST對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯與運(yùn)算,結(jié)果并不送目的操邏輯非指令NOT對(duì)一個(gè)操作數(shù)執(zhí)行邏輯非運(yùn)算NOTreg/mem

;reg/mem←~reg/mem

按位取反,原來(lái)是“0”的位變?yōu)椤?”;原來(lái)是“1”的位變?yōu)椤?”8邏輯非指令NOT對(duì)一個(gè)操作數(shù)執(zhí)行邏輯非運(yùn)算NOTreg/m例邏輯運(yùn)算moval,75h ;AL=75Handal,32h ;AL=30H ;CF=OF=0,SF=0,ZF=0,PF=1oral,71h ;AL=71H ;CF=OF=0,SF=0,ZF=0,PF=1xoral,0f1h ;AL=80H ;CF=OF=0,SF=1,ZF=0,PF=0notal ;AL=7FH標(biāo)志不變9例邏輯運(yùn)算moval,75h ;AL=75H9邏輯運(yùn)算指令的應(yīng)用andbl,11110110b

;BL中D0和D3清0,其余位不變orbl,00001001b

;BL中D0和D3置1,其余位不變xorbl,00001001b

;BL中D0和D3求反,其余位不變

AND指令可用于復(fù)位某些位(同0相與),不影響其他位

OR指令可用于置位某些位(同1相或),不影響其他位

XOR指令可用于求反某些位(同1相異或),不影響其他位10邏輯運(yùn)算指令的應(yīng)用andbl,11110110b AND例4.7從偏移地址TABLE開(kāi)始的內(nèi)存區(qū)中,存放著100個(gè)字節(jié)型數(shù)據(jù),要求將這些數(shù)進(jìn)行累加,并將累加和的低位存SUM單元,高位存SUM+1單元。程序如下:LEA BX,TABLE;(BX)←數(shù)據(jù)表地址指針MOVCL,100;(CL)←數(shù)據(jù)塊長(zhǎng)度

XOR AX,AX ;清AL、AH,并清進(jìn)位CFLOOPER:ADD AL,[BX] ;加一個(gè)數(shù)到ALJNC GOON ;如(CF)=0,轉(zhuǎn)移到GOONINC AH;否則,AH加1GOON:INC BX;地址指針加1 DEC CL;計(jì)數(shù)值減1 JNZLOOPER;如(CL)≠0,轉(zhuǎn)移到LOOPER MOVSUM,AX;否則,(SUM)←(AL),(SUM+1)←(AH) HLT ;停止11例4.7從偏移地址TABLE開(kāi)始的內(nèi)存區(qū)中,存放常見(jiàn)的用法⑴清進(jìn)位標(biāo)志位:ANDAX,AX或ORAL,AL等⑵清零操作數(shù):XORAX,AX不僅把AX清零,而且也影響了狀態(tài)標(biāo)志⑶把某幾位取反:用XOR指令,把要取反的位和1異或,不變的位和0異或⑷清零或置位某幾位:用AND指令清零,用OR指令置位12常見(jiàn)的用法122移位指令將操作數(shù)移動(dòng)一位或多位,分成邏輯移位和算術(shù)移位,分別具有左移或右移操作移位指令的第一個(gè)操作數(shù)是指定的被移位的操作數(shù),可以是寄存器或存儲(chǔ)單元;后一個(gè)操作數(shù)表示移位位數(shù):該操作數(shù)為1,表示移動(dòng)一位該操作數(shù)為CL,CL寄存器值表示移位位數(shù)(移位位數(shù)大于1只能CL表示)按照移入的位設(shè)置進(jìn)位標(biāo)志CF,根據(jù)移位后的結(jié)果影響SF、ZF、PF132移位指令將操作數(shù)移動(dòng)一位或多位,分成邏輯移位和算術(shù)移位邏輯左移指令SHL(shiftlogicalleft)SHLreg/mem,1/CL ;reg/mem左移1或CL位 ;最低位補(bǔ)0,最高位進(jìn)入CFSHL和SAL指令的功能演示14邏輯左移指令SHL(shiftlogicalleft)SSHL和SAL指令的功能15SHL和SAL指令的功能15例4.8將一個(gè)16位無(wú)符號(hào)數(shù)乘以10。該數(shù)原來(lái)存放在以FACTOR為首地址的兩個(gè)連續(xù)的存儲(chǔ)單元中(低位在前,高位在后)。因?yàn)镕ACTOR10=(FACTOR8)+(FACTOR2),故可用左移指令實(shí)現(xiàn)以上乘法運(yùn)算。編程如下:MOVAX,F(xiàn)ACTOR ;(AX)←被乘數(shù)SHL AX,1 ;(AX)=FACTOR2MOV BX,AX ;暫存BXSHL AX,1 ;(AX)=FACTOR4SHL AX,1 ;(AX)=FACTOR8ADD AX,BX ;(AX)=FACTOR10HLT

以上程序的執(zhí)行時(shí)間大約需26個(gè)時(shí)鐘。如用乘法指令編程,執(zhí)行時(shí)間將超過(guò)130個(gè)時(shí)鐘。

16例4.8將一個(gè)16位無(wú)符號(hào)數(shù)乘以10。該數(shù)原來(lái)存邏輯右移指令SHR(shiftlogicalright)SHRreg/mem,1/CL ;reg/mem右移1/CL位 ;最高位補(bǔ)0,最低位進(jìn)入CF17邏輯右移指令SHR(shiftlogicalright)例4.9將一個(gè)16位無(wú)符號(hào)數(shù)除以512。該數(shù)原來(lái)存放在以DIVIDAND為首地址的兩個(gè)連續(xù)的存儲(chǔ)單元中。因?yàn)镈IVIDAND÷512=(DIVIDAND÷2)÷256,故可用邏輯右移指令完成上述除法運(yùn)算。編程如下:MOV AX,DIVIDAND;(AX)←被除數(shù)SHR AX,1;(AX)=DIVIDAND÷2XCHGAL,AH ;(AL)←→(AH),相當(dāng)于循環(huán)右移8位CBW ;清AX的高8位,(AX)=DIVIDAND÷512HLT當(dāng)然,也可以將立即數(shù)9傳送到CL寄存器,然后用指令SHRAX,CL完成除以512的運(yùn)算。但是相比之下,上面的程序執(zhí)行速度更快。18例4.9將一個(gè)16位無(wú)符號(hào)數(shù)除以512。該數(shù)原來(lái)存算術(shù)左移指令SAL(shiftarithmeticleft)SALreg/mem,1/CL ;與SHL是同一條指令19算術(shù)左移指令SAL(shiftarithmeticlefSHL和SAL指令的功能20SHL和SAL指令的功能20算術(shù)右移指令SAR(shiftarithmeticright)SARreg/mem,1/CL ;reg/mem右移1/CL位 ;最高位不變,最低位進(jìn)入CF21算術(shù)右移指令SAR(shiftarithmeticrigSAR指令的功能22SAR指令的功能223)循環(huán)移位指令8086/8088指令系統(tǒng)有四條循環(huán)移位指令,不帶進(jìn)位標(biāo)志CF的左循環(huán)移位指令ROL和右循環(huán)移位指令ROR(也稱小循環(huán)),以及帶進(jìn)位標(biāo)志CF的左循環(huán)移位指令RCL和右循環(huán)移位指令RCR(也稱大循環(huán))。循環(huán)移位指令的操作數(shù)類型與移位指令相同,可以是8位或16位的寄存器或存儲(chǔ)器。指令中指定的左移或右移的位數(shù)也可以是1或由CL寄存器指定,但不能是1以外的常數(shù)或CL以外的其他寄存器。所有循環(huán)移位指令都只影響進(jìn)位標(biāo)志CF和溢出標(biāo)志OF,但OF標(biāo)志的含義對(duì)于左循環(huán)移位指令和右循環(huán)移位指令有所不同。233)循環(huán)移位指令23循環(huán)移位指令(rotate)循環(huán)移位指令類似移位指令,但要將從一端移出的位返回到另一端形成循環(huán)。分為:ROL

reg/mem,1/CL ;不帶進(jìn)位循環(huán)左移ROR

reg/mem,1/CL ;不帶進(jìn)位循環(huán)右移RCL

reg/mem,1/CL ;帶進(jìn)位循環(huán)左移RCRreg/mem,1/CL ;帶進(jìn)位循環(huán)右移循環(huán)移位指令的操作數(shù)形式與移位指令相同,按指令功能設(shè)置進(jìn)位標(biāo)志CF,但不影響SF、ZF、PF、AF標(biāo)志演示演示演示演示24循環(huán)移位指令(rotate)循環(huán)移位指令類似移位指令,但要將ROL指令的功能25ROL指令的功能25ROR指令的功能26ROR指令的功能26RCL指令的功能27RCL指令的功能27RCR指令的功能28RCR指令的功能28(1)循環(huán)左移指令ROL(ROtateLeft)。指令格式:ROLdst,1/CLROL指令將目的操作數(shù)向左循環(huán)移動(dòng)1位或移CL寄存器指定的位數(shù)。最高位移到進(jìn)位標(biāo)志CF,同時(shí)最高位移到最低位形成循環(huán),進(jìn)位標(biāo)志CF不在循環(huán)回路之內(nèi)。ROL指令的操作如圖4.24所示。圖4.24ROL指令操作示意圖29(1)循環(huán)左移指令ROL(ROtateLeftROL指令將影響CF和OF兩個(gè)狀態(tài)標(biāo)志位。如果循環(huán)移位次數(shù)等于1,且移位以后目的操作數(shù)新的最高位與CF不相等,則(OF)=1,否則(OF)=0。因此,OF的值表示循環(huán)移位前后符號(hào)位是否有所變化。如果移位次數(shù)不等于1,則OF的值不確定。ROL指令的例子如下:ROLBH,1 ;寄存器循環(huán)左移1位ROLDX,CL ;寄存器循環(huán)左移(CL)位ROLWORDPTR[DI],1 ;存儲(chǔ)器循環(huán)左移1位ROLBYTEPTRALPHA,CL ;存儲(chǔ)器循環(huán)左移(CL)位30ROL指令將影響CF和OF兩個(gè)狀態(tài)標(biāo)志位。如果循環(huán)(2)循環(huán)右移指令ROR(ROtateRight)。指令格式:RORdst,1/CLROR指令將目的操作數(shù)向右循環(huán)移動(dòng)1位或移CL寄存器指定的位數(shù)。最低位移到進(jìn)位標(biāo)志CF,同時(shí)最低位移到最高位。該指令的操作如圖4.25表示。ROR指令也將影響狀態(tài)標(biāo)志位CF和OF。若循環(huán)移位次數(shù)等于1且移位后新的最高位和次高位不等,則(OF)=1,否則(OF)=0。若循環(huán)移位次數(shù)不等于1,則OF的值不確定。圖4.25ROR指令操作示意圖31(2)循環(huán)右移指令ROR(ROtateRight下面是ROR指令的幾個(gè)例子:RORCX,1 ;寄存器循環(huán)右移1位RORBH,CL ;寄存器循環(huán)右移(CL)位RORBYTEPTRBETA,1 ;存儲(chǔ)器循環(huán)右移1位RORWORDPTRALPHA,CL;存儲(chǔ)器循環(huán)右移(CL)位32下面是ROR指令的幾個(gè)例子:32(3)帶進(jìn)位循環(huán)左移指令RCL(RotateLeftthroughCarry)。指令格式:RCLdst,1/CLRCL指令將目的操作數(shù)連同進(jìn)位標(biāo)志CF一起向左循環(huán)移動(dòng)1位或移CL寄存器指定的位數(shù)。最高位移入CF,而CF移入最低位。該指令的操作如圖4.26所示。RCL指令對(duì)狀態(tài)標(biāo)志位的影響與ROL指令相同。圖4.26RCL指令操作示意圖33(3)帶進(jìn)位循環(huán)左移指令RCL(Rotate(4)帶進(jìn)位循環(huán)右移指令RCR(RotateRightthroughCarry)。指令格式:RCRdst,1/CLRCR指令將目的操作數(shù)與進(jìn)位標(biāo)志CF一起向右循環(huán)移動(dòng)1位或移CL寄存器指定的位數(shù)。最低位移入進(jìn)位標(biāo)志CF,CF則移入最高位。該指令的操作如圖4.27所示。RCR指令對(duì)狀態(tài)標(biāo)志位的影響與ROR指令相同。圖4.27RCR指令操作示意圖34(4)帶進(jìn)位循環(huán)右移指令RCR(RotateR這里介紹的四條循環(huán)移位指令與前面討論過(guò)的移位指令有所不同,循環(huán)移位之后,操作數(shù)中原來(lái)各位的信息不會(huì)丟失,而只是移到了操作數(shù)中的其他位或進(jìn)位標(biāo)志上,必要時(shí)還可以恢復(fù)。利用循環(huán)移位指令可以對(duì)寄存器或存儲(chǔ)器中的任一位進(jìn)行位測(cè)試。例如,要求測(cè)試AL寄存器中第5位的狀態(tài)是“0”還是“1”,可利用以下指令實(shí)現(xiàn):MOVCL,5 ;(CL)←移位次數(shù)ROLAL,CL ;(CF)←AL的第5位JNC ZERO ;若(CF)=0,轉(zhuǎn)ZERO… ;否則…ZERO:…35這里介紹的四條循環(huán)移位指令與前面討論過(guò)的移位指令有所說(shuō)明⑴邏輯移位適用于無(wú)符號(hào)數(shù),算術(shù)移位適用于有符號(hào)數(shù)。⑵邏輯左移和算術(shù)左移的機(jī)器碼完全相同,是助記符的兩種寫(xiě)法。ROL循環(huán)左移:操作數(shù)整體左移,最高位移到CF,最低位補(bǔ)原最高位ROR循環(huán)右移:操作數(shù)整體右移,最低位移到CF,最高位補(bǔ)原最低位RCL帶進(jìn)位的循環(huán)左移:類似于ROL循環(huán)移位,CF加入到循環(huán)圈中。RCR帶進(jìn)位的循環(huán)右移:類似于ROR循環(huán)移位,CF加入到循環(huán)圈中。36說(shuō)明36四、串操作指令

串操作指令的特征是對(duì)數(shù)據(jù)塊(字符串)進(jìn)行操作,并且其中部分指令可以兩個(gè)操作數(shù)同時(shí)是存儲(chǔ)器操作數(shù)。MOVS(Movestring)串傳送CMPS(Comparestring)串比較SCAS(Scanstring)串掃描LODS(Loadfromstring)從串中取數(shù)據(jù)STOS(Storeintostring)存數(shù)據(jù)到串中37四、串操作指令串操作指令的特征是對(duì)數(shù)據(jù)塊(字符串)進(jìn)行操作說(shuō)明⑴串操作指令每次執(zhí)行完成一個(gè)字節(jié)或一個(gè)字的操作。⑵通常使用重復(fù)前綴,用來(lái)完成數(shù)據(jù)塊的操作。重復(fù)前綴⑴REP重復(fù)⑵REPE/REPZ相等/為零則重復(fù)⑶REPNE/REPNZ不相等/不為零則重復(fù)3838特點(diǎn)⑴串操作指令需要指明每次操作的類型:B字節(jié),W字例如:MOVSB,CMPSW等。⑵串操作指令使用隱含尋址方式,源串地址為DS:SI,目的串地址為ES:DI,待處理串的長(zhǎng)度放在CX中。⑶使用DF來(lái)表示每次操作以后變址寄存器SI和DI的變化方向CLD;DF=0SI,DI做增量變化B:+1或W:+2STD;DF=1SI,DI做減量變化B:-1或W:-239特點(diǎn)39⑴MOVS指令(兩個(gè)操作數(shù)同時(shí)是存儲(chǔ)器操作數(shù))MOVSB或MOVSW以字節(jié)或字為單位在存儲(chǔ)單元之間傳送數(shù)據(jù),可以使用REP前綴[REP]MOVS[ES:]dst_string,[seg:]src_string[REP]MOVSB[REP]MOVSW①((ES):(DI))←((DS):(SI))②(SI)←(SI)1,(DI)←(DI)1(字節(jié)操作)(SI)←(SI)2,(DI)←(DI)2(字操作)其中,DF=0時(shí)用“+”,DF=1時(shí)用“?”第一種格式的一個(gè)重要優(yōu)點(diǎn)是可以對(duì)源字符串進(jìn)行段重設(shè)(但目的字符串的段地址只能在ES,不可進(jìn)行段重設(shè))。在第二種和第三種格式中,串操作指令字符的后面加上一個(gè)字母“B”或“W”,指出操作對(duì)象是字節(jié)串或字串。40⑴MOVS指令(兩個(gè)操作數(shù)同時(shí)是存儲(chǔ)器操作數(shù))40注意:在MOVSB、MOVSW這兩種指令下,指令后面不允許出現(xiàn)操作數(shù)。例如,以下指令都是合法的:REPMOVSDATA2,DATA1;操作數(shù)類型應(yīng)預(yù)先定義MOVSBUFFER2,ES:BUFFER1;源操作數(shù)進(jìn)行段重設(shè)REPMOVSWORDPTR[DI],[SI];用變址寄存器表示操作數(shù)REPMOVSB ;字節(jié)串傳送MOVSW ;字串傳送 但以下表示方法是非法的:

MOVSBDEST,ES:SRC41注意:在MOVSB、MOVSW這兩種指令下,指令后面不允許出例4.10將數(shù)據(jù)段中首地址為BUFFER1的200個(gè)字節(jié)傳送到附加數(shù)據(jù)段首地址為BUFFER2的內(nèi)存區(qū)中。使用字節(jié)串傳送指令的程序段如下:LEA SI,BUFFER1 ;(SI)←源串首地址指針LEA DI,BUFFER2 ;(DI)←目的串首地址指針MOV CX,200 ;(CX)←字節(jié)串長(zhǎng)度CLD ;清方向標(biāo)志DFREP MOVSB ;傳送200個(gè)字節(jié)HLT ;停止42例4.10將數(shù)據(jù)段中首地址為BUFFER⑵LODS指令LODSB或LODSW從內(nèi)存中取出字節(jié)或字到累加器AL或AX可以使用REP前綴,但意義不大。LODS[seg:]src_string;可以段超越LODSB ;(AL)←((DS):(SI))LODSW ;(AX)←((DS):(SI))①(AL)←((DS):(SI))或(AX)←((DS):(SI))②(SI)←(SI)±1(字節(jié)操作)(SI)←(SI)±2(字操作)其中,當(dāng)DF=0時(shí)用“+”,當(dāng)DF=1時(shí)用“?”。43⑵LODS指令LODSB或LODSW從內(nèi)存中取出字節(jié)例4.11內(nèi)存中以BUFFER為首址的緩沖區(qū)內(nèi)有10個(gè)非壓縮型BCD碼形式存放的十進(jìn)制數(shù),它們的值可能是0~9中的任意一個(gè),將這些十進(jìn)制數(shù)順序顯示在屏幕上。根據(jù)題意可編程如下: LEA SI,BUFFER;(SI)←緩沖區(qū)首址 MOV CX,10 ;(CX)←字符串長(zhǎng)度 CLD ;清狀態(tài)標(biāo)志位DFGET:LODSB ;取一個(gè)BCD碼到ALOR AL,30H ;BCD碼轉(zhuǎn)換為ASCII碼 MOV AH,02H ;(AH)←功能號(hào) MOV DL,AL ;(DL)←字符INT 21H ;顯示DEC CX ;(CX)←(CX)?1JNZ GET ;未完成10個(gè)字符則重復(fù) HLT

44例4.11內(nèi)存中以BUFFER為首址的緩沖區(qū)內(nèi)有⑶STOS指令STOSB或STOSW從累加器中存字節(jié)或字到存儲(chǔ)器,可以使用REP前綴[REP]STOS [ES:]dst_string[REP]STOSB ;((ES):(DI))←(AL)[REP]STOSW ;((ES):(DI))←(AX)①((ES):(DI))←(AL)或((ES):(DI))←(AX)②(DI)←(DI)±1(字節(jié)操作)(DI)←(DI)±2(字操作)其中,當(dāng)DF=0時(shí)用“+”,當(dāng)DF=1時(shí)用“?”。STOS指令對(duì)狀態(tài)標(biāo)志位沒(méi)有影響。指令若加上重復(fù)前綴REP,則操作將一直重復(fù)進(jìn)行下去,直到(CX)=0。45⑶STOS指令45例4.12將字符'#'裝入以AREA為首址的100個(gè)字節(jié)中。 LEA DI,AREA MOV AX,'##' MOV CX,50 CLDREP STOSW HLT程序采用了送存50個(gè)字(‘##’),也可以采用送存100個(gè)字節(jié)('#')的方法。這兩種方法程序執(zhí)行的結(jié)果是相同的,但前者執(zhí)行速度要更快一些。46例4.12將字符'#'裝入以AREA為首址的100例4.13一個(gè)數(shù)據(jù)塊由大寫(xiě)或小寫(xiě)的英文字母、數(shù)字和各種其他符號(hào)組成,其結(jié)束符是回車(chē)符CR(ASCII碼為0DH),數(shù)據(jù)塊的首地址為BLOCK1。將數(shù)據(jù)塊傳送到以BLOCK2為首地址的內(nèi)存區(qū),并將其中所用的英文小寫(xiě)字母(a~z)轉(zhuǎn)換成相應(yīng)的大寫(xiě)字母(A~Z),其余不變。實(shí)現(xiàn):判斷,數(shù)據(jù)搬家,轉(zhuǎn)換小寫(xiě)字母為大寫(xiě)。前面已經(jīng)討論過(guò)英文小寫(xiě)字母與相應(yīng)的大寫(xiě)字母的ASCII碼之間有一定的關(guān)系,即只需將小寫(xiě)字母的ASCII碼減20H,即可得到相應(yīng)大寫(xiě)字母的ASCII碼。程序如下:47例4.13一個(gè)數(shù)據(jù)塊由大寫(xiě)或小寫(xiě)的英文字母、數(shù)字 LEA SI,BLOCK1 ;(SI)←源地址指針 LEA DI,BLOCK2 ;(DI)←目標(biāo)地址指針 CLD ;清方向標(biāo)志DFNEXT:LODSB ;取一個(gè)字符到AL CMP AL,0DH ;是否回車(chē)符 JZ DONE ;是,則轉(zhuǎn)DONE CMP AL,61H ;否則,是否小于'a' JC OK ;C=1,是小于'a',則轉(zhuǎn)OK CMP AL,7BH ;是否大于'z' JNC OK ;C=0,是大于'z',則轉(zhuǎn)OK SUB AL,20H ;否則,AL減20HOK: STOSB ;送存 JMP NEXT ;轉(zhuǎn)移到NEXTDONE:HLT ;停止程序使用回車(chē)符控制結(jié)束。并沒(méi)有使用CX48 LEA SI,BLOCK1 ;(SI)←源地址指針48⑷CMPS指令CMPSB或CMPSW以字節(jié)或字為單位進(jìn)行兩個(gè)存儲(chǔ)器操作數(shù)的比較,可以使用REPE/REPZ前綴,用源操作數(shù)-目的操作數(shù),但并不送目的操作數(shù),與CMP指令可以比較。[REPE/REPNE]CMPS[srg:]src_string,[ES:]dst_string[REPE/REPNE]CMPSB[REPE/REPNE]CMPSW①((DS):(SI))?((ES):(DI))②(SI)←(SI)1,(DI)←(DI)1(字節(jié)操作)(SI)←(SI)2,(DI)←(DI)2(字操作)

CMPS指令與其他指令有所不同,指令中的源操作數(shù)在前,而目的操作數(shù)在后49⑷CMPS指令CMPSB或CMPSW以字節(jié)或字為單位例4.14比較兩個(gè)字符串,找出其中第一個(gè)不相等字符的地址。如果兩個(gè)字符全部相同,則轉(zhuǎn)到ALLMATCH進(jìn)行處理。這兩個(gè)字符串長(zhǎng)度均為20,首地址分別為STRING1和STRING2。 LEA SI,STRING1 ;(SI)←字符串1首地址 LEA DI,STRING2 ;(DI)←字符串2首地址 MOV CX,20 ;(CX)←字符串長(zhǎng)度 CLD ;清方向標(biāo)志DFREPECMPSB ;如相等,重復(fù)進(jìn)行比較JCXZALLMATCH;若(CX)=0,跳至ALLMATCHDEC SI;否則(SI)?1,修正地址DEC DI;(DI)?1,使其指向所要尋找的不等字符HLT;停止ALLMATCH:MOVSI,0 MOVDI,0 HLT;停止50例4.14比較兩個(gè)字符串,找出其中第一個(gè)不⑸SCAS指令SCASB或SCASW在數(shù)據(jù)串中查找AL或AX中的內(nèi)容,可以使用REPNE/REPNZ前綴。

[REPE/REPNE]SCAS [ES:]dst_string [REPE/REPNE]SCASB[REPE/REPNE]SCASW①(AL)?((ES):(DI))或(AX)?((ES):(DI))②(DI)←(DI)1(字節(jié)操作)(DI)←(DI)2(字操作)字符串的起始地址只能放在(ES:DI)中,不允許段超越。51⑸SCAS指令51例4.15在包含100個(gè)字符的字符串中尋找第一個(gè)回車(chē)符CR(其ASCII碼為0DH),找到后將其地址保留在(ES:DI)中,并在屏幕上顯示字符'Y'。如果字符串中沒(méi)有回車(chē)符,則在屏幕上顯示字符'N'。該字符串的首地址為STRING。 LEA DI,STRING ;(DI)←字符串首址 MOV AL,0DH ;(AL)←回車(chē)符 MOV CX,100 ;(CX)←字符串長(zhǎng)度 CLD ;清狀態(tài)標(biāo)志位DFREPNESCASB ;如未找到,重復(fù)掃描 JZMATCH ;如找到,則轉(zhuǎn)MATCH MOVDL,'N' ;字符串中無(wú)回車(chē),則(DL)←'N' JMP DSPY ;轉(zhuǎn)到DSPYMATCH:DEC DI;(DI)←(DI)?1 MOV DL,'Y' ;(DL)←'Y'DSPY:MOVAH,02H INT 21H;顯示字符 HLT52例4.15在包含100個(gè)字符的字符串中尋找表4.6串操作指令的重復(fù)前綴、操作數(shù)和地址指針

指令重復(fù)前綴操作數(shù)地址指針寄存器MOVSREP目的,源ES:DI,DS:SILODS無(wú)源DS:SISTOSREP目的ES:DICMPSREPE/REPNE源,目的DS:SI,ES:DISCASREPE/REPNE目的ES:DI53表4.6串操作指令的重復(fù)前綴、操作數(shù)和地址指針指令作業(yè)P15010,1254作業(yè)P15010,1254三、邏輯類指令

(位操作指令)

這一類指令包括邏輯運(yùn)算指令、移位指令和循環(huán)移位指令等三組。位操作類指令以二進(jìn)制位為基本單位進(jìn)行數(shù)據(jù)的操作當(dāng)需要對(duì)字節(jié)或字?jǐn)?shù)據(jù)中的各個(gè)二進(jìn)制位操作時(shí),可以考慮采用位操作類指令注意這些指令對(duì)標(biāo)志位的影響邏輯運(yùn)算指令A(yù)NDORXORNOTTEST移位指令SHLSHRSAR循環(huán)移位指令ROLRORRCLRCR55三、邏輯類指令(位操作指令)

這一類指令包括邏輯運(yùn)算指令、1.邏輯運(yùn)算指令邏輯運(yùn)算類指令與算術(shù)運(yùn)算指令不同算術(shù)指令是按字節(jié)或字進(jìn)行算術(shù)運(yùn)算,而邏輯運(yùn)算指令是把操作數(shù)按位來(lái)進(jìn)行邏輯運(yùn)算。“與”運(yùn)算指令 格式:ANDdst,src“或”運(yùn)算指令 格式:ORdst,src“非”運(yùn)算指令 格式:NOTopr“異或”運(yùn)算指令 格式:XORdst,src測(cè)試指令 格式:TESTdst,src 說(shuō)明:TEST相當(dāng)于AND運(yùn)算,但是不保存結(jié)果,僅影響標(biāo)志。561.邏輯運(yùn)算指令21邏輯運(yùn)算指令邏輯運(yùn)算指令NOT目的;取反指令A(yù)ND目的,源;按位與指令OR目的,源;按位或指令XOR目的,源;按位異或指令TEST目的,源;測(cè)試指令,與AND指令操作相同,只是不改變目的操作數(shù)的內(nèi)容單操作數(shù)邏輯指令NOT不影響標(biāo)志位,操作數(shù)與INC、DEC和NEG一樣:571邏輯運(yùn)算指令邏輯運(yùn)算指令3邏輯與指令A(yù)ND對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯與運(yùn)算,結(jié)果送目的操作數(shù)ANDdest,src

;dest←dest∧src只有相“與”的兩位都是1,結(jié)果才是1;否則,“與”的結(jié)果為058邏輯與指令A(yù)ND對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯與運(yùn)算,結(jié)果送目的操作數(shù)邏輯或指令OR對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯或運(yùn)算,結(jié)果送目的操作數(shù)ORdest,src

;dest←dest∨src只要相“或”的兩位有一位是1,結(jié)果就是1;否則,結(jié)果為059邏輯或指令OR對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯或運(yùn)算,結(jié)果送目的操作數(shù)O邏輯異或指令XOR對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯異或運(yùn)算,結(jié)果送目的操作數(shù)XORdest,src

;dest←dest⊕src只有相“異或”的兩位不相同,結(jié)果才是1;否則,結(jié)果為060邏輯異或指令XOR對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯異或運(yùn)算,結(jié)果送目的操測(cè)試指令TEST對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯與運(yùn)算,結(jié)果并不送目的操作數(shù),僅按AND指令影響標(biāo)志TESTdest,src

;dest∧src

AND與TEST指令的關(guān)系,同SUB與CMP指令的關(guān)系一樣61測(cè)試指令TEST對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯與運(yùn)算,結(jié)果并不送目的操邏輯非指令NOT對(duì)一個(gè)操作數(shù)執(zhí)行邏輯非運(yùn)算NOTreg/mem

;reg/mem←~reg/mem

按位取反,原來(lái)是“0”的位變?yōu)椤?”;原來(lái)是“1”的位變?yōu)椤?”62邏輯非指令NOT對(duì)一個(gè)操作數(shù)執(zhí)行邏輯非運(yùn)算NOTreg/m例邏輯運(yùn)算moval,75h ;AL=75Handal,32h ;AL=30H ;CF=OF=0,SF=0,ZF=0,PF=1oral,71h ;AL=71H ;CF=OF=0,SF=0,ZF=0,PF=1xoral,0f1h ;AL=80H ;CF=OF=0,SF=1,ZF=0,PF=0notal ;AL=7FH標(biāo)志不變63例邏輯運(yùn)算moval,75h ;AL=75H9邏輯運(yùn)算指令的應(yīng)用andbl,11110110b

;BL中D0和D3清0,其余位不變orbl,00001001b

;BL中D0和D3置1,其余位不變xorbl,00001001b

;BL中D0和D3求反,其余位不變

AND指令可用于復(fù)位某些位(同0相與),不影響其他位

OR指令可用于置位某些位(同1相或),不影響其他位

XOR指令可用于求反某些位(同1相異或),不影響其他位64邏輯運(yùn)算指令的應(yīng)用andbl,11110110b AND例4.7從偏移地址TABLE開(kāi)始的內(nèi)存區(qū)中,存放著100個(gè)字節(jié)型數(shù)據(jù),要求將這些數(shù)進(jìn)行累加,并將累加和的低位存SUM單元,高位存SUM+1單元。程序如下:LEA BX,TABLE;(BX)←數(shù)據(jù)表地址指針MOVCL,100;(CL)←數(shù)據(jù)塊長(zhǎng)度

XOR AX,AX ;清AL、AH,并清進(jìn)位CFLOOPER:ADD AL,[BX] ;加一個(gè)數(shù)到ALJNC GOON ;如(CF)=0,轉(zhuǎn)移到GOONINC AH;否則,AH加1GOON:INC BX;地址指針加1 DEC CL;計(jì)數(shù)值減1 JNZLOOPER;如(CL)≠0,轉(zhuǎn)移到LOOPER MOVSUM,AX;否則,(SUM)←(AL),(SUM+1)←(AH) HLT ;停止65例4.7從偏移地址TABLE開(kāi)始的內(nèi)存區(qū)中,存放常見(jiàn)的用法⑴清進(jìn)位標(biāo)志位:ANDAX,AX或ORAL,AL等⑵清零操作數(shù):XORAX,AX不僅把AX清零,而且也影響了狀態(tài)標(biāo)志⑶把某幾位取反:用XOR指令,把要取反的位和1異或,不變的位和0異或⑷清零或置位某幾位:用AND指令清零,用OR指令置位66常見(jiàn)的用法122移位指令將操作數(shù)移動(dòng)一位或多位,分成邏輯移位和算術(shù)移位,分別具有左移或右移操作移位指令的第一個(gè)操作數(shù)是指定的被移位的操作數(shù),可以是寄存器或存儲(chǔ)單元;后一個(gè)操作數(shù)表示移位位數(shù):該操作數(shù)為1,表示移動(dòng)一位該操作數(shù)為CL,CL寄存器值表示移位位數(shù)(移位位數(shù)大于1只能CL表示)按照移入的位設(shè)置進(jìn)位標(biāo)志CF,根據(jù)移位后的結(jié)果影響SF、ZF、PF672移位指令將操作數(shù)移動(dòng)一位或多位,分成邏輯移位和算術(shù)移位邏輯左移指令SHL(shiftlogicalleft)SHLreg/mem,1/CL ;reg/mem左移1或CL位 ;最低位補(bǔ)0,最高位進(jìn)入CFSHL和SAL指令的功能演示68邏輯左移指令SHL(shiftlogicalleft)SSHL和SAL指令的功能69SHL和SAL指令的功能15例4.8將一個(gè)16位無(wú)符號(hào)數(shù)乘以10。該數(shù)原來(lái)存放在以FACTOR為首地址的兩個(gè)連續(xù)的存儲(chǔ)單元中(低位在前,高位在后)。因?yàn)镕ACTOR10=(FACTOR8)+(FACTOR2),故可用左移指令實(shí)現(xiàn)以上乘法運(yùn)算。編程如下:MOVAX,F(xiàn)ACTOR ;(AX)←被乘數(shù)SHL AX,1 ;(AX)=FACTOR2MOV BX,AX ;暫存BXSHL AX,1 ;(AX)=FACTOR4SHL AX,1 ;(AX)=FACTOR8ADD AX,BX ;(AX)=FACTOR10HLT

以上程序的執(zhí)行時(shí)間大約需26個(gè)時(shí)鐘。如用乘法指令編程,執(zhí)行時(shí)間將超過(guò)130個(gè)時(shí)鐘。

70例4.8將一個(gè)16位無(wú)符號(hào)數(shù)乘以10。該數(shù)原來(lái)存邏輯右移指令SHR(shiftlogicalright)SHRreg/mem,1/CL ;reg/mem右移1/CL位 ;最高位補(bǔ)0,最低位進(jìn)入CF71邏輯右移指令SHR(shiftlogicalright)例4.9將一個(gè)16位無(wú)符號(hào)數(shù)除以512。該數(shù)原來(lái)存放在以DIVIDAND為首地址的兩個(gè)連續(xù)的存儲(chǔ)單元中。因?yàn)镈IVIDAND÷512=(DIVIDAND÷2)÷256,故可用邏輯右移指令完成上述除法運(yùn)算。編程如下:MOV AX,DIVIDAND;(AX)←被除數(shù)SHR AX,1;(AX)=DIVIDAND÷2XCHGAL,AH ;(AL)←→(AH),相當(dāng)于循環(huán)右移8位CBW ;清AX的高8位,(AX)=DIVIDAND÷512HLT當(dāng)然,也可以將立即數(shù)9傳送到CL寄存器,然后用指令SHRAX,CL完成除以512的運(yùn)算。但是相比之下,上面的程序執(zhí)行速度更快。72例4.9將一個(gè)16位無(wú)符號(hào)數(shù)除以512。該數(shù)原來(lái)存算術(shù)左移指令SAL(shiftarithmeticleft)SALreg/mem,1/CL ;與SHL是同一條指令73算術(shù)左移指令SAL(shiftarithmeticlefSHL和SAL指令的功能74SHL和SAL指令的功能20算術(shù)右移指令SAR(shiftarithmeticright)SARreg/mem,1/CL ;reg/mem右移1/CL位 ;最高位不變,最低位進(jìn)入CF75算術(shù)右移指令SAR(shiftarithmeticrigSAR指令的功能76SAR指令的功能223)循環(huán)移位指令8086/8088指令系統(tǒng)有四條循環(huán)移位指令,不帶進(jìn)位標(biāo)志CF的左循環(huán)移位指令ROL和右循環(huán)移位指令ROR(也稱小循環(huán)),以及帶進(jìn)位標(biāo)志CF的左循環(huán)移位指令RCL和右循環(huán)移位指令RCR(也稱大循環(huán))。循環(huán)移位指令的操作數(shù)類型與移位指令相同,可以是8位或16位的寄存器或存儲(chǔ)器。指令中指定的左移或右移的位數(shù)也可以是1或由CL寄存器指定,但不能是1以外的常數(shù)或CL以外的其他寄存器。所有循環(huán)移位指令都只影響進(jìn)位標(biāo)志CF和溢出標(biāo)志OF,但OF標(biāo)志的含義對(duì)于左循環(huán)移位指令和右循環(huán)移位指令有所不同。773)循環(huán)移位指令23循環(huán)移位指令(rotate)循環(huán)移位指令類似移位指令,但要將從一端移出的位返回到另一端形成循環(huán)。分為:ROL

reg/mem,1/CL ;不帶進(jìn)位循環(huán)左移ROR

reg/mem,1/CL ;不帶進(jìn)位循環(huán)右移RCL

reg/mem,1/CL ;帶進(jìn)位循環(huán)左移RCRreg/mem,1/CL ;帶進(jìn)位循環(huán)右移循環(huán)移位指令的操作數(shù)形式與移位指令相同,按指令功能設(shè)置進(jìn)位標(biāo)志CF,但不影響SF、ZF、PF、AF標(biāo)志演示演示演示演示78循環(huán)移位指令(rotate)循環(huán)移位指令類似移位指令,但要將ROL指令的功能79ROL指令的功能25ROR指令的功能80ROR指令的功能26RCL指令的功能81RCL指令的功能27RCR指令的功能82RCR指令的功能28(1)循環(huán)左移指令ROL(ROtateLeft)。指令格式:ROLdst,1/CLROL指令將目的操作數(shù)向左循環(huán)移動(dòng)1位或移CL寄存器指定的位數(shù)。最高位移到進(jìn)位標(biāo)志CF,同時(shí)最高位移到最低位形成循環(huán),進(jìn)位標(biāo)志CF不在循環(huán)回路之內(nèi)。ROL指令的操作如圖4.24所示。圖4.24ROL指令操作示意圖83(1)循環(huán)左移指令ROL(ROtateLeftROL指令將影響CF和OF兩個(gè)狀態(tài)標(biāo)志位。如果循環(huán)移位次數(shù)等于1,且移位以后目的操作數(shù)新的最高位與CF不相等,則(OF)=1,否則(OF)=0。因此,OF的值表示循環(huán)移位前后符號(hào)位是否有所變化。如果移位次數(shù)不等于1,則OF的值不確定。ROL指令的例子如下:ROLBH,1 ;寄存器循環(huán)左移1位ROLDX,CL ;寄存器循環(huán)左移(CL)位ROLWORDPTR[DI],1 ;存儲(chǔ)器循環(huán)左移1位ROLBYTEPTRALPHA,CL ;存儲(chǔ)器循環(huán)左移(CL)位84ROL指令將影響CF和OF兩個(gè)狀態(tài)標(biāo)志位。如果循環(huán)(2)循環(huán)右移指令ROR(ROtateRight)。指令格式:RORdst,1/CLROR指令將目的操作數(shù)向右循環(huán)移動(dòng)1位或移CL寄存器指定的位數(shù)。最低位移到進(jìn)位標(biāo)志CF,同時(shí)最低位移到最高位。該指令的操作如圖4.25表示。ROR指令也將影響狀態(tài)標(biāo)志位CF和OF。若循環(huán)移位次數(shù)等于1且移位后新的最高位和次高位不等,則(OF)=1,否則(OF)=0。若循環(huán)移位次數(shù)不等于1,則OF的值不確定。圖4.25ROR指令操作示意圖85(2)循環(huán)右移指令ROR(ROtateRight下面是ROR指令的幾個(gè)例子:RORCX,1 ;寄存器循環(huán)右移1位RORBH,CL ;寄存器循環(huán)右移(CL)位RORBYTEPTRBETA,1 ;存儲(chǔ)器循環(huán)右移1位RORWORDPTRALPHA,CL;存儲(chǔ)器循環(huán)右移(CL)位86下面是ROR指令的幾個(gè)例子:32(3)帶進(jìn)位循環(huán)左移指令RCL(RotateLeftthroughCarry)。指令格式:RCLdst,1/CLRCL指令將目的操作數(shù)連同進(jìn)位標(biāo)志CF一起向左循環(huán)移動(dòng)1位或移CL寄存器指定的位數(shù)。最高位移入CF,而CF移入最低位。該指令的操作如圖4.26所示。RCL指令對(duì)狀態(tài)標(biāo)志位的影響與ROL指令相同。圖4.26RCL指令操作示意圖87(3)帶進(jìn)位循環(huán)左移指令RCL(Rotate(4)帶進(jìn)位循環(huán)右移指令RCR(RotateRightthroughCarry)。指令格式:RCRdst,1/CLRCR指令將目的操作數(shù)與進(jìn)位標(biāo)志CF一起向右循環(huán)移動(dòng)1位或移CL寄存器指定的位數(shù)。最低位移入進(jìn)位標(biāo)志CF,CF則移入最高位。該指令的操作如圖4.27所示。RCR指令對(duì)狀態(tài)標(biāo)志位的影響與ROR指令相同。圖4.27RCR指令操作示意圖88(4)帶進(jìn)位循環(huán)右移指令RCR(RotateR這里介紹的四條循環(huán)移位指令與前面討論過(guò)的移位指令有所不同,循環(huán)移位之后,操作數(shù)中原來(lái)各位的信息不會(huì)丟失,而只是移到了操作數(shù)中的其他位或進(jìn)位標(biāo)志上,必要時(shí)還可以恢復(fù)。利用循環(huán)移位指令可以對(duì)寄存器或存儲(chǔ)器中的任一位進(jìn)行位測(cè)試。例如,要求測(cè)試AL寄存器中第5位的狀態(tài)是“0”還是“1”,可利用以下指令實(shí)現(xiàn):MOVCL,5 ;(CL)←移位次數(shù)ROLAL,CL ;(CF)←AL的第5位JNC ZERO ;若(CF)=0,轉(zhuǎn)ZERO… ;否則…ZERO:…89這里介紹的四條循環(huán)移位指令與前面討論過(guò)的移位指令有所說(shuō)明⑴邏輯移位適用于無(wú)符號(hào)數(shù),算術(shù)移位適用于有符號(hào)數(shù)。⑵邏輯左移和算術(shù)左移的機(jī)器碼完全相同,是助記符的兩種寫(xiě)法。ROL循環(huán)左移:操作數(shù)整體左移,最高位移到CF,最低位補(bǔ)原最高位ROR循環(huán)右移:操作數(shù)整體右移,最低位移到CF,最高位補(bǔ)原最低位RCL帶進(jìn)位的循環(huán)左移:類似于ROL循環(huán)移位,CF加入到循環(huán)圈中。RCR帶進(jìn)位的循環(huán)右移:類似于ROR循環(huán)移位,CF加入到循環(huán)圈中。90說(shuō)明36四、串操作指令

串操作指令的特征是對(duì)數(shù)據(jù)塊(字符串)進(jìn)行操作,并且其中部分指令可以兩個(gè)操作數(shù)同時(shí)是存儲(chǔ)器操作數(shù)。MOVS(Movestring)串傳送CMPS(Comparestring)串比較SCAS(Scanstring)串掃描LODS(Loadfromstring)從串中取數(shù)據(jù)STOS(Storeintostring)存數(shù)據(jù)到串中91四、串操作指令串操作指令的特征是對(duì)數(shù)據(jù)塊(字符串)進(jìn)行操作說(shuō)明⑴串操作指令每次執(zhí)行完成一個(gè)字節(jié)或一個(gè)字的操作。⑵通常使用重復(fù)前綴,用來(lái)完成數(shù)據(jù)塊的操作。重復(fù)前綴⑴REP重復(fù)⑵REPE/REPZ相等/為零則重復(fù)⑶REPNE/REPNZ不相等/不為零則重復(fù)9238特點(diǎn)⑴串操作指令需要指明每次操作的類型:B字節(jié),W字例如:MOVSB,CMPSW等。⑵串操作指令使用隱含尋址方式,源串地址為DS:SI,目的串地址為ES:DI,待處理串的長(zhǎng)度放在CX中。⑶使用DF來(lái)表示每次操作以后變址寄存器SI和DI的變化方向CLD;DF=0SI,DI做增量變化B:+1或W:+2STD;DF=1SI,DI做減量變化B:-1或W:-293特點(diǎn)39⑴MOVS指令(兩個(gè)操作數(shù)同時(shí)是存儲(chǔ)器操作數(shù))MOVSB或MOVSW以字節(jié)或字為單位在存儲(chǔ)單元之間傳送數(shù)據(jù),可以使用REP前綴[REP]MOVS[ES:]dst_string,[seg:]src_string[REP]MOVSB[REP]MOVSW①((ES):(DI))←((DS):(SI))②(SI)←(SI)1,(DI)←(DI)1(字節(jié)操作)(SI)←(SI)2,(DI)←(DI)2(字操作)其中,DF=0時(shí)用“+”,DF=1時(shí)用“?”第一種格式的一個(gè)重要優(yōu)點(diǎn)是可以對(duì)源字符串進(jìn)行段重設(shè)(但目的字符串的段地址只能在ES,不可進(jìn)行段重設(shè))。在第二種和第三種格式中,串操作指令字符的后面加上一個(gè)字母“B”或“W”,指出操作對(duì)象是字節(jié)串或字串。94⑴MOVS指令(兩個(gè)操作數(shù)同時(shí)是存儲(chǔ)器操作數(shù))40注意:在MOVSB、MOVSW這兩種指令下,指令后面不允許出現(xiàn)操作數(shù)。例如,以下指令都是合法的:REPMOVSDATA2,DATA1;操作數(shù)類型應(yīng)預(yù)先定義MOVSBUFFER2,ES:BUFFER1;源操作數(shù)進(jìn)行段重設(shè)REPMOVSWORDPTR[DI],[SI];用變址寄存器表示操作數(shù)REPMOVSB ;字節(jié)串傳送MOVSW ;字串傳送 但以下表示方法是非法的:

MOVSBDEST,ES:SRC95注意:在MOVSB、MOVSW這兩種指令下,指令后面不允許出例4.10將數(shù)據(jù)段中首地址為BUFFER1的200個(gè)字節(jié)傳送到附加數(shù)據(jù)段首地址為BUFFER2的內(nèi)存區(qū)中。使用字節(jié)串傳送指令的程序段如下:LEA SI,BUFFER1 ;(SI)←源串首地址指針LEA DI,BUFFER2 ;(DI)←目的串首地址指針MOV CX,200 ;(CX)←字節(jié)串長(zhǎng)度CLD ;清方向標(biāo)志DFREP MOVSB ;傳送200個(gè)字節(jié)HLT ;停止96例4.10將數(shù)據(jù)段中首地址為BUFFER⑵LODS指令LODSB或LODSW從內(nèi)存中取出字節(jié)或字到累加器AL或AX可以使用REP前綴,但意義不大。LODS[seg:]src_string;可以段超越LODSB ;(AL)←((DS):(SI))LODSW ;(AX)←((DS):(SI))①(AL)←((DS):(SI))或(AX)←((DS):(SI))②(SI)←(SI)±1(字節(jié)操作)(SI)←(SI)±2(字操作)其中,當(dāng)DF=0時(shí)用“+”,當(dāng)DF=1時(shí)用“?”。97⑵LODS指令LODSB或LODSW從內(nèi)存中取出字節(jié)例4.11內(nèi)存中以BUFFER為首址的緩沖區(qū)內(nèi)有10個(gè)非壓縮型BCD碼形式存放的十進(jìn)制數(shù),它們的值可能是0~9中的任意一個(gè),將這些十進(jìn)制數(shù)順序顯示在屏幕上。根據(jù)題意可編程如下: LEA SI,BUFFER;(SI)←緩沖區(qū)首址 MOV CX,10 ;(CX)←字符串長(zhǎng)度 CLD ;清狀態(tài)標(biāo)志位DFGET:LODSB ;取一個(gè)BCD碼到ALOR AL,30H ;BCD碼轉(zhuǎn)換為ASCII碼 MOV AH,02H ;(AH)←功能號(hào) MOV DL,AL ;(DL)←字符INT 21H ;顯示DEC CX ;(CX)←(CX)?1JNZ GET ;未完成10個(gè)字符則重復(fù) HLT

98例4.11內(nèi)存中以BUFFER為首址的緩沖區(qū)內(nèi)有⑶STOS指令STOSB或STOSW從累加器中存字節(jié)或字到存儲(chǔ)器,可以使用REP前綴[REP]STOS [ES:]dst_string[REP]STOSB ;((ES):(DI))←(AL)[REP]STOSW ;((ES):(DI))←(AX)①((ES):(DI))←(AL)或((ES):(DI))←(AX)②(DI)←(DI)±1(字節(jié)操作)(DI)←(DI)±2(字操作)其中,當(dāng)DF=0時(shí)用“+”,當(dāng)DF=1時(shí)用“?”。STOS指令對(duì)狀態(tài)標(biāo)志位沒(méi)有影響。指令若加上重復(fù)前綴REP,則操作將一直重復(fù)進(jìn)行下去,直到(CX)=0。99⑶STOS指令45例4.12將字符'#'裝入以AREA為首址的100個(gè)字節(jié)中。 LEA DI,AREA MOV AX,'##' MOV CX,50 CLDREP STOSW HLT程序采用了送存50個(gè)字(‘##’),也可以采用送存100個(gè)字節(jié)('#')的方法。這兩種方法程序執(zhí)行的結(jié)果是相同的,但前者執(zhí)行速度要更快一些。100例4.12將字符'#'裝入以AREA為首址的100例4.13一個(gè)數(shù)據(jù)塊由大寫(xiě)或小寫(xiě)的英文字母、數(shù)字和各種其他符號(hào)組成,其結(jié)束符是回車(chē)符CR(ASCII碼為0DH),數(shù)據(jù)塊的首地址為BLOCK1。將數(shù)據(jù)塊傳送到以BLOCK2為首地址的內(nèi)存區(qū),并將其中所用的英文小寫(xiě)字母(a~z)轉(zhuǎn)換成相應(yīng)的大寫(xiě)字母(A~Z),其余不變。實(shí)現(xiàn):判斷,數(shù)據(jù)搬家,轉(zhuǎn)換小寫(xiě)字母為大寫(xiě)。前面已經(jīng)討論過(guò)英文小寫(xiě)字母與相應(yīng)的大寫(xiě)字母的ASCII碼之間有一定的關(guān)系,即只需將小寫(xiě)字母的ASCII碼減20H,即可得到相應(yīng)大寫(xiě)字母的ASCII碼。程序如下:101例4.13一個(gè)數(shù)據(jù)塊由大寫(xiě)或小寫(xiě)的英文字母、數(shù)字 LEA SI,BLOCK1 ;(SI)←源地址指針 LEA DI,BLOCK2 ;(DI)←目標(biāo)地址指針 CLD ;清方

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論