字符串操作指令_第1頁(yè)
字符串操作指令_第2頁(yè)
字符串操作指令_第3頁(yè)
字符串操作指令_第4頁(yè)
字符串操作指令_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

3隱含規(guī)定源串必須放在數(shù)據(jù)段,用SI尋址。DS:[SI]表示元素;

目的串必須在附加段,用DI尋址。ES:[DI]表示元素;要習(xí)慣元素(存儲(chǔ)單元)的表達(dá)方式!4

配合使用重復(fù)前綴REP

指令加上重復(fù)前綴,如虎添翼。

串計(jì)數(shù)器必須用CX

先從總體上了解此類(lèi)指令的操作。源:::目:SI+NSIDI+NDISISI-NDIDI-N用CLD(ClearDF)設(shè)置DF=0,增址修改;也可用STD,設(shè)置減址AL/AX/EAXAL/AX/EAX關(guān)鍵字AL/AX/EAXDF:標(biāo)志寄存器中的D10string1

string2

N=1/2/4

數(shù)據(jù)段

附加段

DS

ES

串傳送MOVSB/W/DDS:[SI]

ES:[DI]串裝入LODSB/W/DDS:[SI]AL/AX/EAX串存儲(chǔ)STOSB/W/DAL/AX/EAX

ES:[DI]串比較CMPSB/W/DDS:[SI]—

ES:[DI]串掃描SCASB/W/D關(guān)鍵字(AL/AX/EAX)—ES:[DI](1)串傳送指令MOVeString基本格式

MOVSB/MOVSW/MOVSD

字節(jié)字雙字

指令的三個(gè)‘動(dòng)作’:

DS:[SI]

ES:[DI](傳送)

SI±NSI(修改“源”)

DI±NDI(修改“目的”)CLD

CLearDFDF=0,增址修改STDSeTDF

DF=1,減址修改使用該指令的輔助指令(使用該指令的準(zhǔn)備工作)1)SI,DI賦值;2)確定增址或減址;3)傳送長(zhǎng)度

*帶有重復(fù)前綴REP的格式(

REPeat前綴助記符,不能獨(dú)立使用)格式:REP

MOVSB/W/D(重復(fù)次數(shù)由CX內(nèi)容確定)功能:每傳送一個(gè)字節(jié),修改指針。CX-1,如果CX≠0,繼續(xù)傳送例:把數(shù)據(jù)段BLOCK單元開(kāi)始的100個(gè)字節(jié),依次傳送到附加段BUF開(kāi)始的內(nèi)存區(qū)。用三種方法完成傳送,目的:學(xué)習(xí)指令,比較指令。MOVSB解1:用MOV指令

MOVSI,OFFSETBLOCK ;指向源串

MOVDI,OFFSETBUF ;指向目的串

MOVCX,100 ;計(jì)數(shù)器初值LAST:. MOVAL,[SI]

;從源串取一字節(jié)

MOVES:[DI],AL

;送入目的串

INCSI

;指向源串下一個(gè)字符

INCDI

;指向目的串下一個(gè)字符

LOOPLAST

;傳送100個(gè)字節(jié)

……….. ;CX-1,不為0轉(zhuǎn)LAST解2:用MOVSB指令配合核心指令的輔助指令

MOVSI,OFFSETBLOCK

;指向源串

MOVDI,OFFSETBUF

;指向目的串

CLD

;增址修改.. MOVCX,100 ;計(jì)數(shù)器初值

LAST:.MOVSB

;傳送,修改地址指針

LOOPLAST ;100個(gè)字節(jié)未完,繼續(xù)

………. ;已完,……..解3用帶重復(fù)前綴的傳送指令REPMOVSB配合核心指令的輔助指令

MOVSI,OFFSETBLOCK

;指向源串

MOVDI,OFFSETBUF

;指向目的串

MOVCX,100

;計(jì)數(shù)器初值

CLD

;增址修改

REP.MOVSB

;傳送100個(gè)字節(jié)

