拜托C和汇编高手给看一下,百思不得其解呀

MarkDong 2003-09-12 12:28:04
遇到个一辈子没碰见过的问题,高手给看一下吧,先把代码贴上大家看看
这个代码是VC运行时的汇编代码,所以里面掺杂了些C++代码
主要功能是将诸如"6cab6c88......"这样的字符串以每两个构成一个字节码形成一个字节数组6c ab 6c 88 .......
现在的问题是6c可以正确的转换,可是ab 88等则不能正确转换,均得到0,不明白了。求各位汇编高手给看一下

// 将CString保存的MD5串转换为ByteArray
void CTools::MD5StringToByteArray(CString* pString, unsigned char* pByteArray)
{
00418AF0 push ebp
00418AF1 mov ebp,esp
00418AF3 sub esp,0E4h
00418AF9 push ebx
00418AFA push esi
00418AFB push edi
00418AFC lea edi,[ebp-0E4h]
00418B02 mov ecx,39h
00418B07 mov eax,0CCCCCCCCh
00418B0C rep stos dword ptr [edi]
unsigned char onebyte;
unsigned char onechar;

if(pString->GetLength() != 32) return;
00418B0E mov ecx,dword ptr [pString]
00418B11 call ATL::CSimpleStringT<char>::GetLength (411DC5h)
00418B16 cmp eax,20h
00418B19 je CTools::MD5StringToByteArray+30h (418B20h)
00418B1B jmp CTools::MD5StringToByteArray+0F2h (418BE2h)
for(int i = 0; i<16; i++)
00418B20 mov dword ptr [i],0
00418B27 jmp CTools::MD5StringToByteArray+42h (418B32h)
00418B29 mov eax,dword ptr [i]
00418B2C add eax,1
00418B2F mov dword ptr [i],eax
00418B32 cmp dword ptr [i],10h
00418B36 jge CTools::MD5StringToByteArray+0F2h (418BE2h)
{
onebyte = 0;
00418B3C mov byte ptr [onebyte],0

// 高4位
onechar = pString->GetAt(i*2);
00418B40 mov eax,dword ptr [i]
00418B43 shl eax,1
00418B45 push eax
00418B46 mov ecx,dword ptr [pString]
00418B49 call ATL::CSimpleStringT<char>::GetAt (411DACh)
00418B4E mov byte ptr [onechar],al
if(onechar >= '0' && onechar <= '9')
00418B51 movzx eax,byte ptr [onechar]
00418B55 cmp eax,30h
00418B58 jl CTools::MD5StringToByteArray+88h (418B78h)
00418B5A movzx eax,byte ptr [onechar]
00418B5E cmp eax,39h
00418B61 jg CTools::MD5StringToByteArray+88h (418B78h)
onebyte |= ((onechar - (unsigned char)'0') << 4);
00418B63 movzx eax,byte ptr [onechar]
00418B67 sub eax,30h
00418B6A shl eax,4
00418B6D movzx ecx,byte ptr [onebyte]
00418B71 or ecx,eax
00418B73 mov byte ptr [onebyte],cl
else
00418B76 jmp CTools::MD5StringToByteArray+9Bh (418B8Bh)
onebyte |= ((onechar - (unsigned char)'a' + (unsigned char)0x0a) << 4);
00418B78 movzx eax,byte ptr [onechar]
00418B7C sub eax,57h
00418B7F shl eax,4
00418B82 movzx ecx,byte ptr [onebyte]
00418B86 or ecx,eax
00418B88 mov byte ptr [onebyte],cl

// 低4位
onechar = pString->GetAt(i*2+1);
00418B8B mov eax,dword ptr [i]
00418B8E lea ecx,[eax+eax+1]
00418B92 push ecx
00418B93 mov ecx,dword ptr [pString]
00418B96 call ATL::CSimpleStringT<char>::GetAt (411DACh)
00418B9B mov byte ptr [onechar],al
if(onechar >= '0' && onechar <= '9')
00418B9E movzx eax,byte ptr [onechar]
00418BA2 cmp eax,30h
00418BA5 jl CTools::MD5StringToByteArray+0D2h (418BC2h)
00418BA7 movzx eax,byte ptr [onechar]
00418BAB cmp eax,39h
00418BAE jg CTools::MD5StringToByteArray+0D2h (418BC2h)
onebyte |= (onechar - (unsigned char)'0');
00418BB0 movzx eax,byte ptr [onechar]
00418BB4 sub eax,30h
00418BB7 movzx ecx,byte ptr [onebyte]
00418BBB or ecx,eax
00418BBD mov byte ptr [onebyte],cl
else
00418BC0 jmp CTools::MD5StringToByteArray+0E2h (418BD2h)
onebyte |= (onechar - (unsigned char)'a' + (unsigned char)0x0a);
00418BC2 movzx eax,byte ptr [onechar]
00418BC6 sub eax,57h
00418BC9 movzx ecx,byte ptr [onebyte]
00418BCD or ecx,eax
00418BCF mov byte ptr [onebyte],cl

pByteArray[i] = onebyte;
00418BD2 mov eax,dword ptr [pByteArray]
00418BD5 add eax,dword ptr [i]
00418BD8 mov cl,byte ptr [onebyte]
00418BDB mov byte ptr [eax],cl
}
00418BDD jmp CTools::MD5StringToByteArray+39h (418B29h)
}
...全文
42 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
MarkDong 2003-09-13
  • 打赏
  • 举报
