- UID
- 2
- 精华
- 积分
- 7736
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
郁金香老师在实现strcmp代码为:
_declspec(naked) int strcmpA(char* s1,char* s1)
{
_asm
{
push ebp
mov ebp,esp
xor al,al
mov edi,[ebp+8]
mov ecx,-1
repnz scasb
not ecx
mov edi,[ebp+8]
mov esi,[ebp+C]
repz cmpsb
mov eax,1
jnz end
pop ebp
ret
}
end:
_asm
{
mov eax,0
pop ebp
retn
}
}
这里说说我个人的看法,老师在第一次写好代码的时候运行出错,因为栈帧被内联汇编里的ret指令搞坏了,ret之后的恢复栈帧代码没有运行导致栈混乱,因此老师加入了naked修饰符作为裸函数去掉栈帧,之后又为使用参数而建立栈帧,这样做十分蹩脚,因为相当于自己去掉栈帧之后自己又建立了栈帧,如果是教学的话这种错误情有可原,在这里我提供一种更优的方式解决这个问题:
bool strcmpA(char* s1,char* s2)
{
if(!s1 || !s2)
return false;
if(s1 == s2)
return true;
_asm
{
mov edi,s1
mov ecx,-1
repnz scasb
not ecx
mov edi,s1
mov esi,s2
repz cmpsb
jnz end1
jmp end2
}
end1:
return false;
end2:
return true
}
|
|