汇编 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
	}
}

 

posted @ 2017-02-07 10:47  whzym111  阅读(12761)  评论(0编辑  收藏  举报