RTV forum PL | NewsGroups PL

Jak zaimplementować efektywną procedurę dzielenia dwubajtowego w ASM dla 51 z liczby 28125?

procedura dzielenia dwubajtowego bez reszty w asm dla 51 szu

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak zaimplementować efektywną procedurę dzielenia dwubajtowego w ASM dla 51 z liczby 28125?

Goto page Previous  1, 2

AlexY
Guest

Sun Mar 28, 2004 10:23 pm   



Użytkownik Krzysztof Bąk napisał:

[...]
Quote:
Pewnie teraz nic nie wnoszę, ale zawsze jest nadzieja, że się pomoże
zabłąkanemu Smile i że poskutkuje na przyszłość.

heh Smile tak zwane "nie tym razem" lubie wiedziec co robi napisany przeze
mnie program :)

Quote:
Ja kiedyś też byłem zapalonym zwolennikiem asm i jak mnie ktoś próbował
przekonać, że nie tędy droga to prawie na noże szło. Ale czasy się zmieniają
i warto czasami popatrzeć szerzej na zagadnienie.

jw :)

[..]
Quote:
Żebyś się nie denerwował - zaraz napiszę dwa wiersze w C i podrzucę Ci co
wylistował compilator do assemblera - to może być wskazówka.

bez obaw, zdenerwowany nie jestem ale nie lubie tworzenia sie
tasiemcowych watkow nie na temat.
Na listing cierpliwie czekam.

AlexY
Guest

Sun Mar 28, 2004 10:31 pm   



Użytkownik Mariusz Dybiec napisał:
[...]
Quote:
1/28125 = 3.55556e-5. Miało być przesuwac przecinek przy wyświetlaniu
czyli w arytmetyce dziesiętnej . A tak masz rację wyszło bez sensu. Tym
bardziej, że źle przeczytałem.

To ja moze jednak zwalcze dzielenie egipskie Wink
To co obaj piszecie zdecydowanie wybiega poza moje obecne znajomosci
matematyczne choc zawsze uwazalem ze jestem dobry w naukach scislych,
linki do algorytmow zachowane, na pewno sie przydadza Smile

J.F.
Guest

Sun Mar 28, 2004 11:50 pm   



On Mon, 29 Mar 2004 01:31:14 +0200, AlexY wrote:
Quote:
To ja moze jednak zwalcze dzielenie egipskie Wink
To co obaj piszecie zdecydowanie wybiega poza moje obecne znajomosci
matematyczne choc zawsze uwazalem ze jestem dobry w naukach scislych,
linki do algorytmow zachowane, na pewno sie przydadza Smile

Kombinujesz ze az czytac przykro. Jest jedna klasyczna metoda
dzielenia, wystarczy tylko cokolwiek przeczytac o arytmetyce
komputerow.

Hi=0; Lo=dzielna ; wy=0 ;

Repeat 16 razy
{
shitf_left_32bit (Hi,Lo)
if Hi>=dzielnik { wy=2*wy+1 ; Hi=Hi-dzielnik }
else wy =2*wy;
}

[moglem cos delikatnie pomylic]
W praktyce pieknie sie optymalizuje bo wy i Lo moze byc
ta sama zmienna. A w Hi zostaje reszta.

Na '51 troche zlosliwe, bo to procek wybitnie 8 bit.

W sumie jest to mniej wiecej owo "egipskie dzielenie",
ale takze klasyczne dzielenie pisemne "w slupku"..

J.

Krzysztof Bąk
Guest

Mon Mar 29, 2004 1:35 am   



Quote:
I właśnie dlatego żeby oszczędziś swój czas itd trzeba pisać w C -
pozbywasz
się wielu tego typu "rozterek" i zamiast wyważać otwarte już dawno drzwi
masz czas żeby zająć się meritum sprawy.

Zeby nie rozpoczynac dyskusji advocacy stwierdze krotko:
od zawsze (12 lat z przerwami) pisze w asm i tego sie bede trzymal,
jesli nie jestes w stanie mi pomoc to prosze cobys sie w tej dyskusji
nie udzielal poniewaz nic konstruktywnego nie wnosisz.

Pewnie teraz nic nie wnoszę, ale zawsze jest nadzieja, że się pomoże
zabłąkanemu Smile i że poskutkuje na przyszłość.
Ja kiedyś też byłem zapalonym zwolennikiem asm i jak mnie ktoś próbował
przekonać, że nie tędy droga to prawie na noże szło. Ale czasy się zmieniają
i warto czasami popatrzeć szerzej na zagadnienie.
Analogicznie jest z elektronikami starszej daty - ci cały swiat zbudowaliby
w najlepszym wypadku na wzm. operacyjnych (arytmetykę też) a przecież
technologia idzie do przodu....
Żebyś się nie denerwował - zaraz napiszę dwa wiersze w C i podrzucę Ci co
wylistował compilator do assemblera - to może być wskazówka.

