Как работает этот код? (принцип не понятен, пока)

Тема в разделе "WASM.HEAP", создана пользователем device, 31 авг 2007.

  1. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Это не авторский оригинал, а попытка расшифровать уже кем-то откомпиленный бинарник.
    Короче прога что-то там вычисляет.

    Код (Text):
    1. call gnu_input_console_now ;Вводим какое-то число
    2. add esp, 4 ;???
    3. fild dword ptr [ebp-8]
    4. mov eax, dword ptr [ebp-8]
    5. imul eax, dword ptr [ebp-8]
    6. push eax
    7. fild dword ptr [esp]
    8. add esp, 4
    9. fdiv qword ptr [Lt_0003]
    10. fxch st(1)
    11. faddp
    12. fdiv qword ptr [Lt_0004]
    13. fistp dword ptr [ebp-12]
    14. push 1
    15. push dword ptr [ebp-12]
    16. push 0
    Я так понял, что Lt_0003, Lt_0004 это числовые константы
    Подозреваю, что есть операция возведения в степень. Кто что думает?
     
  2. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    По-моему так:

    Код (Text):
    1. DWORD X = [ebp-8];
    2. [ebp-12] = ( double(X*X) / Lt_0003 + X ) / Lt_0004;
    Что касается
    Код (Text):
    1. add esp, 4 ;???
    ,
    то это всего лишь коррекция стека после __cdecl вызова.
     
  3. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    flankerx
    А может ли быть так:
    [ebp-12] = ( x+( x ^ Lt_0003 / Lt_0003 ) ) / Lt_0004 ; просто методом подстановки значений такое выражение наиболее подходит.
    или я не прав в чем-то?
     
  4. Fscale

    Fscale New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2007
    Сообщения:
    25
    Да нет, я тоже смотрел - по-моему flankerx правильнее писал;
    Ет наверное по значениях вышёл похожый результат или глюк какой?
     
  5. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    device
    fdiv все же делит, а не в степень возводит.

    а вообще возьми instruction reference, там все написано. кусочек кода у тебя маленький, минут за 20-30 разберешься.
     
  6. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Засунь программу в какой-нибудь REC и посмотри как она соберёт эту последовательность. Косяков за ней не наблюдал.
     
  7. eight

    eight New Member

    Публикаций:
    0
    Регистрация:
    14 авг 2007
    Сообщения:
    27
    Я начинаю только.. смотрел в справочнике(в книге), не нашел этих ф-ций.. не могли бы вы рассказать, что они означают?
    fdiv, fistp
    и
    fxch st(1)
    faddp
     
  8. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    здесь есть эти функции
    http://developer.intel.com/design/processor/manuals/253666.pdf
    и
    chapter 8 отсюда
    http://developer.intel.com/design/processor/manuals/253665.pdf
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    не знаю какой ты смотрел справочник и почему искал именно функции - это инструкции сопроцессора

    fdiv - деление двух чисел, результат ST(1) / ST(0) попадает на вершину стека
    faddp - сложение
    fispt сохранение, и наконец fxch - обмен
     
  10. eight

    eight New Member

    Публикаций:
    0
    Регистрация:
    14 авг 2007
    Сообщения:
    27
    Great, t00x, большое спасибо. А искал потому что не понял что они означают в этом коде..
     
  11. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Все-таки FlankerX проавильно написал... Я разобрался.