Оптимизированный код. Как понять эту конструкцию?

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

  1. zAjac

    zAjac Иван

    Публикаций:
    0
    Регистрация:
    25 апр 2009
    Сообщения:
    4
    Адрес:
    Украина, Киев
    Добрый день.
    Понадобилось восстановить одну процедуру, скомпилированную судя по всему с какими-то параметрами
    оптимизации. Почти весь код восстановил, кроме одного кусочка (см. листинг).
    Поискал в интернете и здесь: единственное что понял - так это то, что это какой-то вариант оптимизации деления.
    Вроде бы дклится число, полученое функцией rand на какое-то другое число, но на какое - я не могу понять.
    Помогите пожалуйста решить этот вопрос.

    Код (Text):
    1. call     rand                    ;вызов стандартной процедуры rand библиотеки msvcrt
    2. mov      ecx,66666667h
    3. mov      ebx, eax
    4. imul     ecx
    5. mov      esi, ebx
    6. sar      esi, 1Fh
    7. mov      [ebp+var_1], edx        ;
    8. mov      [ebp+var_2], eax        ;
    9. mov      eax, [ebp+var_1]
    10. sar      eax, 1
    11. sub      eax, esi
    12. lea      edx, [eax+eax*4]
    13. sub      ebx, edx
     
  2. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    что изначально содержится в edx?
     
  3. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    И ещё...rand возвращает ответ в eax ?
    если так..то не могу понять..в чём проблема?
     
  4. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    вопрос отпал))) ...


    сорри что три сообщения подряд... (редактирования нету)
     
  5. zAjac

    zAjac Иван

    Публикаций:
    0
    Регистрация:
    25 апр 2009
    Сообщения:
    4
    Адрес:
    Украина, Киев
    В edx изначально хранится число (длинна текущего пакета данных).

    А можно по подробнее? Мне просто не совсем понятно (
     
  6. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    zAjac
    Ей богу)..не могу понять....чего сложного?


    call rand ;вызов стандартной процедуры rand библиотеки msvcrt
    mov ecx,66666667h
    mov ebx, eax
    imul ecx // в eax старшая часть, в edx младшая
    mov esi, ebx // в ecx значение rand
    sar esi, 1Fh // сдвинули биты вправо (поделили) на 31//тобишь остался только бит знака
    mov [ebp+var_1], edx ; в стек младшая часть произведения на rand на ecx
    mov [ebp+var_2], eax ;в стек старшая часть
    mov eax, [ebp+var_1] ; в eax младшая часть произведения на rand на ecx
    sar eax, 1 // поделили на 2 старшую часть произведения
    sub eax, esi // вычли из eax бит знака.. (вычитаем еденицу если отрицательно)
    lea edx, [eax+eax*4] ; записываем адрес [eax+eax*4] в edx
    sub ebx, edx вычитаем из rand адрес
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Что-то вроде
    x-(x/5-sign(x))*5
     
  8. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    zAjac
    Этот код вычисляет rand() % 5.
    Результат в ebx.
     
  9. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    mov esi, ebx // в ecx значение rand
    тут опечатка)
    mov esi, ebx // в esi значение rand

    тут тоже опечатка
    sar eax, 1 // поделили на 2 старшую часть произведения
    надо так
    sar eax, 1 // поделили на 2 младшую часть произведения
     
  10. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    featurelles
    прибавляем
     
  11. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    т.к. в esi после знакового сдвига будет либо 0 либо -1
    P.S. Куда дели редактирование
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Точнее rand() по модулю 5. В отличие от %, модуль числа 5 всегда положительный. Поэтому здесь и присутствуют штучки с определением знака и его вычитанием
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Блин, куда дели редактирование ?!!! ;)
    Уточню:
    x mod 5 = x-(x/5+sign(x)*5, где sign = 0 при x >= 0, и =1 при x < 0
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Да что такое, скобку пропустил...
    PS: Аквилыч, это не порядок...
     
  15. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Мда, я лопух, да еще и бот - 4 дебильных поста подряд :dntknw:
    Это обычный x % 5, пора спЯть...
     
  16. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    любите вы сложные решения искать ,))
     
  17. zAjac

    zAjac Иван

    Публикаций:
    0
    Регистрация:
    25 апр 2009
    Сообщения:
    4
    Адрес:
    Украина, Киев
    Спасибо большое.
    Теперь до меня дошло ))