Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
clr resultTL clr resultTM clr resultTH clr resultHH div32x8 : sub countTL , cykl sbc countTM , 0 sbc countTH , 0 sbc countHH , O brcs end div32x8 ; если перенос в минус , то на выход inc resultTL ; иначе увеличиваем резуль тат на l - младIIМЙ байт brne div32x8 ; если не было переноса , то обратно inc resultTM ; иначе следующий байт на l brne div32x8 ; если не было переноса , то обратно inc resultTH ; иначе следующий байт на 1 brne div32x8 ; если не было переноса , то обратно inc resultHH ; иначе стар)IIИ Й байт на 1 rjmp div32x8 ; обратно end div32x8 : ret ; ====конец процедуры div32x8 Как видите, число задействованных регистров меньше, и процедура получилась значительно короче . Недостаток этого способа, кроме большей длительности вы полнения, - здесь мы напрямую не получаем остатка. Его все же можно получить, если прибавить к тому отрицательному числу, что осталось в регистрах countxx, значение делителя (как бы вернуться на одну итерацию назад) либо, если оборвать цикл за одну итерацию до того, как выполнится условие переноса в минус (каждый раз сравнивая значение делимого с делителем: как только первое станет меньше второго, цикл можно обрывать) . Другой недостаток - здесь приходится выделять специальные регистры под результат, а делимое при этом все равно окажется ис порченным. Но зато этот алгоритм легко масштабируется - для того, чтобы вместо деления 32-битового числа на 8-битовое получить деление 32-битового на число большей разрядности, достаточно в командах sbc вместо нуля подставить соответствующий разряд делителя. При меньшей разрядности исходных чисел и результата из про цедуры просто удаляют строки с участием ненужных старших регистров. Многие подобные задачи на деление удается решить еще более простым и менее громоздким методом, если заранее подгадать так, чтобы делитель оказался кратным степени двойки. Тогда все деление сводится, как мы знаем, к сдвигу разрядов впра во столько раз, какова степень двойки. Для примера предположим, что мы некую величину измерили 64 раза и хотим узнать среднее. Пусть сумма укладывается в два байта, тогда вся процедура деления будет такой, как в листинге 8 . 6 .
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==