пытаюсь писать на ассемблере ( СИ в обще не знаю пока )
ATtiny2313 делить не умеет в обще
умеет только двигать, складывать и вычитать...
деление на 6 можно заменить делением на два ( логический сдвиг вправо один раз ), а потом еще на три ( а вот на три я делить не умею )
Уважаемый ВитГо подсказал мне статью http://cxem.net/mc/book30.php
я тупо скопировал от туда нужный мне код и вставил в свой проект, но это не правильно - хочется понять логику происходящего.
Статью я прочитал, но почему то ни чего не понял...
Уважаемые, попытайтесь мне пожалуйста объяснить на пальцах...
Код: Выделить всё
; R19:R18 = R17:R16/3
; R19:R18 – частное
; R17:R16 – делимое
; R20 – вспомогательный регистр
div16to3:
clr R18 ;очищаем вспомогательные регистры R18,R19
clr R19 ;при входе в подпрограмму
du1: rcall shft_right
brne PC+2 ;если Z=1,
ret ;то завершаем деление
add R18,R16 ;в ином случае добавляем к накопителю
adc R19,R17 ;очередной нечётный член ряда
rcall shift_right
brne PC+2 ;если Z=1,
ret ;то завершаем деление
sub R18,R16 ;в ином случае вычитаем из накопителя
sbc R19,R17 ;очередной чётный член ряда
rjmp du1
shft_right:
lsr R17 ;производим деление R17:R16 / 2,
ror R16 ;получая очередной член ряда
mov R20,R17 ;если R20 = R17+R16 = 0 (т.е. R17:R16=0),
or R20,R16 ;то выходим из подпрограммы с флагом Z=1
ret


