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

 
 
> Деление/умножение чисел на ассемблере
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
Ответов
aaarrr
сообщение Jun 24 2008, 10:49
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Сначала умножьте temp2 на temp3, а потом делите сдвигом на 1024.
Go to the top of the page
 
+Quote Post
Sprite
сообщение Jun 24 2008, 10:58
Сообщение #3


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

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



Цитата(aaarrr @ Jun 24 2008, 17:49) *
Сначала умножьте temp2 на temp3, а потом делите сдвигом на 1024.


Поправка: temp2 принимает значение от 500 до 1500.

Спасибо за совет, еще 2 вопроса:
1. Как выполняется умножение на asm?
2. Как быть, если temp2==1000 и temp3==1000? При этом результат операции умножения == 1000000, что выходит за границы максимального значения типа uint16==65535. Нужно использовать числа бОльшей разрядности?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 24 2008, 11:09
Сообщение #4


Гуру
******

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



Цитата(Sprite @ Jun 24 2008, 13:58) *
1. Как выполняется умножение на asm?
У Atmel на сайте есть документ "AVR200 Multiply and Divide Routines". Скачайте и прочтите
Цитата(Sprite @ Jun 24 2008, 13:58) *
2. Как быть, если temp2==1000 и temp3==1000? При этом результат операции умножения == 1000000, что выходит за границы максимального значения типа uint16==65535. Нужно использовать числа бОльшей разрядности?
При перемножении двух 16-тиразрядных чисел - результат: 32-разрядное число
Go to the top of the page
 
+Quote Post
Sprite
сообщение Jun 24 2008, 14:12
Сообщение #5


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

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



Цитата(Палыч @ Jun 24 2008, 18:09) *
У Atmel на сайте есть документ "AVR200 Multiply and Divide Routines". Скачайте и прочтите При перемножении двух 16-тиразрядных чисел - результат: 32-разрядное число


Большое спасибо! Нашел в Appnotes примеры быстрого умножения. Все работает, после умножения результат сохраняется в r18, r19, r20, r21 (r18 - младший байт). Теперь мне необходимо поделить на 1024. Эта операция соответствует 10-ти сдвигам вправо (команда lsr). Но lsr применяется только к 8-битным регистрам.
Я делаю следующее:
Код
mov     r21, r20
mov     r20, r19
mov     r19, r18

Т.е. сдвигаю результат на 8 бит вправо. Далее мне необходимо сдвинуть весь результат еще на 2 бита вправо, но как это сделать я пока не знаю. При сдвиге командой lsr каждого из регистров (r18, r19, r20) теряются два старших бита каждого из регистров. Подскажите, как выполнить сдвиг сразу трех регистров?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 24 2008, 14:43
Сообщение #6


Гуру
******

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



Цитата(Sprite @ Jun 24 2008, 17:12) *
Подскажите, как выполнить сдвиг сразу трех регистров?
Обычно это делают через бит переноса (С). Если у Вас делится положительное число (знак расширять нет необходимости, он всегда 0), то сдвиг трёх байт на 1 бит:

clc
ror r21
ror r20
ror r19

При "отбрасывании" младшего байта (сдвиг на 8) нет необходимости три других копировать, достаточно помнить, что теперь младший r19

P.S. Ой! Можно то, короче

lsr r21
ror r20
ror r19
Go to the top of the page
 
+Quote Post



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

 


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


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