pzdr
kb

JS
Guest

Mon Mar 29, 2004 12:16 pm   



W artykule <c46hu3$g0v$1@atlantis.news.tpi.pl>
autorem którego mieni się AlexY, napisano:

Quote:
???? tego nie rozumiem, chcesz przeszukiwać tablicę element po
elemencie???

raczej tak, szukanie bedzie po tablicy dwubajtowej ktorej wartosci beda
nieliniowe, watpie czy uda sie usyskac efektyny algorytm uwzgledniajacy
nieliniowosc, prosciej i szybciej bedzie z dodawaniem

Wartości w tablicy są uporządkowane - możesz zastosować bisekcję. Wyjdzie
nie więcej niż 8 porównań na znalezienia wyniku.


Pozdrawiam
Jarosław Szynal

AlexY
Guest

Mon Mar 29, 2004 1:34 pm   



Użytkownik Alek napisał:
Quote:
Użytkownik "AlexY" <alexy@irc.-cut_this-.pl> napisał w wiadomości
news:c46hu3$g0v$1@atlantis.news.tpi.pl...

raczej tak, szukanie bedzie po tablicy dwubajtowej ktorej wartosci beda
nieliniowe, watpie czy uda sie usyskac efektyny algorytm uwzgledniajacy
nieliniowosc, prosciej i szybciej bedzie z dodawaniem

czemu nieliniowe?

spojz na dwie pierwsze wartosci z tabelki, predkosc 1 i 2km/h i odnies
do 169 i 170km/h roznice sa wybitnie nieliniowe

Quote:
dzielimy 7 razy przez 2 zwyczajnie przesowajac bity w prawo. W efekcie
dzielimy stala 28125 przez ilosc us z przesunietymi bitami.
kawalek tablicy :

Przyznam się, że tabelki nie zrozumiałem Sad

No moj blad bo nie opisalem co jest co
1 kolumna predkosc pojazdu, 2kol. zliczone cykle (us) pomiedzy
przerwaniami generowanymi co 1metr, 3kol. to samo co w 2 tylko ze w binarce

Quote:
Nadal staram sie rozgryzc dzielenie egipskie...


A czego tam nie możesz ugryźć?

juz rozgryzlem, wprawdzie nie samodzielnie bo musial mi to kolega
przetlumaczyc dosc preyzyjnie ale juz mam polowe w asm'ie

Quote:
To o czym mówiłem:
masz 2 tabele wielkość 333 pozycji (2B każda pozycja) (dla dzielenia
całego zakresu Wink):

pozostawie to jako ostateczne rozwiazanie Smile

Krzysztof Bąk
Guest

Mon Mar 29, 2004 7:24 pm   



[..]
Quote:
Na listing cierpliwie czekam.
Obiecany listing (zajmije ok. 100 byte'ów pamięci codu):

;
X0003:
mov r4,rb1r2 // Hi dzielna
mov r5,rb1r3 // Lo dzielna
mov r6,rb1r0 // Hi dzielnik
mov r7,rb1r1 // Lo dzielnik
lcall X001f // właściwa procedura dzielenia
mov rb1r4,r6 // Hi wynik
mov rb1r5,r7 // Lo wynik
ret
;
X001f:
cjne r4,#0,X002d
cjne r6,#0,X004e
mov a,r7
mov b,r5
div ab
mov r7,a
mov r5,b
ret
;
X002d:
clr a
xch a,r4
mov r0,a
mov b,#8
X0033:
mov a,r7
add a,r7
mov r7,a
mov a,r6
rlc a
mov r6,a
mov a,r4
rlc a
mov r4,a
mov a,r6
subb a,r5
mov a,r4
subb a,r0
jc X0047
mov r4,a
mov a,r6
subb a,r5
mov r6,a
inc r7
X0047:
djnz b,X0033
clr a
xch a,r6
mov r5,a
ret
;
X004e:
mov a,r5
mov r0,a
mov b,a
mov a,r6
div ab
jb ov,X0073
mov r6,a
mov r5,b
mov b,#8
X005d:
mov a,r7
add a,r7
mov r7,a
mov a,r5
rlc a
mov r5,a
jc X006c
subb a,r0
jnc X006e
djnz b,X005d
ret
;
X006c:
clr c
subb a,r0
X006e:
mov r5,a
inc r7
djnz b,X005d
X0073:
ret
;

pzdr
kb

Goto page Previous  1, 2

elektroda NewsGroups Forum Index - Elektronika Polska - Jak zaimplementować efektywną procedurę dzielenia dwubajtowego w ASM dla 51 z liczby 28125?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map