……….(2)取串指令LOaDfromString

基本格式LODSB/W/DDS:[SI]

AL/AX/EAX

把DS:[SI]中的一個(gè)元素送入AL/AX/EAX*沒(méi)有帶前綴的格式(3)存串指令STOreintoString

基本格式STOSB/W/DAL/AX/EAXES:[DI]

把一個(gè)元素AL/AX/EAX送入目的存儲(chǔ)區(qū)*帶有重復(fù)前綴REP的形式REPSTOSB/W/D(4)串比較指令CoMPareString*基本格式CMPSB/W/DDS:[SI]

和ES:[DI]的當(dāng)前元素比較,并按DF標(biāo)志修改地址。當(dāng)前元素相等?ZF標(biāo)志置1ZF標(biāo)志置0指令結(jié)束CMPS指令功能示意*指令的三個(gè)‘動(dòng)作’:

DS:[SI]―ES:[DI](比較)

SI±NSI(修改)

DI±NDI(修改)*帶有重復(fù)前綴的串比較指令

格式1:REPE

CMPSB/W/D(REPE=REPZ)

比較,如果相等且CX≠0,重復(fù)基本指令CMPSB/W/DCX=0?CX-1CX

比較當(dāng)前元素根據(jù)DF,修改SI,DI當(dāng)前元素相等?停止重復(fù)操作的條件:重復(fù)次數(shù)計(jì)數(shù)器CX等于0或ZF=0;

CX等于0:計(jì)數(shù)器為0,應(yīng)當(dāng)停;

ZF=0:表明不相等,不滿(mǎn)足繼續(xù)比較的條件,即使CX不為0也應(yīng)當(dāng)停。繼續(xù)重復(fù)執(zhí)行的條件:重復(fù)次數(shù)計(jì)數(shù)器CX不等于0且標(biāo)志ZF=1

在比較次數(shù)沒(méi)有完成的情況下(CX不等于0),又滿(mǎn)足繼續(xù)比較的條件(ZF=1),所以應(yīng)當(dāng)繼續(xù)。

指令結(jié)束,若ZF=1,表明兩個(gè)串完全相等;若ZF=0,表明至少有一個(gè)元素不相等格式2:REPNE

CMPSB/W/D

比較,不相等且CX≠0,重復(fù)執(zhí)行基本指令CMPSB/W/D

停止重復(fù)的條件:重復(fù)次數(shù)計(jì)數(shù)器CX等于0或ZF=1;

CX等于0:計(jì)數(shù)器為0,應(yīng)當(dāng)停;

ZF=1:表明相等,不滿(mǎn)足繼續(xù)比較的條件,也應(yīng)當(dāng)停。繼續(xù)重復(fù)執(zhí)行的條件:重復(fù)次數(shù)計(jì)數(shù)器CX不等于0且標(biāo)志ZF=0

在比較次數(shù)沒(méi)有完成的情況下(CX不等于0),又滿(mǎn)足繼續(xù)比較的條件(ZF=0),所以應(yīng)當(dāng)繼續(xù)。CX=0?CX-1CX

比較當(dāng)前元素根據(jù)DF,修改SI,DI當(dāng)前元素相等?指令結(jié)束,若ZF=0,表明兩個(gè)串對(duì)應(yīng)元素都不相等;若ZF=1,表明至少有一個(gè)元素相等配合核心指令REPECMPSB的輔助指令例:比較ST1,ST2兩個(gè)字符串,若二者相等,令A(yù)L=0;不相等令A(yù)L=FFH。設(shè)長(zhǎng)度為20字節(jié)。MOVSI,OFFSETST1MOVDI,OFFSETST2MOVCX,20CLD

REPECMPSB;元素相等,重復(fù)比較,CX=0退出。

;如果有元素不相等,也退出

JNZNEQU;兩個(gè)串不相等,轉(zhuǎn)

XORAL,AL;串相等,設(shè)置AL=0JMPFINISH;無(wú)條件轉(zhuǎn)

