汇编--查找第一个非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);
}

转载于:https://www.cnblogs.com/D0g3/p/4169596.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值