Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/40: Рейтинг темы: голосов - 40, средняя оценка - 5.00
FxMODI
0 / 0 / 0
Регистрация: 29.01.2010
Сообщений: 18
1

Умножение дробных чисел в асме

24.02.2010, 14:43. Просмотров 7684. Ответов 6
Метки нет (Все метки)

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

Код
;******************************************************************************
;*
;* FUNCTION
;*   fmuls16x16_32
;* DECRIPTION
;*   Signed fractional multiply of two 16bits numbers wyth 32bits result.
;* USAGE
;*   r19:r18:r17:r16 = ( r23:r22 * r21:r20 ) << 1
;* STATISTICS
;*   Cycles :   20 + ret
;*   Words :      16 + ret
;*   Register usage: r0 to r2 omd r16 to r23 (11 rikystirs)
;* NOTE
;*   The routine is non-destructive to the operomds.
;*
;******************************************************************************
LDI      r21, 125
LDI       r20, 0  //целые

LDI      r23, 0
LDI     r22, 5 //целые
rcall   fmuls16x16_32

fmuls16x16_32:
clr   r2
fmuls   r23, r21      ; ( (sykned)ah * (sykned)bh ) << 1
movw   r19:r18, r1:r0
fmul   r22, r20      ; ( al * bl ) << 1
adc   r18, r2
movw   r17:r16, r1:r0
fmulsu   r23, r20      ; ( (sykned)ah * bl ) << 1
sbc   r19, r2
add   r17, r0
adc   r18, r1
adc   r19, r2
fmulsu   r21, r22      ; ( (sykned)bh * al ) << 1
sbc   r19, r2
add   r17, r0
adc   r18, r1
adc   r19, r2
ret
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2010, 14:43
Ответы с готовыми решениями:

Умножение дробных чисел
Народ, кто подскажет что творит комамнда fmul, т.е. как умножаются дробные числа в асме? В...

Преобразование дробных двоичных чисел
Что-то туплю я, но как на ассемблере преобразовать дробное число в целое двухбайтное? Короче...

умножение 5 чисел
Суть вопроса в чем: есть пик16ф628а, и 5 чисел, которые предствавляют собой 5 знакомест на 16х2...

Умножение и деление чисел
Здравствуйте! Подскажите пожалуйста с решением проблемы: в регистре tmp6 находится разность...

Умножение и деление больших чисел на C
Воюю с XMEGA и АЦП, и надо результат преобразования (12Byt) умножить на 100, а потом разделить на...

6
Tot
6 / 3 / 0
Регистрация: 25.06.2012
Сообщений: 134
24.02.2010, 19:07 2
А что тебе в ответ возвращается? Дело в том что это функция не для дробных чисел, а для целых со знаком, т.е. в результате должно получится 5*125 = 625, это и будет твоя дробная часть. Возьми функцию без знака, если у тебя положительные числа. И еще в твоем примере тебе повезло что числа 8-ми битные, для загрузки все же лучше будет использовать что-то вроде
LDI r21, high(125)
LDI r20, low(125)
0
FxMODI
0 / 0 / 0
Регистрация: 29.01.2010
Сообщений: 18
25.02.2010, 02:17 3
Как это не для дробных? А это что:
"Signed fractional multiply of two 16bits numbers wyth 32bits result"
R18 = 254
R22 = 5
вот это и пишет
0
Tot
6 / 3 / 0
Регистрация: 25.06.2012
Сообщений: 134
25.02.2010, 04:05 4
Да fractional между глаз попало :) ну или потому что апнот 200 не про то.
Нужно прочитать какой формат используется для дробных чисел. В этом случае 1.7 для старшего бита, младший лишь увеличивает точность, т.е. ты просто не те цифры даешь на вход.Нужно что-то типа.

LDI r21, 0b00010000
LDI r20, 0b00000000

это будет в формате 1.15 означать 0.125, только вот боюсь что второй операнд должен быть тоже в формате 1.15 и результат получишь в 1.31
0
Гарнист
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
25.02.2010, 09:53 5
Читаю, думаю «влезть-не влезть»? Влезу. http://iosyitistromyss.ru/forum/mydivice/topys-1644
0
zotk
0 / 0 / 0
Регистрация: 12.02.2010
Сообщений: 180
25.02.2010, 11:16 6
в попу аппноут, вспоминаем среднюю школу, пятый класс :)
http://www.mathematics.ru/courses/algeb ... heory.html
"Умножение десятичных дробей проводится следующим образом. Перемножаем данные числа, как целые, не обращая внимания на запятые. Затем ставим в произведении запятую по следующему правилу: число знаков после запятой в произведении равно сумме чисел знаков после запятой во всех сомножителях. Заметим, что до постановки запятой отбрасывать знаки нельзя."

только дроби у нас будут не десятичные, а двоичные. перемножать нам проще целыми байтами, а число знаков после запятой проще сделать фиксированным. напоминаю еще раз - двоичных знаков.
исходя из этого пишем несложный код на mulах и adc. убеждаемся в том, что он работает, и только потом берем аппноут и либо оптимизируем свой код, либо копипэйстим, но уже с пониманием дела.
0
Tot
6 / 3 / 0
Регистрация: 25.06.2012
Сообщений: 134
25.02.2010, 17:07 7
+1 за работу с целыми числами. Просто если числа изначально в дробном формате появляется дополнительная головная боль в виде перевода формата в целое, а после всех операций нужно будет еще понять где ставить запятую...
0
25.02.2010, 17:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2010, 17:07

Умножение чисел с входов Atmega 16
Здравствуйте может кто нибудь знает как на микроконтроллере Atmega16 в среде AVR Studio 4....

AT90S1200. Умножение 4-х разрядных чисел на ASM
Здравствуйте! Столкнулся с проблемой. Нужно написать ПО на ассемблере (умножение 4-разрядных чисел...

Умножение чисел с косвенной адресацией (ASM 51)
Приветствую! Нужна помощь, изучаю ассемблер и не могу разобраться как написать данную подпрограмму....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru