Asembler - pytanie

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
Awatar użytkownika
misha89
Użytkownik
Posty: 150
Rejestracja: 06 lip 2006, 17:15
Lokalizacja: Ryki
Kontakt:

Asembler - pytanie

Post autor: misha89 » 08 lis 2006, 20:22

Jak jest kodowany asembler? Chodzi mi o to jak recznie przepisac asemblera na system szesnastkowy??

Awatar użytkownika
brzozi
Użytkownik
Posty: 297
Rejestracja: 02 sie 2005, 22:11
Lokalizacja: Trzebinia
Kontakt:

Post autor: brzozi » 08 lis 2006, 20:47

Teoretycznie każdemu rozkazowi odpowiada odpowiedni kod, ale ja proponuje to sprowadzić do czystej teorii. Do tłumaczenia służą programy dokonujące asemblacji czyli tłumaczenia na hexa. Troszeczkę nie rozumiem sensu pytania.

Awatar użytkownika
misha89
Użytkownik
Posty: 150
Rejestracja: 06 lip 2006, 17:15
Lokalizacja: Ryki
Kontakt:

Post autor: misha89 » 08 lis 2006, 22:32

każdemu rozkazowi odpowiada odpowiedni kod
To juz wiem:)
Po prostu chce sie nauczyc "recznie" tlumaczyc asemblera. A moze ktos wie jak wyglada pojedynczy rozkaz mikrokontrolera AVR pobierany z pamieci?? Wiem ze jest on 16bitowy i zawiera kod mnemonika. A czy zawiera on jeszcze adres i dane?

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 08 lis 2006, 22:43

misha1024 pisze: Po prostu chce sie nauczyc "recznie" tlumaczyc asemblera.
Po co Ci to ?!? :shock:
Daj spokoj, tlumaczac kod recznie:
* tracisz mase czasu, ktory mozesz wykorzystac na nauke programowania albo czegos innego
* popelnisz duzo bledow i masz nowy problem: oprocz bledow logicznych pojawiaja sie bledy tlumaczenia, nigdy nie znajdziesz (przesadzam...) bledu w oprogramowaniu
* muszisz WPROWADZIC RECZNIE przetlumaczony kod do komutera/programatora.
Czekaj, czekja... Czy Ty aby czasem nie korzystasz z zestawu AVT-2500 ?

DODANO:
Jezeli tak dramatycznie potrzebujesz kodu maszynowego, to napisz program normalnie w assemblerze, skompiluj i zajrzyj do pliku *.hex - tam bedziesz mial swoj kod maszynowy :)

Awatar użytkownika
gaweł
Użytkownik
Posty: 651
Rejestracja: 05 kwie 2004, 8:38
Lokalizacja: Białystok
Kontakt:

Post autor: gaweł » 08 lis 2006, 22:59

misha1024 pisze:Po prostu chce sie nauczyc "recznie" tlumaczyc asemblera. A moze ktos wie jak wyglada pojedynczy rozkaz mikrokontrolera AVR pobierany z pamieci?? Wiem ze jest on 16bitowy i zawiera kod mnemonika. A czy zawiera on jeszcze adres i dane?
Można poczytać tutaj. Tam znajdziesz odpowiedź na kilka swoich pytań. Nie znajdziesz tam kodów rozkazów, ale te są dostępne
tutaj.
Mam nadzieję, że jest to ci potrzebne do zrozumienia samego procesu kompilacji, bo jeżeli chcesz w ten sposób kompilować "produkcyjnie", to jest to słaby pomysł.
Wystarczy, że przykładowo przykładowo wskażę ci kilka kłopotliwych instrukcji: skoki warunkowe. Ich operandy są adresami relatywnymi i w dodatku w notacji U2. Wystarczy mała zmiana i cały żmudny proces zda się psu na budę.
A może masz ochotę napisać własny kompilator? :wink:

Awatar użytkownika
misha89
Użytkownik
Posty: 150
Rejestracja: 06 lip 2006, 17:15
Lokalizacja: Ryki
Kontakt:

Post autor: misha89 » 08 lis 2006, 23:26

