Вернуться в начальную школу с карандашом и бумагой.Если я хочу добавить 1234 и 5678
1234
+ 5678
======
4 + 8 - это 2 переноса, то 1
1
1234
+ 5678
======
2
и так далее
00110 <-- carry bits
1234 <-- first operand
+ 5678 <-- second operand
======
6912
бит переноса вышестолбец с единицами является значимым, он называется переносом, и бит переноса, который покидает крайний левый столбец, выполняется.
Что если бы у меня была только бумага, достаточная для добавления двух столбцов одновременно?
110
34
+ 78
======
12
Я начинаю с двух нижних наборов цифр, и мне требуется ноль в качестве переноса. Я получаю результат 12 с переносом.
Теперь я беру это выполнение,используйте его для переноса следующих двух цифр.Этот сумматор, я должен быть в состоянии взять вынос из предыдущего добавления и использовать его в качестве переноса для этого добавления.
001
12
+ 56
====
69
Когда все сказано и сделано, я получаю 69 и 12, сложите их вместеЯ получил 6912, но мне не нужен был полный 4-значный сумматор, чтобы добраться туда.Вы можете повторять это вечно или до тех пор, пока не закончится память, регистры или тактовые циклы.
У avr могут быть другие способы решения проблемы, но большинство процессоров по крайней мере имеют две формы сложения и две формы вычитаниятак что вы можете каскадировать сумматор так, чтобы он был настолько широким, насколько вам нужно.Изучите набор инструкций для avr, и то, что происходит выше, должно выскочить у вас.
РЕДАКТИРОВАТЬ:
Пример переменного тока может помочь ... (переключение в шестнадцатеричный формат)
unsigned int a,b,c,d,cin,cout,x,y;
a=0x12; b=0x34;
c=0x56; d=0x78;
x=b+d; //dont want a carry in or assume it is zero
cout=x&0x100;
if(cout) cin=1; else cin=0;
y=a+c+cin; //need the carry out on the prior add as the carry in here
x&=0xFF;
y&=0xFF;
printf("0x%02X%02X\n",y,x);
EDIT2:
Я надеюсь, что это не домашнее задание ...
ldi r20,0x12
ldi r21,0x34
ldi r22,0x56
ldi r23,0x78
add r21,r23
adc r20,r22
результат - старший байт r20 и младший байт r21
, есливам нужно читать из оперативной памяти, есть много способов, это предполагает, что 16-битные числа имеют младший порядок
lds r0,0x100
lds r1,0x101
lds r2,0x102
lds r3,0x103
add r0,r2
adc r1,r3
r0 младшая половина результата, верхняя половина r1.
или используйте один изрегистры указателя x, y или z
;put 0x0100 in Z
ldi r30,0x00
ldi r31,0x01
ld r0,z+
ld r1,z+
ld r2,z+
ld r3,z+
add r0,r2
adc r1,r3