幼儿园亲子游戏滑溜布:vc下的asm问题

来源:百度文库 编辑:神马品牌网 时间:2024/04/29 20:41:33
下面是我找的一个程序块 用来实现快速的memcpy
运行后有错如:F:\joytogame\2D图像效果实现\DDraw.cpp(51) : warning C4405: 'qword' : identifier is reserved word
F:\joytogame\2D图像效果实现\DDraw.cpp(51) : error C2400: inline assembler syntax error in 'opcode'; found 'qword'
这是怎么回事啊?

void Qmemcpy(void *dst, void *src, int nQWORDs)
{
#define CACHEBLOCK 1024 //一个块中有多少QWORDs
//修改此值有可能实现更高的速度
int n=((int)(nQWORDs/CACHEBLOCK))*CACHEBLOCK;
int m=nQWORDs-n;
if (n)
{
_asm //下面先拷贝整数个块
{
mov esi, src;
mov edi, dst;
mov ecx, n; //要拷贝多少个块
lea esi, [esi+ecx*8];
lea edi, [edi+ecx*8];
neg ecx;
mainloop:
mov eax, CACHEBLOCK / 16;
prefetchloop:
mov ebx, [esi+ecx*8]; //预读此循环
mov ebx, [esi+ecx*8+64]; //预读下循环
add ecx, 16;
dec eax;
jnz prefetchloop;
sub ecx, CACHEBLOCK;
mov eax, CACHEBLOCK / 8;
writeloop:
movq mm0, qword ptr [esi+ecx*8 ];
movq mm1, qword ptr [esi+ecx*8+8 ];
movq mm2, qword ptr [esi+ecx*8+16];
movq mm3, qword ptr [esi+ecx*8+24];
movq mm4, qword ptr [esi+ecx*8+32];
movq mm5, qword ptr [esi+ecx*8+40];
movq mm6, qword ptr [esi+ecx*8+48];
movq mm7, qword ptr [esi+ecx*8+56];

movntq qword ptr [edi+ecx*8 ], mm0;
movntq qword ptr [edi+ecx*8+8 ], mm1;
movntq qword ptr [edi+ecx*8+16], mm2;
movntq qword ptr [edi+ecx*8+24], mm3;
movntq qword ptr [edi+ecx*8+32], mm4;
movntq qword ptr [edi+ecx*8+40], mm5;
movntq qword ptr [edi+ecx*8+48], mm6;
movntq qword ptr [edi+ecx*8+56], mm7;
add ecx, 8;
dec eax;
jnz writeloop;
or ecx, ecx;
jnz mainloop;
}
}
if (m)
{
_asm
{
mov esi, src;
mov edi, dst;
mov ecx, m;
mov ebx, nQWORDs;
lea esi, [esi+ebx*8];
lea edi, [edi+ebx*8];
neg ecx;
copyloop:
prefetchnta [esi+ecx*8+512]; //预读
movq mm0, qword ptr [esi+ecx*8 ];
movq mm1, qword ptr [esi+ecx*8+8 ];
movq mm2, qword ptr [esi+ecx*8+16];
movq mm3, qword ptr [esi+ecx*8+24];
movq mm4, qword ptr [esi+ecx*8+32];
movq mm5, qword ptr [esi+ecx*8+40];
movq mm6, qword ptr [esi+ecx*8+48];
movq mm7, qword ptr [esi+ecx*8+56];

movntq qword ptr [edi+ecx*8 ], mm0;
movntq qword ptr [edi+ecx*8+8 ], mm1;
movntq qword ptr [edi+ecx*8+16], mm2;
movntq qword ptr [edi+ecx*8+24], mm3;
movntq qword ptr [edi+ecx*8+32], mm4;
movntq qword ptr [edi+ecx*8+40], mm5;
movntq qword ptr [edi+ecx*8+48], mm6;
movntq qword ptr [edi+ecx*8+56], mm7;
add ecx, 8;
jnz copyloop;
sfence;
emms;
}
}
else
{
_asm
{
sfence;
emms;
}
}
}

warning C4405: 'qword' : identifier is reserved word
标识符qword是一个保留字。

你试着把qword改成别的字符试试。