• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

(转)一种高速内存校验算法(DelphiMMX优化算法应用之一)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

最近碰到一个项目需要对内存数据进行检测,确定是否和原始值一样,看了现成的算法MD5 CRC 等,感觉速度不太理想,因此动手自己写了用于检测内存数据的高速算法.

该算法利用了CPU的MMX微指令的单指令多数据优点来提高校验速度.对于大数据量校验尤其明显.

 

 

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;

需要说明的是该算法有个缺陷,就是需要字节按64byte对齐,否则检测将不完整,可能出现对最后1-63byte不检测的情况,当然也可以修改上面算法让他自动适应.上面代码也还有优化余地,比如加入cache高速缓存预读处理prefetchnta预读优化速度.由于时间紧张未能加入.

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Delphi出现“Unsatisfied forward or external declaration”错误分析发布时间:2022-07-18
下一篇:
多线程状态(DELPHI)发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap