|
|
  |
Определение промежутка времени |
|
|
|
Apr 28 2013, 07:43
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(d7d1cd @ Apr 23 2013, 15:57)  Спасибо за код. Можно попросить прокомментировать строки функции, которая преобразует дату в число дней... Дело было давно, сейчас тонкостей не помню. Возможно "формула Зеллера" из этой оперы. В самом конце формулы будет вычитание большого числа - это сдвиг начало эпохи. Цитата(decom @ Apr 23 2013, 16:51)  В коде похоже ошибка, надо бы проверить. Перевод туда и обратно проверял числительно для всех дат от 2000 до 2099 года. Можете показать проблемное место?
|
|
|
|
|
Apr 30 2013, 16:50
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Цитата(Kopa @ Apr 28 2013, 09:51)  Какому пункту правил? Я не помню точно какой пункт, но он относится к запрету обсуждения дизасма чужих программ. Почему всем так интересно, чего это я пишу на асме, а не на Си? Всем интересно, а модераторы потом претензии предъявляют не всем, а тебе... Мне не важен язык программы, мне нужен алгоритм. Так что кто может помочь, направляйте на путь истинный...
|
|
|
|
|
May 1 2013, 05:35
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Цитата(msalov @ May 1 2013, 00:05)  Такой наивный вопрос: а чем стандартная библиотека Си не угодила? Там есть функция работы со временем mktime, которая время в человеко-приемлемой форме переводит во время Unix (количество секунд с 01.01.1970 00:00:00). Ну а дальше разницу взять - дело тривиальное. Такое наивное сто двадцать пятое объяснение: Я ПИШУ НА АССЕМБЛЕРЕ!!!
|
|
|
|
|
May 3 2013, 19:06
|
Частый гость
 
Группа: Свой
Сообщений: 170
Регистрация: 30-06-05
Из: Киев
Пользователь №: 6 426

|
Цитата(Stanislav @ May 2 2013, 09:57)  Извините, но при чём здесь Ассемблер? Изучите основы систем счисления, а потом пишите хоть на суахили... Сложно будет человеку на Ассемблере писать функции деления не на константу. Если быстродействие не кусается, то можно преобразование выполнять через отнимание в цикле сначала количества секунд в годе (с учетом высокосных), потом месяцы (например через масив количества секунд в месяце), сутки и т.д.
|
|
|
|
|
May 3 2013, 19:13
|
Частый гость
 
Группа: Свой
Сообщений: 170
Регистрация: 30-06-05
Из: Киев
Пользователь №: 6 426

|
Цитата(adnega @ May 3 2013, 22:10)  Если человек использует ассемблер, то эта функция у него уже есть. Не факт. Я даже в программе на С стараюсь избегать деления на что-либо отличное от степени двойки.
|
|
|
|
|
May 3 2013, 19:24
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(jack_avenger @ May 3 2013, 23:13)  Не факт. Я даже в программе на С стараюсь избегать деления на что-либо отличное от степени двойки. А как же вывод десятичных чисел на дисплей? Деление на константу 10. В свое время делал на АСМе получается (частное и остаток) компактно и быстро, но с использованием команды умножения. Функцию деления произвольно числа на произвольное число делал для кр1878ве1, МК51, AVR. Заниматься вычитаниями можно, но зачем, когда можно взять и один раз написать нужную функцию?
|
|
|
|
|
May 3 2013, 20:00
|
Частый гость
 
Группа: Свой
Сообщений: 170
Регистрация: 30-06-05
Из: Киев
Пользователь №: 6 426

|
Цитата(adnega @ May 3 2013, 22:24)  А как же вывод десятичных чисел на дисплей? Деление на константу 10. Использование деления на 10 для вывода на дисплей это немного "из пушки по воробьям". У некоторых МSP (например у СС430) есть преобразователь BIN->BCD, и BCD->BIN. Обычно эти регистры сидят в адресном пространстве ЖКИ. Если преобразователя нет, надо преобраз]овывать используя команду двоично-десятичного сложения dadd.x. Так в разы быстрее деления. В С она доступна через __bcd_add_long(). Вот пример из книги "MSP430 Microcontroller Basics" Код ; Assembly routine to convert 16-bit unsigned binary value to BCD ; Taken from Application Reports , section 5.5.3 ; Called from C as: uint32_t UIntToBCD (uint16_t UIntValue ); ; 16-bit parameter "UIntValue" passed in R12 ; 32-bit value "UIntToBCD" returned in R13:R12 ; Uses only the scratch registers R12 -R15 so no stacking necessary ;----------------------------------------------------------------------- PUBLIC UIntToBCD ; Export symbol outside this file RSEG CODE ; Essential as usual UIntToBCD: ; Name of function as usual mov.w R12 ,R14 ; Move input and leave R12 free for result clr.w R12 ; Clear registers for result clr.w R13 mov.w #0x0010 ,R15 ; Initialize loop counter to number of bits LoopStart: rla.w R14 ; Shift msb of input into carry bit dadd.w R12 ,R12 ; R13:R12 = 2* R13:R12 + carry bit DECIMALLY dadd.w R13 ,R13 ; lsword then msword dec.w R15 ; Decrement loop counter jnz LoopStart ; Repeat if nonzero reta ; Return instruction in MSP430X ; ret ; Usual MSP430 return instruction END
|
|
|
|
|
May 4 2013, 16:13
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(decom @ May 4 2013, 11:01)  Вы уже достали своими детскими вопросами. Вот алгоритм определения разности в минутах ВНУТРИ ОДНОГО ГОДА. Дата А: 12.34 21/01/2013 Дата Б: 17.35 05/05/2013 ... Ответ в секундах: 150061*60=9 003 660 (девять миллионов три тысячи шестьсот шестьдесят секунд) А вот для произвольной даты внутри столетия (2000 - 2099 года) Для первой даты: поскольку месяц меньше 3, то у года вычитаем единицу, а месяц увеличиваем на 12. ((2013 - 1) * 1461) / 4 + ((1 + 12) * 306 + 7) / 10 + 21 - 730533 = 734883 + 398 + 21 - 730533 = 4769 В секундах: ((4769 * 24 + 12) * 60 + 34) * 60 + 0 = 412 086 840 Для второй даты: (2013 * 1461) / 4 + (5 * 306 + 7) / 10 + 5 - 730533 = 735248 + 153 + 5 - 730533 = 4873 В секундах: ((4873 * 24 + 17) * 60 + 35) * 60 + 0 = 421 090 500 Разница: 9 003 660
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|