Zamiana liczby dziesiętnej na hex w AVR: optymalny kod w asemblerze dla rejestrów 0-255?
Re: zamiana dec na hex bez dzielenia
From: "Jarek" <crystal_at_nospam_kki.net.pl>
Subject: Re: zamiana dec na hex bez dzielenia
Date: Mon, 19 Mar 2001 15:51:39 +0100
Użytkownik "Juliusz" <jul_at_nospam_fom.pl> napisał w wiadomości
news:992174$hoi$1_at_nospam_news.tpi.pl...
Witam.
Jak robicie koledzy zamiane liczby dziesietnej, z przedzialu 0-255,
siedzacej w 3 rejestrach AVR'a na bajt ?
Chodzi mi o mozliwie optymalny kod pod wzgledem ilosci uzytych rozkazow
assemblerowych.
Juliusz
Kilka dodatkowych pytań:
1. Z którego zakresu są rejestry zawierające dane (0-15 czy 16-31)?
2. Czy zawartość tych 3 rejestrów może ulec zmianie?
3. Ile bajtów zajmuje aktualnie twój kod?
4. Czy rejestr setek jest ograniczony do zakresu 0-2, jeżeli nie to czy
sygnalizować błąd dla > 2?
Jarek
From: "Juliusz" <jul_at_nospam_fom.pl>
Subject: Re: zamiana dec na hex bez dzielenia
Date: Mon, 19 Mar 2001 18:43:54 +0100
Kilka dodatkowych pytań:
1. Z którego zakresu są rejestry zawierające dane (0-15 czy 16-31)?
To akurat nie ma znaczenia, uzywam gornych akurat ale i tak te dane laduja w
buforze w ramie. Takich liczb jest kilka do zamiany.
2. Czy zawartość tych 3 rejestrów może ulec zmianie?
Nie, ale zawsze moge je na stos zwalic w przerwaniach jesli bedzie trzeba.
3. Ile bajtów zajmuje aktualnie twój kod?
Hmm zajmuje full i brakuje mi z 30% :-) Wiec szukam wyjscia przerabiajac go
do granic mozliwosci upakowania.
4. Czy rejestr setek jest ograniczony do zakresu 0-2, jeżeli nie to czy
sygnalizować błąd dla > 2?
Nie trzeba sygnalizowac
Tu dokladnie chodzi o LCD w trybie 4 bitowym, klawiature i adresy IP
wprowadzane z klawiatury dziesietnie. Analizowalem kilka warianrow kodu jak
to ma wygladac i co zabiera wiecej kodu jesli wczesniej lub pozniej zaczynam
robic zamiane na hexy. Kazde rozwiazanie ma swoje plusy i minusy.
Np AVR jest ubogi w testowanie bitow i wszelkie MOV'y co robi kod nieco
nadmuchany. Stosowanie flag po rozparcelowaniu np dolnego rejestru na flagi
powoduje, ze kod strasznie puchnie i czasem szybciej zrobic dwie podobne
procedury niz gimnastykowac sie z flagami i testowaniem bitow.
Uzylem AVR'a akurat, bo programuje go w ukladzie i ma SPI oraz z kilku
innych powodow. Nie jest to pierwszy kod na AVR'a jaki pisalem. Robilem duzo
bardziej skomplikowane rzeczy ale mialem wiecej pamieci programu do
dyspozycji.
Juliusz
From: jfox_at_nospam_friko6.onet.pl (J.F.)
Subject: Re: zamiana dec na hex bez dzielenia
Date: Tue, 20 Mar 2001 01:08:41 GMT
On Mon, 19 Mar 2001 18:43:54 +0100, Juliusz wrote:
3. Ile bajtów zajmuje aktualnie twój kod?
Hmm zajmuje full i brakuje mi z 30% :-) Wiec szukam wyjscia przerabiajac go
do granic mozliwosci upakowania.
30% ? To raczej czas sie zastanowic nad lepszym prockiem.
Juliusz - przeciez zarabiasz tyle ze sie nie oplaca zebys
optymalizowal kod, wiekszy procek nie jest warty twojej placy :-)
Tu dokladnie chodzi o LCD w trybie 4 bitowym, klawiature i adresy IP
wprowadzane z klawiatury dziesietnie. Analizowalem kilka warianrow kodu jak
to ma wygladac i co zabiera wiecej kodu jesli wczesniej lub pozniej zaczynam
robic zamiane na hexy. Kazde rozwiazanie ma swoje plusy i minusy.
Np AVR jest ubogi w testowanie bitow i wszelkie MOV'y co robi kod nieco
nadmuchany.
Czy ty za bardzo nie kombinujesz ?
[zaladowac do R1 setki]
MOV R2,R1
ADD R2,R2
ADD R2,R2
ADD R2,R1
ADD R2,R2
[zaladowac do R1 dziesiatki]
ADD R1,R2
MOV R2,R1
ADD R2,R2
ADD R2,R2
ADD R2,R1
ADD R2,R2
[zaladowac do R1 jednostki]
ADD R2,R1
I jakos watpie zebys duzo zaoszczedzil inaczej kombinujac.
No chyba ze sie ograniczysz do 0..199 - wtedy setkom wystarczy
NEG R1; ANDI R1, 10
Albo:
[zaladowac do R1 setki]
[zaladowac do R3 dziesiatki]
RCALL muladd
[zaladowac do R3 jednostki]
muladd:
MOV R2,R1
ADD R1,R1
ADD R1,R1
ADD R1,R2
ADD R1,R1
ADD R1,R3
RET
J.
From: "Juliusz" <jul_at_nospam_fom.pl>
Subject: Re: zamiana dec na hex bez dzielenia
Date: Tue, 20 Mar 2001 21:31:55 +0100
Czy ty za bardzo nie kombinujesz ?
[zaladowac do R1 setki]
MOV R2,R1
ADD R2,R2
ADD R2,R2
ADD R2,R1
ADD R2,R2
[zaladowac do R1 dziesiatki]
ADD R1,R2
MOV R2,R1
ADD R2,R2
ADD R2,R2
ADD R2,R1
ADD R2,R2
[zaladowac do R1 jednostki]
ADD R2,R1
Rzeczywiscie proste :-) A widzisz, czlowiek ma czasem zacmienie i arytmetyki
z podstawowki zapomina :-) Gdyby nie ilosc miejsca na kod to bym nawet o tym
nie pomyslal :-)
Juliusz