2015-04-08 1 views

ответ

1

Для этого используется флаг переноса.

Добавьте младший байт каждого 32-разрядного номера, используя инструкцию ADD. Это поместит перенос (девятый бит) сложения в флаг переноса. Затем вы добавляете каждую пару более высоких байтов по очереди с помощью инструкции ADC. Он будет включать флаг переноса в дополнение, а также положить следующий перенос в него после добавления.

0

Я не знаю, очень хорошо ассемблера AVR, но я составил программу, которая суммирует два uint32_t и результаты сборки в следующей строке:

lds r20,_ZZ4mainE1x 
lds r21,_ZZ4mainE1x+1 
lds r22,_ZZ4mainE1x+2 
lds r23,_ZZ4mainE1x+3 
lds r24,_ZZ4mainE1y 
lds r25,_ZZ4mainE1y+1 
lds r26,_ZZ4mainE1y+2 
lds r27,_ZZ4mainE1y+3 
add r24,r20 
adc r25,r21 
adc r26,r22 
adc r27,r23 
sts _ZZ4mainE4tled,r24 
sts _ZZ4mainE4tled+1,r25 
sts _ZZ4mainE4tled+2,r26 
sts _ZZ4mainE4tled+3,r27 

код C является следующим:

static uint32_t volatile x; 
static uint32_t volatile y; 
static uint32_t volatile tled; 

tled=x+y; 

Декларации volatile были использованы для предотвращения оптимизации компилятора, которая создавала бы код, содержащий результат сложения!

Код сборки демонстрирует, как компилятор использует восемь 8-битных регистров для выполнения требуемой операции!