реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Определение промежутка времени
adnega
сообщение Apr 28 2013, 07:43
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(d7d1cd @ Apr 23 2013, 15:57) *
Спасибо за код. Можно попросить прокомментировать строки функции, которая преобразует дату в число дней...

Дело было давно, сейчас тонкостей не помню.
Возможно "формула Зеллера" из этой оперы.
В самом конце формулы будет вычитание большого числа - это сдвиг начало эпохи.

Цитата(decom @ Apr 23 2013, 16:51) *
В коде похоже ошибка, надо бы проверить.

Перевод туда и обратно проверял числительно для всех дат от 2000 до 2099 года.
Можете показать проблемное место?
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Apr 30 2013, 16:50
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Цитата(Kopa @ Apr 28 2013, 09:51) *
Какому пункту правил?


Я не помню точно какой пункт, но он относится к запрету обсуждения дизасма чужих программ. Почему всем так интересно, чего это я пишу на асме, а не на Си? Всем интересно, а модераторы потом претензии предъявляют не всем, а тебе...


Мне не важен язык программы, мне нужен алгоритм. Так что кто может помочь, направляйте на путь истинный...

Go to the top of the page
 
+Quote Post
msalov
сообщение Apr 30 2013, 20:05
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Такой наивный вопрос: а чем стандартная библиотека Си не угодила? Там есть функция работы со временем mktime, которая время в человеко-приемлемой форме переводит во время Unix (количество секунд с 01.01.1970 00:00:00). Ну а дальше разницу взять - дело тривиальное.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение May 1 2013, 05:35
Сообщение #19


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Цитата(msalov @ May 1 2013, 00:05) *
Такой наивный вопрос: а чем стандартная библиотека Си не угодила? Там есть функция работы со временем mktime, которая время в человеко-приемлемой форме переводит во время Unix (количество секунд с 01.01.1970 00:00:00). Ну а дальше разницу взять - дело тривиальное.

Такое наивное сто двадцать пятое объяснение: Я ПИШУ НА АССЕМБЛЕРЕ!!!


Go to the top of the page
 
+Quote Post
msalov
сообщение May 2 2013, 04:30
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Пишите хоть в машинных кодах.
Из моего сообщения вы могли бы почерпнуть, если бы не торопились с выводами, такие варианты:
* использовать библиотеку напрямую (если только у вас не орден велосипедостроителя 3ей степени), ведь из ПИСАНИЯ НА АССЕМБЛЕРЕ не следует невозможность использования библиотек;
* использовать исходный код (реализаций на Си предостаточно) что б реализовать алгоритм своими силами;
* бинарник нужной функции из библиотеки пропустить через дизассемблер, ручками выправить полученное до ассемблируемого вида, ведь вам же нужен АССЕМБЛЕР.
Go to the top of the page
 
+Quote Post
Stanislav
сообщение May 2 2013, 06:57
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 4 363
Регистрация: 13-05-05
Из: Москва
Пользователь №: 4 987



Цитата(d7d1cd @ May 1 2013, 09:35) *
Такое наивное сто двадцать пятое объяснение: Я ПИШУ НА АССЕМБЛЕРЕ!!!
Извините, но при чём здесь Ассемблер?
Изучите основы систем счисления, а потом пишите хоть на суахили...


--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
Go to the top of the page
 
+Quote Post
jack_avenger
сообщение May 3 2013, 19:06
Сообщение #22


Частый гость
**

Группа: Свой
Сообщений: 170
Регистрация: 30-06-05
Из: Киев
Пользователь №: 6 426



Цитата(Stanislav @ May 2 2013, 09:57) *
Извините, но при чём здесь Ассемблер?
Изучите основы систем счисления, а потом пишите хоть на суахили...

Сложно будет человеку на Ассемблере писать функции деления не на константу. Если быстродействие не кусается, то можно преобразование выполнять через отнимание в цикле сначала количества секунд в годе (с учетом высокосных), потом месяцы (например через масив количества секунд в месяце), сутки и т.д.
Go to the top of the page
 
