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

 
 
> Деление/умножение чисел на ассемблере
Sprite
сообщение Jun 24 2008, 10:42
Сообщение #1


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

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Доброго всем времени суток!
Пишу программу для atmega8535. Недавно начал изучать asm и встала такая задача:
Необходимо написать аналог следующего C-кода на asm:
Код
uint16_t temp1, temp2, temp3;
........
temp1 = temp2/1024*temp3;

, где temp3 может иметь значения от 1 до 1023;
Данное вычисление должно выполняться максимально быстро. Слышал, что имеется волшебная команда lsr, что соответствует делению на 2, т.о. выполнив 10 раз lsr мы поделим temp2 на 1024, но результат при этом будет <0, что недопустимо, поскольку используется целые числаsad.gif
Помогите разобраться!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Палыч
сообщение Jun 24 2008, 10:48
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Sprite @ Jun 24 2008, 13:42) *
Код
uint16_t temp1, temp2, temp3;
........
temp1 = temp2/1024*temp3;

... выполнив 10 раз lsr мы поделим temp2 на 1024, но результат при этом будет <0, что недопустимо, поскольку используется целые числа
Достаточно вспомнить, что Ваше выражение эквивалентно следующему
temp1 = temp2*temp3/1024;
т.е. вначале выполняйте умножение, а затем - деление (если нужно - с округлением результата)

P.S. Кстати, при делении на 1024 сдвигать на 10 вовсе не требуется - младший байт делимого можно просто отбросить (экономия = 8 сдвигов).
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 04:47
Рейтинг@Mail.ru


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