#include "pch.h"
#include
//从别人那里所得颇多,分享自己的所得,如果你有所收获,那便是再好不过了!水平有限,难免出错!
//编译环境: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);
}
分享文章:C++内联汇编实现strcmpstrcpystrcat
文章位置:
http://njwzjz.com/article/jghesj.html