汇编 REPE/REPZ 指令,CMPSB指令
生活随笔
收集整理的這篇文章主要介紹了
汇编 REPE/REPZ 指令,CMPSB指令
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
知識點:
?REPE/REPZ 指令
?CMPSB 指令
一、CMPSB
//cmp //sub
//SCASB//scasw//scasd
cmp byte ptr [edi],al //對標志位的影響相當于sub指令
word,dword
//同時還會修改寄存器EDI的值:如果標志DF為0,則 inc EDI;如果DF為1,則 dec EDI。
//CMPSB
cmps byte ptr [edi],byte ptr [esi]//對標志位的影響相當于sub指令
cmps word ptr //cmpsw
cmps dword ptr //cmpsd
//同時還會修改寄存器EDI的值:如果標志DF為0,則 inc EDI;如果DF為1,則 dec EDI。
二、REPE/REPZ 指令
//上一節課我們了解了REPNE/REPNZ
REPNE SCAS BYTE PTR ES:[EDI] // 當ECX!=0并且ZF==0時 重復執行后邊的指令 每執行一次ECX的值減1
REPE/REPZ cmpsb //// 當ECX!=0并且ZF=1時 重復執行后邊的指令 每執行一次ECX的值減1
三、代碼測試
1、比較字符串是否相等
MOV EDI,s1
MOV ESI,s2
MOV ECX,0xFFFFFFFF
XOR EAX,EAX //查找字串結束標志 '' eax=0
REPNE SCASB // edi,al
NOT ECX //計算字串長度存ECX
MOV EDI,s1
mov ESI,s2
XOR EDX,EDX
REPE CMPSB //不相等則退出
int _tmain(int argc, _TCHAR* argv[])
{
char *s1="abcde21";
char *s2="abcde1";
__asm
{
//mov al,0
xor al,al//eax=0
mov edi,s1//
mov ecx,-1 //0xFFFF FFFF
repnz scasb;
not ecx // '' 計算s1字串長度,指定repz循環次數
mov edi,s1
mov esi,s2
repz cmpsb // edi,esi
//ZF=1 && ECX=0 字串相等
}
return 0;
}
知識點:
?__declspec(naked) 純匯編
?堆棧平衡
?參數傳遞
?用純匯編封裝函數strcmpA
一、CMPSB
//cmp //sub
//SCASB//scasw//scasd
cmp byte ptr [edi],al //對標志位的影響相當于sub指令
word,dword
//同時還會修改寄存器EDI的值:如果標志DF為0,則 inc EDI;如果DF為1,則 dec EDI。
//CMPSB
cmps byte ptr [edi],byte ptr [esi]//對標志位的影響相當于sub指令
cmps word ptr //cmpsw
cmps dword ptr //cmpsd
//同時還會修改寄存器EDI的值:如果標志DF為0,則 inc EDI;如果DF為1,則 dec EDI。
二、REPE/REPZ 指令
//上一節課我們了解了REPNE/REPNZ
REPNE SCAS BYTE PTR ES:[EDI] // 當ECX!=0并且ZF==0時 重復執行后邊的指令 每執行一次ECX的值減1
REPE/REPZ cmpsb //// 當ECX!=0并且ZF=1時 重復執行后邊的指令 每執行一次ECX的值減1
三、代碼測試
1、比較字符串是否相等
int _tmain(int argc, _TCHAR* argv[])
{
char *s1="abcde21";
char *s2="abcde1";
__asm
{
//mov al,0
xor al,al//eax=0
mov edi,s1//
mov ecx,-1 //0xFFFF FFFF
repnz scasb;
not ecx // '' 計算s1字串長度,指定repz循環次數
mov edi,s1
mov esi,s2
repz cmpsb // edi,esi
//ZF=1 && ECX=0 字串相等
}
return 0;
}
__declspec(naked) int strcmpA(char* s1,char *s2)// scasw strcmpW
{
__asm
{
push ebp // esp+4+4 s1 //esp+4+8
mov ebp,esp //構建棧底
//mov al,0
xor al,al//eax=0
mov edi,[ebp+4+4]//
mov ecx,-1 //0xFFFF FFFF
repnz scasb;
not ecx // '' 計算s1字串長度,指定repz循環次數
mov edi,[ebp+4+4]
mov esi,[ebp+4+8]
repz cmpsb // edi,esi
//[edi-1] [esi-1]
xor eax,eax
xor edx,edx
mov al,[edi-1]
mov dl,[esi-1]
sub eax,edx //相等eax=0,大于返回結果>0 小于<0
pop ebp //棧平衡
retn
}
}
總結
以上是生活随笔為你收集整理的汇编 REPE/REPZ 指令,CMPSB指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 印度尼西亚:特斯拉拟投建电池材料厂,无意
- 下一篇: 金铲铲之战的辅助app