69,373
社区成员
发帖
与我相关
我的任务
分享
void *memcopy_dword(void *dest, void *src, int n)
{
_asm {
mov esi, src
mov edi, dest
mov ecx, n
mov ebx, ecx // ebx, ecx 都是4个字节的,一次过复制4个字节..
and ecx, 3 //所以,原始字符串的改变也是,一次就改变4个字节...
rep movsb
mov ecx, ebx
shr ecx, 2
rep movsd
}
return dest;
}
至于实际上,你的程序里面到底是调用那个版本的 strcpy ,这个是由编译器和系统函数库决定的.由不得你决定,有些程序安装的是最慢的(如1楼所说)的版本,也有些程序安装的是优化后的4个字节为单位复制的版本(貌似vs基本上都是)....
所以,你的这个程序的运行结果,在不同的系统函数库下(比如vc/vs/tc等),可能是不同的...注意:可能而已..
仅供参考..
#include<stdio.h>
#include <string.h>
int main()
{
char str[7] = "aabbcc";
strcpy(str+2, str);
printf("%s\n", str);
return 0;
}
你定义的是str[7] = "aabbcc", str[6]的值并不会是'\0', 但是你在strcpy的时候,很明显str+2在复制时会溢出,因此str+2的值会是"aabbcc", 所以我觉得printf(str)时,其值应该是"aaaabbcc", 而printf(str+2)的值是"aabbcc"char * strcpy( char *strDest, const char *strSrc )
{
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0’ );
return address;
}