Назад к gradeschool с карандашом и бумагой. Если я хочу, чтобы добавить 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, и то, что происходит выше, должно выскочить на вас.
EDIT:
A C пример может помочь ... (переключение проклясть)
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.
или использовать один из х, у, или г регистров указателей
;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
Это домашнее задание? Если это так, пометьте его как таковой. да, сначала вам нужно загрузить некоторые регистры, тогда вам нужно добавить их все или вычесть. Вы можете всегда возвращаться к добавлению/adc или sub/sbc для выполнения большого количества бит/байтов добавлений или вычитаний. –
Если я использую add или adc, как правильно сохранить результат? –