--------------------------------------------------------------------------------------------------------------------------------------------------------
一.字符串傳送指令? MOVSB/MOVSW/MOVSD
?格式: MOVS OPD,OPS?
?功能: OPD<--OPS.
?
說明: 1. 其中OPS為源串符號地址,OPD為目的串符號地址.
??????????2. 對字節串操作時: 若DF=0,則作加,即[ES:DI]<--[DS:SI],(SI)<--(SI)+1,(DI)<--(DI)+1.
????????????????????????? 若DF=1,則作減,即 (SI)<--(SI)-1,(DI)<--(DI)-1.
??????????3. 對字串操作時: 若DF=0,則作加,即(SI)<--(SI)+2,(DI)<--(DI)+2.
??????????????????????? 若DF=1,則作減,即(SI)<--(SI)-2,(DI)<--(DI)-2.
????????? 4. 在指令中不出現操作數時,字節串傳送格式為MOVSB、字串傳送格式為MOVSW,雙??????????? 字傳送格式為MOVSD
???????? ?5. 本指令不影響標志位.
???????? ?6. 例如: 將存儲器中變量A開始的200個數據串傳送至B開始的存儲區,可用以下程??????????? 序段實現:
??????????????? MOV SI,OFFSET A ;SI指向源串首址
??????????????? MOV DI,OFFSET B ;DI指向目的串首址
??????????????? MOV CX,200??????? ?;字節串或字串長度200送CX
??????????????? CLD???????????????????? ? ;0-->DF?
????? ATOB:MOVS B,A???;對字節串傳送可用MOVSB
??????????????? DEC CX???????????????? ;(CX)<--(CX)-1?
?????????????? ?JNZ ATOB?????????????;?
??????????????? (CX)<>0,轉至ATOB
???????? 7. 用指令MOVS?? ?B,A究竟是字節傳送,還是字傳送,取決于A,B的類型定義.
??????????????? ?若DF=0,則在字傳送時,(SI)<--(SI)+2,(DI)<--(DI)+2.
----------------------------------------------------------------------------------------------------------------------------------------------------------
.
二.比較串指令:CMPSB、CMPSW、CMPSD ;比較 ESI、EDI; 執行后, ESI 與 EDI 的地址移動相應的單位
?
字符串比較指令
?格式: CMPS????? OPRD1,OPRD2
?----? CMPSB
???????? CMPSW
?功能: 由SI尋址的源串中數據與由DI尋址的目的串中數據進行比較,比較結果送標志位,而
?----? 不改變操作數本身.同時SI,DI將自動調整.
?
說明: 1. 其中OPRD2為源串符號地址,OPRD1為目的串符號地址.
??????? 2. 本指令影響標志位AF、CF、OF、SF、PF、ZF.本指令可用來檢查二個字符串是否相同,可以使用循環控制方法對整串進行比較.
??????? 3. 與MOVS相似,CMPS指令也可以不使用操作數,此時可用指令CMPSB或CMPSW分別表示字節串比較或字串比較.
??????? 4. 例如: 對兩個字節串進行比較,若一致,則AL內容置為0;若不一致,則AL內容置為0FFH.程序段如下:
??????????????? MOV SI,OFFSET ST1
??????????????? MOV DI,OFFSET ST2?
??????????????? MOV CX,N
??????????????? CLD?
????? ?NEXT:CMPSB
??????????????? JNZ FIN
??????????????? DEC CX
??????????????? JNZ NEXT
??????????????? MOV AL,0
??????????????? JMP OVR
?????????FIN:MOV AL,0FFH?
??????? OVR:MOV RSLT,AL
??????? 5.CMPSD不大一樣,它是雙字掃描,其它的基本相同.
----------------------------------------------------------------------------------------------------------------------------------------------------------
.
三.掃描串指令:SCASB、SCASW、SCASD ;依據 AL/AX/EAX 中的數據掃描 EDI 指向的數據, 執行后 EDI 自動變化
?字符串搜索指令
?格式: SCAS OPRD
?----? SCASB?
?????????SCASW
???????? SCASD??????? ;它是雙字掃描,其它的基本相同
?功能: 把AL(字節串)或AX(字串)的內容與由DI寄存器尋址的目的串中的數據相減,結果置標志位,但不改變任一操作數本身.地址指針DI自動調整.
?
?說明: 1. 其中OPRD為目的串符號地址.
?----
?????? 2. 本指令影響標志AF、CF、OF、PF、SF、ZF.該指令可查找字符串中的一個關鍵字,只需在本指令執行前,把關鍵字放在AL(字節)或AX(字串 )中,用重復前綴可在整串中查找.
????????? 指令中不使用操作數時,可用指令格式SCASB,SCASW,分別表示字節串或字串搜索指令.
?????? 3. 例如: 尋找字符串中有否'$'字符
??????????????? MOV DI,OFFSET STR
??????????????? MOV CX,N?????????????? ;N為串長度
??????????????? MOV AL,'$'
??????????????? CLD?
???????AGN:SCASB
??????????????? JZ FIN
??????????????? DEC CX
??????????????? JNZ AGN
??????????????? MOV AL,0 ;未找到,AL中置0
??????????????? JMP OVR?
???????? FIN:MOV AL,0FFH?? ;找到,AL中置為0FFH?
???????OVR:MOV RALT,AL
----------------------------------------------------------------------------------------------------------------------------------------------------------
.
四.儲存串指令:STOSB、STOSW、STOSD ;將 AL/AX/EAX 中的數據儲存到 EDI 給出的地址, 執行后 EDI 自動變化
?
?字符串存儲指令 STOS
?格式: STOS OPRD
?----??STOSW
?????????STOSD???它是雙字傳送,其它的基本相同.
?功能: 把AL(字節)或AX(字)中的數據存儲到DI為目的串地址指針所尋址的存儲器單元中去.指針DI將根據DF的值進行自動調整.
?說明: 1. 其中OPRD為目的串符號地址.
? ?????? 2. 本指令不影響標志位.當不使用操作數時,可用STOSB或STOSW分別表示字節串或字串的操作.
---------------------------------------------------------------------------------------------------------------------------------------------------------
.
五.載入串指令:LODSB、LODSW、LODSD ;將 ESI 指向的數據載入到 AL/AX/EAX, 執行后 ESI 自動變化
?
?取字符串元素指令 LODS
?格式: LODS OPRD 其中OPRD為源字符串符號地址.
?
?功能: 把SI尋址的源串的數據字節送AL或數據字送AX中去, 并根據DF的值修改地址指針SI
??????????? 進行自動調整.
?
?說明:?? 1. 本指令不影響標志位.
??? ?????? 2. 當不使用操作數時,可用LODS(字節串)或LODSW(字串)指令.
----------------------------------------------------------------------------------------------------------------------------------------------------------.
上述指令可以有重復前綴
:REP? ? ? ECX > 0 時
REPE (或 REPZ)ECX > 0 且 ZF=1 時
REPNE(或REPNZ)ECX > 0 且 ZF=0 時
;重復前綴可以自動按單位(1、2、4)遞減 ECX
?
嗯?? 串傳送指令?? 功能都是比較強大的??
對一個函數進行反編譯? 我們也會發現?? 編譯器利用了這些串傳送指令 對局部變量進行了初始化??
?
xor eax,eax???????????????????? ;要將這塊內存的每個單元要初始化的數值 送入eax
|
RtlMoveMemory????? 移動內存 ----> ?--->movsb
RtlFillMemory?????????? 填充內存塊 --->eax = ? ---->stosb
RtlZeroMemory?????? ?以0填充內存塊 -->eax = 0 ----->stosb 如果是sw,sd的話 那樣計數的方式就不一樣了
----------------------------------------------------------------------------------------------------------------------------------------------------------?
?
?
?
----------------------------------------------------------------------------------------------------------------------------------------------------------?
?
?
----------------------------------------------------------------------------------------------------------------------------------------------------------?
?
?
?
?
----------------------------------------------------------------------------------------------------------------------------------------------------------?
?