adnega 11 28 апреля, 2013 Опубликовано 28 апреля, 2013 · Жалоба Спасибо за код. Можно попросить прокомментировать строки функции, которая преобразует дату в число дней... Дело было давно, сейчас тонкостей не помню. Возможно "формула Зеллера" из этой оперы. В самом конце формулы будет вычитание большого числа - это сдвиг начало эпохи. В коде похоже ошибка, надо бы проверить. Перевод туда и обратно проверял числительно для всех дат от 2000 до 2099 года. Можете показать проблемное место? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
d7d1cd 0 30 апреля, 2013 Опубликовано 30 апреля, 2013 · Жалоба Какому пункту правил? Я не помню точно какой пункт, но он относится к запрету обсуждения дизасма чужих программ. Почему всем так интересно, чего это я пишу на асме, а не на Си? Всем интересно, а модераторы потом претензии предъявляют не всем, а тебе... Мне не важен язык программы, мне нужен алгоритм. Так что кто может помочь, направляйте на путь истинный... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
msalov 0 30 апреля, 2013 Опубликовано 30 апреля, 2013 · Жалоба Такой наивный вопрос: а чем стандартная библиотека Си не угодила? Там есть функция работы со временем mktime, которая время в человеко-приемлемой форме переводит во время Unix (количество секунд с 01.01.1970 00:00:00). Ну а дальше разницу взять - дело тривиальное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
d7d1cd 0 1 мая, 2013 Опубликовано 1 мая, 2013 · Жалоба Такой наивный вопрос: а чем стандартная библиотека Си не угодила? Там есть функция работы со временем mktime, которая время в человеко-приемлемой форме переводит во время Unix (количество секунд с 01.01.1970 00:00:00). Ну а дальше разницу взять - дело тривиальное. Такое наивное сто двадцать пятое объяснение: Я ПИШУ НА АССЕМБЛЕРЕ!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
msalov 0 2 мая, 2013 Опубликовано 2 мая, 2013 · Жалоба Пишите хоть в машинных кодах. Из моего сообщения вы могли бы почерпнуть, если бы не торопились с выводами, такие варианты: * использовать библиотеку напрямую (если только у вас не орден велосипедостроителя 3ей степени), ведь из ПИСАНИЯ НА АССЕМБЛЕРЕ не следует невозможность использования библиотек; * использовать исходный код (реализаций на Си предостаточно) что б реализовать алгоритм своими силами; * бинарник нужной функции из библиотеки пропустить через дизассемблер, ручками выправить полученное до ассемблируемого вида, ведь вам же нужен АССЕМБЛЕР. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Stanislav 0 2 мая, 2013 Опубликовано 2 мая, 2013 · Жалоба Такое наивное сто двадцать пятое объяснение: Я ПИШУ НА АССЕМБЛЕРЕ!!!Извините, но при чём здесь Ассемблер? Изучите основы систем счисления, а потом пишите хоть на суахили... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jack_avenger 5 3 мая, 2013 Опубликовано 3 мая, 2013 · Жалоба Извините, но при чём здесь Ассемблер? Изучите основы систем счисления, а потом пишите хоть на суахили... Сложно будет человеку на Ассемблере писать функции деления не на константу. Если быстродействие не кусается, то можно преобразование выполнять через отнимание в цикле сначала количества секунд в годе (с учетом высокосных), потом месяцы (например через масив количества секунд в месяце), сутки и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 3 мая, 2013 Опубликовано 3 мая, 2013 · Жалоба Сложно будет человеку на Ассемблере писать функции деления не на константу. Если человек использует ассемблер, то эта функция у него уже есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jack_avenger 5 3 мая, 2013 Опубликовано 3 мая, 2013 · Жалоба Если человек использует ассемблер, то эта функция у него уже есть. Не факт. Я даже в программе на С стараюсь избегать деления на что-либо отличное от степени двойки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 3 мая, 2013 Опубликовано 3 мая, 2013 · Жалоба Не факт. Я даже в программе на С стараюсь избегать деления на что-либо отличное от степени двойки. А как же вывод десятичных чисел на дисплей? Деление на константу 10. В свое время делал на АСМе получается (частное и остаток) компактно и быстро, но с использованием команды умножения. Функцию деления произвольно числа на произвольное число делал для кр1878ве1, МК51, AVR. Заниматься вычитаниями можно, но зачем, когда можно взять и один раз написать нужную функцию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jack_avenger 5 3 мая, 2013 Опубликовано 3 мая, 2013 · Жалоба А как же вывод десятичных чисел на дисплей? Деление на константу 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
d7d1cd 0 4 мая, 2013 Опубликовано 4 мая, 2013 · Жалоба Господа, деление меня не волнует (так же как и умножение). Для своих целей я уже написал функции для деления и умножения. Причем они работают с 32-х разрядными числами. Если не трудно, то покажите алгоритм определения разности между датами в минутах (точнее не нужно). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
decom 0 4 мая, 2013 Опубликовано 4 мая, 2013 · Жалоба Вы уже достали своими детскими вопросами. Вот алгоритм определения разности в минутах ВНУТРИ ОДНОГО ГОДА. Дата А: 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 (девять миллионов три тысячи шестьсот шестьдесят секунд) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 4 мая, 2013 Опубликовано 4 мая, 2013 · Жалоба Вы уже достали своими детскими вопросами. Вот алгоритм определения разности в минутах ВНУТРИ ОДНОГО ГОДА. Дата А: 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
decom 0 4 мая, 2013 Опубликовано 4 мая, 2013 · Жалоба Полагаю ТС собирается сделать гаджет типа "сколько секунд я прожил. Поэтому ему надо с 1900 года. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться