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

 
 
> Математический вопрос, Программирование на ассемблере
d7d1cd
сообщение Dec 21 2013, 16:41
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Привет всем. Я программирую на ассемблере. В моей программе все числа хранятся в 32-х разрядах. Соответственно, математические операции (умножение, деление и прочие), реализованы с помощью функций, которые так же работают с 32-х разрядными числами.
Сейчас возникла такая проблема. Мне необходимо сделать вычисления по следующей формуле: X = A * B / C. Числа A, B, C, X - 32-х разрядные. Результат в Х точно поместится в 32 разряда, но при выполнении операции А*В может получится 64-х разрядное число. Подскажите, возможно ли, не прибегая к использованию 64-х разрядных функций и чисел, выполнить вычисления по формуле?

P.S. Функция деления возвращает 2 результата: частное и остаток. Все числа исключительно положительные.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
PRidon
сообщение Dec 23 2013, 07:38
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 8-10-12
Пользователь №: 73 855



Ну есть один вариант. Делал похожее умножение на 8ми битке.
Пусть XY и AB - исходные числа. (каждая буква - 16 бит)
XY*AB= CDEF
где CD = X*A + 'старшие 16 бит'(A*Y+B*X),
EF = 'младшие 16 бит'(A*Y+B*X) + Y*B,
т.е. получаем 2 числа по 32 бита. Причем получаем оперируя только 32х битными числами.
Деление выполняется так же.
Единственный минус: на 3 больше умножений и на 2 больше делений. Ну а если уже написанная функция возвращает и остаток, и результат деления, то проблем быть не должно.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Dec 23 2013, 17:34
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Цитата(PRidon @ Dec 23 2013, 11:38) *
Ну есть один вариант. Делал похожее умножение на 8ми битке.
Пусть XY и AB - исходные числа. (каждая буква - 16 бит)
XY*AB= CDEF
где CD = X*A + 'старшие 16 бит'(A*Y+B*X),
EF = 'младшие 16 бит'(A*Y+B*X) + Y*B,
т.е. получаем 2 числа по 32 бита. Причем получаем оперируя только 32х битными числами.
Деление выполняется так же.
Единственный минус: на 3 больше умножений и на 2 больше делений. Ну а если уже написанная функция возвращает и остаток, и результат деления, то проблем быть не должно.

Спасибо за совет. Вот сейчас именно то, что надо. Но я тоже долго размышлял над задачей и подумал, что мне лучше переписать функции умножения и деления. То есть, функция деления должна делить 64-х битное число на 32-х битное и возвращать 32-х битное, а функция умножения должна перемножать 32-х битные числа и возвращать 64-х битное.
Функцию деления, я думаю, переписать смогу, а вот с функцией умножения загвоздка. Я хочу применить аппаратный умножитель, но не совсем разбираюсь в его регистрах. Функция умножения 32-х битных чисел и возвращения 32-х битного результата выглядит так:
Код
mov.w   R12,&MPY
mov.w   R14,&OP2
mov.w   R12,&MAC
mov.w   &RESLO,R12
mov.w   &RESHI,&RESLO
mov.w   R15,&OP2
mov.w   R13,&MAC
mov.w   R14,&OP2
mov.w   &RESLO,R13

В этой функции R12 и R13 - это первый множитель (R12 - младшее слово), R14 и R15 - второй множитель (R14 младшее слово). Результат я получаю в регистрах R12 и R13 (R12 - младшее слово). Подскажите, как мне получить 64-х битный результат умножения (в регистрах R12-R15)?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- d7d1cd   Математический вопрос   Dec 21 2013, 16:41
- - Xenia   Цитата(d7d1cd @ Dec 21 2013, 20:41) ... н...   Dec 21 2013, 16:55
|- - d7d1cd   Цитата(Xenia @ Dec 21 2013, 20:55) Откуда...   Dec 21 2013, 17:11
- - lekintr   Цитата(d7d1cd @ Dec 21 2013, 20:41) Резул...   Dec 21 2013, 17:15
- - d7d1cd   Ну вообще то под словами "результат в Х...   Dec 21 2013, 17:37
|- - kovigor   Цитата(d7d1cd @ Dec 21 2013, 20:37) Ну во...   Dec 21 2013, 19:20
|- - d7d1cd   Цитата(kovigor @ Dec 21 2013, 23:20) А чт...   Dec 22 2013, 06:26
- - Егоров   Хм.. так 32 разряда - точность. Умножайте спокойно...   Dec 21 2013, 21:53
|- - d7d1cd   Цитата(PRidon @ Dec 23 2013, 11:38) Пусть...   Dec 24 2013, 14:28
- - PRidon   Процессор та какой? Если умножитель аппаратный, то...   Dec 24 2013, 06:18
- - PRidon   Это обычное умножение столбиком. Что переполняется...   Dec 25 2013, 04:57
- - d7d1cd   Итак, умножению иною реализовано. Вот код: Код//**...   Dec 25 2013, 17:40
- - PRidon   как разберешься с делением - выложи результат. Пол...   Dec 26 2013, 05:31
- - demiurg_spb   Я бы, прежде чем изобретать велосипед, ознакомился...   Dec 26 2013, 06:19
- - d7d1cd   Цитата(PRidon @ Dec 26 2013, 09:31) как р...   Dec 26 2013, 11:10


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

 


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


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