Перейти к содержанию
    

Определение промежутка времени

Спасибо за код. Можно попросить прокомментировать строки функции, которая преобразует дату в число дней...

Дело было давно, сейчас тонкостей не помню.

Возможно "формула Зеллера" из этой оперы.

В самом конце формулы будет вычитание большого числа - это сдвиг начало эпохи.

 

В коде похоже ошибка, надо бы проверить.

Перевод туда и обратно проверял числительно для всех дат от 2000 до 2099 года.

Можете показать проблемное место?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какому пункту правил?

 

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

 

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пишите хоть в машинных кодах.

Из моего сообщения вы могли бы почерпнуть, если бы не торопились с выводами, такие варианты:

* использовать библиотеку напрямую (если только у вас не орден велосипедостроителя 3ей степени), ведь из ПИСАНИЯ НА АССЕМБЛЕРЕ не следует невозможность использования библиотек;

* использовать исходный код (реализаций на Си предостаточно) что б реализовать алгоритм своими силами;

* бинарник нужной функции из библиотеки пропустить через дизассемблер, ручками выправить полученное до ассемблируемого вида, ведь вам же нужен АССЕМБЛЕР.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изучите основы систем счисления, а потом пишите хоть на суахили...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините, но при чём здесь Ассемблер?

Изучите основы систем счисления, а потом пишите хоть на суахили...

Сложно будет человеку на Ассемблере писать функции деления не на константу. Если быстродействие не кусается, то можно преобразование выполнять через отнимание в цикле сначала количества секунд в годе (с учетом высокосных), потом месяцы (например через масив количества секунд в месяце), сутки и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сложно будет человеку на Ассемблере писать функции деления не на константу.

Если человек использует ассемблер, то эта функция у него уже есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если человек использует ассемблер, то эта функция у него уже есть.

Не факт. Я даже в программе на С стараюсь избегать деления на что-либо отличное от степени двойки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не факт. Я даже в программе на С стараюсь избегать деления на что-либо отличное от степени двойки.

А как же вывод десятичных чисел на дисплей? Деление на константу 10.

В свое время делал на АСМе получается (частное и остаток) компактно и быстро, но с использованием команды умножения.

Функцию деления произвольно числа на произвольное число делал для кр1878ве1, МК51, AVR.

Заниматься вычитаниями можно, но зачем, когда можно взять и один раз написать нужную функцию?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как же вывод десятичных чисел на дисплей? Деление на константу 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Господа, деление меня не волнует (так же как и умножение). Для своих целей я уже написал функции для деления и умножения. Причем они работают с 32-х разрядными числами.

Если не трудно, то покажите алгоритм определения разности между датами в минутах (точнее не нужно).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы уже достали своими детскими вопросами.

Вот алгоритм определения разности в минутах ВНУТРИ ОДНОГО ГОДА.

Дата А: 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 (девять миллионов три тысячи шестьсот шестьдесят секунд)

 

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы уже достали своими детскими вопросами.

Вот алгоритм определения разности в минутах ВНУТРИ ОДНОГО ГОДА.

Дата А: 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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Полагаю ТС собирается сделать гаджет типа "сколько секунд я прожил. Поэтому ему надо с 1900 года.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...