串操作指令可以方便對一組連續的數據進行操作。串操作后自動根據DF標志位修改ESI和EDI,DF = 0時,ESI,EDI遞增,DF = 1時,ESI,EDI遞減。串操作指令有2組,1組實現數據串傳送,另1組實現數據串檢測。串操作指令通常需要反復執行,所以常與重復指令前綴聯合使用,它通過計數器ECX控制重復執行串指令的次數。
?
1.串傳送指令
這組指令實現對串的傳送,它們有,MOVS,STOS,LODS,可以配合REP前綴,但不影響標志。
MOVSB ;BYTE PTR[EDI] = BYTE PTR[ESI]
MOVSW ;WORD PTR[EDI] = WORD PTR[ESI]
MOVSD ;DWORD PTR[EDI] = DWORD PTR[EDI]
STOSB ;BYTE PTR[EDI] = AL
STOSW ;WORD PTR[EDI] = AX
STOSD ;DWORD PTR[EDI] = EAX
LODSB ;AL = BYTE PTR[ESI]
LODSW ;AX = WORD PTR[ESI]
LODSD ;EAX = DWORD PTR[ESI]
?
REP重復指令前綴,可以表示為當ECX != 0時,則繼續執行,直到ECX = 0。可以說,ECX指明了重復次數。如果不使用REP前綴,那么串指令其實是只被執行1次的,這是很多新手易出錯的地方。
比如,我們可以使用串傳送指令代替ZeroMemory。
結合上篇文章,我們可以定義一個宏,程序源碼如下:
ZeroMem MACRO Addr,Sizecld ;;CLD標志位清0,表示遞增正向傳輸xor al,almov edi,Addrmov ecx,Sizerep stosb endm
調用格式如下:
ZeroMem 數據串地址,長度
?
2.串檢測指令
這組指令包含有CMPS和SCAS。由于串比較指令和減法的實質是一樣的,所以它們也影響標志位。這兩個串操作指令可以和REPE/REPZ和REPNE/REPNZ聯合使用,通過ZF判斷是否相等。
CMPSB ;BYTE PTR[ESI] - BYTE PTR[EDI]
CMPSW ;WORD PTR[ESI] - WORD PTR[EDI]
CMPSD ;DWORD PTR[ESI] - DWORD PTR[EDI]
SCASB ;AL - BYTE PTR[EDI]
SCASW ;AX - WORD PTR[EDI]
SCASD ;EAX - DWORD PTR[EDI]
?
REPE/REPZ ;每執行一次指令,ECX遞減1。如果ECX = 0或ZF = 0,則結束重復執行
REPNE/REPNZ ;每執行一次指令,ECX遞減1。如果ECX = 0或ZF = 1,則結束重復執行
?
實際運用時要注意區分,串操作指令結束時因為比較完了,還是因為標志位問題。
我根據串操作指令定義了一個宏,可以代替ComapreMemory,如下:
CmpMem MACRO Addr1,Addr2,SizeLOCAL nxor eax,eaxmov esi,Addr1mov edi,Addr2mov ecx,Sizerepe cmpsb ;;當ZF = 0時,結束是因為有不同jnz n ;;當兩數據串完全相等時,則EAX = 1inc eax n: endm
?