第五周 串操作指令
大家好,又是我,沉迷學(xué)習(xí)無(wú)法自拔的小笨蛋康sir。 這個(gè)文集將會(huì)同步更新我觀看吳寧老師的《微機(jī)原理與接口技術(shù)》教學(xué)視頻寫(xiě)的筆記,學(xué)習(xí)筆記,大概每周一章。 有問(wèn)題大家可以在評(píng)論下面留言討論,歡迎糾錯(cuò)! 歡迎收藏閱讀,動(dòng)動(dòng)小手給個(gè)硬幣點(diǎn)個(gè)贊。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?——@正能量的康sir??
也可移步我的博客(https://blog.csdn.net/qq_33956508)獲得更好的閱讀體驗(yàn)(暫不更新),也會(huì)更新一些其它技術(shù)類(lèi)文章。

串操作指令說(shuō)明:
針對(duì)數(shù)據(jù)塊或字符串的操作(這類(lèi)數(shù)據(jù)在內(nèi)存中存放)
可實(shí)現(xiàn)存儲(chǔ)器到存儲(chǔ)器的數(shù)據(jù)傳送(允許兩個(gè)操作數(shù)都是存儲(chǔ)器操作數(shù))
待操作的數(shù)據(jù)串成為源串,目標(biāo)地址稱(chēng)為目標(biāo)串
? ? ? ?

? ? ? ?
串操作指令的操作對(duì)象是多個(gè)字節(jié)數(shù)(一串字符或數(shù)據(jù)),因此,指令的執(zhí)行需要確定:
串所在的區(qū)域
串的首地址
串長(zhǎng)度(大小)
串的操作方向
串操作指令的要求
串所在區(qū)域及首地址:
源串一般存放在數(shù)據(jù)段,偏移地址由SI指定,允許段重設(shè)。
目標(biāo)串必須在附加段,偏移地址由DI指定。
? ? ? ?

? ? ? ?
串長(zhǎng)度:
串長(zhǎng)度值由CX指定
串的操作方向:由DF標(biāo)志位決定。指令根據(jù)DF狀態(tài)自動(dòng)修改地址指針
DF=0——>增地址方向
DF=1——>減地址方向
通過(guò)增加重復(fù)前綴,可以實(shí)現(xiàn)對(duì)CX值的自動(dòng)修改
重復(fù)前綴:
無(wú)條件重復(fù):REP
當(dāng)CX≠0時(shí),REP后的指令將繼續(xù)重復(fù)執(zhí)行;
常用于傳送類(lèi)指令前——>未傳完則繼續(xù)傳送
條件重復(fù):
相等(為0)重復(fù):REPE(REPZ),CX≠0∩ZF=1,則前綴后的指令將繼續(xù)重復(fù)執(zhí)行
不相等(不為零)重復(fù):REPNE(REPNZ), CX≠0∩ZF=0,則前綴后的指令將繼續(xù)重復(fù)執(zhí)行
條件前綴常用于運(yùn)算類(lèi)指令前,當(dāng):1)操作未結(jié)束AND結(jié)果=0或者
2)操作未結(jié)束AND結(jié)果≠0
使其后的指令繼續(xù)重復(fù)執(zhí)行。
串操作指令
串傳送MOVS
串比較CMPS
串掃描SCAS
串裝入LODS
串送存STOS
串操作指令流程
? ? ? ?

? ?
(串操作中,完成一個(gè)字節(jié)或字操作、修改地址指針(SI、DI)是通過(guò)串操作指令實(shí)現(xiàn)的,修改串長(zhǎng)度值(修改CX)、判斷完成否 是通過(guò)重復(fù)前綴實(shí)現(xiàn)的)
? ? ? ?

