Вы можете выполнять арифметику только в регистрах при программировании в студии Atmel?

Мне нужно умножить два 4-байтовых числа. Я могу хранить эти значения в регистрах x, y, z, но как мне их умножить, поскольку я могу умножать только 8x8 бит за раз? Я знаю, как выделить память в dseg, но арифметические функции там не выполняются. Устройства, которые я использую для моделирования, - 169p и 2560. Можно использовать Mul.

Я пробовал использовать регистры x, y, z, но не могу понять, как позаботиться о переносах и т.п. Я знаю, что их можно найти в регистрах 0,1 и так далее четвертого. Я попытался выделить ячейки памяти, достаточно большие для хранения чисел для арифметики, но мне все равно пришлось бы перемещать их в регистры для операций.


person user3335432    schedule 21.02.2014    source источник
comment
Спасибо, шут, за ответ, шут. Я скоро приду к решению   -  person user3335432    schedule 23.02.2014


Ответы (2)


Вы можете реализовать любой из известных алгоритмов умножения для себя, или, если вы настаиваете на построении поверх существующего 8-битного умножения, вы можете использовать некоторую элементарную алгебру. Пример для 16-битного регистра с s=2^8:

op1 = a*s + b
op2 = c*s + d
op1 * op2 = (a*s + b) * (c*s + d) = a*c*s*s + b*c*s + a*d*s + b*d

Все умножения переменных здесь 8-битные с 16-битным результатом. Добавьте частичные члены в окончательный результат, сдвинутый соответствующим образом в зависимости от степени s.

Для 32 бит это будет немного сложнее ;)

person Jester    schedule 21.02.2014

Я закончил свою задачу по умножению $A3B4 и $421C с помощью Atmel AVR. Вот код для тех, кто ищет пример этого. Окончательный ответ хранится в ячейках данных 0x2000-0x2003.

ldi yl,0xB4
 ldi yh,0xA3
 ldi zl,0x1c
 ldi zh,0x42

 mul zl,yl

 mov r15,r0
 mov r16,r1

 mul zl,yh

 mov r17,r0
 mov r18,r1

 mul zh,yl

 mov r19,r0
 mov r20,r1

 mul zh, yh

 mov r21,r0
 mov r22,r1

 adc r16,r17
 adc r16,r19
 adc r18,r20
 adc r18,r21

 ldi r25,0
 adc r22,r25

 ldi yl,0x00
 ldi yh,0x20

 std y+0,r22
 std y+1,r18
 std y+2, r16
 std y+3, r15
person user3335432    schedule 23.02.2014