Czy Ty aby czasem nie korzystasz z zestawu AVT-2500 ?
Nie, nie korzystam z tgo zestwu :grin:
Moze troche przesadzilem z tym recznym tlumaczeniem. Chce sie mniej wiecej orientowac co oznaczaja poszczegolne wartosci w pliku .hex Jaka jest jego struktura - czy najpierw jest mnemonik pozniej adres i dana?? Ktorys z uzytkownikow forum pisal (nie pamietam gdzie to czytalem :/) ze w pewnym momecie nauki rogramowania bardziej byl dla nie go zrozumialy kod maszynowy niz mnemoniki. Wielki respect dla niego. Tez chcialbym tak :mrgreen:

Zna ktos odpowiedzi na poprzednie pytania?

Awatar użytkownika
gaweł
Użytkownik
Posty: 651
Rejestracja: 05 kwie 2004, 8:38
Lokalizacja: Białystok
Kontakt:

Post autor: gaweł » 08 lis 2006, 23:45

Plik hex jest pewnego rodzaju notacją, gdzie występują wyłącznie znaki pisarskie. Czasami jeszcze się zdarza postać binarna, która zawiera dane jakie mają być zaprogramowane do pamięci w postaci nie przekształconej, czyli bajty w każdem możliwej kombinacji i w dodatku beż żadnej kontroli. W formacie hex już jest rochę zorganizowany. Istnieje podział na różne rodzaje bloków, dodane są sumy kontrolne itp.
Plik hex zawiera w sobie dane, jakie są umieszczane w pamięciach i najczęściej jest kod programu. ale nie koniecznie. Przykładowo zawartość pamięci wewnętrznej EEPROM dla AVR też jest zapisany w pliku hex (tak robi AVRSTUDIO).
Jak widać w plikach hex nie zawsze jest zawarty program. To czy w danym pliku znajduje się program dla twego AVR'a zależy wyłącznie od interpretacji. Równie dobrze możesz kod wygenerowany dla innego procka (np. C51) załadować do AVR'a. Technicznie jest to do wykonania, bo programator nie będzie "dyskutował" tylko wykona polecenia. Co zrobi procek AVR załadowany programem dla innego procka? Na pewno nie będzie działał.
Jeżeli chodzi o format pliku hex, to opis widziałem przykładowo w (po polsku):
"Modułowe systemy mikrokomputerowe", praca zbiorowa.

[ Dodano: 2006-11-09, 11:59 ]
misha1024 aby pokazać ci, że nie jest to dobry pomysł, to powiedz mi co robi poniższy program (jest to prawdziwy wynik kompilacji):

Kod: Zaznacz cały

e002
bf0e
e50f
bf0d
e000
bb0a
ef0f
bb0b
ef0f
bb07
ef0f
bb08
b309
7001
f419
e000
bb08
cffa
ef0f
bb08
cff7
albo:

Kod: Zaznacz cały

:020000020000FC
:1000000002E00EBF0FE50DBF00E00ABB0FEF0BBB18
:100010000FEF07BB0FEF08BB09B3017019F400E045
:0A00200008BBFACF0FEF08BBF7CFC3
:00000001FF

Awatar użytkownika
misha89
Użytkownik
Posty: 150
Rejestracja: 06 lip 2006, 17:15
Lokalizacja: Ryki
Kontakt:

Post autor: misha89 » 09 lis 2006, 15:08

Przetlumaczylem tylko pierwsza wartosc (e002). Nie wiem czy dobrze :)
Jest torozkaz LDI powodujacy zaladowanie wartosci 00000010 do rejestru r16. Tak??

Uswiadomiles mnie ze to nie jest dobry pomysl. Dzieki.

Wiesz, od dluzszego czasu staram sie poznac bardzo szczegolowa zasade dzialanie mikrokontrolera. Narazie zatrzymalem sie na dekoderze instrukcji. Posiadam ksiazke "Mikrokontrolery AVR w praktyce" jednak malo jest w niej o ukladzie sterujacym praca uC. Moze sie myle ale dekoder instrukcji musi byc czyms w rodzaju pamieci ROM. A czy dekoder instrukcji wystawia wartosc na magistrali adresowej czy jest wystawiana wczesniej, przez rejestr instrukcji??

