码迷,mamicode.com
首页 > 其他好文 > 详细

汇编--查找第一个非0字符的五种方法

时间:2014-12-17 17:58:50      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:style   blog   ar   io   color   sp   div   log   ad   

第一种

#include <windows.h>
#include <stdio.h>

void main(void)
{
    int m = 0, cout = 0;
    char cStr2Find[1024] = {0};
    printf("请输入一段字符串");
    scanf("%s", cStr2Find);
    __asm{
        pushad;                    //保存所有寄存器
        lea esi,cStr2Find;        //esi指向查找字符串
        xor ecx,ecx;            //ecx清零
_loop:
        lodsb;                    //循环得到字符串长度
        or al,al;
        jz _end;
        inc ecx;
        jmp _loop;
_end:
        mov ebx,ecx;            //保存字符串长度到ebx
        inc ecx;
        lea esi,cStr2Find;
_loop1:
        lodsb;                    //循环查找第一个非字符‘0‘的字符
        dec ecx;                //ecx用来判断是否找完字符串
        or ecx,ecx;
        jz _end2;
        cmp al,0;
        je _loop1;                //不是字符‘0‘就往上跳
        sub ebx,ecx;            //是字符‘0‘,就得到我们对比了多少个字符..
        mov cout,ebx;            //也就是非‘0‘字符在哪个位置
        jmp _end3;
_end2:
        mov cout,-1;
_end3:
        popad;
    }
    printf("非0位置: %d\n",cout);
}

第二种:

#include <windows.h>
#include <stdio.h>

void main(void)
{
    int m = 0, cout = 0;
    char cStr2Find[1024] = {0};
    printf("请输入一段字符串");
    scanf("%s", cStr2Find);
    __asm{
        pushad;                    //保存所有寄存器
        lea edi,cStr2Find;
        mov ecx,-1;
        xor eax,eax;
        repne scas byte ptr es:[edi];
        not ecx;
        dec ecx;                //这一堆指令是计算字符串长度
        
        mov ebx,ecx;            //ebx是字符串长度
        
        lea edi,cStr2Find;        
        mov eax,0x30;
        repe scas byte ptr es:[edi];    //扫描第一个非0字符
        or ecx,ecx;                //判断扫描玩没?
        je  _panduan;            //扫描完就跳
        sub ebx,ecx;            //没有扫描完说明含有非0字符
        dec ebx;
        mov cout,ebx;            //把位置给cout
        jmp _end;
_panduan:                    //注意,如果最后一个字符是非0,也会跳到这里    
        dec edi;
        cmp byte ptr[edi],0;    //判断最后一个字符是不是字符0
        je _AllAreZero;        //是就跳
        dec ebx;
        mov cout,ebx;        //最后一个字符是非0
        jmp _end;
_AllAreZero:
        mov cout,-1;
_end:
        popad;
    }
    printf("非0位置: %d\n",cout);
}

第三种:

#include <windows.h>
#include <stdio.h>

void main(void)
{
    int m = 0, cout = 0;
    char cStr2Find[1024] = {0};
    printf("请输入一段字符串");
    scanf("%s", cStr2Find);
    __asm{
        pushad;                    //保存所有寄存器
        lea esi,cStr2Find;        //esi指向查找字符串
        lea edi,cStr2Find;

        mov ecx,-1;
        xor eax,eax;
        repne scas byte ptr es:[edi];
        not ecx;
        dec ecx;                //这一堆指令是求字符串长度

        mov ebx,ecx

_loop:
        cmp byte ptr[esi], 0;
        jne ok;
        inc esi;
        loop _loop;            //循环对比
        mov cout,-1;        //没找到
        jmp _end;            
ok:
        sub ebx,ecx;        //找到了
    //    dec ebx;
        mov cout,ebx;
_end:
        popad;
    }
    printf("非0位置: %d\n",cout);
}

第四种:

#include <windows.h>
#include <stdio.h>

void main(void)
{
    int m = 0, cout = 0;
    char cStr2Find[1024] = {0};
    printf("请输入一段字符串");
    scanf("%s", cStr2Find);
    __asm{
        pushad;                    //保存所有寄存器
        lea edi,cStr2Find;
        mov ecx,-1;
        xor eax,eax;
        repne scas byte ptr es:[edi];
        not ecx;
        dec ecx;                //这一堆指令是计算字符串长度
        
        mov ebx,ecx;            //ebx是字符串长度
        
        lea esi,cStr2Find;

_loop:
        mov al,0;
        xor al, byte ptr[esi];    
        or al,al;
        jne _ok;
        inc esi;
        loop _loop;                //循环对比是不是字符0
        jmp _AllAreZero
_ok:
        sub ebx,ecx;        
        mov cout,ebx;
        jmp _end;
_AllAreZero:
        mov cout,-1;
_end:
        popad;
    }
    printf("非0位置: %d\n",cout);
}

第五种:

#include <windows.h>
#include <stdio.h>

void main(void)
{
    int m = 0, cout = 0;
    char cStr2Find[1024] = {0};
    printf("请输入一段字符串");
    scanf("%s", cStr2Find);
    __asm{
        pushad;                    //保存所有寄存器
        lea edi,cStr2Find;
        mov ecx,-1;
        xor eax,eax;
        repne scas byte ptr es:[edi];
        not ecx;
        dec ecx;                //这一堆指令是计算字符串长度
        
        mov ebx,ecx;            //ebx是字符串长度
        
        lea esi,cStr2Find;

_loop:
        mov al,0;
        sub al, byte ptr[esi];    //sub
        or al,al;
        jne _ok;            //判断是否是非0;
        inc esi;
        dec ecx;        //判断对比完没
        cmp ecx,0;            
        je _AllAreZero;    //对比完就跳
        jmp _loop;
_ok:
        sub ebx,ecx;        
        mov cout,ebx;
        jmp _end;
_AllAreZero:
        mov cout,-1;
_end:
        popad;
    }
    printf("非0位置: %d\n",cout);
}

汇编--查找第一个非0字符的五种方法

标签:style   blog   ar   io   color   sp   div   log   ad   

原文地址:http://www.cnblogs.com/D0g3/p/4169596.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!