Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

Вычитание

Подобно сложению с переносом в архитектуре AVR существует и команда вычитания с заемом sbc Rd,Rr. Для связи байтов в ней тоже участвует флаг C, который в этом случае обычно называется флагом заема. Бит C устанавливается каждый раз, когда результат предыдущей операции вычитания оказывается меньше нуля и автоматически вычитается из разности полученной после команды sbc Rd,Rr (Rd <- Rd-Rr-С). Ниже показан пример вычитания 16-разрядного числа R17:R16 из R19:R18 (разность помещается на место вычитаемого):

     sub   R18,R16  ;R18 <- R18 - R16      
     sbc   R19,R17  ;R19 <- R19 - R17 - C                              

Разрядность разности при вычитании никогда не превысит разрядности делимого. Однако здесь возникает другая проблема, связанная с тем, что уменьшаемое может оказаться меньше вычитаемого. В результате такого действия мы получим установленный флаг C, как признак отрицательного результата. И хотя с точки зрения арифметики такая операция является вполне законной - она приводит к отрицательным числам, представленным в дополнительном коде, которые будут рассмотрены в следующем разделе.

Ниже приведена подпрограмма вычитания двух многобайтовых чисел, размещенных в SRAM.

; [YH:YL] = [YH:YL] - [XH:XL]
; [YH:YL] – уменьшаемое при входе и разность при 
;   выходе (косвенно адресуется через YH:YL)
; [XH:XL] – вычитаемое (косвенно адресуется через XH:XL)
; R16,R17,R18 – вспомогательные регистры
; reduced - адрес уменьшаемого и
; полученной разности в ОЗУ 
; subtracted - адрес вычитаемого в ОЗУ
; SIZE – размер уменьшаемого и вычитаемого в байтах
; на выходе бит C=1 если [YH:YL] < [XH:XL]
 
sub_indirect:       
     ldi   YH, high(reduced)         ;заносим в указатель Y адрес
     ldi   YL, low(reduced)     ;уменьшаемого reduced
     ldi   XH, high(subtracted) ;заносим в указатель X адрес
     ldi   XL, low(subtracted)  ;вычитаемого subtracted
     ldi   R16,SIZE
     clc   	       ;при первом входе в цикл C=0      
sb1: ld    R17,X+         
	 ld    R18,Y      ;поочерёдно вычитаем с учётом заёма из
	 sbc   R18,R17    ;уменьшаемого все байты вычитаемого и  
	 st    Y+,R17     ;заносим результат по адресу уменьшаемого
     dec   R16        
	 brne  sb1        ;повторяем вычитание SIZE раз 
     ret                              

Перейти к следующей части:

Теги:

Котов Игорь Юрьевич Опубликована: 2012 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (1) | Я собрал (0) | Подписаться

0
Владимир #
Разрядность разности при вычитании никогда не превысит разрядности делимого.
нужно: разрядности уменьшаемого
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

AVR-программатор USB ASP
AVR-программатор USB ASP
Конструктор - Гитарная педаль Remote Delay 2.5 UNI-T UT-61A
вверх