🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
4 messages
4 total messages Started by -=RapidHail=- Sat, 17 May 2008 23:59
[ASM] [PIC16F84a][HEX->DEC] Konwersja liczby na dziesiątki i jednostki
#1812
Author: -=RapidHail=-
Date: Sat, 17 May 2008 23:59
50 lines
2027 bytes
Mam taki kod który robi to co mi jest potrzebne a więc rozbiera liczbę na
jednostki i dziesiątki, czy mógłby ktoś wytłumaczyć na czym polega taki
rozbiór. Przełożyć to z asm na polski? Zaczynam dopiero zabawę z assemblerem
(8 bitowy mikrokontroler) i nie idzie tak tragicznie ale operacje
matematyczne wciąż są dla mnie zagwozdką.
Bit C wrejestrze STATUS to znacznik przeniesienia (aktywne "1") lub pożyczki
(aktywne "0"): 1 - wystąpiło przeniesienie z najbardziej znaczącego bitu
wyniku, 0 - nie wystąpiło.

Kod programu:
temp   equ 0x19
dana   equ 0x20
temp1  equ 0x21
i      equ 0x22
dzies  equ 0x23
jedn   equ 0x24

Start
 clrf dzies
 movlw .93
 movwf dana
 movwf temp1
 clrf i
 movlw .8
 movwf temp
k01 rlf temp1,1
 rlf i,1
 movlw .10
 subwf i,0
 btfss STATUS,C
 goto k02
 movlw .10
 subwf i,1
 bsf STATUS,C
 btfss STATUS,C
k02 bcf STATUS,C
 rlf dzies,1
 decfsz temp,1
 goto k01
 movlw .10
 movwf temp
 clrf temp1
k03 movf dzies,0
 addwf temp1,1
 decfsz temp,1
 goto k03
 movf temp1,0
 subwf dana,0
 movwf jedn
end
Re: [ASM] [PIC16F84a][HEX->DEC] Konwersja liczby na dziesiątki i jednostki
#1813
Author: Bogdan (bogdro)
Date: Sun, 18 May 2008 12:18
26 lines
2217 bytes
-=RapidHail=- pisze:
> Mam taki kod który robi to co mi jest potrzebne a więc rozbiera liczbę na
> jednostki i dziesiątki, czy mógłby ktoś wytłumaczyć na czym polega taki
> rozbiór. Przełożyć to z asm na polski? Zaczynam dopiero zabawę z assemblerem
> (8 bitowy mikrokontroler) i nie idzie tak tragicznie ale operacje
> matematyczne wciąż są dla mnie zagwozdką.
> Bit C wrejestrze STATUS to znacznik przeniesienia (aktywne "1") lub pożyczki
> (aktywne "0"): 1 - wystąpiło przeniesienie z najbardziej znaczącego bitu
> wyniku, 0 - nie wystąpiło.

  Bez znajomości instrukcji (ja robię na x86) trudno mi będzie to 
powiedzieć, ale przyglądając się trochę kodowi według mnie działa on tak:
1. odejmij od danej liczby 10
2. jak wynik ujemny, należy 10 dodać z powrotem, reszta jest liczbą 
jedności
3. Jak wynik nieujemny, zwiększ liczbę dziesiątek o 1 i skacz do 1.

  Czyli metoda "na piechotę" by z tego wyszła. Czy PICi mają 
instrukcje "wyższego poziomu", takie jak mnożenie i dzielenie? Z 
ciekawości pytam.

-- 
Pozdrawiam/Regards - Bogdan                     (GNU/Linux & FreeDOS)
Kurs asemblera x86 (DOS, GNU/Linux):http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm:  pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
www.JabberPL.org www.TorProject.org Soft (EN): miniurl.pl/bogdro-soft
Re: [ASM] [PIC16F84a][HEX->DEC] Konwersja liczby na dziesiątki i jednostki
#1814
Author: -=RapidHail=-
Date: Sun, 18 May 2008 13:05
46 lines
3254 bytes
Użytkownik "Bogdan (bogdro)" <bogdan@poczta.gazeta.pl> napisał w wiadomości 
news:g0p6r0$7fi$2@inews.gazeta.pl...

