请问memcmp这个函数他返回的效果和strcmp一样的,如果我想要memcmp来返回2个连续内存中首个不相同的地址,那么应该怎么去修改这个memcmp??全是汇编啊,看不懂 @@
有会的请帮我看看怎么修改??我个人觉得汇编可能比较快一点,所以想改这段汇编代码,请看清问题再回答。
附memcmp的汇编代码:
CODESEG public memcmp
memcmp proc .FPO ( 0, 3, 0, 0, 0, 0 ) mov eax,[esp+0ch] ; eax = counter
test eax,eax ; test if counter is zero
jz short retnull ; return 0 mov edx,[esp+4] ; edx = buf1
push esi
push edi
mov esi,edx ; esi = buf1
mov edi,[esp+10h] ; edi = buf2; Check for dword (32 bit) alignment
or edx,edi
and edx,3 ; edx=0 iff buf1 are buf2 are aligned
jz short dwords; Strings are not aligned. If the caller knows the strings (buf1 and buf2) are
; different, the function may be called with length like -1. The difference
; may be found in the last dword of aligned string, and because the other
; string is misaligned it may cause page fault. So, to be safe. the comparison
; must be done byte by byte.
test eax,1
jz short main_loop mov cl,[esi]
cmp cl,[edi]
jne short not_equal
inc esi
inc edi
dec eax
jz short done ; eax is already 0main_loop:
mov cl,[esi]
mov dl,[edi]
cmp cl,dl
jne short not_equal mov cl,[esi+1]
mov dl,[edi+1]
cmp cl,dl
jne short not_equal add edi,2
add esi,2 sub eax,2
jnz short main_loop
done:
pop edi
pop esi
retnull:
ret ; _cdecl return
dwords:
mov ecx,eax
and eax,3 ; eax= counter for tail loop shr ecx,2
jz short tail_loop_start
; counter was >=4 so may check one dword
rep cmpsd jz short tail_loop_start; in last dword was difference
mov ecx,[esi-4] ; load last dword from buf1 to ecx
mov edx,[edi-4] ; load last dword from buf2 to edx
cmp cl,dl ; test first bytes
jne short difference_in_tail
cmp ch,dh ; test seconds bytes
jne short difference_in_tail
shr ecx,10h
shr edx,10h
cmp cl,dl ; test third bytes
jne short difference_in_tail
cmp ch,dh ; they are different, but each one is bigger?
; jmp short difference_in_taildifference_in_tail:
mov eax,0
; buf1 < buf2 buf1 > buf2
not_equal:
sbb eax,eax ; AX=-1, CY=1 AX=0, CY=0
pop edi ; counter
sbb eax,-1 ; AX=-1 AX=1
pop esi
ret ; _cdecl return; in tail loop we test last three bytes (esi and edi are aligned on dword
; boundary)
tail_loop_start: test eax,eax ; eax is counter%4 (number of bytes for tail
; loop)
jz short done ; taken if there is no tail bytes
mov edx,[esi] ; load dword from buf1
mov ecx,[edi] ; load dword from buf2
cmp dl,cl ; test first bytes
jne short difference_in_tail
dec eax ; counter--
jz short tail_done
cmp dh,ch ; test second bytes
jne short difference_in_tail
dec eax ; counter--
jz short tail_done
and ecx,00ff0000h ; test third bytes
and edx,00ff0000h
cmp edx,ecx
jne short difference_in_tail
dec eax
tail_done:
pop edi
pop esi
ret ; _cdecl returnmemcmp endp
end
有会的请帮我看看怎么修改??我个人觉得汇编可能比较快一点,所以想改这段汇编代码,请看清问题再回答。
附memcmp的汇编代码:
CODESEG public memcmp
memcmp proc .FPO ( 0, 3, 0, 0, 0, 0 ) mov eax,[esp+0ch] ; eax = counter
test eax,eax ; test if counter is zero
jz short retnull ; return 0 mov edx,[esp+4] ; edx = buf1
push esi
push edi
mov esi,edx ; esi = buf1
mov edi,[esp+10h] ; edi = buf2; Check for dword (32 bit) alignment
or edx,edi
and edx,3 ; edx=0 iff buf1 are buf2 are aligned
jz short dwords; Strings are not aligned. If the caller knows the strings (buf1 and buf2) are
; different, the function may be called with length like -1. The difference
; may be found in the last dword of aligned string, and because the other
; string is misaligned it may cause page fault. So, to be safe. the comparison
; must be done byte by byte.
test eax,1
jz short main_loop mov cl,[esi]
cmp cl,[edi]
jne short not_equal
inc esi
inc edi
dec eax
jz short done ; eax is already 0main_loop:
mov cl,[esi]
mov dl,[edi]
cmp cl,dl
jne short not_equal mov cl,[esi+1]
mov dl,[edi+1]
cmp cl,dl
jne short not_equal add edi,2
add esi,2 sub eax,2
jnz short main_loop
done:
pop edi
pop esi
retnull:
ret ; _cdecl return
dwords:
mov ecx,eax
and eax,3 ; eax= counter for tail loop shr ecx,2
jz short tail_loop_start
; counter was >=4 so may check one dword
rep cmpsd jz short tail_loop_start; in last dword was difference
mov ecx,[esi-4] ; load last dword from buf1 to ecx
mov edx,[edi-4] ; load last dword from buf2 to edx
cmp cl,dl ; test first bytes
jne short difference_in_tail
cmp ch,dh ; test seconds bytes
jne short difference_in_tail
shr ecx,10h
shr edx,10h
cmp cl,dl ; test third bytes
jne short difference_in_tail
cmp ch,dh ; they are different, but each one is bigger?
; jmp short difference_in_taildifference_in_tail:
mov eax,0
; buf1 < buf2 buf1 > buf2
not_equal:
sbb eax,eax ; AX=-1, CY=1 AX=0, CY=0
pop edi ; counter
sbb eax,-1 ; AX=-1 AX=1
pop esi
ret ; _cdecl return; in tail loop we test last three bytes (esi and edi are aligned on dword
; boundary)
tail_loop_start: test eax,eax ; eax is counter%4 (number of bytes for tail
; loop)
jz short done ; taken if there is no tail bytes
mov edx,[esi] ; load dword from buf1
mov ecx,[edi] ; load dword from buf2
cmp dl,cl ; test first bytes
jne short difference_in_tail
dec eax ; counter--
jz short tail_done
cmp dh,ch ; test second bytes
jne short difference_in_tail
dec eax ; counter--
jz short tail_done
and ecx,00ff0000h ; test third bytes
and edx,00ff0000h
cmp edx,ecx
jne short difference_in_tail
dec eax
tail_done:
pop edi
pop esi
ret ; _cdecl returnmemcmp endp
end
解决方案 »
- MDI,如何在标题栏上建立选项卡和按钮,类似谷歌浏览器那种
- 用axWindowsMediaPlayer1做视频播放器怎么能让视频跟播放器一样大小
- 如何用CToolTipCtrl给CTreeView加提示
- 按钮响应
- CListCtrl删除图片后,原图片位置成为空白,如何解决
- WaitCommEvent在XP下是否不能用啊?
- 在ADD Member Variable时遇到的问题
- 关于状态栏的问题(在线等)
- 怎么在代码中,取得和设置,按钮(BUTTON)的标题,
- mfc 线程问题 会报内存不可读来帮下忙吧
- 隐藏进程有一种新的方案,但在xp下不能隐藏,请问应如何修改呢?
- 高分求图像模板匹配算法源程序,UP者有分
size_t i;
void *q1=p1, *q2=p2; for(i=0; i<size; i++, q1++, q2++){
if((*q1)!=(*q2)) return i; // 一个个字节比较,不一样就返回该位置
}
return size; // 所有字节都一样,表明相等
}
就是
__asm
{
……
}