Страница 1 из 1

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

Добавлено: Вс янв 17, 2010 15:05:47
ustasss
нужно сложить два 8-разрядных числа в 2-10 коде на ассемблер для AVR?

Добавлено: Вс янв 17, 2010 15:23:15
Arlleex
ты поставил задачу или спрашиваешь, типа надо нам или не надо? :)

Добавлено: Вс янв 17, 2010 15:25:07
ustasss
я поставил задачу если кто знает как это сделать подскажите очень надо пжл)

Добавлено: Вс янв 17, 2010 16:06:40
Pooher

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

ADD Rd,Rr
Но это только в случае, когда Rd+Rr<0xFF. Если больше, то надо проверять флаг полупереноса.

Добавлено: Вс янв 17, 2010 17:15:09
ustasss
спасибо

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

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

Добавлено: Вс янв 17, 2010 17:33:19
ustasss
я сам этого не пойму - дуб дали такое задание)

Добавлено: Вс янв 17, 2010 19:01:27
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:   ; все, дальше можно обрабатывать след байт, если есть

Добавлено: Вс янв 17, 2010 19:22:16
Neekeetos
ustasss писал(а):я сам этого не пойму - дуб дали такое задание)
Апнот для двоично-десятичной арифметики:
http://www.atmel.com/dyn/resources/prod ... oc0938.pdf
исходник от него:
http://www.atmel.com/dyn/resources/prod ... avr204.asm

Добавлено: Пн янв 18, 2010 16:41:34
ustasss
Спасибо большое за помощь :))

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