知识点:
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 //查找字串结束标志 '\\0' 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 // '\\0' 计算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 // '\\0' 计算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 // '\\0' 计算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 }}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 69lv.com 版权所有 湘ICP备2023021910号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务