Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Алгоритм вычитания по произвольному модулю
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
U235
Никто не подскажет, как на ARM-ассемблере организовать вычитание по модулю, к примеру, 55580? Согласен и просто на пригодный к ассемблированию алгоритм для 32х разрядного процессора. А то уже успел сильно пожалеть, что дрых на лекциях по булевой алгебре sad.gif
yuri_d
Цитата(U235 @ Aug 30 2007, 14:10) *
Никто не подскажет, как на ARM-ассемблере организовать вычитание по модулю, к примеру, 55580?

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

Если же нужно вычитание в поле (например Галуа), то лучше почитайте соответствующую литературу по полям и по операциям в них.
U235
Интересует именно циклическое вычитание в поле, чтобы значения менялись циклически в диапазоне 0-55580. Я тут пока прикинул такой алгоритм вычитания r1 из r2: вычитаем r1 из r2 если значение положительное - все ок. Если отрицательное, вычитаем это значение из 55580 и получаем окончательный результат. Правильно?
yuri_d
Цитата(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
U235
Смысл последней строки в том, что если получится отрицательное число, то его можно просто сложить и за счеть арифметических свойств дополнительного кода получится правильный результат? Я хотел так сделать, но меня смутило, что будет если результат первого вычитания окажется меньше -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
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.