Деление на три - ассемьлер AVR

Обсуждаем контроллеры компании Atmel.
Ответить
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Сообщение uwrtey »

Понадобилось мне разделить шестнадцати битное число на шесть в МК ATtiny 2313
пытаюсь писать на ассемблере ( СИ в обще не знаю пока )
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   
не зная броду не лезь к вольтмоду
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

uwrtey писал(а):но почему то ни чего не понял
а что именно не понятно то? Как по мне, очень понятно написано.
И вообще, лучше возьмите универсальную подпрограмму деления из аппноутов Атмел.
Ставим плюсы: )
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Сообщение uwrtey »

непонятен замысел....
цитирую
Для другого частного случая деления на 3 существует один очень интересный алгоритм, основанный на разложении дроби X/3 в ряд вида:
X/3 = X/2 - X/4 + X/8 - X/16 + X/32 - …

Каждый член ряда получается делением X на целую степень 2, что как было показано выше, легко реализуется сдвиговыми операциями. Ниже приведена подпрограмма деления на 3 16-разрядного числа.
как-то скупо с объяснениями...
не зная броду не лезь к вольтмоду
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

Возьми книжку Ю.Ревича,открой раздел "Арифметические операции" и наслаждайся. :))
Последний раз редактировалось Vov123 Ср май 22, 2013 14:47:27, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

получение X/3 с помощью разложения числа 1/3 в ряд (высшая математика. раздел Ряды). чем больше слагаемых мы сложим, тем ближе к 1/3 получим результат.
1/2 - 1/4 + 1/8 - 1/16 + 1/32 - 1/64 + 1/128 - 1/256 = 1/4 + 1/16 + 1/64 + 1/256 = 0,25 + 0,0625 + 0,015625 + 0,00390625 = 0,33203125
это почти одна треть. ммм, еще вопросы?)
Ставим плюсы: )
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Сообщение uwrtey »

что значит эта команда:
BRNE PC+2 ; если результат предыдущего действия не равен нулю, то нужно к текущему адресу прибавить два ??? ( перешагнуть следующую команду ) ???
______________

а как узнать - на сколько точно нужно выполнять вычисление ???
не зная броду не лезь к вольтмоду
Реклама
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

PC - программный счётчик
Хоть 10 поставь,главное самому потом не запутаться.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

uwrtey писал(а):то нужно к текущему адресу прибавить два ??? ( перешагнуть следующую команду ) ???
да. все верно. именно так. PC - указывает адрес текущей команды.
uwrtey писал(а):а как узнать - на сколько точно нужно выполнять вычисление ???
точность уже от задачи зависит))) мож вы ракету собираетесь на орбиту выводить, а может кол-во кур поделить на 6 курятников))))
Ставим плюсы: )
akl
Друг Кота
Сообщения: 4468
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

uwrtey Здесь, ранее, обсуждался алгоритм замены деления на константу умножением. Бывает очень полезно.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Сообщение uwrtey »

а можно по подробнее про универсальную подпрограмму деления из аппноутов Атмел?
по ссылке сходил, посмотрел, код не увидел... ( не догоняю что то )

____________

Я так и не могу понять как работает код, что я приводил выше...
сейчас я комментарии отредактирую - как я понимаю происходящее...

Код: Выделить всё

; R19:R18 = R17:R16/3
; R19:R18 – частное
; R17:R16 – делимое
; R20 – вспомогательный регистр
 
div16to3:
    clr   R18      ;очищаем вспомогательные регистры R18,R19
    clr   R19      ;при входе в подпрограмму 
du1: rcall shft_right
    brne  PC+2     ;пропускаем следующую команду если результат предыдущей команды не равен нулю
    ret            ;выходим! так как результат предыдущей операции был нулевым! ( команда CLR ) 
    add   R18,R16  ;-
    adc   R19,R17  ;-
    rcall shift_right
    brne  PC+2     ;-
    ret            ;-
    sub   R18,R16  ;-
    sbc   R19,R17  ;-
    rjmp  du1
 
shft_right:
    lsr   R17      ;-
    ror   R16      ;-
    mov   R20,R17  ;-
    or    R20,R16  ;-
    ret 
не зная броду не лезь к вольтмоду
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

uwrtey писал(а):а можно по подробнее про универсальную подпрограмму деления из аппноутов Атмел?
поищите в гугле файл от этого аппноута avr200.asm
uwrtey писал(а):выходим! так как результат предыдущей операции был нулевым! ( команда CLR )
ага, щас, а rcall уже не команда?
Ставим плюсы: )
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Сообщение uwrtey »

ОЙ :oops: Я просто метки отдельно от команд записываю, не обратил внимания ( для каждой метки и команды своя строка ) :oops:
не зная броду не лезь к вольтмоду
Ответить

Вернуться в «AVR»