>  Bez znajomości instrukcji (ja robię na x86) trudno mi będzie to 
> powiedzieć, ale przyglądając się trochę kodowi według mnie działa on tak:
> 1. odejmij od danej liczby 10
> 2. jak wynik ujemny, należy 10 dodać z powrotem, reszta jest liczbą 
> jedności
> 3. Jak wynik nieujemny, zwiększ liczbę dziesiątek o 1 i skacz do 1.
>
>  Czyli metoda "na piechotę" by z tego wyszła. Czy PICi mają instrukcje 
> "wyższego poziomu", takie jak mnożenie i dzielenie? Z ciekawości pytam.

No właśnie nie jest to metoda na piechotę. Znaczy co ja przez to rozumiem: 
odejmowanie dziesiątek i sprawdzenie ile razy została odjęta. Posiadają 
tylko 35 instrukcji, nie ma mnożenia i dzielenia. A w kodzie główną uwagę 
należy skierować na przesunięcia cykliczne (takie moje zdanie).

Jeżeli będzie chcęć rozgryzienia to podaję instrukcję użyte w kodzie:
movlw - wpisanie na akumulator (WRERG)
movwf - wpisanie do rejestru
clrf - czyszczenie rejestru (o zadanym adresie)
rlf - przesuwanie cykliczne w lewo zawartości rejestru o podanym adresie ze 
znacznikiem C, a wiec:
RLF REG,1
przed rozkazem: REG = 1110 0110, znacznik C=0
po rozkazie:    REG = 1100 1100, C=1

RLF REG,1
przed rozkazem: REG = 1110 0110, znacznik C=1
po rozkazie:    REG = 1100 1101, C=1

Bit C wrejestrze STATUS to znacznik przeniesienia (aktywne "1") lub pożyczki 
(aktywne "0"): 1 - wystąpiło przeniesienie z najbardziej znaczącego bitu 
wyniku, 0 - nie wystąpiło.
btfss - testowanie bitu w rejestrze o adresie f (tutaj bit C w rejestrze 
STATUS), jeżeli jest ustawiony to pomijja kolejną instrukcję
addwf - dodanie WREG do rejestru i zapisanie wyniku w rejestrze (1 po 
przecinku)
decfsz - dekremenctuj rejestr o zadanym adresie, jeżeli po dekrementacji 
będzie 0 to pomija następny rozkaz
movf dana,0 - przesłanie rejestru do WREG (0 po przecinku), jeśli 1 to na 
odwrót z WREG do rejestru
subwf f,d - odejmowanie od rejestru f rejestru WREG i zapisanie wyniku w 
WREG (d=0)
movwf f - przesłanie zawartości WREG do rejestru f. 
Re: [ASM] [PIC16F84a][HEX->DEC] Konwersja liczby na dziesiątki i jednostki
#1815
Author: Bernard
Date: Tue, 20 May 2008 15:20
14 lines
1767 bytes
-=RapidHail=- wrote:
> Mam taki kod który robi to co mi jest potrzebne a więc rozbiera liczbę na
> jednostki i dziesiątki, czy mógłby ktoś wytłumaczyć na czym polega taki
> rozbiór. Przełożyć to z asm na polski? Zaczynam dopiero zabawę z assemblerem
> (8 bitowy mikrokontroler) i nie idzie tak tragicznie ale operacje
> matematyczne wciąż są dla mnie zagwozdką.

Jest taki śmieszny algorytm, który z grubsza polega na tym ,że do 
inicjalnej wartości 0 (która w przyszłości będzie liczbą po konwersji) 
dodaje się wagi kolejnych bitów, przeprowadzając na bieżąco korekcję z 
bin na BCD. Widziałem już parę implementacji tego dla innych procesorów, 
dla których nie ma sensu tego wogóle stosować, bo są dużo szybsze 
metody, np. AAM dla x86 albo zwykłe dzielenie dla 51. Akurat w przypadku 
głupiutkiego PICa pewnie ten algorytm jest całkiem sensowny.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads