汇编 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 //查找字串结束标志 '\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 } }