[ Dodano: 2006-11-09, 15:35 ]
Drugi rozkaz (bf0e) OUT to umieszczenie danej z r16 do rejestru we/wy o nazwie PORTA

Program jest napisany pod jaki mikrokontroler??

Awatar użytkownika
gaweł
Użytkownik
Posty: 651
Rejestracja: 05 kwie 2004, 8:38
Lokalizacja: Białystok
Kontakt:

Post autor: gaweł » 09 lis 2006, 18:36

W przypadku E002 to się zgadza. Następna instrtukcja to ... pudło :mrgreen: . Poniżej masz fragment raportu z kompilacji. Program jest napisany dla ATMEGA8515 i jest to bardzo, bardzo, bardzo prosty program.

Kod: Zaznacz cały

                 .def acc	= r16
                 ;-----------------------------------------------------------------------------
                 	.cseg
                 ;-----------------------------------------------------------------------------
                 	.org	0		;
000000 e002      	ldi	acc,HIGH(RAMEND);
000001 bf0e      	out	SPH,acc		;
000002 e50f      	ldi	acc,LOW(RAMEND)	;
000003 bf0d      	out	SPL,acc		;
                 ;-----------------------------------------------------------------------------
                 Main	:			;
000004 e000      	ldi	acc,0b00000000	;
000005 bb0a      	out	DDRA,acc	;
000006 ef0f      	ldi	acc,0b11111111	;
000007 bb0b      	out	PORTA,acc	;
000008 ef0f      	ldi	acc,0b11111111	;
000009 bb07      	out	DDRB,acc	;
00000a ef0f      	ldi	acc,0b11111111	;
00000b bb08      	out	PORTB,acc	;
                 Main_0	:			;
00000c b309      	in	acc,PINA	;
00000d 7001      	andi	acc,0x01	;  jeżeli PORTA bit 0 = 0 to
00000e f419      	brne	Main_10		;
00000f e000      	ldi	acc,0b00000000	;    PORTB := 0b00000000 ;
000010 bb08      	out	PortB,acc	;
000011 cffa      	rjmp	Main_0		;
                 Main_10	:			;
000012 ef0f      	ldi	acc,0b11111111	;    PORTB := 0b11111111 ;
000013 bb08      	out	PortB,acc	;
000014 cff7      	rjmp	Main_0		;
                 ;-----------------------------------------------------------------------------


Awatar użytkownika
misha89
Użytkownik
Posty: 150
Rejestracja: 06 lip 2006, 17:15
Lokalizacja: Ryki
Kontakt:

Post autor: misha89 » 09 lis 2006, 19:49

No tak to jest rejestr SPH. Patrzylem na zestawienie rejestrow mikrokontrolera 90S2313 a tam rejestr o adresie $E3 (111110) jest zrezerowany wiec kombinowalem :mrgreen:

Mowisz ze jest to bardzo prosty program. Ja jeszcze nie napisalem ani jednego programu w asemblerze :mrgreen: Mam wielka ochote sie go nauczyc ale nie mam czasu :sad: mam sporo nauki w liceum.

Ilu bitowa jest magistrala adresowa w uC AVR??

ZbeeGin

Post autor: ZbeeGin » 09 lis 2006, 20:14

misha1024 pisze:Ilu bitowa jest magistrala adresowa w uC AVR??
W sumie, tego Atmel nie podaje. I właściwie ma rację, bo rzadko się wykorzystuje zewnętrzną pamięć EEPROM z programem użytkownika. Układy Mega mają nawet i po 128KB pamięci Flash, dobrze napisany kod jest dość zwarty, więc jest to bardzo dużo.
Ponadto układy AVR są przeznaczone raczej do układów sterowania, zatem komputera osobistego opartego o rdzeń AVR nie zrobisz. Jedną z przeszkód jest architektura: nie można uruchamiać programów z pamięci RAM!

Układy z rodziny AVR (Classic, Mega, Tiny) posiadają wewnętrzną magistralę 8-bitową, łączącą wszystkie bloki mikrokontrolera.

