首页 > 代码库 > 汇编--查找第一个非0字符的五种方法

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

第一种

#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字符的五种方法