в изучаемой программе встретил код: Код (Text): .text:0047D5CE mov ecx, edi .text:0047D5D0 sub ecx, esi .text:0047D5D2 mov eax, 92492493h .text:0047D5D7 imul ecx .text:0047D5D9 add edx, ecx .text:0047D5DB sar edx, 4 .text:0047D5DE mov eax, edx .text:0047D5E0 shr eax, 1Fh .text:0047D5E3 add eax, edx .text:0047D5E5 cmp eax, 6 Вот чувствую, что здесь весь этот мудренный код от ...5D2 до ...5E3 - это какая-то оптимизированная математическая операция типа взятия по модулю. Но какая, я даже не знаю, как подступиться? Может кто-нибудь из понимающих подскажет что это?
да, рулит, я видел это. Код похож, но не то чтобы один в один, правда? Хотелось просто найти подтверждение здесь этому предположению. Опытным путём установил, что похоже на mod 7, но формально этого доказать не могу. Ладно, вопрос снят, точнее потребность в более точном ответе отпала. Извините за отнятое время.
Spalex Это % 28 0x92492493 * i Берём старщий даблворд, т.е. результат >> 32, для округления в бОльшую сторону прибавляем i. Потом сдвигаем ещё на 4 позиции вправо, т.е.: (0x92492493 * i) >> (32 + 4) 0x92492493 * i / 0x1000000000 i * 2454267027 / 68719476736 i * 0,035714285724679939448833465576172 i / 28 Т.к. число знаковое, нужно ещё скорректоровать округление, если результат отрицательный, что и делают последние 2 инструкции.