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

|
Подскажите пожалуйста как правильно на асемблере умножить регистровую пару на константу, поиском ничего доступного не нашел (может и плохо искал). Заранее спасибо!
|
|
|
|
|
 |
Ответов
(1 - 10)
|
Dec 12 2006, 08:59
|

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
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Dec 12 2006, 10:33
|
Группа: Новичок
Сообщений: 8
Регистрация: 12-05-05
Пользователь №: 4 962

|
Контроллер Mega 16, надо умножить результат от преобразования АЦП на константу, в моем случае на 7.
|
|
|
|
|
Dec 12 2006, 10:45
|
Участник

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

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

Местный
  
Группа: Свой
Сообщений: 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
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Dec 12 2006, 11:07
|

Частый гость
 
Группа: Новичок
Сообщений: 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*
|
|
|
|
|
Dec 12 2006, 18:35
|

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.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Dec 13 2006, 04:43
|
Участник

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

|
умножение 2 байта на байт правильно понял? [A:B] * C = [B*C] + [A*C] если скорость не критична Есть алгоритмы побыстрее - умножение определенным способом на константу, вроде как говорили выше, не разбирался
|
|
|
|
|
Dec 18 2006, 02:49
|

Частый гость
 
Группа: Новичок
Сообщений: 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. Нет пределов совершенству; лучшее враг хорошего.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|