|
|
  |
Целочисленная арифметика для PIC18, деление 24/24=24, 32/32=32 |
|
|
|
May 29 2008, 13:14
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Народ, предлагаю всем заинтересованным поделиться арифметическими подпрограммами общего пользования. Открываю топик программой деления беззнакового 24-битного числа на беззнаковое 24-битное число с получением 24-битного результата. CODE ;File: DIV2424.ASM ;Title: The 24-bit Division Routine ;Version: 1.5 ;Last updated: 29.05.08 ;Author: GM ;Target: Microchip microcontroller of PIC18 family ; ;Support E-mail: pdp11@bk.ru ; ;DESCRIPTION ;This routine divides an unsigned 24-bit value by an unsigned ;24-bit value to get an unsigned 24-bit quotient ;using: call udiv2424 ;processing time: 418-562 machine cycles ;input data: ; dividend - in variables dvd2,dvd1,dvd0(lsb) ; divisor - in variables dvs2,dvs1,dvs0(lsb) ;output data: ; quotient - in variables dvd2,dvd1,dvd0(lsb) ; remainder- in variables rmn2,rmn1,rmn0(lsb) LIST P=PIC18F45J10 #include "P18F45J10.INC"
global udiv2424 extern dvd2,dvd1,dvd0 extern dvs2,dvs1,dvs0 extern rmn2,rmn1,rmn0 extern bitcnt
code udiv2424 clrf rmn0 ;clear remainder clrf rmn1 clrf rmn2 movlw .24 ;bit shift counter movwf bitcnt bcf STATUS,0 udiv241 rlcf dvd0 rlcf dvd1 rlcf dvd2 rlcf rmn0 rlcf rmn1 rlcf rmn2 movf dvs0,w ;rmn-dvs-->rmn subwf rmn0,f movf dvs1,w subwfb rmn1,f movf dvs2,w subwfb rmn2,f bc udiv242 ;Cy=1 if rmn>=0 movf dvs0,w ;rmn+dvs-->rmn addwf rmn0,f movf dvs1,w addwfc rmn1,f movf dvs2,w addwfc rmn2,f bcf STATUS,0 udiv242 decfsz bitcnt,f bra udiv241 rlcf dvd0 rlcf dvd1 rlcf dvd2 return end
Как видите, код достаточно компактный, и достаточно быстрый, по крайней мере в сети быстрее не нашёл. Ну, можно ещё немного ускорить, циклов на 50, с разумным увеличением размера программы. Немного позже добавлю программу деления 32/32-->32.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
May 29 2008, 13:30
|
Группа: Новичок
Сообщений: 14
Регистрация: 20-04-08
Пользователь №: 36 922

|
Да, темка интересная. Сейчас немогу, а через месяц здесь обязательно что-нибудь покажу. В сети примеров много, но не все они корректно работают, надо самому поковыряться.
Сообщение отредактировал andrej2005 - May 29 2008, 13:33
|
|
|
|
|
May 29 2008, 14:44
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(andrej2005 @ May 29 2008, 12:30)  В сети примеров много, но не все они корректно работают, надо самому поковыряться Ну, я проверял, может и не в полном объёме. Вот обещанная программа беззнакового деления 32/32=32. CODE ;File: DIV3232.ASM ;Title: The 32-bit Division Routine ;Version: 1.5 ;Last updated: 29.05.08 ;Author: GM ;Target: Microchip microcontrollers of PIC18 family ;Support E-mail: pdp11@bk.ru ; ;DESCRIPTION ;This routine divides an unsigned 32-bit value by an unsigned ;32-bit value to get an unsigned 32-bit quotient ;using: call udiv3232 ;processing time: 684-940 machine cycles ;input data: ; dividend - in variables dvd3,dvd2,dvd1,dvd0(lsb) ; divisor - in variables dvs3,dvs2,dvs1,dvs0(lsb) ;output data: ; quotient - in variables dvd3,dvd2,dvd1,dvd0(lsb) : remainder- in variables rmn3,rmn2,rmn1,rmn0(lsb)
udiv3232 clrf rmn0 ;clear remainder clrf rmn1 clrf rmn2 clrf rmn3 movlw .32 ;bit shift counter movwf bitcnt bcf STATUS,0 udiv321 rlcf dvd0 rlcf dvd1 rlcf dvd2 rlcf dvd3 rlcf rmn0 rlcf rmn1 rlcf rmn2 rlcf rmn3 movf dvs0,w ;rmn-dvs-->rmn subwf rmn0,f movf dvs1,w subwfb rmn1,f movf dvs2,w subwfb rmn2,f movf dvs3,w subwfb rmn3,f bc udiv322 ;Cy=1 if rmn>=0 movf dvs0,w ;rmn+dvs-->rmn addwf rmn0,f movf dvs1,w addwfc rmn1,f movf dvs2,w addwfc rmn2,f movf dvs3,w addwfc rmn3,f bcf STATUS,0 udiv322 decfsz bitcnt,f bra udiv321 rlcf dvd0 rlcf dvd1 rlcf dvd2 rlcf dvd3 return end
Аналогов по скорости и компактности в сети не находил. Вот на этом сайте есть неплохая подборка по тематике ветки.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
May 29 2008, 14:48
|
Группа: Новичок
Сообщений: 14
Регистрация: 20-04-08
Пользователь №: 36 922

|
Цитата(=GM= @ May 29 2008, 18:44)  Вот на этом сайте есть неплохая подборка по тематике ветки. Да, да. Знаем-с.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|