Вычитание

Вычитание

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

sub R18,R16 ;R18

Разрядность разности при вычитании никогда не превысит разрядности делимого. Однако здесь возникает другая проблема, связанная с тем, что уменьшаемое может оказаться меньше вычитаемого. В результате такого действия мы получим установленный флаг 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


Категория: Микроконтроллеры
Метки:

Написать коментарий

*
= 5 + 0

Добавить изображение

Последние статьи