Беззнаковые целые числа
Эта глава главным образом будет посвящена арифметическим операциям над большими беззнаковыми целыми числами (подробней о различных форматах чисел смотри в приложении Б). В приложениях на AVR-микроконтроллерах наиболее часто приходится использовать 16-разрядные вычисления, которые достаточно легко программируются. Двухбайтовые числа предоставляют достаточно широкий диапазон представления переменных. Однако, встречаются задачи в которых необходимо применение чисел и с большей разрядностью (счётчики импульсов, накопители суммы, промежуточные результаты вычислений и т.д.).
Сложение
Реализовать многобайтовое сложение очень просто. Для этого имеется специальная команда adc Rd,Rr, которая складывает содержимое двух регистров и добавляет к полученной сумме бит переноса C из регистре SREG (Rd <- Rd+Rr+С). Этот бит устанавливается всегда, когда в результате предыдущей операции сложения возникает переполнение (т.е. бит C всегда является 9-ым битом результата операции сложения). Так может выглядеть сложение двух 16-разрядных чисел R17:R16 и R19:R18 (сумма размещается на месте второго слагаемого R19:R18):
add R18,R16 ;R18 <- R18 + R16 adc R19,R17 ;R19 <- R19 + R17 + C
Необходимо помнить, что в результате сложения двух n-разрядных чисел возможно образование n+1-разрядной суммы. Например, в результате следующей операции сложения получим:
0xB2FF + 0xCC45 = 0x17F44 = 0x10000 + 0x7F44.
Сумма двухбайтовых слагаемых превысила максимальное 16-разрядное значение 0xFFFF = 65535 и вместо 0x17F44 = 98116 мы получили 0x7F44 = 32580. При этом должен установиться флаг C (17-тый разряд суммы), как признак того, что произошел перенос в старший разряд и к полученному результату необходимо добавить 0x10000 = 65536.
В регистре SREG имеется еще один бит непосредственно связанный с действием сложения. Это флаг половинного переноса H, который может использоваться в 4-разрядных вычислениях. Он носит тот же смысл, что и флаг C, но указывает на переполнение суммы младших полубайтов (т.е. перенос из третьего в четвертый разряды числа). Флаг H почти никогда не используется на практике.
Если для хранения результата вычисления не хватает РОНов, то сложение рационально производить с помощью косвенной адресации, а результат размещать в SRAM процессора. В этом случае разрядность слагаемых и вычисленной суммы будет ограничена только свободным местом в памяти данных.
Подпрограмма такого сложения:
; [YH:YL] = [YH:YL] + [XH:XL] ; [YH:YL] – первое слагаемое при входе и сумма при ; выходе (косвенно адресуется через YH:YL) ; [XH:XL] – второе слагаемое (косвенно адресуется через XH:XL) ; R16,R17,R18 – вспомогательные регистры ; composed1 – адрес 1-го слагаемого и ; полученной суммы в ОЗУ ; composed 2 – адрес 2-го слагаемого в ОЗУ ; SIZE – размер слагаемых в байтах ; на выходе в C находится старший разряд результата add_indirect: ldi YH,high(composed1) ;заносим в указатель Y адрес ldi YL,low(composed1) ;первого слагаемого composed1 ldi XH,high(composed2) ;заносим в указатель Y адрес ldi XL,low(composed2) ;второго слагаемого composed2 ldi R16,SIZE clc ;при первом входе в цикл C=0 ad1: ld R17,X+ ld R18,Y ;поочерёдно складываем с учётом переноса adc R18,R17 ;все байты слагаемых и заносим результат st Y+,R18 ;по адресу первого слагаемого dec R16 brne ad1 ;повторяем сложение SIZE раз ret
Перейти к следующей части: Вычитание
Комментарии (0) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация