匯編語言-字符串操作指令_第1頁
匯編語言-字符串操作指令_第2頁
匯編語言-字符串操作指令_第3頁
匯編語言-字符串操作指令_第4頁
匯編語言-字符串操作指令_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡(jiǎn)介

匯編語言---字符串操作指令字符串操作指令的實(shí)質(zhì)是對(duì)一片連續(xù)的存儲(chǔ)單元進(jìn)行處理,這片連續(xù)的存儲(chǔ)單元由隱含指針DS:SI或ES:DI來指定;字符串操作指令可對(duì)內(nèi)存單元按照字節(jié)、字、雙字進(jìn)行處理,并能根據(jù)操作對(duì)象的字節(jié)數(shù)使變址寄存器SI/DI增加或減少1、2、4字節(jié);規(guī)定如下:A.當(dāng)DF=0時(shí),變址寄存器SI/DI增加1、2、4字節(jié);即:變址寄存器SI/DI遞增的步長(zhǎng)可以是1、2、4字節(jié);B.當(dāng)DF=1時(shí),變址寄存器SI/DI減少1、2、4字節(jié);即:變址寄存器SI/DI遞減的步長(zhǎng)可以是1、2、4字節(jié);一、取字符串?dāng)?shù)據(jù)指令(LoadStringInstruction)從指針DI:SI所指定的內(nèi)存單元開始,取一個(gè)字節(jié)/字/雙字,然后存入到AL/AX/EAX中,并根據(jù)標(biāo)志位DF的值對(duì)寄存器SI做相應(yīng)的增減;把存放字符串?dāng)?shù)據(jù)的連續(xù)存儲(chǔ)區(qū)當(dāng)做是數(shù)據(jù)源,使用寄存器SI;該指令的執(zhí)行不會(huì)影響任何標(biāo)志位;指令格式:LODSLODSB/LODSW地址表達(dá)式地址表達(dá)式;80386+地址表達(dá)式LODS在指令LODS中,它會(huì)根據(jù)"地址表達(dá)式"的屬性來決定讀取一個(gè)字節(jié)、字或雙字;即:當(dāng)該地址表達(dá)式的屬性為字節(jié)、字或雙字時(shí),將從指針DI:SI處讀取一個(gè)字節(jié)到AL中,或讀取一個(gè)字到AX中,或讀取一個(gè)雙字到EAX中,與此同時(shí),SI還將分別增減1、2、4字節(jié);取字符串?dāng)?shù)據(jù)指令的功能示意圖如下圖所示:二、置字符串?dāng)?shù)據(jù)指令(StoreStringInstruction)該指令把寄存器AL/AX/EAX中的值存入指針ES:DI所指向內(nèi)存單元開始的一片存儲(chǔ)單元中,并根據(jù)標(biāo)志位DF的值對(duì)寄存器DI做相應(yīng)的增減;把存放字符串的連續(xù)存儲(chǔ)區(qū)當(dāng)做是數(shù)據(jù)的目的地,使用寄存器DI;該指令的執(zhí)行并不會(huì)影響任何標(biāo)志位;指令格式:STOS地址表達(dá)式STOSB/STOSW地址表達(dá)式地址表達(dá)式;80386+置字符串?dāng)?shù)據(jù)指令的功能示意圖如下圖所示:三、字符串傳送指令(MoveStringInstruction)STOSD該指令把指針DS:SI所指向的字節(jié)、字或雙字傳送給指針ES:DI所指向的內(nèi)存單元,并根據(jù)標(biāo)志位DF的值對(duì)寄存器DI和SI分別作相應(yīng)的增減;該指令的執(zhí)行并不會(huì)影響任何標(biāo)志位;指令格式:MOVSMOVSB/MOVSW地址表達(dá)式1,地址表達(dá)式2地址表達(dá)式1,地址表達(dá)式2;80386+地址表達(dá)式1,地址表達(dá)式2MOVSD字符串傳送指令的功能示意圖如下圖所示:四、輸入字符串指令(InputStringInstruction)該指令是從某一指定端口接受一個(gè)字符串,并存入到一片連續(xù)的存儲(chǔ)單元中;輸入端口由寄存器DX指定,存儲(chǔ)單元的首地址由指針ES:DI來確定,讀入的數(shù)據(jù)個(gè)數(shù)由寄存器CX來確定;在指令的執(zhí)行過程中,還要根據(jù)標(biāo)志位DF的值來對(duì)寄存器DI做相應(yīng)的增減;把存放字符串的連續(xù)存儲(chǔ)區(qū)當(dāng)做是數(shù)據(jù)的目的地;該指令不會(huì)影響任何標(biāo)志位;與指令有關(guān)的操作數(shù)ES、DI、DX和CX等都是隱含操作數(shù);指令格式:INS地址表達(dá)式INSB/INSW地址表達(dá)式INSD地址表達(dá)式;80386+五、字符串輸出指令(OutputStringInstruction)該指令是把一個(gè)給定的字符串輸出到一個(gè)指定的端口中;輸出端口由通用寄存器DX指定,輸出數(shù)據(jù)的首地址由指針DS:SI確定,輸出數(shù)據(jù)的個(gè)數(shù)由計(jì)數(shù)寄存器CX來確定;在指令執(zhí)行的過程中,還要根據(jù)方向標(biāo)志DF的值來對(duì)變址寄存器SI做相應(yīng)的增減;該指令的執(zhí)行并不會(huì)影響任何標(biāo)志位;與指令有關(guān)的操作數(shù)DS、SI、DX和CX等都是隱含操作數(shù);指令格式:OUTSOUTSB/OUTSW地址表達(dá)式地址表達(dá)式;80386+六、字符串比較指令(CompareStringInstruction)地址表達(dá)式OUTSD該指令是把指針DS:SI所指向的字節(jié)、字、雙字的值與指針ES:DI所指向的字節(jié)、字、雙字的值相減,并用所得到的差來設(shè)置相關(guān)標(biāo)志位;與此同時(shí),變址寄存器SI和DI也將根據(jù)方向標(biāo)志位DF的值做相應(yīng)的增減;指令格式:CMPSCMPSB/CMPSW地址表達(dá)式1,地址表達(dá)式2地址表達(dá)式1,地址表達(dá)式2;80386+地址表達(dá)式1,地址表達(dá)式2CMPSD受影響的標(biāo)志位:AF,CF,OF,PF,SF,ZF字符串比較指令的功能示意圖如下圖所示:七、字符串掃描指令(ScanStringInstruction)該指令是用指針ES:DI所指向字節(jié)/字/雙字的值與相應(yīng)的AL/AX/EAX的值相減,并依據(jù)所得到的差值來設(shè)置相關(guān)標(biāo)志位;與此同時(shí),變址寄存器DI還將根據(jù)方向標(biāo)志DF的值來做相應(yīng)的增減;指令格式:SCASSCASB/SCASW地址表達(dá)式地址表達(dá)式;80386+地址表達(dá)式SCASD受影響的標(biāo)志位:AF,CF,OF,PF,SF,ZF字符串掃描指令的功能示意圖如下圖所示:八、重復(fù)字符串操作指令(RepeatStringInstruction)前面的字符串操作指令:取字符串?dāng)?shù)據(jù)、置字符串?dāng)?shù)據(jù)、字符串傳送、輸入字符串、輸出字符串、字符串比較、字符串掃描,等指令,都是執(zhí)行一次所具有的功能;但是,每個(gè)字符串通常都是由多個(gè)字符組成的,所以,需要重復(fù)執(zhí)行這些字符串操作指令;為了滿足這種需要,指令系統(tǒng)提供了一組重復(fù)前綴指令;雖然在這些字符串指令的前面都可以添加一個(gè)重復(fù)前綴指令,但是由于指令執(zhí)行結(jié)果的差異,對(duì)某個(gè)具體的字符串指令又不用重復(fù)前綴指令而改用其它循環(huán)來實(shí)現(xiàn)重復(fù)的需要;重復(fù)字符串操作指令對(duì)標(biāo)志位的影響是由被重復(fù)的字符串操作指令來決定;1.重復(fù)前綴指令REP(RepeatStringInstruction)重復(fù)前綴指令是重復(fù)其后指定的字符串操作指令,重復(fù)的次數(shù)由計(jì)數(shù)寄存器CX來決定;指令格式:REPLODS/LODSB/LODSW/LODSDREPSTOS/STOSB/STOSW/STOSDREPMOVS/MOVSB/MOVSW/MOVSDREPINS/INSB/INSW/INSDREPOUTS/OUTSB/OUTSW/OUTSD重復(fù)前綴指令的執(zhí)行步驟如下:STEP1:判斷:CX=0STEP2:如果CX=0,則結(jié)束重復(fù)操作,執(zhí)行程序中的下一條指令;STEP3:否則,CX=CX-1(不影響相關(guān)標(biāo)志位),并執(zhí)行重復(fù)前綴指令后面指定的字符串操作指令,在該指令執(zhí)行完后,再轉(zhuǎn)到步驟STEP1;從上面的重復(fù)前綴指令格式來看,雖然我們可以使用重復(fù)前綴指令來重復(fù)取字符串?dāng)?shù)據(jù)指令(第一組指令),但是可能會(huì)因?yàn)橹噶畹膱?zhí)行結(jié)果而在程序中幾乎不會(huì)使用;例如:編寫一段程序,計(jì)算字符串"12345abcdefg"中各個(gè)字符的ASCII之和;解:......MESSDB'12345abcdefg';在數(shù)據(jù)段進(jìn)行變量說明......MOVAX,SEGMESSMOVDS,AXLEASI,MESSMOVCX,13DXORBX,BXREPLODSB......;用DS:SI來指向字符串的首地址;;重復(fù)次數(shù);置求和的初值為0;循環(huán)去處字符;從程序片段中看,雖然"REPLODSB"能從字符串中逐一取出每個(gè)字符,但這個(gè)操作是在同一條指令中完成的,程序的其它指令根本無法處理每次取出的字符數(shù)據(jù),指令的執(zhí)行結(jié)果是:AL中只保存了最后一次取出的字符'h'的ASCII碼;所以,為了實(shí)現(xiàn)本例的要求,不能使用重復(fù)前綴指令,而要把指令"REPLODSB"改寫成如下四條指令:XORAH,AH;為后面的累加做準(zhǔn)備AGAIN:LODSBADDBX,AX;AL是被取出的字符,AH已被清0LOOPAGAIN2.條件重復(fù)前綴指令(RepeatStringConditionally)條件重復(fù)前綴指令與重復(fù)前綴指令的功能相似,所不同的是:條件重復(fù)前綴指令中的重復(fù)次數(shù)不僅由CX來決定,而且還會(huì)由標(biāo)志位ZF的值來決定;根據(jù)ZF所起的作用又可分為兩種:相等重復(fù)前綴指令和不等重復(fù)前綴指令;A.相等重復(fù)前綴指令:指令格式:REPE/REPZSCAS/SCASB/SCASW/SCASDREPE/REPZCMPS/CMPSB/CMPSW/CMPSD該重復(fù)前綴指令的執(zhí)行步驟如下:STEP1:判斷條件:CX!=0且ZF=1STEP2:如果條件不成立,則結(jié)束重復(fù)操作,執(zhí)行程序中的下一條指令;STEP3:否則,CX=CX-1(不影響任何標(biāo)志位),并執(zhí)行重復(fù)前綴指令后面指定的字符串操作指令,在該指令執(zhí)行后,再轉(zhuǎn)到步驟STEP1;B.不等重復(fù)前綴指令:指令格式:REPNE/REPNZSCAS/SCASB/

溫馨提示

  • 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)論