Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
202 Часть 11. Программирование микроконтроллеров АVR на ассемблере щается, причем он легко модифицируется как для 32-разрядного, так и для 24-разрядного результата. Ради универсальности мы в примерах далее в основном будем пользоваться обычными процедурами из «аппноть1» (исправленными), но для Mega может быть пригоден алгоритм, приведенный в листинге 8 . 3 , а (в назва ниях исходных переменных отражен факт основного назначения такой процеду ры - для умножения неких данных на некий коэффициент, часть комментариев сохранена из английского текста «аппноты») . Надо помнить, что результат отдель ной команды mul всегда помещается в первую регистровую пару rl : ro, поэтому ее приходится дополнят� командами обмена между регистрами mov или movw. . def dataL = r4 ; multiplicand low byte . def dataH = r5 ; multiplicand high byte . def KoeffL = r2 ; multiplier low byte . def koeffH = rЗ ; multipl ier high byte . def temp = rl 6 ; result byte О ( LSD 1 ) . def templ r1 7 ; result byte 1 . def temp2 = r 1 8 ; result byte 2 ( MSD ) · * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * , ; умножение двух 1 6-разрядных величин , только для Mega ; исходные величины dataH : dataL и KoeffH : KoeffL ; результат 3 байта temp2 : templ : temp · * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * , Mul бxl б : clr temp2 ; очистить старший mul dataL , KoeffL ;умножаем младшие movw temp , rO ; результат операции из rl : rO в templ : tempO ( r1 7 : rl 6 ) mul dataH , KoeffL ;умножаем старший � а младший add templ , rO ; в rO младший резуль тата операции mul adc temp2 , rl ; в rl старший резуль тата операции mul mul dataL, KoeffH ;умножаем младший на старший add templ , rO ; в rO младший результата операции mul adc temp2 , rl ; в rl старший резуль тата операции mul mul dataH , KoeffH ;умножаем старший на старший add temp2 , r0 ; 4 -й разряд нам тут не требуется , но он - в rl ret ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Как видите, эта процедура легко модифицируется для любой разрядности результа та - если нужно получить полный 32-разрядный диапазон, просто добавьте еще 1 LSD (MSD) - Least (Most) Significant Digit, младшая (старшая) значашая цифра. В дальнейшем нам встретятся также LSB и MSB, означающие Least (Most) Significant Bit - младший (старший) знача щий разряд, по-русски МЗР и СЗР соответственно.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==