C++内联汇编实现strcmp strcpy strcat
#include "pch.h"#include <iostream>//从别人那里所得颇多,分享自己的所得,如果你有所收获,那便是再好不过了!水平有限,难免出错!//编译环境:vs2017char szStr1[] = "100001";char szStr2[] = "100001";//思路:把字符串逐个字节拿出来,分别比较bool myStrcmp(char* str1, char*str2){__asm {mov edi,str1 //拷贝str1的地址到edimov esi,str2 //拷贝str2的地址到esimov ecx,0h //ecx累加器 loop1: mov al, byte ptr[edi + ecx] //取一个字节传入al(地址加偏移)mov bl, byte ptr[esi + ecx] //取一个字节传入bl(地址加偏移)add ecx, 1 //ecx+1,取出下一字节test al, al //判断al是否为空,字符串的结尾0jz fun1 //为空则跳转test bl, bl //判断bl是否为空,字符串的结尾0jz fun1 //为空则跳转cmp al,bl //比较al、bljnz fun3 //不相等则跳转jmp loop1 //回到循环头部fun1://某个字符串遍历到结尾0的情况cmp al, bl //比较al、bljz fun2 //相等则跳转jmp fun3 //跳转到fun3 fun2:mov eax, 1h //eax置1jmp end //结束 fun3:mov eax, 0h //eax置0end:}}int main(){bool bRet=myStrcmp(szStr1, szStr2);printf("%d", bRet);}//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#include "pch.h"#include <iostream>//编译环境:vs2017char szStr1[100] = "100001";char szStr2[] = "100001156666666666666666666666";//参数:目的字符串 目的字符串长度 源字符串void myStrcpy(char* str1,int nStrlen, char*str2){//str1会被清空__asm {mov edi,str1 //拷贝str1的地址到edimov esi,str2 //拷贝str2的地址到esimov ecx, nStrlen //ecx累加器cld //方向标志位DF置0 esi->edirep movsb //rep重复指令 movsb按字节拷贝 esi->edi}}int main(){myStrcmp(szStr1,100, szStr2);printf("%s", szStr1);}//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#include "pch.h"#include <iostream>char szStr1[] = "100001";char szStr2[] = "100001156666666666666666666666";//思路:从szStrl1末尾开始拷贝, szStr1l + 字符串长度 - 1,减去一是去掉末尾0//参数:目的字符串 目的字符串长度 源字符串 源字符串长度 void myStrcat(char* str1, int nStrlen1, char*str2, int nStrlen2){__asm{xor eax,eax //异或指令,eax清0add eax, str1 //加上strl起始地址add eax, nStrlen1 //加上字符串长度sub eax,1 //去掉末尾0mov edi, eax //拷贝str1结束的地址到edimov esi, str2 //拷贝str2的地址到esimov ecx, nStrlen2 //ecx累加器cld //方向标志位DF置0 esi->edirep movsb //rep重复指令 movsb按字节拷贝 esi->edi}}int main(){myStrcat(szStr1,7,szStr2,31);printf("%s", szStr1);}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。