Подобно сложению с переносом в архитектуре 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
Перейти к следующей части: Умножение
Комментарии (1) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
нужно: разрядности уменьшаемого