+Quote Post
adnega
сообщение May 3 2013, 19:10
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(jack_avenger @ May 3 2013, 23:06) *
Сложно будет человеку на Ассемблере писать функции деления не на константу.

Если человек использует ассемблер, то эта функция у него уже есть.
Go to the top of the page
 
+Quote Post
jack_avenger
сообщение May 3 2013, 19:13
Сообщение #24


Частый гость
**

Группа: Свой
Сообщений: 170
Регистрация: 30-06-05
Из: Киев
Пользователь №: 6 426



Цитата(adnega @ May 3 2013, 22:10) *
Если человек использует ассемблер, то эта функция у него уже есть.

Не факт. Я даже в программе на С стараюсь избегать деления на что-либо отличное от степени двойки.
Go to the top of the page
 
+Quote Post
adnega
сообщение May 3 2013, 19:24
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(jack_avenger @ May 3 2013, 23:13) *
Не факт. Я даже в программе на С стараюсь избегать деления на что-либо отличное от степени двойки.

А как же вывод десятичных чисел на дисплей? Деление на константу 10.
В свое время делал на АСМе получается (частное и остаток) компактно и быстро, но с использованием команды умножения.
Функцию деления произвольно числа на произвольное число делал для кр1878ве1, МК51, AVR.
Заниматься вычитаниями можно, но зачем, когда можно взять и один раз написать нужную функцию?
Go to the top of the page
 
+Quote Post
jack_avenger
сообщение May 3 2013, 20:00
Сообщение #26


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение May 4 2013, 06:06
Сообщение #27


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Господа, деление меня не волнует (так же как и умножение). Для своих целей я уже написал функции для деления и умножения. Причем они работают с 32-х разрядными числами.
Если не трудно, то покажите алгоритм определения разности между датами в минутах (точнее не нужно).
Go to the top of the page
 
+Quote Post
decom
сообщение May 4 2013, 07:01
Сообщение #28


Частый гость
**

Группа: Свой
Сообщений: 150
Регистрация: 9-12-12
Из: Саранск
Пользователь №: 74 770



Вы уже достали своими детскими вопросами.
Вот алгоритм определения разности в минутах ВНУТРИ ОДНОГО ГОДА.
Дата А: 12.34 21/01/2013
Дата Ю: 17.35 05/05/2013

Определяем количество полных дней в каждой дате с начала года:
Дата А: январь 21 = 21
Дата Б: январь 31, февраль 28, март 31, апрель 30, май 5= 125

Определяем количество полных часов с начала даты
Дата А: 12
Дата Б: 17

Определяем количество минут с начала нового часа
Дата А:34
Дата Б:35

Уже известно что в сутках 24 часа или 1440 минут
А в одном часе 60 минут

Переводим в минуты:
Дата А дни 21*1440 = 30240, часы 12*60=720, минуты 34
Дата Б дни 125*1440 = 180000, часы 17*60=1020, минуты 35

Складываем минуты для каждой даты
Дата А: 30240+720+34=30994
Дата Б: 180000+1020+35=181055

Вычисляем разность между датами в минутах:
Разность: ДатаБ-ДатаА = 181055-30994=150061

Ответ: разность в минутах равна 150061 (сто пятьдесят тысяч шестьдесят одна минута)
Чтобы получить ответ в секундах надо умножить число на 60.
Ответ в секундах: 150061*60=9003660 (девять миллионов три тысячи шестьсот шестьдесят секунд)




Go to the top of the page
 
+Quote Post
adnega
сообщение May 4 2013, 16:13
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 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

Go to the top of the page
 
+Quote Post
decom
сообщение May 4 2013, 16:43
Сообщение #30


Частый гость
**

Группа: Свой
Сообщений: 150
Регистрация: 9-12-12
Из: Саранск
Пользователь №: 74 770



Полагаю ТС собирается сделать гаджет типа "сколько секунд я прожил. Поэтому ему надо с 1900 года.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 06:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01482 секунд с 7
ELECTRONIX ©2004-2016