Текст из дизасм. листнинга, переделал под C. ubuf содержит неизвестно что. Кто-нибудь встречался с этим или просто знает что это? Код (Text): char ubuf[168]; unsigned buf[] = {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4}; unsigned sum = 0; for (unsigned i = 0; i < 168; i++) sum = buf[ubuf[i]&15]
Код (Text): .text:71F22914 ; Attributes: bp-based frame .text:71F22914 .text:71F22914 ; __stdcall CalculateDuration(x) .text:71F22914 _CalculateDuration@4 proc near ; CODE XREF: ToplScheduleImport(x,x)+28p .text:71F22914 ; ToplPScheduleValid(x)+1Bp .text:71F22914 .text:71F22914 var_40 = dword ptr -40h .text:71F22914 var_3C = dword ptr -3Ch .text:71F22914 var_38 = dword ptr -38h .text:71F22914 var_34 = dword ptr -34h .text:71F22914 var_30 = dword ptr -30h .text:71F22914 var_2C = dword ptr -2Ch .text:71F22914 var_28 = dword ptr -28h .text:71F22914 var_24 = dword ptr -24h .text:71F22914 var_20 = dword ptr -20h .text:71F22914 var_1C = dword ptr -1Ch .text:71F22914 var_18 = dword ptr -18h .text:71F22914 var_14 = dword ptr -14h .text:71F22914 var_10 = dword ptr -10h .text:71F22914 var_C = dword ptr -0Ch .text:71F22914 var_8 = dword ptr -8 .text:71F22914 var_4 = dword ptr -4 .text:71F22914 PSchedule = dword ptr 8 .text:71F22914 .text:71F22914 push ebp .text:71F22915 mov ebp, esp .text:71F22917 sub esp, 40h .text:71F2291A push esi .text:71F2291B push 2 .text:71F2291D pop eax .text:71F2291E push 3 .text:71F22920 pop ecx .text:71F22921 mov [ebp+var_34], eax .text:71F22924 mov [ebp+var_2C], eax .text:71F22927 mov [ebp+var_28], eax .text:71F2292A mov [ebp+var_1C], eax .text:71F2292D mov [ebp+var_18], eax .text:71F22930 mov [ebp+var_10], eax .text:71F22933 mov eax, [ebp+PSchedule] .text:71F22936 xor edx, edx .text:71F22938 inc edx .text:71F22939 mov [ebp+var_24], ecx .text:71F2293C mov [ebp+var_14], ecx .text:71F2293F mov [ebp+var_C], ecx .text:71F22942 mov [ebp+var_8], ecx .text:71F22945 mov ecx, [eax+10h] .text:71F22948 xor esi, esi .text:71F2294A add ecx, eax .text:71F2294C mov [ebp+var_40], esi .text:71F2294F mov [ebp+var_3C], edx .text:71F22952 mov [ebp+var_38], edx .text:71F22955 mov [ebp+var_30], edx .text:71F22958 mov [ebp+var_20], edx .text:71F2295B mov [ebp+var_4], 4 .text:71F22962 xor eax, eax .text:71F22964 .text:71F22964 loc_71F22964: ; CODE XREF: CalculateDuration(x)+63j .text:71F22964 xor edx, edx .text:71F22966 mov dl, [esi+ecx] .text:71F22969 and edx, 0Fh .text:71F2296C add eax, [ebp+edx*4+var_40] .text:71F22970 inc esi .text:71F22971 cmp esi, 168 .text:71F22977 jb short loc_71F22964 .text:71F22979 imul eax, 15 .text:71F2297C pop esi .text:71F2297D leave .text:71F2297E retn 4 .text:71F2297E _CalculateDuration@4 endp
В помощь: Код (Text): .text:71F22981 _CheckPSchedule@4 proc near ; CODE XREF: CheckSchedule(x)+23p .text:71F22981 ; CheckScheduleCache(x)+31p ... .text:71F22981 .text:71F22981 PSchedule = dword ptr 8 .text:71F22981 .text:71F22981 push esi .text:71F22982 mov esi, [esp+PSchedule] .text:71F22986 test esi, esi .text:71F22988 push edi .text:71F22989 mov edi, 0E0000066h .text:71F2298E jnz short loc_71F22996 .text:71F22990 push edi ; dwExceptionCode .text:71F22991 call _ToplRaiseException@4 ; ToplRaiseException(x) .text:71F22996 .text:71F22996 loc_71F22996: ; CODE XREF: CheckPSchedule(x)+Dj .text:71F22996 cmp dword ptr [esi], 0BCh .text:71F2299C jnz short loc_71F229B0 .text:71F2299E cmp dword ptr [esi+8], 1 .text:71F229A2 jnz short loc_71F229B0 .text:71F229A4 cmp dword ptr [esi+0Ch], 0 .text:71F229A8 jnz short loc_71F229B0 .text:71F229AA cmp dword ptr [esi+10h], 20 .text:71F229AE jz short loc_71F229B6 .text:71F229B0 .text:71F229B0 loc_71F229B0: ; CODE XREF: CheckPSchedule(x)+1Bj .text:71F229B0 ; CheckPSchedule(x)+21j ... .text:71F229B0 push edi ; dwExceptionCode .text:71F229B1 call _ToplRaiseException@4 ; ToplRaiseException(x) .text:71F229B6 .text:71F229B6 loc_71F229B6: ; CODE XREF: CheckPSchedule(x)+2Dj .text:71F229B6 pop edi .text:71F229B7 pop esi .text:71F229B8 retn 4 .text:71F229B8 _CheckPSchedule@4 endp
buf[] содержит количество единиц в двоичной записи чисел от 0 до 15, алгоритм подсчитывает единичные биты в младших полубайтах ubuf[] - по-моему, все совершенно ясно