logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak przygotować procedury w assemblerze do użycia z include?

astony 23 Wrz 2007 10:07 1968 19
REKLAMA
  • #1 4311367
    astony
    Poziom 14  
    Posty: 277
    Pomógł: 4
    Ocena: 23
    Witam.
    Pisze w assemblerze i chciałbym wykorzystać gotowe procedurki poprzez "include".
    W jaki sposób je przygotować aby nie było komunikatu typu niezdeklarowana zmienna lub zdeklarowana podwójnie?
  • REKLAMA
  • #2 4314091
    gmp
    Poziom 19  
    Posty: 434
    Pomógł: 29
    Ocena: 28
    A kolega to na jaki procesor pisze? nie laska sie pochwalic, jakiego kompilatora uzywa... widze ze to raczej poczatki pisania, bo ktos kto PISZE w assemblerze to chyba by nie zadawal takiego pytania.
    Hm... w assemblerze to chyba po prostu musisz sam o to zadbac :), to znaczy zadeklarowac to co niezadeklarowane i nie uzywac tych samych nazw do dwoch zmiennych. takie juz uroki assemblera.
    Moja rada: jesli istnieje na to co piszesz kompilator C to daj sobie spokoj z asseblerem. Zanim bedziesz lepszy od kompilatora(tzn bedziesz w stanie napisac bardziej efektywny kod) mina lata... A w te bajki ktore niektorzy pisza ze maja pelna kontrole nad procesorem to nie wierz, maja dopoki nie popelnia bledu i pisanie programu zajmuje 10x dluzej. Odkad sa ogolnie dostepne procesory przygotowane pod 'C' czyli ARM AVR itp baaaaaaardzo rzadko mam potrzebe siegniecia po assembler. Od kilku lat wlsciwei tylko raz tego potrzebowalem i zmiescilo sie to na pol A4.
  • REKLAMA
  • #3 4314362
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Cytat:
    gmp...


    Do Twojej wiadomości...

    .IF
    .ENDIF
    .ELSE
    .ELIF
    .IFDEF
    .IFNDEF
    .MESSAGE
    .ERROR

    np.
    .set stala = 1
    .if stala == 1
    .message "Jest zadeklarowana i wynosi 1"
    .elif stala == 0
    .message "Jest zadeklarowana i wynosi 0"
    .else
    .error "Nie zadeklarowano!"
    .endif
    
    //lub
    
    .ifdef stala
    .message "Zadeklarowana"
    .endif
    
    //lub
    
    .ifndef stala
    .error "Niezadeklarowana!"
    .endif
  • #4 4314895
    zagwizdow
    Poziom 17  
    Posty: 177
    Pomógł: 21
    Ocena: 7
    ja gdzie widzialem i dodaje do naglowkow takie cos co caly plik pomija jak juz byl
    
    #ifndef p__uart1_plik__
    #define p__uart1_plik__
    .....
    #endif
    


    a jesli chodzi o asm w keilu na '51 to do *.src jakos sam dodaje definy rejestrow '51 i trzeba odznaczyc w opcjach projektu.
  • REKLAMA
  • #5 4314965
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    opcja
    "include" w c jest zarezerwonana dla bibliotek c, zazwyczaj piszesz

    #include <cośtam.h>

    Jeśli wstawki asm mają być krótkie to proponuje komendę inline();

    jesli dłuższe to możesz zastosować __asm;

    Jeszcze inna metoda , ale już ściśle zależna od konkretnego kompliatora to opjca linkowania plików *.obj :( ale nie zawsze działa tak jak chcesz :)

    Po za tym mieszanie Asm i C wymaga wiele rozwagi :)
    najlepiej jest przeanalizować zawartość kompilatu w C ponieważ kompliacja odbywa się krokowo, najpierw na podstawie kodu C tworzony jest kod ASM, a dopiero póżnień kod maszynowy :), więc masz okazję obejrzeć "herezje" z C w listingu, zanim podłączysz swój "dopieszczony" kod w Asmie :).

    Niestety czasem te dwie sprawy mogą się gryźć :( NP. korzystanie ze zbierznych obszarów pamięci etc.
  • #8 4321853
    slomek83
    Poziom 12  
    Posty: 61
    Pomógł: 1
    W programie AVRStudio pliki nagłowkowe deklaruje sie poprzez np:

    .include "nazwa_pliku.inc"

    Plik musi znajdowac sie w katalogu projektu.
  • #9 4322041
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Nie nażekaj "astony" tylko napisz konkretniej o co Ci chodzi ... bo do końca nie złapałem Twojego toku myślenia!

    Chcesz dołączać tylko używane procedury czy że jak?
  • #10 4322239
    trol.six
    Poziom 31  
    Posty: 1650
    Pomógł: 151
    Ocena: 381
    Mam wrażenie że chodzi mu o to, że ma jakieś procedury czy cos tam w asm, czyli drugi plik *.asm, i powiedzmy ma tam te same definicje czegoś. Choćby nawet te samą etykiete do skoku. Albo jakieś zmiennej.

    No ale może sie sam wypowie precyzyjniej.
  • #11 4322532
    astony
    Poziom 14  
    Posty: 277
    Pomógł: 4
    Ocena: 23
    Chodzi o to, że podczas pisania programu w miarę rozwoju listing robi się strasznie długi i bieżąca analiza jest utrudniona. Wydawało mi się że jeżeli poszczególne podprogramy działające już w innym programie umieszczę w bieżacym jako odnośnik to będzie mi łatwiej analizować listing, bo po prostu będzie krótszy. Gdy uznam że program jest gotowy to dopiero kompilacja spowoduje dołączenie wcześniejszych procedur w całości. Podczas wcześniejszy prób "include *.asm" były ciągłe niepowodzenia tak że dałem spokój, jednak wciąż mnie to korci.
    Niestety w tłumaczeniu problemu tez nie jestem biegly :cry:

    Jednak zastosuję tylko nazwy podprogramów jako label z RTS i na koniec dołożę całą procedurę
    Powodzenia
  • REKLAMA
  • #12 4322582
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Rada ... jak coś deklarujesz w ASM to dawaj prefixy czego dotyczą i nie będą się dzięki temu powtarzać ;)

    ADC_Initiate
    LCD_Initiate

    itp. To samo z stałymi i zmiennymi ...
  • #13 4322665
    astony
    Poziom 14  
    Posty: 277
    Pomógł: 4
    Ocena: 23
    Oglądając programy innych próbowałem stosować zmianę nazwy dla tego samego rejestru w zalezności od tego w którym podprogramie występuje. Niestety łatwiej sie wtedy gubię . Dlatego pozostaje mi tylko symulacja, ale do tego potrzebna jest kompilacja. Jezeli mam błąd to mam tez -> brak kompilacji :cry: . Stąd moje próby pójścia na skróty
  • #14 4323909
    zagwizdow
    Poziom 17  
    Posty: 177
    Pomógł: 21
    Ocena: 7
    z asmie tez powinny byc includy i ifdef itp
    przynajmniej z takimi sie zetknalem ( w jednym tylko mialem ograniczenie co do zagniezdzania ).

    powinno Ci zwracac numer linijki blednej co zawsze pomoze jakos dojsc .

    moze napisz w jakim asmie to jest to ktos to musial robic.

    co do nazw to najplepiej dawac na poczatku etykiety skrot od nazwy pliku zeby sie nie powtarzalo tak jak ktos podal wczesniej przyklad.
  • #15 4323982
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    Nie bardzo rozumiem o co chodzi większość asemblerów dopuszcza komendę

    inc ("coś.obj") - czyli włączenie skompilowanego pliku asm , c, pas.

    Więc jeśli chcesz, to co robisz zrobić dobrze to pomyśl o działaniu z bibliotekami lib. Ważne jest to żeby stosować adresowanie ideksowane i zapewnić przenośność kodu w pamięci, nie stosować sztywnych przypisań danych do miejsca w pamięci etc. etc.

    Co zaś do analizy listingów hmm, wskazane byłoby stosowanie debugera, pułapek -trap etc.
    Wtedy możesz analizować działanie kodu krokowo, skokowo i jeśli twój debuger pozwala możesz też ręcznie sterować danymi :) np. w celu testowania zabezpieczeń przekroczenia zakresów danych.

    Praca z wydrukowanym listingiem jest bardzo złożona szczególnie, gdy zależności są dynamiczne :) podziwiam twoją cierpliwość działania .

    A ostatnia sprawa to zastosowania, przecież

    mov A, #10 to to samo co A=10; w C.

    Korzyści wynikające z procedur czysto assemblerowych pojawiają się w procedurach zależnych czasowo od zegara lub tam, gdzie stosuje się arytmetykę złożoną wykorzystując daną architekturę rejestrów, cała reszta działań w assemblerze jest bardzo łatwa do przeniesienia do C i tu zdecydowanie łatwiejsza do kompliacji i debugowania.

    Szczególnie, że C generuje głównie kod przenośny, a w asmie zazwyczaj działasz na konkretnych rejestrach i SFRze, będąc blisko sprzętu, ale daleko od algorytmu.
    Zdecydowanie łatwiej jest śledzić zmienną int licznik_powtórzeń; od adres 100h :) gdzie ten licznik umieszczasz na sztywno:)

    Więc może zamiast szaleć z łączeniem C i Asm przyjrzyj się temu czy rzeczywiście "twoje" procedury są tak dobre, że te z C będą gorsze :(

    Potem naucz się korzystać z bibliotek C , a potem jak będzie brakować czegoś w C :) zaczniesz dodawać swoje wstawki również w asmie :)
  • #16 4327884
    astony
    Poziom 14  
    Posty: 277
    Pomógł: 4
    Ocena: 23
    Niestety plik .obj powstaje po kompilacji. Jezeli mam błąd wynikający właśnie z próby włączenia jakiejś procedury to nie mam tego pliku.
    Piszę w asm (AVRstudio). Wygląda na to że nieprzemyślałem sprawy do końca.
    Dzięki za podpowiedzi i
    powodzenia :bye:
  • #17 4338007
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    A może zadziała

    $include (cośtam.inc)

    Spróbuj :)

    Tak było w asmie c51

    Dodano po 30 [sekundy]:

    Tylko nie zapomnij korzystać ze zmienych extern :)
  • #19 4343691
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    tak ale przez .include
  • #20 4843542
    Ch.M.
    Poziom 27  
    Posty: 1009
    Pomógł: 62
    Ocena: 15
    Odkopuje wątek bo pragnę podzielić się swoimi spostrzeżeniami

    Dołaczanie podprogramów odbywa się bardzo prosto, tzn:
    .include "m128def.inc"
    .include "czekaj_m128.inc"
    .include "s65_LCD.inc"
    .include "i2c.inc"
    wyskakują wtedy dodatkowe zakładki z ww podprogramami. Jedyne co musimy pamiętać, to o zadeklarowaniu wcześniej na początku każdego podprogramu początku adresu, inaczej AVRstudio wyrzuci błedy typu przekroczony zakres skoku, albo zapisze kolejny podprogram na poprzednim.
    Ale nie polecam tej metody, bo ko0mpilator niestety się zaczyna gubić i nie znajduje niektórych błędów (np ograniczenia przy komendzie movw). Po przerzuceniu całego kodu ze wszystkich zakładek w jeden ciągły, debuger zaczyna znajdować błedy.

    Inna metoda w poruszaniu sie po kodzie to włączenie widoku projektu i tam mamy zakładkę labels. Otwiera się nam alfabetyczna lista wszystkich etykiet, jakie nadaliśmy i po doubleclicku AVRstudio od razu nam ustawia kursor na wybranej etykiecie w programie.
    Może komuś przydadzą się te wskazówki

    Pozdrawiam

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy przygotowania procedur w assemblerze do użycia z dyrektywą include, tak aby uniknąć błędów typu niezadeklarowana zmienna lub podwójna deklaracja. Użytkownicy wskazują, że w assemblerze należy samodzielnie dbać o unikalność nazw etykiet, zmiennych i stałych, często stosując prefiksy związane z nazwą pliku, aby zapobiec konfliktom. Popularnym rozwiązaniem jest stosowanie ochrony przed wielokrotnym dołączeniem pliku za pomocą konstrukcji #ifndef/#define/#endif lub odpowiedników w assemblerze. W środowisku AVRStudio dołączanie plików nagłówkowych odbywa się przez .include "plik.inc", przy czym pliki muszą znajdować się w katalogu projektu. Wskazano również, że kompilatory C oferują bardziej zaawansowane mechanizmy zarządzania kodem, a mieszanie kodu C i assemblera wymaga ostrożności. Niektórzy użytkownicy sugerują, że w przypadku problemów z include lepszym rozwiązaniem jest kopiowanie i wklejanie procedur. Wspomniano także o ograniczeniach kompilatora AVRStudio, który może nie wykrywać niektórych błędów przy rozdzieleniu kodu na wiele plików. Alternatywnie zaleca się korzystanie z debugera i narzędzi do analizy etykiet w projekcie. Podsumowując, efektywne użycie include w assemblerze wymaga starannego zarządzania nazwami, stosowania dyrektyw warunkowych i znajomości specyfiki używanego kompilatora oraz środowiska.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA