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

204 Часть 11. Программирование микроконтроллеров АVR на ассемблере ; требуется четыре рабочих регистра dremL - dremНН ; из диапазона r 1 6-r31 дnя хранения остатка ; а также переменная cnt дnя подсчета • * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * , div32x8 : clr dremL ; clear remainder Low byte clr dremМ ; clear remainder clr dremН ; clear remainder sub dremНH , dremНН ; clear rernainder High byte and carry flag ldi cnt , 33 ; init loop counter d 1 : rol countTL ; shi ft left dividend rol countTM rol countTH rol count НН dec cnt ; decrernent counter brne d_2 ; i f done ret ; return d 2 : rol drernL ; shi ft dividend into rernainder rol dremМ rol dremН rol dremНH sub dremL , cykl ; rernainder remainder - divisor sbci dremМ, O ; sbci drernН, O ; sbci drernНH , 0 ; brcc d_3 ; i f result negative add dremL , cykl ; restore rernainder clr temp adc dremМ, temp adc drernН, temp adc dremНН , ternp clc ; clear carry to Ье shi fted into result rjrnp d_l ; else d_3 : sec ; set carry to Ье shi fted into result rjrnp d_l ; * * * * * * * * * * * * * * * * * * * * * конец 32х8 Отдав таким образом дань профессионализму программистов Atmel, заметим, что эта подпрограмма весьма громоздка и построена по довольно-таки «мутному» алгоритму. Процедуру деления можно значительно упростить (хотя в среднем она будет выполняться заметно медленнее), реализовав впрямую упомянутый ранее алгоритм подсчета числа вычитаний делителя из делимого. Код программы приве­ ден в листинге 8 . 5 (регистры count_хх и cykl здесь означают то же самое, что и в листинге 8 .4, результат же окажется в регистрах resultнн- resultт1 ) .

RkJQdWJsaXNoZXIy MTExODQxMg==