第一种
#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); }
时间: 2024-11-08 14:18:25