CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  其他开发语言 >  汇编语言

谁能用MMX汇编帮我写一段字符串比较函数?

楼主lyzcom(初学者)2003-11-02 17:22:40 在 其他开发语言 / 汇编语言 提问

我看书上说:Intel扬言使用MMX中的pcmpeq(具体的指令忘了)进行字符串是否完全一样的比较处理,速度比普通的检查strcmp返回值是否为0的方法快80%!!但是我却一直没有找到源代码。哪位兄弟能帮忙写一个呢? 问题点数:50、回复次数:9Top

1 楼hswxf(黄山一刀)回复于 2003-11-02 21:06:47 得分 0

你说的是针对长串或固定格式的包的比较吧  
  这是MMX的优势呀!Top

2 楼lyzcom(初学者)回复于 2003-11-02 21:30:47 得分 0

哪位兄弟能帮我写一段?不管是长是短,反正MMX做这个的速度肯定要比普通的for循环的方法快。Top

3 楼lyzcom(初学者)回复于 2003-11-03 22:02:30 得分 0

upupup…………那位兄弟帮帮我把。Top

4 楼csdsjkk()回复于 2003-11-03 22:49:59 得分 0

.mmx  
  .data  
                  xx             db   1,2,3,4,5,6,7,8  
                  yy             db   2,3,3,4,1,2,3,4  
                  zz             db   8   dup   (0)  
   
  .code  
                   
                  movq   mm0,qword   ptr   xx  
                  pcmpeqb   mm0,qword   ptr   yy  
                  movq   qword   ptr   zz,mm0  
   
  比较xx和yy,  
  执行完后zz的值如下:  
  00   00   ff   ff   00   00   00   00,  
  意思是:相等为ff,不等为00  
   
   
   
   
   
   
   
   
   
   
  Top

5 楼lyzcom(初学者)回复于 2003-11-04 01:09:54 得分 0

这个好象只能比较8个字节的字符串吧?我需要比较任意长度的。。。。。Top

6 楼bluedreammer(瀟瀟鳥)回复于 2003-11-04 08:43:46 得分 0

學習....  
  markTop

7 楼csdsjkk()回复于 2003-11-04 10:05:28 得分 0

所谓mmx比cmp指令快,  
  偶猜测是指:  
  一条mmx指令可以操作8个字节,而一条cmp最多比较4个字节,  
  所以,扣除其他取初值、检查结果等开销,  
  综合算下来,mmx大概比普通cmp等指令快80%  
  Top

8 楼lyzcom(初学者)回复于 2003-11-04 20:39:20 得分 0

那空间具体的代码如何写呢?????为什么还是没有人给出具体的代码呢?我是一个汇编盲啊。但是不得已我需要使用这段代码啊。哪位大哥行行好吧。给出任意长度字符串的使用MMX指令作比较的代码吧!只要比较两个字符串是否完全相等就可以了。Top

9 楼csdsjkk()回复于 2003-11-04 22:59:00 得分 50

.586  
   
  .model   flat,stdcall  
  option   casemap:none  
   
  include   windows.inc  
  include   user32.inc  
  include   kernel32.inc  
  includelib   user32.lib  
  includelib   kernel32.lib  
   
  .data  
  title1     db   0  
  buf           db   255   dup   (?)  
  gs1           db   '%d',0  
  xx             db   1,2,3,4,5,6,7,8,9  
  yy             db   1,2,3,4,5,6,7,8,9  
   
  .code  
   
  testequ proc   near  
   
  ;esi   指向串1  
  ;edi   指向串2  
  ;ecx   串长度  
  ;返回eax=1表示相等,eax=0表示不等  
   
  .mmx  
                  push   ecx  
                  shr   ecx,3  
                  jecxz   cont1  
  cont:  
                  movq   mm0,qword   ptr   [esi]  
                  pcmpeqb   mm0,qword   ptr   [edi]  
                  movd   eax,mm0  
                  psrlq   mm0,32  
                  movd   edx,mm0  
                  cmp   eax,edx  
                  jne   notequ  
                  cmp   eax,-1  
                  jne   notequ  
                  add   esi,8  
                  add   edi,8  
                  loop   cont  
  cont1:  
                  pop   ecx  
                  and   ecx,7  
                  jecxz   isequ  
                  cld  
                  repe   cmpsb  
                  jne   notequ1  
  isequ:  
                  mov   eax,1  
                  ret  
  notequ:  
                  pop   ecx  
  notequ1:  
                  mov   eax,0  
                  ret  
  testequ   endp  
   
   
   
  start:  
  mov   esi,offset   xx  
  mov   edi,offset   yy  
                  mov   ecx,9  
  call   testequ  
   
  invoke     wsprintf,addr   buf,addr   gs1,eax  
                  invoke   MessageBoxA,0,addr   buf,addr   title1,MB_OK  
   
  invoke   ExitProcess,eax  
   
  end   start  
   
   
  Top

相关问题

  • 字符串函数?
  • 字符串函数
  • ATL & ANSI字符串函数
  • 字符串比较函数
  • 字符串处理函数
  • 字符串函数问题
  • 字符串匹配函数?
  • 汇编下如何处理字符串?
  • 求判断一字符串在数组中字符串函数?
  • 求函数:截取字符串

关键词

  • 指令
  • 代码
  • 普通
  • db
  • 字符串
  • mmx
  • movq
  • 相等
  • 哪位
  • jne notequ

得分解答快速导航

  • 帖主:lyzcom
  • csdsjkk

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo