сложить два 8-разрядных числа в 2-10 коде на ассемблер AVR
Добавлено: Вс янв 17, 2010 15:05:47
нужно сложить два 8-разрядных числа в 2-10 коде на ассемблер для AVR?
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
Код: Выделить всё
ADD Rd,Rr
В смысле, сложение двоично-десятичных чисел? Например, 19h + 37h дают в результате не 50h (как при нормальном двоичном сложении), а 56h?ustasss писал(а):нужно сложить два 8-разрядных числа в 2-10 коде на ассемблер для AVR?
Код: Выделить всё
ADD R16,R17 ; складываем
PUSH SREG ; Сохряняем регистр флагов
BRHS Corr1 ; Если возник полуперенос идем на коррекцию младшего ниббла
MOV R18,R16 ; копируем результат в R18
ANDI R18,0x0F ; оставляем только младший ниббл
CPI R18,0x0A ; проверяем переполнение младшего ниббла
BRCS Corr2 ; если переполнения не было коррекция не нужна
Corr1:LDI R18, 0x06 ; значение коррекции
ADD R16,R18 ; Выполняем коррекцию
Corr2:POP SREG ; восстанавливаем регистр флагов
BRCS Corr3 ; Если было переполнение (старшего ниббла) корректируем старший ниббл
MOV R18,0x09
CPI R18,R16 ; проверяем было ли переполнение старшего ниббла
BRCC EndCorr ; если не было - на выход
Corr3:LDI R18, 0x60 ; Значение коррекции
ADD R16,R18 ; выполняем коррекцию
SEC ; Устанавливаем флаг переноса - признак переполнения 8-разрядной сетки
EndCorr: ; все, дальше можно обрабатывать след байт, если есть
Апнот для двоично-десятичной арифметики:ustasss писал(а):я сам этого не пойму - дуб дали такое задание)
Если не сложно можешь превести все программу то для меня это еще пока сложно, а завтра сдавать?пжлDrWatson писал(а):Если бы в AVR была команда десятичной коррекции весь процесс свелся бы к двум командам, иначе придется примерно так:
R16, R17 - слагаемые, R18 - временный регистр, результат будет в R16, а флаг C=1 укажет на переполнение разрядной сетки.Код: Выделить всё
ADD R16,R17 ; складываем PUSH SREG ; Сохряняем регистр флагов BRHS Corr1 ; Если возник полуперенос идем на коррекцию младшего ниббла MOV R18,R16 ; копируем результат в R18 ANDI R18,0x0F ; оставляем только младший ниббл CPI R18,0x0A ; проверяем переполнение младшего ниббла BRCS Corr2 ; если переполнения не было коррекция не нужна Corr1:LDI R18, 0x06 ; значение коррекции ADD R16,R18 ; Выполняем коррекцию Corr2:POP SREG ; восстанавливаем регистр флагов BRCS Corr3 ; Если было переполнение (старшего ниббла) корректируем старший ниббл MOV R18,0x09 CPI R18,R16 ; проверяем было ли переполнение старшего ниббла BRCC EndCorr ; если не было - на выход Corr3:LDI R18, 0x60 ; Значение коррекции ADD R16,R18 ; выполняем коррекцию SEC ; Устанавливаем флаг переноса - признак переполнения 8-разрядной сетки EndCorr: ; все, дальше можно обрабатывать след байт, если есть