首页 > 代码库 > 汇编--查找第一个非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字符的五种方法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。