C++内联汇编实现strcmpstrcpystrcat-创新互联
#include "pch.h" #include创新互联公司于2013年成立,是专业互联网技术服务公司,拥有项目做网站、成都网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元武进做网站,已为上家服务,为武进各地企业和个人服务,联系电话:13518219792//从别人那里所得颇多,分享自己的所得,如果你有所收获,那便是再好不过了!水平有限,难免出错! //编译环境:vs2017 char szStr1[] = "100001"; char szStr2[] = "100001"; //思路:把字符串逐个字节拿出来,分别比较 bool myStrcmp(char* str1, char*str2) { __asm { mov edi,str1 //拷贝str1的地址到edi mov esi,str2 //拷贝str2的地址到esi mov 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是否为空,字符串的结尾0 jz fun1 //为空则跳转 test bl, bl //判断bl是否为空,字符串的结尾0 jz fun1 //为空则跳转 cmp al,bl //比较al、bl jnz fun3 //不相等则跳转 jmp loop1 //回到循环头部 fun1://某个字符串遍历到结尾0的情况 cmp al, bl //比较al、bl jz fun2 //相等则跳转 jmp fun3 //跳转到fun3 fun2: mov eax, 1h //eax置1 jmp end //结束 fun3: mov eax, 0h //eax置0 end: } } int main() { bool bRet=myStrcmp(szStr1, szStr2); printf("%d", bRet); } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #include "pch.h" #include //编译环境:vs2017 char szStr1[100] = "100001"; char szStr2[] = "100001156666666666666666666666"; //参数:目的字符串 目的字符串长度 源字符串 void myStrcpy(char* str1,int nStrlen, char*str2) { //str1会被清空 __asm { mov edi,str1 //拷贝str1的地址到edi mov esi,str2 //拷贝str2的地址到esi mov ecx, nStrlen //ecx累加器 cld //方向标志位DF置0 esi->edi rep movsb //rep重复指令 movsb按字节拷贝 esi->edi } } int main() { myStrcmp(szStr1,100, szStr2); printf("%s", szStr1); } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #include "pch.h" #include 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清0 add eax, str1 //加上strl起始地址 add eax, nStrlen1 //加上字符串长度 sub eax,1 //去掉末尾0 mov edi, eax //拷贝str1结束的地址到edi mov esi, str2 //拷贝str2的地址到esi mov ecx, nStrlen2 //ecx累加器 cld //方向标志位DF置0 esi->edi rep movsb //rep重复指令 movsb按字节拷贝 esi->edi } } int main() { myStrcat(szStr1,7,szStr2,31); printf("%s", szStr1); }
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
文章名称:C++内联汇编实现strcmpstrcpystrcat-创新互联
分享链接:http://lswzjz.com/article/cdsios.html