NEQU:MOVAL,0FFH;不相等,AL=FFFINISH:HLT;HALT,暫停執(zhí)行指令

配合核心指令的輔助指令(5)串搜索指令SCAnString*基本格式:SCASB/W/D

功能:關(guān)鍵字―ES:[DI](搜索/比較)DI±N→DI(修改)*帶重復(fù)前綴串搜索指令格式1REPE

SCASB/W/D

功能:比較結(jié)果相等,重復(fù)執(zhí)行基本指令SCASB/W/D

格式1REPNE

SCASB/W/D

功能:比較結(jié)果不相等,重復(fù)執(zhí)行基本指令SCASB/W/D例:FIRSTDB-1,35,-75,55,5,-100,0,92,-8,10

MOVCX,10;

MOVDI,OFFSETFIRSTMOVAL,0;關(guān)鍵字

REPNESCASB自己看(6)從端口輸入字符串指令(7)向端口輸出字符串指令3.2.5控制轉(zhuǎn)移指令

(1)無(wú)條件轉(zhuǎn)移指令JMP

。。。。。。。

JMP目的地址 。。。。。。。 。。。。。。。

目的地址: 。。。。。。。此類(lèi)指令解決:如何向CPU提供目的地址的有關(guān)信息①短轉(zhuǎn)移(SHORT):在段內(nèi)的短距離(-128~127)轉(zhuǎn)移。

②段內(nèi)轉(zhuǎn)移(NEAR):目標(biāo)地址與轉(zhuǎn)移指令都在同一段內(nèi)。

③段間轉(zhuǎn)移(FAR):目標(biāo)地址與轉(zhuǎn)移指令分別位于不同的段內(nèi),轉(zhuǎn)移時(shí)CS和IP(EIP)中的值都要發(fā)生改變。格式1:段內(nèi)直接轉(zhuǎn)移

JMP標(biāo)號(hào)

*在指令字節(jié)中,直接提供目的地址的偏移地址(有效地址)格式2:段內(nèi)間接轉(zhuǎn)移

JMP寄存器操作數(shù)

JMP存儲(chǔ)器操作數(shù)*在指令字節(jié)中,把目的地址的偏移地址(有效地址)存放在寄存器或存儲(chǔ)器中。在指令中向CPU提供的是寄存器或存儲(chǔ)器地址信息。例:段內(nèi)間接轉(zhuǎn)移指令的應(yīng)用DATASEGMENTORG1000HPNTRDWP11;匯編后,P11的偏移地址送PNTR字單元

DWP12;P12的偏移地址送PNTR+2字單元;(設(shè)匯編后

P11偏移地址=0039H

;P12的偏移地址=003BH)DATAENDSTD窗口

DS:1000H3900

3B00CODESEGMENTASSUMECS:CODE,DS:DATA

START:………..

MOVBX,OFFSETPNTR;BX=1000H JMP[BX];從1000H,1001H中取16位地址;0039送IP,即轉(zhuǎn)向P11

;目的地址的偏移地址在存儲(chǔ)器中。

……….. MOVSI,PNTR+2;取偏移地址,SI=003BH JMPSI

;目的地址的偏移地址在寄存器中。

…………P11: ………… …………P12: …………

格式3:段間直接轉(zhuǎn)移

JMP標(biāo)號(hào).

段間間接轉(zhuǎn)移

JMP內(nèi)存操作數(shù)*段內(nèi)轉(zhuǎn)移只需把偏移地址送到IP即可,而段寄存器CS不變。段間轉(zhuǎn)移CS和IP都要發(fā)生變化?。?)條件轉(zhuǎn)移指令

JCC

格式:JCC

OP1

條件轉(zhuǎn)移地址標(biāo)號(hào)功能:滿(mǎn)足所給條件,轉(zhuǎn)移;不滿(mǎn)足,順序執(zhí)行下一條指令

條件

P69表3.3必須會(huì)查

1)無(wú)符號(hào)數(shù)條件轉(zhuǎn)移

