Оптимизированное деление?

Тема в разделе "WASM.BEGINNERS", создана пользователем Spalex, 16 янв 2007.

  1. Spalex

    Spalex New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2
    Адрес:
    Russia
    в изучаемой программе встретил код:
    Код (Text):
    1. .text:0047D5CE mov     ecx, edi
    2. .text:0047D5D0 sub     ecx, esi
    3. .text:0047D5D2 mov     eax, 92492493h
    4. .text:0047D5D7 imul    ecx
    5. .text:0047D5D9 add     edx, ecx
    6. .text:0047D5DB sar     edx, 4
    7. .text:0047D5DE mov     eax, edx
    8. .text:0047D5E0 shr     eax, 1Fh
    9. .text:0047D5E3 add     eax, edx
    10. .text:0047D5E5 cmp     eax, 6
    Вот чувствую, что здесь весь этот мудренный код от ...5D2 до ...5E3 - это какая-то оптимизированная математическая операция типа взятия по модулю. Но какая, я даже не знаю, как подступиться? Может кто-нибудь из понимающих подскажет что это?
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Нет, не в тему...
     
  3. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.351
    гугл рулит :)
     
  4. Spalex

    Spalex New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2
    Адрес:
    Russia
    да, рулит, я видел это. Код похож, но не то чтобы один в один, правда? Хотелось просто найти подтверждение здесь этому предположению. Опытным путём установил, что похоже на mod 7, но формально этого доказать не могу. Ладно, вопрос снят, точнее потребность в более точном ответе отпала. Извините за отнятое время.
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Spalex
    Это % 28

    0x92492493 * i

    Берём старщий даблворд, т.е. результат >> 32, для округления в бОльшую сторону прибавляем i. Потом сдвигаем ещё на 4 позиции вправо, т.е.:

    (0x92492493 * i) >> (32 + 4)
    0x92492493 * i / 0x1000000000
    i * 2454267027 / 68719476736
    i * 0,035714285724679939448833465576172
    i / 28

    Т.к. число знаковое, нужно ещё скорректоровать округление, если результат отрицательный, что и делают последние 2 инструкции.