сложить два 8-разрядных числа в 2-10 коде на ассемблер AVR

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Сообщения: 6
Зарегистрирован: Вс янв 17, 2010 15:00:24

Сообщение ustasss »

нужно сложить два 8-разрядных числа в 2-10 коде на ассемблер для AVR?
Реклама
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

ты поставил задачу или спрашиваешь, типа надо нам или не надо? :)
Не умеешь - не берись, но не взявшись не научишься...
Реклама
Родился
Сообщения: 6
Зарегистрирован: Вс янв 17, 2010 15:00:24

Сообщение ustasss »

я поставил задачу если кто знает как это сделать подскажите очень надо пжл)
Мучитель микросхем
Аватара пользователя
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

Код: Выделить всё

ADD Rd,Rr
Но это только в случае, когда Rd+Rr<0xFF. Если больше, то надо проверять флаг полупереноса.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 6
Зарегистрирован: Вс янв 17, 2010 15:00:24

Сообщение ustasss »

спасибо
Реклама
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

ustasss писал(а):нужно сложить два 8-разрядных числа в 2-10 коде на ассемблер для AVR?
В смысле, сложение двоично-десятичных чисел? Например, 19h + 37h дают в результате не 50h (как при нормальном двоичном сложении), а 56h?
Реклама
Родился
Сообщения: 6
Зарегистрирован: Вс янв 17, 2010 15:00:24

Сообщение ustasss »

я сам этого не пойму - дуб дали такое задание)
Опытный кот
Аватара пользователя
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Сообщение 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:   ; все, дальше можно обрабатывать след байт, если есть
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

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

Сообщение ustasss »

Спасибо большое за помощь :))
Родился
Сообщения: 6
Зарегистрирован: Вс янв 17, 2010 15:00:24

Сообщение 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:   ; все, дальше можно обрабатывать след байт, если есть
Если не сложно можешь превести все программу то для меня это еще пока сложно, а завтра сдавать?пжл :))
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»