Asembler - pytanie
Asembler - pytanie
Jak jest kodowany asembler? Chodzi mi o to jak recznie przepisac asemblera na system szesnastkowy??
Po co Ci to ?!?misha1024 pisze: Po prostu chce sie nauczyc "recznie" tlumaczyc asemblera.
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
Można poczytać tutaj. Tam znajdziesz odpowiedź na kilka swoich pytań. Nie znajdziesz tam kodów rozkazów, ale te są dostępnemisha1024 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?
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?
Nie, nie korzystam z tgo zestwuCzy Ty aby czasem nie korzystasz z zestawu AVT-2500 ?
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
Zna ktos odpowiedzi na poprzednie pytania?
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):
albo:
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
Kod: Zaznacz cały
:020000020000FC
:1000000002E00EBF0FE50DBF00E00ABB0FEF0BBB18
:100010000FEF07BB0FEF08BB09B3017019F400E045
:0A00200008BBFACF0FEF08BBF7CFC3
:00000001FF
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??
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??
W przypadku E002 to się zgadza. Następna instrtukcja to ... pudło
. 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 ;
;-----------------------------------------------------------------------------
No tak to jest rejestr SPH. Patrzylem na zestawienie rejestrow mikrokontrolera 90S2313 a tam rejestr o adresie $E3 (111110) jest zrezerowany wiec kombinowalem
Mowisz ze jest to bardzo prosty program. Ja jeszcze nie napisalem ani jednego programu w asemblerze
Mam wielka ochote sie go nauczyc ale nie mam czasu
mam sporo nauki w liceum.
Ilu bitowa jest magistrala adresowa w uC AVR??
Mowisz ze jest to bardzo prosty program. Ja jeszcze nie napisalem ani jednego programu w asemblerze
Ilu bitowa jest magistrala adresowa w uC AVR??
-
ZbeeGin
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.misha1024 pisze:Ilu bitowa jest magistrala adresowa w uC AVR??
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.
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ą.
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ą.
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
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
Szerokość magistrali nie ma nic wspólnego z "twoimi" 10 bitami.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
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ć.