谁能用MMX汇编帮我写一段字符串比较函数?
我看书上说: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