JA 被減數(shù)大于減數(shù) JNBEJNA 被減數(shù)小于或等于減數(shù) JBEJNC 被減數(shù)大于或等于減數(shù). JNB/JAEJC 被減數(shù)小于減數(shù) JB/JNAE2)有符號(hào)數(shù)條件轉(zhuǎn)移

JG 被減數(shù)(真值)大于減數(shù)(真值) JNLEJGE

被減數(shù)(真值)大于或等于減數(shù)(真值)

JNLJL 被減數(shù)(真值)小于減數(shù)(真值) JNGEJLE

被減數(shù)(真值)小于或等于減數(shù)(真值) JNG備注:JB

JumponBelow;低于JNAE

JumponNotAboveorEqual;不高于或等于JNB.JumponNotBelow.;不低于JAE..JumponAboveorEqual.;高于或等于JE

JumponEqual;等于JNE.JumponNotEqual.;不等于JPE…JumponParityEven;偶JPO.JumponParityOdd.;奇JA

JumponAbove.;高于JNBE…JumponNotBeloworEqual.;不低于或等于JNA.JumponNotAbove;不高于JBE.JumponBeloworEqual;低于或等于JNLE

JumponNotLessorEqual;不小于或等于JNL.JumponNotLess;不小于轉(zhuǎn)JNGE

JumponNotGreaterorEqual;不大于或等于轉(zhuǎn)JNG.JumponNotGreater.;不大于轉(zhuǎn)說(shuō)明:*轉(zhuǎn)移范圍在16位尋址方式下為64K;32位尋址方式下為4G*均不影響標(biāo)志位*對(duì)于8086范圍為-128~+127(3)循環(huán)控制指令LOOP

格式:LOOP

短標(biāo)號(hào)

LOOPE/LOOPZ

短標(biāo)號(hào)

LOOPNZ/LOOPNE

短標(biāo)號(hào)

LCXZ

(CX=0)短標(biāo)號(hào)

P70表3.4給出了循環(huán)控制指令的循環(huán)條件4)過(guò)程調(diào)用/返回指令*過(guò)程:子程序*調(diào)用子程序和轉(zhuǎn)移的區(qū)別:是否返回。

*子程序入口地址:子程序第一條指令的第一個(gè)字節(jié)所在存儲(chǔ)單元的地址。所謂調(diào)用子程序,就是把其入口地址送入IP或CS:IP

*CALL類(lèi)指令有兩個(gè)操作:保存返回地址傳送入口地址*調(diào)用指令CALL格式:CALLOP1(子程序入口地址)功能:1)段內(nèi)調(diào)用

把返回地址的偏移地址壓入堆棧,完成“記跡”(記住回家的路),為返回主調(diào)程序作準(zhǔn)備。把子程序的入口地址的偏移地址送入IP,轉(zhuǎn)入子程序

2)段間調(diào)用*把返回地址的段基址和偏移地址都?jí)喝攵褩?IP入口地址的偏移地址

CS入口地址的段基址從尋址角度說(shuō)明OP1的內(nèi)容:a)段內(nèi)直接調(diào)用(用得很普遍)CALL子程序名

。。。。。

CALL0023H

。。。。。0023H

子程序第一條指令。。。。。匯編后,子程序名就是子程序的入口地址例:。。。。。

CALLHEXASC

。。。。。

HEXASC

子程序第一條指令。。。。。匯編后,如果分配給HEXASC的有效地址是0023H,那么以上程序段相當(dāng)于b)段內(nèi)間接調(diào)用

CALL寄存器操作數(shù)

CALL存儲(chǔ)器操作數(shù)例:CALLBX;子程序入口地址應(yīng)當(dāng)存放在BX中

CALLPTER;入口地址應(yīng)當(dāng)存放在存儲(chǔ)器PTER字單元中c)段間直接調(diào)用

CALL子程序名d)段間間接調(diào)用

CALL存儲(chǔ)器操作數(shù)例:注意看段間調(diào)用的匯編語(yǔ)言源程序格式

