鱼C论坛

 找回密码
 立即注册

strcmpA(ASCII码版本汇编实现) 和 strcmpW(UNICODE版本汇编实现)

已有 929 次阅读2015-11-6 16:22 |个人分类:汇编逆向

_declspec(naked) int strcmpA(char* s1, char* s2)
{
_asm
{
push ebp
push esi
push edi
mov ebp,esp
xor al,al
mov edi,[ebp+16]
mov ecx,-1
cld   //保证DF标志位为0,保持正向搜索
repnz scasb
not ecx  //得到s1包含\0的字符串长度,指定repz的循环次数
mov edi,[ebp+16]
mov esi,[ebp+20]
repz cmpsb //edi, esi
//ecx==0 并且 ZF=1  字符串相等
//[edi-1] [esi-1]
xor eax,eax
xor edx,edx
mov al,[edi-1]
mov dl,[esi-1]
sub eax,edx


pop edi
pop esi
pop ebp 
ret

}

}
return :(就是最后一个字符或者最后一个不相等的字符的差值)
两个字符创相等返回0
字符串1大于字符串2返回正数
字符串1小于字符串2 返回负数

_declspec(naked) int strcmpW(wchar_t* s1, wchar_t* s2)
{
_asm
{
push ebp
push esi
push edi
mov ebp,esp
xor ax,ax
mov edi,[ebp+16]
mov ecx,-1
cld   //保证DF标志位为0,保持正向搜索
repnz scasw
not ecx  //得到s1包含\0\0的字符串长度,指定repz的循环次数
mov edi,[ebp+16]
mov esi,[ebp+20]
repz cmpsw //edi, esi
//ecx==0 并且 ZF=1  字符串相等
//[edi-1] [esi-1]
xor eax,eax
xor edx,edx
mov al,[edi-2]
mov dl,[esi-2]
sub eax,edx


pop edi
pop esi
pop ebp 
ret

}

}

return :(就是最后一个字符或者最后一个不相等的字符的差值)
两个字符创相等返回0
字符串1大于字符串2返回正数
字符串1小于字符串2 返回负数


路过

雷人

握手

鲜花

鸡蛋

全部作者的其他最新日志

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-4 20:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部