? ? ? ?
因?yàn)槭窍刃薷牡刂分羔?,再判斷完成否,所以?/p>
若按增地址方向操作,串操作結(jié)束時(shí):
? 串傳送指令:指針將指向串尾+1
? 串比較類(lèi)指令:指針將指向結(jié)束位+1
若按減地址方向操作,串操作結(jié)束時(shí):
? 串傳送指令:指針將指向串尾-1
? 串比較類(lèi)指令:指針將指向結(jié)束位-1
第25講 串傳送與串比較指令
1.串傳送指令
功能:將源數(shù)據(jù)串傳送到目標(biāo)地址
格式:①M(fèi)OVS OPRD1,OPRD2即MOVS [DI],[SI];此格式僅用于源操作數(shù)需段重設(shè)的情況下。所以②③更常用
②MOVSB按字節(jié)傳送
③MOVSW按字傳送
串傳送指令常與無(wú)條件重復(fù)前綴連用
例子:分別用MOV指令和MOVS指令編寫(xiě)將200個(gè)字節(jié)數(shù)據(jù)從內(nèi)存數(shù)據(jù)段
MEM1為首地址的區(qū)域送到同一邏輯段MEM2為首地址的區(qū)域中的程
序。
LEA SI,MEM1
LEA DI,MEM2
MOV CX,200
NEXT:MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
DEC CX
JNZ NEXT
HLT
用MOVS修改
LEA SI,MEM1
LEA DI,MEM2
MOV CX,200
CLD;CLD將DF清零,表示按增地址方向操作
REP MOVSB
HLT
2.串比較指令
功能:用于實(shí)現(xiàn)兩個(gè)數(shù)據(jù)串的比較
操作:目標(biāo)串-源串,結(jié)果不寫(xiě)回目標(biāo)地址
常與條件重復(fù)前綴連用
格式:①CMPS OPRD1,OPRD2
②CMPSB
③CMPSW
注意:前綴的操作對(duì)標(biāo)志位不影響。所以標(biāo)志位完全取決于CMPS的結(jié)果。
例子:測(cè)試上例中200個(gè)字節(jié)數(shù)據(jù)是否傳送正確
LEA SI,MEM1
LEA DI,MEM2
MOV CX,200
CLD
REPE CMPSB;(用REPE或REPZ相等則重復(fù)。結(jié)束串比較指令的條件有兩種:①CX=0,意味著兩個(gè)串完全相等;②CX≠0但ZF=0,意味著碰到了不相等的字節(jié))
JZ STOP;當(dāng)ZF=1,兩數(shù)據(jù)串相同,轉(zhuǎn)移到STOP
DEC SI;指向存放不相等數(shù)據(jù)的地址。因?yàn)榇僮鲿?huì)指向最后一個(gè)字節(jié)加一的位置,那再減一就是指向存放不相等數(shù)據(jù)的地址
MOV AL,[SI]
MOV BX,SI;這兩句是獲取不相等數(shù)據(jù)及存放該數(shù)據(jù)的地址
STOP: HLT
第26講 串掃描指令
常用于在指定存儲(chǔ)區(qū)域中尋找某個(gè)關(guān)鍵字
格式:SCAS OPRD;(OPRD是目標(biāo)操作數(shù))
?SCASB
?SCASW
執(zhí)行與CMPS指令相似的操作,區(qū)別是:這里的源操作數(shù)是AX或AL
串掃描指令應(yīng)用例:
在ES段中從2000H單元開(kāi)始存放了10個(gè)字符,尋找其中有無(wú)字符“A”。若有則記下搜索次數(shù),將搜索次數(shù)寫(xiě)入到DATA1單元,并將存放“A”的地址寫(xiě)入DATA2單元。
MOV DI,2000H
MOV BX,DI;做備份
MOV CX,0AH;因?yàn)橛?0個(gè)字符所以把0AH送給CX
MOV AL,’A’
CLD
REPNZ SCASB;不相等則重復(fù) 掃描
?JZ FOUND
?MOV DI,0
?JMP DONE
FOUND:DEC DI;地址減一才是存放的地址
MOV DATA2,DI
INC DI
SUB DI,BX
DONE:MOV DATA1,DI
HLT
? ? ? ?

? ? ? ?
第27講 串裝入與串送存指令
串裝入指令
格式:LODS OPRD;源操作數(shù)
LODSB
LODSW
操作
對(duì)字節(jié):Al←[DI:SI]數(shù)據(jù)段中SI所指向單元的內(nèi)容送給AL
對(duì)字:AX←[DS:SI]數(shù)據(jù)段中SI所指向的字單元的內(nèi)容送給AX
(1)用于將內(nèi)存某個(gè)區(qū)域的數(shù)據(jù)串依次裝入累加器,以便顯示或輸出到接口。
(2)LODS指令一般不加重復(fù)前綴(會(huì)覆蓋掉原來(lái)的內(nèi)容)
串存儲(chǔ)指令
格式:STOS OPRD
STOSB
STOSW
操作:對(duì)字節(jié):Al→[ES:DI]附加段的一塊區(qū)域
對(duì)字:AX→[ES:DI]
常用于將內(nèi)存某個(gè)區(qū)域置同樣的值
此時(shí):將待送存的數(shù)據(jù)放入AL(字節(jié)數(shù))或AX(字?jǐn)?shù)據(jù));
確定操作方向(增地址/減地址)和區(qū)域大小(串長(zhǎng)度值)
使用串存儲(chǔ)指令+無(wú)條件重復(fù)前綴,實(shí)現(xiàn)數(shù)據(jù)傳送
串存儲(chǔ)指令例
將6000H:1200H單元開(kāi)始的100個(gè)字存儲(chǔ)單元格內(nèi)容清零·
分析:可以用MOV指令或串存儲(chǔ)指令實(shí)現(xiàn)
MOV AX,6000H
MOV ES,AX
MOV DI,1200H
MOV CX,100
CLD
MOV AX,0
REP STOSW
HLT
串操作指令應(yīng)用注意事項(xiàng)
需要定義附加段:目標(biāo)操作數(shù)必須在附加段(后面第四章 匯編語(yǔ)言程序設(shè)計(jì)會(huì)學(xué))
需要設(shè)置數(shù)據(jù)的操作方向:確定DF的狀態(tài)。(CLD將DF清零,增地址方向)
源串和目標(biāo)串指針?lè)謩e為SI和DI
串長(zhǎng)度值必須由CX給出
注意重復(fù)前綴的使用方法:
????除了串裝入指令以外,其他串操作指令都建議使用重復(fù)前綴簡(jiǎn)化編寫(xiě);
????傳送類(lèi)指令前加無(wú)條件重復(fù)前綴;
????串比較類(lèi)(串比較、串掃描)指令前加條件重復(fù)前綴,但前綴不影響ZF狀態(tài)。