回复
靠,昨天下午后来就发现了,是VC7开发环境的bug,内存里保存的是正确的,可能是显示模块的错误,妈的,散分
asmzyd 2003-09-13
  • 打赏
  • 举报
回复
有时候,开发环境的debug程序会出现屏幕更新不及时的情况.
最好再用softice看一下.
sbw 2003-09-12
  • 打赏
  • 举报
回复
真的搞不懂为什么了,试一试在别的机器上运行看看。
MarkDong 2003-09-12
  • 打赏
  • 举报
回复
程序肯定没错,我用VC6试过了,没问题,VC7就是不行

我看了一下汇编,只有做或操作的时候不一样

出错就是这句C语句 pByteArray[i] = onebyte;

汇编如下:
00418BD2 mov eax,dword ptr [pByteArray]
00418BD5 add eax,dword ptr [i]
00418BD8 mov cl,byte ptr [onebyte]
00418BDB mov byte ptr [eax],cl

其中第三行从内存取值后,cl就为0,可是内存地址里明明是0xab
关键奇怪的是如果内存里是0x6c就没问题,是0xab就有问题,妈的
spbabyba 2003-09-12
  • 打赏
  • 举报
回复
程序没错,你看看是不是别的地方出错了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
spbabyba 2003-09-12
  • 打赏
  • 举报
回复
你这就是VC写的程序,编译的时候生成的汇编.
出错是你C代码写错了.
MarkDong 2003-09-12
  • 打赏
  • 举报
回复
源码在这里

// 将CString保存的MD5串转换为ByteArray
void CTools::MD5StringToByteArray(CString* pString, unsigned char* pByteArray)
{
unsigned char onebyte;
unsigned char onechar;

if(pString->GetLength() != 32) return;
for(int i = 0; i<16; i++)
{
onebyte = 0;

// 高4位
onechar = pString->GetAt(i*2);
if(onechar >= '0' && onechar <= '9')
onebyte |= ((onechar - (unsigned char)'0') << 4);
else
onebyte |= ((onechar - (unsigned char)'a' + (unsigned char)0x0a) << 4);

// 低4位
onechar = pString->GetAt(i*2+1);
if(onechar >= '0' && onechar <= '9')
onebyte |= (onechar - (unsigned char)'0');
else
onebyte |= (onechar - (unsigned char)'a' + (unsigned char)0x0a);

pByteArray[i] = onebyte;
}
}
sbw 2003-09-12
  • 打赏
  • 举报
回复
不能给C源码看么?

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