Awatar użytkownika
gaweł
Użytkownik
Posty: 651
Rejestracja: 05 kwie 2004, 8:38
Lokalizacja: Białystok
Kontakt:

Post autor: gaweł » 09 lis 2006, 21:34

Uzupełniając wypowiedź ZbeeGin, to można dodać, że niektóre mikrokontrolery mają możliwość przyłączenia na zewnątrz pamięć RAM. W ten sposób uzyskuje się sumaryczną (RAM wewn. + RAM zewn.) 64k przestrzeni adresowej. Do jej zaadresowania używana jest 16-bitowa szyna danych i jak napisał ZbeeGin, nie ma możliwości uruchomiania kodu z tej pamięci. Jest to implikacją architektury mikrokontrolera (AVR ma architekturę Harvard), gdzie jest rozdzielona przestrzeń adresowna na program i dane.
Jeżeli masz ochotę na zabawy z prockiem, to musisz sobie sam zbudować zestaw do zabawy lub takowy zakupić (chyba, że od razu budujesz docelowe urządzenie, które może spełniać rolę zestawu ćwiczeniowego). Oferta jest szeroka, poczynając od zestawów oferowanych przez ATMEL (jak przykładowo STK500) do zestawów oferowanych przez BTC. Literatura w języku polskim jest, czyli nie musisz się głowić nad anglojęzyczną dokumentacją.

Awatar użytkownika
misha89
Użytkownik
Posty: 150
Rejestracja: 06 lip 2006, 17:15
Lokalizacja: Ryki
Kontakt:

Post autor: misha89 » 09 lis 2006, 22:42

Dzieki wielkie

Nie daje mi spac jeszcze jedna rzecz. Przykladowy rozkaz OR (kod 0010 10sd dddd ssss) adresuje dwa rejestry sssss i ddddd. To w sumie daje 10bitow adresu, jak to jest mozliwe przy 8bitowej magistrali??

[ Dodano: 2006-11-09, 22:59 ]
Jesli chodzi o zestawy to podobaja mi sie te oferowane przez propox http://www.propox.com/products/t_143.html i cena nie jest zbyt wysoka :mrgreen:

Awatar użytkownika
gaweł
Użytkownik
Posty: 651
Rejestracja: 05 kwie 2004, 8:38
Lokalizacja: Białystok
Kontakt:

Post autor: gaweł » 09 lis 2006, 23:15

misha1024 pisze:Dzieki wielkie

Nie daje mi spac jeszcze jedna rzecz. Przykladowy rozkaz OR (kod 0010 10sd dddd ssss) adresuje dwa rejestry sssss i ddddd. To w sumie daje 10bitow adresu, jak to jest mozliwe przy 8bitowej magistrali??

[ Dodano: 2006-11-09, 22:59 ]
Jesli chodzi o zestawy to podobaja mi sie te oferowane przez propox http://www.propox.com/products/t_143.html i cena nie jest zbyt wysoka :mrgreen:
Szerokość magistrali nie ma nic wspólnego z "twoimi" 10 bitami.
Rozkaz OR realizuje sumę logiczną zawartości dwóch rjestrów, gdzie w rozkazie występuje bezpośredni tryb adresowania. Symbol sssss (od ang. Source) i ddddd (od ang. Destination) wskazują na rejestry biorące udział w operacji. Przykładowo: sssss=10000 i ddddd=10001 dają OR r16,R17.
We wspomnianej przez ciebie wcześniej książce J.Doliński "Mikrokontrolery AVR..." jest to na stronie 29.

Co do kitu nie będę się wpowiadał, bo nie miałem okazji go używać.

Awatar użytkownika
misha89
Użytkownik
Posty: 150
Rejestracja: 06 lip 2006, 17:15
Lokalizacja: Ryki
Kontakt:

Post autor: misha89 » 09 lis 2006, 23:30

Tak, ale rejestry r16 i r17 musza byc w jakis sposob wybrane z posrod reszty, czyli musza byc na raz zaadresowane?

ODPOWIEDZ