Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

Глава 8. Арифметические операции и операции в двоично-десятичном формате 1 99 макросов - результирующий код существенно раздуется, а преимуществ никаких не получите. Если кто-либо из читателей будут со мной не согласны, и им нравится оформление именно в виде макросов, то, несомненно, они уже вполне смогут спра­ виться с этим самостоятельно. Стандартные арифмети ческие операции О том, как выполнять сложение и вычитание 8-разрядных чисел с учетом переноса в следующий разряд, мы уже говорили в главе 7 при обсуждении штатных команд АVR (см. там разд. «Команды арйфметическuх операций») . Эту методику легко распространить на числа любой разрядности, например: add data 1 0 , data20 ;младшие разряды adc data l l , data2 1 ; байтl + С adc data 1 2 , data22 ; байт2 + С adc data 1 3 , data23 ; старшие разряды + С Здесь складываются 32-разрядные числа, представленные побайтно в регист­ рах data 1 3 : data1 2 : datal l : data 1 0 и data2 3 : data22 : data2 l : data2 0, результат оказыва­ ется в data1 3 - datal O . Эту процедуру несложно оформить . в виде макроса (лис­ тинг 8 . 1 ) . .macro Add32 32 add @ 3 , @ 7 ;младшие разряды adc @ 2 , @ 6 ; байтl + С adc @ 1 , @ 5 ; байт2 + С adc @ О , @ 4 ; старшие разряды + С . endmacro При вызове такого макроса операнды указывают в «арабском» порядке, начиная со старшего: сначала все байты первого слагаемого, затем все байты второго слагае­ мого, результат займет байты первого слагаемого. Например, такой вызов: Add32_32 r1 6 , r1 7 , r1 8 , r 1 9 , rl , r2 , r3 , r4 предполагает, что в регистрах rl б , rl 7 , rl B , r1 9 находятся байты первого слагаемого (старший в rl , младший в r4 ) , а в rl , r2 , r 3 , r4 - байты второго (старший в rl б, младший в r1 9 ) , результат будет записан в r l б , rl 7 , r l B , r1 9 . Аналогично записывается операция вычитания - с заменой add на suЬ, а adc на sbc. Для 24- или 1 6-разрядных исходных чисел достаточно из этих процедур убрать лишние строки и байты в исходных данных. Если предполагается, что результат сложения двух, например, 24-разрядных чисел займет более трех байтов, то первое слагаемое (оно же результат) должно по-прежнему занимать четыре байта (лис­ тинг 8 .2) .

RkJQdWJsaXNoZXIy MTExODQxMg==