C++內聯彙編實現strcmp strcpy strcat

#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);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章