Easyelectronics.ru

Электроника для всех
Текущее время: 26 фев 2021, 03:56

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Умножение дробных чисел в асме
СообщениеДобавлено: 25 фев 2010, 15:30 
Только пришел

Зарегистрирован: 30 янв 2010, 13:31
Сообщения: 18
Связался с этим делом, покурил апнот200. Но тока он чето не работает, считает и выдает какую-то лажу. Более менее считает числа с одним знаком после запятой, но невсегда правильно, мне же нужно умножать на 3 знака после запятой. Здесь умножаю 5 * 0.125, такие числа он вообще не варит. Что я делаю не так?

Код:
;******************************************************************************
;*
;* FUNCTION
;*   fmuls16x16_32
;* DECRIPTION
;*   Signed fractional multiply of two 16bits numbers with 32bits result.
;* USAGE
;*   r19:r18:r17:r16 = ( r23:r22 * r21:r20 ) << 1
;* STATISTICS
;*   Cycles :   20 + ret
;*   Words :      16 + ret
;*   Register usage: r0 to r2 and r16 to r23 (11 registers)
;* NOTE
;*   The routine is non-destructive to the operands.
;*
;******************************************************************************
      LDI      r21, 125
      LDI       r20, 0  //целые
      
      LDI      r23, 0
      LDI     r22, 5 //целые
      rcall   fmuls16x16_32
      
fmuls16x16_32:
   clr   r2
   fmuls   r23, r21      ; ( (signed)ah * (signed)bh ) << 1
   movw   r19:r18, r1:r0
   fmul   r22, r20      ; ( al * bl ) << 1
   adc   r18, r2
   movw   r17:r16, r1:r0
   fmulsu   r23, r20      ; ( (signed)ah * bl ) << 1
   sbc   r19, r2
   add   r17, r0
   adc   r18, r1
   adc   r19, r2
   fmulsu   r21, r22      ; ( (signed)bh * al ) << 1
   sbc   r19, r2
   add   r17, r0
   adc   r18, r1
   adc   r19, r2
   ret


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение дробных чисел в асме
СообщениеДобавлено: 25 фев 2010, 19:54 
Только пришел

Зарегистрирован: 08 фев 2010, 23:17
Сообщения: 13
Откуда: Москва
А что тебе в ответ возвращается? Дело в том что это функция не для дробных чисел, а для целых со знаком, т.е. в результате должно получится 5*125 = 625, это и будет твоя дробная часть. Возьми функцию без знака, если у тебя положительные числа. И еще в твоем примере тебе повезло что числа 8-ми битные, для загрузки все же лучше будет использовать что-то вроде
LDI r21, high(125)
LDI r20, low(125)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение дробных чисел в асме
СообщениеДобавлено: 26 фев 2010, 03:04 
Только пришел

Зарегистрирован: 30 янв 2010, 13:31
Сообщения: 18
Как это не для дробных? А это что:
"Signed fractional multiply of two 16bits numbers with 32bits result"
R18 = 254
R22 = 5
вот это и пишет


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение дробных чисел в асме
СообщениеДобавлено: 26 фев 2010, 04:52 
Только пришел

Зарегистрирован: 08 фев 2010, 23:17
Сообщения: 13
Откуда: Москва
Да fractional между глаз попало :) ну или потому что апнот 200 не про то.
Нужно прочитать какой формат используется для дробных чисел. В этом случае 1.7 для старшего бита, младший лишь увеличивает точность, т.е. ты просто не те цифры даешь на вход.Нужно что-то типа.

LDI r21, 0b00010000
LDI r20, 0b00000000

это будет в формате 1.15 означать 0.125, только вот боюсь что второй операнд должен быть тоже в формате 1.15 и результат получишь в 1.31


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение дробных чисел в асме
СообщениеДобавлено: 26 фев 2010, 10:40 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:55
Сообщения: 5600
Откуда: Уругвайская АССР
Читаю, думаю «влезть-не влезть»? Влезу. http://easyelectronics.ru/forum/mydevice/topic-1644

_________________
Без гнева и жестокости, сегодня Смерть взмахнёт косой, и ангел тайными дорогами мой милый Кубик унесёт с собой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение дробных чисел в асме
СообщениеДобавлено: 26 фев 2010, 12:03 
Заглядывает иногда

Зарегистрирован: 14 фев 2010, 17:10
Сообщения: 198
Откуда: Москва
в попу аппноут, вспоминаем среднюю школу, пятый класс :)
http://www.mathematics.ru/courses/algeb ... heory.html
"Умножение десятичных дробей проводится следующим образом. Перемножаем данные числа, как целые, не обращая внимания на запятые. Затем ставим в произведении запятую по следующему правилу: число знаков после запятой в произведении равно сумме чисел знаков после запятой во всех сомножителях. Заметим, что до постановки запятой отбрасывать знаки нельзя."

только дроби у нас будут не десятичные, а двоичные. перемножать нам проще целыми байтами, а число знаков после запятой проще сделать фиксированным. напоминаю еще раз - двоичных знаков.
исходя из этого пишем несложный код на mul'ах и adc. убеждаемся в том, что он работает, и только потом берем аппноут и либо оптимизируем свой код, либо копипэйстим, но уже с пониманием дела.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение дробных чисел в асме
СообщениеДобавлено: 26 фев 2010, 17:54 
Только пришел

Зарегистрирован: 08 фев 2010, 23:17
Сообщения: 13
Откуда: Москва
+1 за работу с целыми числами. Просто если числа изначально в дробном формате появляется дополнительная головная боль в виде перевода формата в целое, а после всех операций нужно будет еще понять где ставить запятую...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  
cron

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB