VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > 汇编语言 >
  • 汇编 REPE/REPZ 指令,CMPSB指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
知识点:
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;
}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
知识点:
__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
    }
}

 

原文:https://www.cnblogs.com/whzym111/p/6373068.html

相关教程