zoukankan      html  css  js  c++  java
  • 汇编 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
    	}
    }
    
  • 相关阅读:
    三种省市级联下拉列表的写法
    三种省市级联下拉列表的写法
    SQL经典试题(mysql)
    60行代码俄罗斯方块
    ibatis xml中配置信息详解
    60行代码俄罗斯方块
    xinetd
    csh and tcsh
    xinetd restart
    bash sh
  • 原文地址:https://www.cnblogs.com/whzym111/p/6373068.html
Copyright © 2011-2022 走看看