.486DATASEGMENTUSE16(邏輯段最大長(zhǎng)度為64K)

PNTERDDDISP;存放子程序入口地址

DATAENDS

;

CODE1SEGMENTUSE16;主程序在代碼段CODE1ASSUMECS:CODE1,DS:DATABEG:MOVAX,DATAMOVDS,AX

CALLFARPTRDISP;段間直接調(diào)用

CALLPNTER;段間間接調(diào)用兩種調(diào)用方法,調(diào)用同一個(gè)子程序。注意體會(huì)尋址方式CODE2ENDS;子程序代碼段結(jié)束

ENDBEG;整個(gè)程序結(jié)束MOVAH,4CHINT21HCODE1ENDS;主程序代碼段結(jié)束;

CODE2SEGMENTUSE16;子程序在代碼段CODE2ASSUMECS:CODE2

ORG0020H

DISP PROCFAR;定義子程序?yàn)檫h(yuǎn)過(guò)程

MOVAH,2;DOS功能2

MOVDL,‘A’;顯示‘A’ INT21H RET;返回主程序

DISP ENDP;子程序結(jié)束說(shuō)明:1)CALLFARPTRDISP;段間直接調(diào)用注意:DISP的段基址和偏移地址是怎么確定的?在指令中又是怎么表達(dá)的?

必須用屬性修改運(yùn)算符PTR說(shuō)明子程序是遠(yuǎn)過(guò)程,否則不能返回?cái)帱c(diǎn)。

。。。。。。

CALL2812:0020

CALLFAR[0000]

。。。。。。

子程序從存儲(chǔ)器中取入口地址,包括:基地址:偏移地址CALLFARPTRDISP段基址2812,由系統(tǒng)分配;偏移地址0020,由ORG確定2)該例用兩種尋址方式調(diào)用同一個(gè)子程序,在屏幕上顯示兩個(gè)‘A’。直接尋址

間接尋址

2812:0020DS:0000

2000

1228TD窗口(5)返回指令RET1)段內(nèi)返回:把返回地址的偏移地址送IP,返回主調(diào)程序

2)段間返回:把返回地址的偏移地址送IP

把返回地址的基地址送CS

2)再進(jìn)行SP+N→SP的操作。(以便使SP指向堆棧中存放參數(shù)的單元,這樣,在主程序中可以用POP指令很方便地取出參數(shù)。)(3)帶參數(shù)的返回指令格式:RETN(N為偶數(shù))功能:1)把返回地址送入IP或CS:IP后,RET是指令系統(tǒng)中唯一有不同操作碼(CB/C3)的指令。當(dāng)匯編程序處理“FAR”過(guò)程時(shí),RET的代碼是CB,CALL壓入4字節(jié)返回地址,RET彈出4字節(jié)返回地址;處理“NEAR”過(guò)程時(shí),RET的代碼是C3,CALL壓入2字節(jié)返回地址,RET彈出2字節(jié)返回地址例(RET)

。。。。。CALLSUBRLSUBRH。。。。。。。。。。。。。。。。。。。。子程序。。。。。

RET調(diào)用指令有兩個(gè)動(dòng)作:*把返回地址0013壓入堆棧;*把子程序入口地址SUBR送入IP0010001100120013SUBR

RET指令把返回地址0013H送入IP返回?cái)帱c(diǎn);如果是段間調(diào)用,則段基址送入CS,0013H送入IP例(RETN):設(shè)返回地址為2815:0023,CCCC是子程序回送主程序的參數(shù),堆棧內(nèi)容如圖示。執(zhí)行RET4

指令1)2815:0023

送CS:IP,SP+4SP指向FFFAH

2)SP+4SP指向FFFEH,

如果執(zhí)行POPAX

則:AX=CCCC主程序堆棧子程序參數(shù)

FFFF

XXFFFDCCFFFC

FF

FFFB

DD

SP+4..

FFFA

BB

FFF9EE

RET4FFF8

..28

FFF7..25

SP

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論