Я должен создать 32-разрядный сумматор, но я не знаю, как создать 32-битный регистр из 8-битных регистров, которые используются AVR ATmega169 в сборке.Как реализовать 32-битный регистр в 8-битном AVR-процессоре?
ответ
Для этого используется флаг переноса.
Добавьте младший байт каждого 32-разрядного номера, используя инструкцию ADD. Это поместит перенос (девятый бит) сложения в флаг переноса. Затем вы добавляете каждую пару более высоких байтов по очереди с помощью инструкции ADC. Он будет включать флаг переноса в дополнение, а также положить следующий перенос в него после добавления.
Я не знаю, очень хорошо ассемблера 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-битных регистров для выполнения требуемой операции!