Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите перевести TDataTime в SYSTEMTIME без моду 
:(
    Опции темы
Dmitry_177
Дата 27.3.2007, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Помогите пожалуйста перевести TDataTime в SYSTEMTIME без модуля SysUtils.. TDataTime это тоже самое что и Double, вот его и надо перевести в SYSTEMTIME.. Но без модуля SysUtils! DateTimeToSystemTime не предлагайте, т.к. он из того модуля.. Помогите мне пожалуйста очень нужно.. нашел в интернете перевод из SYSTEMTIME в TDataTime на ассемблере, написано в FASM-е.. помогите сделать обратное.. Я в ассемблере ничего не понимаю, а очень нужно... Если что, ассемблерный ком можно же вставлять в Delphi 

Код

;========================================
;C/C++
;  void __stdcall SysTimeToDateTime(CONST SYSTEMTIME * lpST; TDateTime * lpDT)
;Delphi
;  procedure SysTimeToDate(const ST:TSystemTime;var DT:TDateTime);stdcall;
;type TDateTime = type Double
;  The integral part of a TDateTime value is the number of days that have passed since 12/30/1899
;  The fractional part of a TDateTime value is the time of day
;========================================
;FASM
SysTimeToDateTime:
 DateDelta = 693594  ;Days between 1/1/0001 and 12/31/1899
 virtual at ebp
   lpST SYSTEMTIME
 end virtual
push ebp
mov  ebp,[esp+8] ;lpST
push ebx
push edi
push esi
push 0   ;local dword

movzx eax,[lpST.wYear]
xor edx,edx
mov edi,eax
mov ecx,100
div ecx   ;eax - число годов кратных 100; edx <> 0 - текущий год кратен 100
imul esi,edi,365 ;esi - число дней без учета високосных

;пока выполняются div и imul делаем вспомогательные вычисления
movzx ebx,[lpST.wMonth]
xor ecx,ecx  ;проверяем необходимость коррекции числа дней на 1, если year - високосный
cmp ebx,2  ;коррекция нужна будет только для янв.и фев.
setg cl   ;
or ecx,edi  ;орим с годом
and ecx,3  ;ecx = 0 - возможно нужна коррекция (год кратен 4 и месяц < 3)

movzx ebx,word[ebx*2+.SubMonDays-2] ;число дней от начала месяца до конца года
add ebx,DateDelta  ;поправка к началу отсчета дней в TDateTime
shr edi,2    ;edi = число годов кратных 4 = число доп.високос.дней (без учета 100 и 400)
sub edi,ebx    ;вычли остаток дней до конца кода и поправку DateDelta

movzx ebx,[lpST.wDay]
add edi,esi    ;добавили результат imul - число дней за year лет
add edi,ebx    ;edi - полное число дней
        ;осталось еще скоректировать на 100\400 и янв\фев, если год - високосный
   ;----------
movzx esi,[lpST.wHour] ;запускаем вычисление миллисекунд
imul esi,3600000
movzx ebx,[lpST.wMinute]
imul ebx,60000
add  ebx,esi
movzx  esi,[lpST.wSecond]
imul  esi,1000
add  esi,ebx
   ;----------
dec ecx
sar ecx,2      ;ecx - коррекция числа дней текущего года (0 или -1)

;---- тут должен подоспеть результат деления на 100 в eax:edx ----
xor ebx,ebx
test eax,3     ;контроль кратности года 400
setz bl
or edx,ebx     ;edx = 0 - не високосный (кратен 100, но не кратен 400)

   ;---------
movzx ebx,[lpST.wMilliseconds]
add   ebx,esi
mov [esp],ebx
   ;-----------

add edx,-1     ;перенос если не 0
sbb edx,edx    ;0 - не високосный, -1 високосный
and edx,ecx    ;поправка к числу дней текущего года (-1 или 0)

sub edi,eax    ;вычли число годов кратных 100
shr eax,2      ;число годов кратных 400
add eax,edi    ;добавили число годов кратных 100
add eax,edx    ;скорректировали на 1, если янв\фев високосного года

;----------------
fild dword[esp]
mov [esp],eax
fmul qword[.MSecPerDay]
fiadd dword[esp]

pop eax
pop esi
pop edi
pop ebx
pop ebp
mov eax,[esp+8]
fstp qword[eax]
ret 8
align 8
.SubMonDays:
dw 365  ;янв
dw 365-31  ;фев
dw 365-31-28  ;март
dw 365-31-28-31  ;апр
dw 365-31-28-31-30  ;май
dw 365-31-28-31-30-31  ;июнь
dw 31+30+31+30+31+31 ;июль
dw 31+30+31+30+31 ;авг
dw 31+30+31+30 ;сен
dw 31+30+31 ;окт
dw 31+30 ;ноя
dw 31 ;дек
.MSecPerDay: dq 1.15740740740740740740740740740741e-8 ;=1/(24*60*60*1000)

PM MAIL   Вверх
ama_kid
Дата 27.3.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 19
Всего: 95



а что мешает передрать из sysutils?
там код хоть и не на ассемблере, но элементарный...

Добавлено через 59 секунд
вру... есть и ассемблерные части... smile


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Dmitry_177
Дата 27.3.2007, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



так можно же намного проще сделать...
PM MAIL   Вверх
ama_kid
Дата 27.3.2007, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 19
Всего: 95



не, ну если ты хочешь сделать быстрее - бери готовый, оптимизированный годами усилиями сотен разработчиков от борланда и оптимизируй дальше на здоровье... Правда я сомневаюсь, что удастся достичь потрясающего прироста производительности, но небольшого за счет сокращения числа переходов можешь добиться (помести весь код в одну функцию, тем самым убрав все переходы, может быть еще найдешь места, подпадающие под возможность оптимизации, и т.д.)... А вот сам алгоритм преобразования - вряд ли можно хоть сколько-нибудь оптимизировать... Ну, в общем, возможность оптимизировать, конечно, всегда есть, меня в этом убедила "история одного байта", но насколько это целесообразно на конечной машине - вопрос отнюдь не праздный...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Dmitry_177
Дата 27.3.2007, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Вот например тип TTimeStamp, зачем он мне нужен, если мне напрямую нужно...

а еще  что значит:
Код

{$IFDEF PIC}
{$ELSE}
{$ENDIF}

я понимаю что какое-то условие, но какое?
а еще:
Код

{$IFDEF MSWINDOWS}
{$ENDIF}


и еще вопрос, в функции DateTimeToTimeStamp из SysUtils есть такой момент:
Код

        CALL    GetGOT


а сама функция GetGOT выглядит так:
Код

function GetGOT: Pointer; export;
begin
  asm
        MOV     Result,EBX
  end;
end;


вот как ее можно вставить в DateTimeToTimeStamp, чтобы небыло ничего лишнего?
PM MAIL   Вверх
ama_kid
Дата 27.3.2007, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 19
Всего: 95



Цитата(Dmitry_177 @  27.3.2007,  19:38 Найти цитируемый пост)
а еще  что значит:
{$IFDEF PIC}
{$ELSE}
{$ENDIF}

Это всего лишь директива препроцессора - если PIC продефайнен - тогда компилировать нижеследующий код, если нет - компилировать тот, который после ELSE

Цитата(Dmitry_177 @  27.3.2007,  19:38 Найти цитируемый пост)
а сама функция GetGOT выглядит так:

function GetGOT: Pointer; export;
begin
  asm
        MOV     Result,EBX
  end;
end;
вот как ее можно вставить в DateTimeToTimeStamp, чтобы небыло ничего лишнего? 


Я не знаю, что там перед функцией и за ней, но результат ассемблерной функции всегда помещается в регистр EAX (если вмещается), поэтому надо просто его оттуда забрать... типа mov EAX,EBX...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Dmitry_177
Дата 27.3.2007, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



если PIC продефайнен, а что это значит?
PM MAIL   Вверх
ama_kid
Дата 27.3.2007, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 19
Всего: 95



это значит, что если где-т до этого стоит {$DEFINE PIC} - то эта "переменная компилятора" объявлена для препроцессора. Это применяется  для осуществления разветвления компиляции кода, в основном для обеспечения мультиплатформенности кода (для каждой платформы - своя ветвь компиляции)


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Dmitry_177
Дата 27.3.2007, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Добрые люди подсказали вот такую процедуру:

Код

procedure _DateTimeToSystemTime(DateTime: TDateTime; var SystemTime: TSystemTime);
var
 FT:TFileTime;
begin
 Int64(FT):=Round((DateTime+109205.0)*864000000000.0);
 FileTimeToSystemTime(FT,SystemTime);
end;


Правильная ли она?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0517 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.