温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++内联汇编实现strcmp strcpy strcat

发布时间:2020-06-22 16:48:51 来源:网络 阅读:665 作者:适__ 栏目:编程语言
#include "pch.h"
#include <iostream>

//从别人那里所得颇多,分享自己的所得,如果你有所收获,那便是再好不过了!水平有限,难免出错!
//编译环境: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 <iostream>

//编译环境: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 <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清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);
}


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI