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

Глава В. Арифметические операции и операции в двоично-десятичном формате 201 Подпрограмму перемножения двух величин, представленных в исходном 1 6-раз­ рядном виде, с представлением результата в трехбайтовой форме можно легко по­ лучить из слегка подправленной процедуры MPY1 6U по «аппноте» 200 (листинг 8 . 3) . Мы ею будем часто пользоваться в процедурах перевода данных в физические ве­ личины для отображения на дисплее (комментарии сохранены из исходного текста, регистры переименованы, номера их здесь указаны только для ориентировки). ; Универсальная процедура умножения двух 1 6-разрядных величин ; множимое в DataH : DataL, множитель KoeffH : KoeffL ; результат в templ : temp : ResH : ResL . def Мр1 6х1 6 : ;умножение 1 6х1 6 = 32 разряда . def KoeffL = rЗ ; multipl ier low byte . def KoeffH = r4 ; multiplier high byte . def ResL r9 ; result byte О ( LSB) . def ResH = . def temp = . def count . def DataL . def DataH . def templ clr clr ldi m1 6u l : l s r ror brcc add adc noad8 : ror ror ror ror dec brne ret rlO ; result byte 1 r1 6 ; result byte 2 r1 7 ; loop counter r1 9 ; multiplicand low byte r20 ; multipl icand high byte r2 1 ; result byte 3 ( MSB ) temp2 ; clear 2 highest bytes of result temp count , 1 6 KoeffH KoeffL noad8 temp , DataL temp2 , DataH temp2 temp ResH ResL count m1 6u 1 ; init loop counter ; i f bit О of multiplier set ; add multiplicand Low to byte 2 of res ; add multiplicand high to byte 3 of res ; shift right result byte 3 ; rotate right result byte 2 ; rotate result byte 1 and multiplier High ; rotate result byte О and multipl ier Low ; decrement loop counter ; i f not done , loop more А вот универсальное перемножение двух однобайтовых величин (процедура MPY8U в «аппноте») нам потребуется только один раз - в последнем разделе главы 16, и от оригинала она нйчем, кроме имен регистров, не отличается, потому ее текста я здесь не привожу. Можно воспользоваться тем обстоятельством, что для контроллеров семейства Mega определены аппаратные операции умножения . Тогда алгоритм сильно упро-

RkJQdWJsaXNoZXIy MTExODQxMg==