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

 
 
> Алгоритм вычитания по произвольному модулю
U235
сообщение Aug 30 2007, 10:10
Сообщение #1





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



Никто не подскажет, как на ARM-ассемблере организовать вычитание по модулю, к примеру, 55580? Согласен и просто на пригодный к ассемблированию алгоритм для 32х разрядного процессора. А то уже успел сильно пожалеть, что дрых на лекциях по булевой алгебре sad.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
yuri_d
сообщение Aug 30 2007, 12:16
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 28-01-05
Из: МО, Мытищи
Пользователь №: 2 274



Цитата(U235 @ Aug 30 2007, 14:10) *
Никто не подскажет, как на ARM-ассемблере организовать вычитание по модулю, к примеру, 55580?

Если Вы имеете ввиду 55580-ричные числа, то проще всего сначала перевести их в двоичные, далее сделать вычитание, а затем опять перевести в 55580-ричное.

Если же нужно вычитание в поле (например Галуа), то лучше почитайте соответствующую литературу по полям и по операциям в них.
Go to the top of the page
 
+Quote Post
U235
сообщение Aug 30 2007, 12:51
Сообщение #3





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



Интересует именно циклическое вычитание в поле, чтобы значения менялись циклически в диапазоне 0-55580. Я тут пока прикинул такой алгоритм вычитания r1 из r2: вычитаем r1 из r2 если значение положительное - все ок. Если отрицательное, вычитаем это значение из 55580 и получаем окончательный результат. Правильно?
Go to the top of the page
 
+Quote Post
yuri_d
сообщение Aug 30 2007, 14:25
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 28-01-05
Из: МО, Мытищи
Пользователь №: 2 274



Цитата(U235 @ Aug 30 2007, 16:51) *
Интересует именно циклическое вычитание в поле, чтобы значения менялись циклически в диапазоне 0-55580. Я тут пока прикинул такой алгоритм вычитания r1 из r2: вычитаем r1 из r2 если значение положительное - все ок. Если отрицательное, вычитаем это значение из 55580 и получаем окончательный результат. Правильно?

Значит у Вас просто арифметика по модулю 55581. Тогда подойдет следующий код:
вход: r1, r2
результат: r2
ldr r3, = 55581
subs r2, r2, r1
addcc r2, r2, r3
Go to the top of the page
 
+Quote Post
U235
сообщение Sep 5 2007, 10:21
Сообщение #5





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



Смысл последней строки в том, что если получится отрицательное число, то его можно просто сложить и за счеть арифметических свойств дополнительного кода получится правильный результат? Я хотел так сделать, но меня смутило, что будет если результат первого вычитания окажется меньше -32768. Не уверен, что тогда сложение будет корректно работать. Поэтому в итоге написал топорно, но зато вроде на 100 процентов надежно:

cmp r1, r2
bcc MOD55
sub r1, r1, r2
b RES
MOD55 ldr r3, =55581
sub r1, r2, r1
sub r1, r3, r1
RES ...

Попутно, кстати, по неопытности сначалав условном переходе поставил проверку флага N, а не C. В итоге где то с полчаса наблюдал замечательные глюки, пока не перечитал по 33ему разу документацию и не усвоил, в чем разница между этими флагами smile.gif
Go to the top of the page
 
+Quote Post

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

 


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


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