|
Вообщем, суть сводится к следующему. На АВР нет деления, но есть ведь умножение. Что нам мешает вместо y=x/3 написать y=(k*x)/256? Вот и вычисляем константу k, при делении на 3 она равна 256/3=85, при 5 - 51. Просто и доступно.
Даже программку уже написал:
DIV:
tst R17; 1
breq ENDDIV; выход - деление на ноль; 2
cpi R17, 1; 1
breq ENDDIV; деление на 1; 2
cpi R17,2;1
brne delenie_na_3;2
lsr R16;1
rjmp ENDDIV;2
delenie_na_3:
cpi R17,3; 1
brne delenie_na_4; 2
ldi R17, 85; 1
mul R16, R17; 2
mov R16, R1; 1
rjmp ENDDIV;2
delenie_na_4:
cpi R17,4; 1
brne delenie_na_5; 2
lsr R16; разделили на 2; 1
lsr R16; разделили на 4; 1
rjmp ENDDIV;2
delenie_na_5:
cpi R17,5; 1
brne dalneishiy_delitel; 2
ldi R17, 51; 1
mul R16, R17; 2
mov R16, R1; 1
rjmp ENDDIV;2
dalneishiy_delitel:
; делитель больше
ENDDIV: