сложить два 8-разрядных числа в 2-10 коде на ассемблер AVR
- Сообщения: 6
- Зарегистрирован: Вс янв 17, 2010 15:00:24
нужно сложить два 8-разрядных числа в 2-10 коде на ассемблер для AVR?
- Реклама
- Сообщения: 4435
- Зарегистрирован: Сб мар 07, 2009 20:44:36
- Сообщения: 6
- Зарегистрирован: Вс янв 17, 2010 15:00:24
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Код: Выделить всё
ADD Rd,Rr
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
- Сообщения: 6
- Зарегистрирован: Вс янв 17, 2010 15:00:24
- Реклама
В смысле, сложение двоично-десятичных чисел? Например, 19h + 37h дают в результате не 50h (как при нормальном двоичном сложении), а 56h?ustasss писал(а):нужно сложить два 8-разрядных числа в 2-10 коде на ассемблер для AVR?
- Сообщения: 6
- Зарегистрирован: Вс янв 17, 2010 15:00:24
Если бы в AVR была команда десятичной коррекции весь процесс свелся бы к двум командам, иначе придется примерно так:
R16, R17 - слагаемые, R18 - временный регистр, результат будет в R16, а флаг C=1 укажет на переполнение разрядной сетки.
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: ; все, дальше можно обрабатывать след байт, если есть
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Апнот для двоично-десятичной арифметики:ustasss писал(а):я сам этого не пойму - дуб дали такое задание)
http://www.atmel.com/dyn/resources/prod ... oc0938.pdf
исходник от него:
http://www.atmel.com/dyn/resources/prod ... avr204.asm
- Сообщения: 6
- Зарегистрирован: Вс янв 17, 2010 15:00:24
- Сообщения: 6
- Зарегистрирован: Вс янв 17, 2010 15:00:24
Если не сложно можешь превести все программу то для меня это еще пока сложно, а завтра сдавать?пжл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: ; все, дальше можно обрабатывать след байт, если есть


