首页
社区
课程
招聘
[求助]谁有空呢帮我优化一下这个算法,谢谢。
发表于: 2012-3-31 04:09 3248

[求助]谁有空呢帮我优化一下这个算法,谢谢。

2012-3-31 04:09
3248
比如加入cache高速缓存预读处理prefetchnta预读优化速度。
还有个问题。现在是按64byte对齐,否则检测将不完整,可能出现对最后1-63byte不检测的情况。

1.获取原始内存数据校验值算法:

function GetMemoryValue(aSource: Pointer; aSize: DWORD): PInt64; {获取指定内存MMX运算码和CheckMemory配对用}

asm

      mov esi, aSource //开始地址

      mov ecx, aSize   //长度

      shr ecx,6  //除64

      mov eax,0

      emms

      pxor    mm0,mm0

      pxor    mm1,mm1

      pxor    mm2,mm2

      pxor    mm3,mm3

      pxor    mm4,mm4

      pxor    mm5,mm5

      pxor    mm6,mm6

      pxor    mm7,mm7

    @XorLoop:

      pxor    mm0, qword ptr [esi+eax]

      pxor    mm1, qword ptr [esi+eax+$8]

      pxor    mm2, qword ptr [esi+eax+$10]

      pxor    mm3, qword ptr [esi+eax+$18]

      pxor    mm4, qword ptr [esi+eax+$20]

      pxor    mm5, qword ptr [esi+eax+$28]

      pxor    mm6, qword ptr [esi+eax+$30]

      pxor    mm7, qword ptr [esi+eax+$38]

      add eax,$40 //64

      sub ecx, 1

    jnz @XorLoop

      pxor    mm0,mm1

      pxor    mm0,mm2

      pxor    mm0,mm3

      pxor    mm0,mm4

      pxor    mm0,mm5

      pxor    mm0,mm6

      pxor    mm0,mm7

      lea     eax,[ESP+$8] //MMXValue

      movq    qword ptr [eax], mm0  //保存MMX运算值结果

      Sfence

      Emms

end;

2.检测内存数据校验值算法:

function CheckMemory(aSource: Pointer; aSize: DWORD; MMXValue: PInt64): Boolean;

{内存校验检测,MMXVaule为内存正常值由GetMemoryValue获得,被修改返回True}

asm

      mov esi, aSource //开始地址

      mov ecx, aSize   //长度

      shr ecx,6  //除64

      mov eax,0

      emms

      pxor    mm0,mm0

      pxor    mm1,mm1

      pxor    mm2,mm2

      pxor    mm3,mm3

      pxor    mm4,mm4

      pxor    mm5,mm5

      pxor    mm6,mm6

      pxor    mm7,mm7

    @XorLoop:

      pxor    mm0, qword ptr [esi+eax]

      pxor    mm1, qword ptr [esi+eax+$8]

      pxor    mm2, qword ptr [esi+eax+$10]

      pxor    mm3, qword ptr [esi+eax+$18]

      pxor    mm4, qword ptr [esi+eax+$20]

      pxor    mm5, qword ptr [esi+eax+$28]

      pxor    mm6, qword ptr [esi+eax+$30]

      pxor    mm7, qword ptr [esi+eax+$38]

      add eax,$40 //64

      sub ecx, 1

    jnz @XorLoop

      pxor    mm0,mm1

      pxor    mm0,mm2

      pxor    mm0,mm3

      pxor    mm0,mm4

      pxor    mm0,mm5

      pxor    mm0,mm6

      pxor    mm0,mm7

      mov     eax,[ESP+$8] //MMXValue

      movq    mm1, qword ptr [eax] //读值比较

      pxor    mm0,mm1

      movq    qword ptr [eax], mm0  //保存结果

      Sfence

      Emms

      xor  esi,esi

      cmp     dword ptr [eax], esi

      Jne @Fal

      cmp     dword ptr [eax+4], esi

      Jne @Fal

      xor eax,eax  //检验成功

      jmp @exit

   @Fal:  //检验失败

      mov eax,1

   @Exit:

end;

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//