Важная информация

User Tag List

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 28

Тема: Арифметические процедуры на ассемблере

  1. #11
    Master
    Регистрация
    10.02.2014
    Адрес
    г. Тула
    Сообщений
    538
    Спасибо Благодарностей отдано 
    47
    Спасибо Благодарностей получено 
    42
    Поблагодарили
    29 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от AlexG Посмотреть сообщение
    Может баян:
    "Гуртовцев А.Л... Программы для микропроцессоров. [Djv- 2.3M] Справочное пособие.
    Спасибо за ссылку на интересную книжку,не попадалась мне еще такая.

    Цитата Сообщение от drbars Посмотреть сообщение
    Дмитрий2012, ты хоть подробно напиши что на что делить... 24bit/16bit или 24bit/8 ?
    В идеале нужна функция деления 32bit/24bit В данный момент меня устроила бы и 24bit /24bit
    Задача состоит в том, чтобы данные 32bit переменной в которой тикает время в миллисекундах перевести в часы - минуты – секунды - милисек.
    думаю делать так:

    час = милисек div 3600000
    мин = (милисек mod 3600000) div 60000
    сек = (милисек mod 60000) div 1000
    милисек = милисек mod 1000

    сразу же застрял на делении многобайтных чисел сам такую процедуру пока не осилю написать, вот и ищу готовую. Что попадаются в инете и журналах не работают. Толи опечатки там есть, то ли я что не так делаю...

  2. #12
    Member
    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Дмитрий2012, на первом шаге можно вычислять (ms/128)/(3600000/128), тогда делить более чем на 16 разрядные числа не придётся. А это время больше нигде не нужно, то может его лучше хранить и увеличивать по компонентам.

  3. #13
    Master
    Регистрация
    24.05.2005
    Адрес
    г. Запорожье, Украина
    Сообщений
    992
    Спасибо Благодарностей отдано 
    571
    Спасибо Благодарностей получено 
    364
    Поблагодарили
    239 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    а ассемблер для какого процессора ?

  4. #14
    Master
    Регистрация
    10.02.2014
    Адрес
    г. Тула
    Сообщений
    538
    Спасибо Благодарностей отдано 
    47
    Спасибо Благодарностей получено 
    42
    Поблагодарили
    29 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от blackmirror Посмотреть сообщение
    Дмитрий2012, на первом шаге можно вычислять (ms/128)/(3600000/128), тогда делить более чем на 16 разрядные числа не придётся. А это время больше нигде не нужно, то может его лучше хранить и увеличивать по компонентам.
    я об этом даже не подумал, спасибо за подсказку. Если ничего с делением 32 битных чисел не выйдет попробую такой вариант.

    Ну а на будущее хотелось бы все-равно иметь процедуры деления 32bit чисел.

    Цитата Сообщение от shurik-ua Посмотреть сообщение
    а ассемблер для какого процессора ?
    для Z80
    Последний раз редактировалось Дмитрий2012; 12.05.2017 в 17:37.

  5. #15
    Banned
    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,841
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    658
    Поблагодарили
    512 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Дмитрий2012 Посмотреть сообщение
    В идеале нужна функция деления 32bit/24bit В данный момент меня устроила бы и 24bit /24bit
    Задача состоит в том, чтобы данные 32bit переменной в которой тикает время в миллисекундах перевести в часы - минуты – секунды - милисек.
    можно без деления
    4 таблицы по 1.5К (может даже меньше тк младшие 2 байта не могут указывать количество часов)
    для каждого байта 32 битного числа
    в которых лежит декодированое значения часов минут секунд
    (2 байта часы, 1 байт минуты, 1 байт секунды, 2 байта миллисекунды)

    потом складываем полученные 4 значения с учетом переполнений
    и фсе

    возможно будет быстрее даже
    Последний раз редактировалось NEO SPECTRUMAN; 12.05.2017 в 18:53.

  6. #16
    Activist
    Регистрация
    15.01.2005
    Сообщений
    201
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    7
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    милисек = [32bit] / 1000
    /1000 = /8/125
    /8 это 3 сдвига вправо и тогда 24 часа входят в [24bit]

    итого, нужна процедура деления [24bit] на 125 или 3 деления подряд на 5

    получить секунды, это дальше делить на 60, это 2 сдвига и процедура деления на 15 [или на 5, а потом на 3]

    минуты - аналогично

    в остатке - часы

    кактотак?

    - - - Добавлено - - -

    еще как вариант, сдвинуть вначале = /8, получив [24bit]

    и далее только вычитанием

    -450000 до переполнения = часы
    -7500 до переполнения = минуты
    -125 до переполнения = секунды
    остаток = миллисекунды (деленные на 8)

  7. #16
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  8. #17
    Banned
    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,841
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    658
    Поблагодарили
    512 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от NEO SPECTRUMAN Посмотреть сообщение
    4 таблицы по 1.5К (может даже меньше тк младшие 2 байта не могут указывать количество часов)
    для каждого байта 32 битного числа
    точнее
    000000FF = 0-255мс (1 таблица 256 байт)
    0000FF00 = 0-999мс (2 таблицы) 0-59с (1 таблица) 0-1мин (1 таблица или сравнение)
    00FF0000 = 0-999мс (2 таблицы) 0-59с (1 таблица) 0-59мин (1 таблица) 0-4час (1 таблица или сравнение)
    FF000000 = 0-999мс (2 таблицы) 0-59с (1 таблица) 0-59мин (1 таблица) 0-1188 часов (2 таблицы)

    итого
    16 таблиц по 256 байт
    4К таблиц

    или
    14 таблиц по 256 байт
    3.5К таблиц

    если не нужны миллисекунды то можно выкинуть 1.75К
    Последний раз редактировалось NEO SPECTRUMAN; 12.05.2017 в 23:33.

  9. #18
    Master
    Регистрация
    10.02.2014
    Адрес
    г. Тула
    Сообщений
    538
    Спасибо Благодарностей отдано 
    47
    Спасибо Благодарностей получено 
    42
    Поблагодарили
    29 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Спасибо всем за предложенные алгоритмы, возьму на заметку.
    Остановился пока на варианте, который реально могу реализовать сам с моим уровнем знания ассемблера, использующем алгоритм с процедурой деления Unsigned 24 / 16

    Time – время в миллисекундах
    ms=(time mod 1000)
    time1=(time div 1000)
    sec=(time1 mod 60)
    time2=(time1 div 60)
    min=(time2 mod 60)
    time3=(time2 div 60)
    hour=(time3 mod 24)

  10. #19
    Member
    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Дмитрий2012, если время потом нужно вывести, то как предложил char можно сделать табличку с константами 864000000, 86400000, 36000000, 3600000, 600000, 60000, 10000, 1000, 100, 10, 1 и подсчитывая сколько раз их можно вычесть без переполнения, сразу получать нужные цифры. Причём первые три константы имеют нулевой младший байт, что позволяет вычитать только старшие три байта, после этого останется число не более 36000000, которое не влезает в три байта, но если его и остальные константы умножить на 2, то на этом шаге тоже можно будет обойтись 24-битным вычитанием, после вычитания 2*10000 можно перейти к 16-битному вычитанию, а после вычитания 2*100 остаётся 8-битное, ну а для последней цифры цикл уже не нужен, нужно только поделить остаток на 2. Есть сильное подозрение, что данный алгоритм будет работать быстрее чем деление на 1000, 60, 60 и 24.

  11. #20
    Activist
    Регистрация
    15.01.2005
    Сообщений
    201
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    7
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    а вообще, все это жесткая порнуха; кто миллисекунды увеличивает? на прерываниях? ну и делается это тогда отдельными счетчиками на мсек/сек/мин/час, увеличивающимися друг за другом, зачем вообще процессор и такты излишне жечь делением?! )

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 30
    Последнее: 14.01.2011, 15:13
  2. Функция #0a процедуры #3d13
    от axor в разделе Программирование
    Ответов: 3
    Последнее: 12.10.2006, 16:31
  3. Арифметические операции с двухбайтными числами
    от mishutka в разделе Программирование
    Ответов: 10
    Последнее: 17.02.2006, 19:09

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •