реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Умножение
Ich
сообщение Dec 12 2006, 01:05
Сообщение #1





Группа: Новичок
Сообщений: 8
Регистрация: 12-05-05
Пользователь №: 4 962



Подскажите пожалуйста как правильно на асемблере умножить регистровую пару на константу, поиском ничего доступного не нашел (может и плохо искал). Заранее спасибо!
Go to the top of the page
 
+Quote Post
dimka76
сообщение Dec 12 2006, 08:59
Сообщение #2


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(Ich @ Dec 12 2006, 01:05) *
Подскажите пожалуйста как правильно на асемблере умножить регистровую пару на константу, поиском ничего доступного не нашел (может и плохо искал). Заранее спасибо!


Это смотря какие числа умножать и для каких контроллеров (имеется ли на борту аппаратный умножитель или нет).
А вообще посмотри AVR200 и AVR201 на
http://www.atmel.com/dyn/products/app_note...p?family_id=607


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Ich
сообщение Dec 12 2006, 10:33
Сообщение #3





Группа: Новичок
Сообщений: 8
Регистрация: 12-05-05
Пользователь №: 4 962



Контроллер Mega 16, надо умножить результат от преобразования АЦП на константу, в моем случае на 7.
Go to the top of the page
 
+Quote Post
kalinka16
сообщение Dec 12 2006, 10:45
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 42
Регистрация: 30-06-05
Пользователь №: 6 414



Цитата(Ich @ Dec 12 2006, 10:33) *
Контроллер Mega 16, надо умножить результат от преобразования АЦП на константу, в моем случае на 7.


Результат АЦП сдвинуть влево на три бита (эквивалентно умножению на 8) и вычесть результат АЦП (будет 7)
Go to the top of the page
 
+Quote Post
Wild007
сообщение Dec 12 2006, 10:47
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



Цитата(Ich @ Dec 12 2006, 09:33) *
Контроллер Mega 16, надо умножить результат от преобразования АЦП на константу, в моем случае на 7.

Исползовать команду:
MULSU Rd, Rr Multiply Signed with Unsigned R1:R0 ← Rd x Rr
Смотри DS


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post
ValeraK
сообщение Dec 12 2006, 11:07
Сообщение #6


Частый гость
**

Группа: Новичок
Сообщений: 164
Регистрация: 11-01-05
Из: Россия, Снежинск
Пользователь №: 1 900



Цитата(Ich @ Dec 12 2006, 03:05) *
Подскажите пожалуйста как правильно на асемблере умножить регистровую пару на константу


При умножении 16 на 16 результат 32, делаю так:

clr Temp1000
clr Temp0100
ldi Cnt,16 ;bit counter
M16x16: lsr MnozhimoeH
ror MnozhimoeL
brcc NoAdd
add Temp0100,MnozhitelL
adc Temp1000,MnozhitelH
NoAdd: ror Temp1000 ;Result >>
ror Temp0100
ror Temp0010
ror Temp0001
dec Cnt
brne M16x16

Результат будет в четырёх регистрах Temp*
Go to the top of the page
 
+Quote Post
xemul
сообщение Dec 12 2006, 12:51
Сообщение #7



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



(high(a)*256 + low(a)) * b = (high(a) *b ) * 256 + low(a) * b
Осталось только реализовать это на ассемблере с использованием поминавшейся команды mulsu (mul, muls - по вкусуsmile.gif).
Go to the top of the page
 
+Quote Post
_Bill
сообщение Dec 12 2006, 13:57
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Ich @ Dec 12 2006, 10:33) *
Контроллер Mega 16, надо умножить результат от преобразования АЦП на константу, в моем случае на 7.

"Умножение без умножения"
Go to the top of the page
 
+Quote Post
=GM=
сообщение Dec 12 2006, 18:35
Сообщение #9


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(ValeraK @ Dec 12 2006, 08:07) *
Цитата(Ich @ Dec 12 2006, 03:05) *

Подскажите пожалуйста как правильно на асемблере умножить регистровую пару на константу


При умножении 16 на 16 результат 32, делаю так:

clr Temp1000
clr Temp0100
ldi Cnt,16 ;bit counter
M16x16: lsr MnozhimoeH
ror MnozhimoeL
brcc NoAdd
add Temp0100,MnozhitelL
adc Temp1000,MnozhitelH
NoAdd: ror Temp1000 ;Result >>
ror Temp0100
ror Temp0010
ror Temp0001
dec Cnt
brne M16x16

Результат будет в четырёх регистрах Temp*

Будет чуток побыстрее (на 32 такта), если совместить регистры MnozhimoeH и MnozhimoeH с регистрами Temp0010 и Temp0001. К тому же нужно будет не 8 регистров, а 6. Ну и lsr сменить на ror.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
OlegIvanov
сообщение Dec 13 2006, 04:43
Сообщение #10


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 12-09-05
Пользователь №: 8 464



умножение 2 байта на байт правильно понял? [A:B] * C = [B*C] + [A*C] если скорость не критична Есть алгоритмы побыстрее - умножение определенным способом на константу, вроде как говорили выше, не разбирался
Go to the top of the page
 
+Quote Post
ValeraK
сообщение Dec 18 2006, 02:49
Сообщение #11


Частый гость
**

Группа: Новичок
Сообщений: 164
Регистрация: 11-01-05
Из: Россия, Снежинск
Пользователь №: 1 900



Цитата(=GM= @ Dec 12 2006, 20:35) *
Цитата(ValeraK @ Dec 12 2006, 08:07) *

Цитата(Ich @ Dec 12 2006, 03:05) *

Подскажите пожалуйста как правильно на асемблере умножить регистровую пару на константу

При умножении 16 на 16 результат 32, делаю так:

Будет чуток побыстрее (на 32 такта), если совместить регистры MnozhimoeH и MnozhimoeH с регистрами Temp0010 и Temp0001. К тому же нужно будет не 8 регистров, а 6. Ну и lsr сменить на ror.


Полностью согласен, только ещё нужно убрать пару лишних сдвигов снизу.
Делалось давно, да и я стараюсь следовать: работает - не трогай.

P.S. Нет пределов совершенству; лучшее враг хорошего.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 09:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01454 секунд с 7
ELECTRONIX ©2004-2016