FPU +OleDateTime

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

  1. pusheax

    pusheax New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2007
    Сообщения:
    1
    Есть библиотека написанная на MVC++, в библиотеке есть некая функция (в экспорте запись присутствует), задача функции перевод даты-времени из одного формата в другой. Я ещё совсем не хорошо стою на ногах в асме, я не могу понять что происходит (от части из-за FPU), можете перевести пример нижнего кода на любой язык (или псевдо-алгоритм. язык) более высокого уровня.

    Привожу полностью кусок из IDA.
    Код (Text):
    1. dbl_41C2A550    dq 0.0
    2. dbl_41C2A868    dq 2.0
    3.  
    4. class ATL::COleDateTime __cdecl MTimersLib::ConvTimeToOleTime(double const &)
    5.               public ?ConvTimeToOleTime@MTimersLib@@YA?AVCOleDateTime@ATL@@ABN@Z
    6.  ?ConvTimeToOleTime@MTimersLib@@YA?AVCOleDateTime@ATL@@ABN@Z proc near
    7.  
    8.  arg_0           = dword ptr  4
    9.  arg_4           = dword ptr  8
    10.  
    11.                  fld     ds:dbl_41C2A550
    12.                  mov     ecx, [esp+arg_4]
    13.                  fld     qword ptr [ecx]
    14.                  fucompp
    15.                  fnstsw  ax
    16.                  test    ah, 44h
    17.                  jnp     short loc_41C1366B
    18.                  fld     qword ptr [ecx]
    19.                  mov     eax, [esp+arg_0]
    20.                  fadd    ds:dbl_30C2A868
    21.                  mov     dword ptr [eax+8], 0
    22.                  fstp    qword ptr [eax]
    23.                  retn
    24.  ; ---------------------------------------------------------------------------
    25.  
    26.  loc_41C1366B:
    27.                  mov     eax, [esp+arg_0]
    28.                  fld     ds:dbl_41C2A550
    29.                  fstp    qword ptr [eax]
    30.                  mov     dword ptr [eax+8], 0
    31.                  retn
    32.  ?ConvTimeToOleTime@MTimersLib@@YA?AVCOleDateTime@ATL@@ABN@Z endp
    И вообще на что это похоже — какой-то наследник COldDateTime из ATL?

    Спасибо за любое участие в теме.
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    pusheax
    Код (Text):
    1. ...
    2.   fld     ds:dbl_41C2A550      ;; 0.0 в сопроцессор
    3.   mov     ecx, [esp+arg_4]
    4.   fld     qword ptr [ecx]      ;; параметр в сопроцессор
    5.   fucompp                      ;; сравнить их
    6.   fnstsw  ax                   ;; получить результат сравнения
    7.   test    ah, 44h              ;; переход если
    8.   jnp     short loc_41C1366B   ;;  переданный параметр равен 0.0
    9. ;;
    10. ;; // т.е. код аналогичен
    11. ;;
    12. ;; if (0.0 == параметр) goto loc_41C1366B
    13. ;;
    14.  
    15.  
    16.   fld     qword ptr [ecx]      ;; параметр в сопроцессор
    17.   mov     eax, [esp+arg_0]
    18.   fadd    ds:dbl_30C2A868      ;; сложить с ds:dbl_30C2A868
    19.   fstp    qword ptr [eax]      ;; class ATL::COleDateTime.m_dt = st(0);
    20.   mov     dword ptr [eax+8], 0 ;; class ATL::COleDateTime.m_status = valid;
    21. ;;
    22. ;; // если учесть, что typedef double DATE;
    23. ;; // то этот код - заинлайненный вызов конструктора
    24. ;; // COleDateTime::COleDateTime(DATE dtSrc)
    25. ;; // с учетом fadd аналогичен
    26. ;;
    27. ;; return COleDateTime(параметр + dbl_30C2A868);
    28. ;;
    29.  
    30.  
    31. loc_41C1366B:
    32.   mov  eax, [esp+arg_0]
    33.   fld  ds:dbl_41C2A550      ;; 0.0 в сопроцессор
    34.   fstp qword ptr [eax]      ;; class ATL::COleDateTime.m_dt = st(0);  // т.е. 0.0
    35.   mov  dword ptr [eax+8], 0 ;; class ATL::COleDateTime.m_status = valid;
    36. ;;
    37. ;; // т.е. этот код заинлайненный вызов конструктора
    38. ;;
    39. ;; return COleDateTime::COleDateTime(0.0)
    40. ;;
    41. ...
    что в dbl_30C2A868?