Форум по микроконтроллерам: ПП деления 24/8 - Нужна помощь - Форум по микроконтроллерам

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

ПП деления 24/8 - Нужна помощь

#1 Пользователь офлайн   VadimKHL 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 238
  • Регистрация: 20 Сентябрь 12
  • ГородМосква

Отправлено 02 Июнь 2016 - 19:25

Добрый вечер!

Уважаемы форумчани, понадобилась ПП деления 3-х байтного на однобайтное число.
Нашел на пиклист следующую:
The archive on this page links to 2 divide 24 by 8 routines. 

-PICList post "24bit by 16bit Division" (actually 24 / 8)
-PICList post "Divide 24/8 routine" ASM embedded in C  

During testing I discovered that high numbers cause the wrong 
answers to be calculated (eg 0xF00000 / 0xFD = wrong answer)

I wrote my own routine which is Nikolai's 24 bits by 16, 
modified to divide by 8 bits, remainder is also 8 bits:

;***********************************************************
;Unsigned 24 bit by 8 bit divide routine
;
; Inputs:
;   Dividend  - x,x+1,x+2 (x+2 - most significant!)
;   Divisor   - y
; Temporary:
;   Counter   - counter
; Output:
;   Quotient  - x,x+1,x+2 (x+2 - most significant!)
;   Remainder - x+3
;
; Size: 17
; Timing: 342 cycles (including call and return)
;
; This is basically Nikolai Golovchenko's 24 by 16 bit 
; divide routine, with some instructions removed to 
; optimise it for an 8 bit divide. 
; Thanks to Nikolai for the original post.
;
; James Hillman, 2 December 2005 
;***********************************************************

FXD248U:
    CLRF    x+3          ;remainder
    MOVLW   d'24'
    MOVWF   counter

LOOPU248
    RLF     x,W      ;shift dividend left to move next bit to remainder
    RLF     x+1,F    ;
    RLF     x+2,F    ;
    RLF     x+3,F    ;shift carry (next dividend bit) into remainder
    RLF     x,F      ;finish shifting the dividend and save carry in x.0,
                     ;since remainder can be 9 bit long in some cases
                     ;This bit will also serve as the next result bit.
         
    MOVF    y,W      ;substract divisor from 8-bit remainder
    SUBWF   x+3,F        

;here we also need to take into account the 9th bit of remainder, which
;is in x.0. If we don't have a borrow after subtracting from 
;8 bits of remainder, then there is no borrow regardless of 9th bit 
;value. But, if we have the borrow, then that will depend on 9th bit 
;value. If it is 1, then no final borrow will occur. If it is 0, borrow
;will occur. These values match the borrow flag polarity.

    BTFSC   STATUS,0  ;if no borrow after 8 bit subtraction
    BSF     x,0       ;then there is no borrow in result. Overwrite
                      ;x.0 with 1 to indicate no borrow.
                      ;if borrow did occur, x.0 already
                      ;holds the final borrow value (0-borrow, 
                      ;1-no borrow)

    BTFSS   x,0       ;if no borrow after 9-bit subtraction
    ADDWF   x+3,F     ;restore remainder. (w contains the value 
                      ;subtracted from it previously)
    DECFSZ  counter,F    
    GOTO    LOOPU248    
    RETURN


Не могу понять, как работает данный метод деления.
Может кто объяснить, либо дать ссылку, где можно подробно почитать?

Спасибо!

Сообщение отредактировал VadimKHL: 02 Июнь 2016 - 19:28

«Миллионы людей видели, как падают яблоки, но только Ньютон спросил почему»
0

#2 Пользователь офлайн   wws63 

  • Завсегдатай
  • PipPipPip
  • Группа: SuperMod
  • Сообщений: 261
  • Регистрация: 15 Февраль 11

Отправлено 03 Июнь 2016 - 09:28

А перевести на русский комментарии к программке не пробовали?
0

#3 Пользователь офлайн   VadimKHL 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 238
  • Регистрация: 20 Сентябрь 12
  • ГородМосква

Отправлено 03 Июнь 2016 - 09:43

Я хочу понять саму суть метода,
т.к. на этой основе можно делать хоть 48 на 24 бита и т.д.

Я думаю перевод много не даст.
«Миллионы людей видели, как падают яблоки, но только Ньютон спросил почему»
0

#4 Пользователь офлайн   MAZ 

  • Консерватор - до мозга костей и суставов
  • PipPipPipPip
  • Группа: SuperMod
  • Сообщений: 1 391
  • Регистрация: 15 Февраль 11
  • ГородРоссия

Отправлено 03 Июнь 2016 - 18:05

Возьми готовую.48/24
Если бы Бог не был консерватором, вместо десяти заповедей мы имели бы десять предложений
0

#5 Пользователь офлайн   VadimKHL 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 238
  • Регистрация: 20 Сентябрь 12
  • ГородМосква

Отправлено 03 Июнь 2016 - 21:39

Просмотр сообщенияMAZ (03 Июнь 2016 - 18:05) писал:

Возьми готовую.48/24


Не совсем понял.
Эта ПП и так готовая. 24/8.???

Конкретно мне требуется 24/.20 (3-х байтное число делить на 20).

Я хочу написать свою, но не могу понять теорию данного метода.
«Миллионы людей видели, как падают яблоки, но только Ньютон спросил почему»
0

#6 Пользователь офлайн   VadimKHL 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 238
  • Регистрация: 20 Сентябрь 12
  • ГородМосква

Отправлено 03 Июнь 2016 - 21:44

К примеру, т.к. я не знаю, как этот метод работает,
мне кажется нужно сбросить STATUS,С перед сдвигами.
Только один раз, или всегда в "кольце"?

Почему и хочу разобраться, что к чему.
«Миллионы людей видели, как падают яблоки, но только Ньютон спросил почему»
0

#7 Пользователь офлайн   MAZ 

  • Консерватор - до мозга костей и суставов
  • PipPipPipPip
  • Группа: SuperMod
  • Сообщений: 1 391
  • Регистрация: 15 Февраль 11
  • ГородРоссия

Отправлено 03 Июнь 2016 - 23:00

Не буду вспоминать. Давно разбирался с этой программой. Но помню что деление под кратное 8. Под 20 не прокатит.
Если бы Бог не был консерватором, вместо десяти заповедей мы имели бы десять предложений
0

#8 Пользователь офлайн   nick14 

  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 465
  • Регистрация: 15 Февраль 11
  • ГородРыбинск

Отправлено 03 Июнь 2016 - 23:19

Просмотр сообщенияVadimKHL (03 Июнь 2016 - 21:44) писал:

К примеру, т.к. я не знаю, как этот метод работает,
мне кажется нужно сбросить STATUS,С перед сдвигами.
Только один раз, или всегда в "кольце"?

Почему и хочу разобраться, что к чему.


Ничего сбрасывать не нужно. Команда RLF влияет на флаг С , но сбрасывать не нужно. Так как результат состояния флага после выполнения команды.
0

#9 Пользователь офлайн   nick14 

  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 465
  • Регистрация: 15 Февраль 11
  • ГородРыбинск

Отправлено 03 Июнь 2016 - 23:25

Протестировал программу... все делит как надо....
Прикрепленный файл  test_del.rar (10,9К)
Количество загрузок:: 44

0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей