Есть библиотека написанная на MVC++, в библиотеке есть некая функция (в экспорте запись присутствует), задача функции перевод даты-времени из одного формата в другой. Я ещё совсем не хорошо стою на ногах в асме, я не могу понять что происходит (от части из-за FPU), можете перевести пример нижнего кода на любой язык (или псевдо-алгоритм. язык) более высокого уровня. Привожу полностью кусок из IDA. Код (Text): dbl_41C2A550 dq 0.0 dbl_41C2A868 dq 2.0 class ATL::COleDateTime __cdecl MTimersLib::ConvTimeToOleTime(double const &) public ?ConvTimeToOleTime@MTimersLib@@YA?AVCOleDateTime@ATL@@ABN@Z ?ConvTimeToOleTime@MTimersLib@@YA?AVCOleDateTime@ATL@@ABN@Z proc near arg_0 = dword ptr 4 arg_4 = dword ptr 8 fld ds:dbl_41C2A550 mov ecx, [esp+arg_4] fld qword ptr [ecx] fucompp fnstsw ax test ah, 44h jnp short loc_41C1366B fld qword ptr [ecx] mov eax, [esp+arg_0] fadd ds:dbl_30C2A868 mov dword ptr [eax+8], 0 fstp qword ptr [eax] retn ; --------------------------------------------------------------------------- loc_41C1366B: mov eax, [esp+arg_0] fld ds:dbl_41C2A550 fstp qword ptr [eax] mov dword ptr [eax+8], 0 retn ?ConvTimeToOleTime@MTimersLib@@YA?AVCOleDateTime@ATL@@ABN@Z endp И вообще на что это похоже — какой-то наследник COldDateTime из ATL? Спасибо за любое участие в теме.
pusheax Код (Text): ... fld ds:dbl_41C2A550 ;; 0.0 в сопроцессор mov ecx, [esp+arg_4] fld qword ptr [ecx] ;; параметр в сопроцессор fucompp ;; сравнить их fnstsw ax ;; получить результат сравнения test ah, 44h ;; переход если jnp short loc_41C1366B ;; переданный параметр равен 0.0 ;; ;; // т.е. код аналогичен ;; ;; if (0.0 == параметр) goto loc_41C1366B ;; fld qword ptr [ecx] ;; параметр в сопроцессор mov eax, [esp+arg_0] fadd ds:dbl_30C2A868 ;; сложить с ds:dbl_30C2A868 fstp qword ptr [eax] ;; class ATL::COleDateTime.m_dt = st(0); mov dword ptr [eax+8], 0 ;; class ATL::COleDateTime.m_status = valid; ;; ;; // если учесть, что typedef double DATE; ;; // то этот код - заинлайненный вызов конструктора ;; // COleDateTime::COleDateTime(DATE dtSrc) ;; // с учетом fadd аналогичен ;; ;; return COleDateTime(параметр + dbl_30C2A868); ;; loc_41C1366B: mov eax, [esp+arg_0] fld ds:dbl_41C2A550 ;; 0.0 в сопроцессор fstp qword ptr [eax] ;; class ATL::COleDateTime.m_dt = st(0); // т.е. 0.0 mov dword ptr [eax+8], 0 ;; class ATL::COleDateTime.m_status = valid; ;; ;; // т.е. этот код заинлайненный вызов конструктора ;; ;; return COleDateTime::COleDateTime(0.0) ;; ... что в dbl_30C2A868?