Помогите разобраться как это работает

Тема в разделе "WASM.RESEARCH", создана пользователем max7C4, 25 янв 2009.

  1. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Дизассемблировал я программу, написанную на gcc. Наткнулся на этот кусок кода. Ребята, помогите разобраться в алгоритме работы.
    Код (Text):
    1. loc_2000AB:
    2. add     ds:dword_202010, 50h
    3. mov     ecx, ds:dword_202010
    4. mov     eax, 66666667h
    5. imul    ecx
    6. sar     edx, 5
    7. mov     eax, ecx
    8. sar     eax, 1Fh
    9. sub     edx, eax
    10. mov     eax, edx
    11. shl     eax, 2
    12. add     eax, edx
    13. shl     eax, 4
    14. sub     ecx, eax
    15. mov     eax, ecx
    16. sub     ds:dword_202010, eax
    17. jmp     short loc_20010B
     
  2. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
     
  3. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Спасибо _basmp_, но это я понял еще утром. Я
    до сих пор не понимаю почему eax=2^37 / 80+1, а в целом это примерно, что-то вреде
    Код (Text):
    1. (ds:dword_202010)+=50h
    2. (ds:dword_202010)-=(ds:dword_202010)%50h
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    HexRays на ура понимает оптимизированное деление на константу.
     
  5. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    n0name
    Вы кажется не поняли, но тот код, который это породил, я уже привел. Мне интересно с какой стати используется вот такая константа (именно с +1), а не что-либо другое. (Для все еще не понявших: Объясните логику оптимизации породившую константу 0х66666667)
     
  6. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    max7C4
    дефолтный режим округления
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    это совет на будущее.
    У Фога в главе про оптимизацию деления расписано достаточно подробно.
     
  8. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    n0name
    Я и без этого разборщика прекрасно справляюсь с дизасмом, просто не понятно зачем используется режим округления (спасибо за подсказку _basmp_, как-то забыл про это) в целых числах. Ну а в целом все понятно. Еще раз спасибо _basmp_. Думаю на этом тему можно закрыть.
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    max7C4
    Это не "дефолтное округление", т.к. шестнадцатиричное 0.6h по дефолту округляется к 0, а не к 1.
    А константа 66666667h получается по "продвинутому" алгоритму (для знаковых чисел), приведенному в мануале по оптимизации AMD
     
  10. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    leo
    а там разве не?
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    _basmp_
    Че "не" ? ;)
    "Там" вместо 66666666h юзается 66666667h и спрашивается: почему +1 в младшем разряде, т.к. и в десятичном виде дробная часть = 0.4 < 0.5 и в двоичном 0.(6)h < 0.8h, т.е. по "дефолту" округление должно быть вниз, а не вверх ?