拜托C和汇编高手给看一下,百思不得其解呀
遇到个一辈子没碰见过的问题,高手给看一下吧,先把代码贴上大家看看
这个代码是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)
}