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

Konwersja kodu Bascom do asemblera: kontrola zasilania i tryb IDLE

tadeko9 03 Gru 2024 09:17 432 17
REKLAMA
  • #1 21330371
    tadeko9
    Poziom 10  
    Posty: 26
    Witam.
    Jak w asemblerze napisać część fragment programu odpowiadającą programowi w bascom:

    Do 'główny program
    ' kontrola zasilania
    If Pind.2 = 1 Then 'PD.2(INT0)=1, czyli brak napięcia zasilania
    Portd = 127 'wygaszenie wszystkich wyświetlaczy (PD3-PD6 = 1)
    Disable Timer0 'zablokowanie licznika T/C0 (Timer0) - sterowanie cyfr
    Idle 'przejście do trybu oszczędzania energii IDLE
    Else 'PD.2(INT0)=0, czyli jest napięcie zasilania
    Enable Timer0 'uruchomienie licznika T/C0 (Timer0) - sterowanie cyfr
    End If
    Loop 'koniec pętli
    End 'koniec programu głównego

    Gdzie:
    ' Pin D0 (2) - przycisk S1 (MOD) Pin B0 (12) - seg. A
    ' Pin D1 (3) - przycisk S2 (SET/Sek) Pin B1 (13) - seg. B
    ' Pin D2 (6) - kontrola zasilania (INT0) Pin B2 (14) - seg. C
    ' Pin D3 (7) - anoda W4 Pin B3 (15) - seg. D
    ' Pin D4 (8) - anoda W3 Pin B4 (16) - seg. E
    ' Pin D5 (9) - anoda W2 Pin B5 (17) - seg. F
    ' Pin D6 (11) - anoda W1 Pin B6 (18) - seg. G
    ' Pin B7 (19) - seg. dp

    Wiem, że odpowiednikiem dla:
    If PinD.2 = 1 'jeśli PinD.2(INT0)=1, czyli brak napięcia zasilania
    jest
    sbic PinD, 2 'czy PinD.2(INT0)=0, czyli brak napięcia zasilania

    Jeśli można, to proszę o odpowiedź na emaila tadeko(_at_)poczta.onet.pl
    Dziękuję za pomoc.
  • REKLAMA
  • #2 21330377
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1463
    O!
    Nasz ulubiony kolega, witamy serdecznie, witamy
  • #3 21330419
    bart-projects
    Poziom 30  
    Posty: 836
    Pomógł: 200
    Ocena: 261
    @tadeko9 : Najważniejsze dla skompilowania kodu dla Bascom jest określenie mikrokontrolera dla którego to jest kompilowane.

    Są przynajmniej dwa sposoby podejrzenia wygenerowanego przez Bascom kodu ASM.
    Zaopatrzenie się w program NoSave Tool który deasembluje kod automatycznie na swoje potrzeby albo trochę bardziej pracochłonny czyli użycie Microchip Studio7.

    Jako że NoSave Tool napisałem ja to żeby nie być posądzonym o namawianie podpowiem jak się to robi w Microchip Studio7.

    1. Kompilujesz kod
    2. Bascom, na potrzeby debugowania, generuje też plik OBJ.
    3. Uruchamiasz Microchip Studio7
    4. U góry -> File -> Open -> Open Object File For Debugging
    5. Wskazujesz plik OBJ i -> Next
    6. Wskazujesz użyty mikrokontroler i -> Finish
    7. Potwierdzasz OK by wygenerował "Update Components"
    8. W Solution Explorer klikasz i otwierasz plik z rozszerzeniem BAS
    9. U góry -> Debug -> Start Debugging and Brake
    10. Jeśli wczesniej nie ustawiono to zapyta o narzedzie debugowania czyli najczęściej wybieramy Simulator
    11. U góry -> Debug -> Windows -> Disassembly (skrót Alt + 8)

    No i zobaczysz jak to przetłumaczyć z Bascom na ASM....

    Przykład poniżej. NoSave Tool robi to wszystko jednym klikiem :D

    Zrzut ekranu z deasembleru w Microchip Studio7 pokazujący przetłumaczenie kodu Bascom na kod asemblera.
  • #4 21330519
    oscil1
    Poziom 24  
    Posty: 645
    Pomógł: 50
    Ocena: 178
    tadeko9 napisał:
    Jeśli można, to proszę o odpowiedź na emaila tadeko(_at_)poczta.onet.pl

    Nie można, chociaż pewnie można jak zapłacisz komuś odpowiednią kwotę.
  • #5 21331266
    bart-projects
    Poziom 30  
    Posty: 836
    Pomógł: 200
    Ocena: 261
    Może, jesli kolejny raz pokaże sie Autorowi tematu i innym, że pisanie w ASM to wymaga duuużo większej uwagi i pilnowania kodu który normalnie kompilator C/C#/Basic itd. robią za programistę, to przestaną zadawać takie pytania.

    Pytanie jak to napisać w ASM jest zależne od tego na jaki to jest procesor i na który port bo nie każdy jest w przestrzeni dostepnej dla szybkich instrukcji bo wymagane peryferium jest poza ich zasięgiem. Wtedy to wymaga adresowania.

    Dlatego nawet dla starej Mega128 dostęp do portów PG i PF to już inna bajka.

    Trudno się czyta takie stwierdzenia "wiem że" jak poniżej:
    tadeko9 napisał:
    Wiem, że odpowiednikiem dla:
    If PinD.2 = 1 'jeśli PinD.2(INT0)=1, czyli brak napięcia zasilania
    jest
    sbic PinD, 2 'czy PinD.2(INT0)=0, czyli brak napięcia zasilania


    Po pierwsze należy zrozumieć co znaczy SBIC i SBIS.
    Nie muszę chyba z angielskiego tłumaczyć poniższego obrazka...
    Zrzut ekranu z dokumentacji instrukcji SBIC i SBIS w assemblerze.

    Teraz jest właśnie jedna z właściwości mikrokontrolerów - mogą wybrać miedzy 1 a 0.
    SBIC sprawdza czy pod podanym adresem I/O podany bit jest 0 i wtedy przeskakuje nastepną po tej instrukcję.
    Normalnie pisze się kod który zakłada że bit będzie miał 0 i wtedy "rób to i to", ale co jesli bit ma 1?

    To nie jest skomplikowane tylko wymaga pieczołowitej dokładności. Normalnie tego pilnuje kompilator.

    Oto co się dzieje jak Pin czeka aż ktos zwolni PIND.1.

    Kod ASM z objaśnieniami dotyczącymi rejestrów I/O

    Po krótce - w ASM musisz wiedzieć pod jakim adresem jest dany rejestr peryferium i do niego sie odnieść.

    [EDIT]
    Mogę jeszcze tak to spróbować wytłumaczyć "niedowiarkom" :D

    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #6 21331325
    gregor124
    Poziom 29  
    Posty: 1603
    Pomógł: 99
    Ocena: 851
    bart-projects napisał:
    Po krótce - w ASM musisz wiedzieć pod jakim adresem jest dany rejestr peryferium i do niego sie odnieść.

    A to ciekawe, co piszesz, bo asembler stworzono właśnie po to, aby nie trzeba było tych adresów pamiętać i zamiast tego używać właśnie ich nazw ;)
    Pomogłem? Kup mi kawę.
  • #7 21331343
    bart-projects
    Poziom 30  
    Posty: 836
    Pomógł: 200
    Ocena: 261
    To spróbuj odwołac sie do portów powyżej 0x3F...
    Potem spróbuj odwołac sie do portów Xmegi lub nowych AVRX...
    Tam porty mają adresy dwubajtowe.

    Skracanie jest tylko jeśłi porty są przypisywane wirtulanie jak w Xmegach Virtial port 0-2 albo w tych nowszych wirtualnie przypisane PORTA czy coś tam dalej, ale maja tak naprawdę dwubajtowe adresy.
    Tego ASM nie przewidywał.

    Może myślisz o pliku definicji który"od zawsze zaciągasz" i uważasz za "normalne", ale to sie zaciąga do konkretnego uC i wtedy jest tłumaczone z PD.1 na 9.1 :D
    To chyba robi IDE a nie ASM.
  • REKLAMA
  • #8 21331485
    oscil1
    Poziom 24  
    Posty: 645
    Pomógł: 50
    Ocena: 178
    bart-projects napisał:
    To chyba robi IDE a nie ASM.


    IDE (Integrated Development Environment) to zintegrowane środowisko programistyczne, które ułatwia tworzenie, edycję, testowanie i debugowanie kodu. Jest to kompleksowe narzędzie używane przez programistów, które łączy w sobie różne funkcje i komponenty niezbędne do pracy nad oprogramowaniem. Z reguły IDE używają zewnętrznych programów do kompilowania i debugowania a same jedynie zapewniają interfejs graficzny do tego.

    Jako że asembler jest z reguły samodzielnym niezależnym, i nie związanym z IDE programem wszelkie etykiety i makra są jego wyłaczną domeną.

    Upraszczając - IDE to rozbudowany edytor tekstowy z możliwością wywoływania rożnych programów do budowania i debugowania kodu.
  • #9 21331591
    stachu_l
    Poziom 38  
    Posty: 2979
    Pomógł: 480
    Ocena: 1123
    oscil1 napisał:
    Jako że asembler jest z reguły samodzielnym niezależnym, i nie związanym z IDE programem wszelkie etykiety i makra są jego wyłaczną domeną.

    Generalnie etykiety i marka to jest inna droga przy kompilacji ale te rozważania wkraczają w naukę o kompilatorach/translatorach.
    Jeżeli assembler jest makto-assemblerem (dziś trudno o inny) to wszelkie maka są przetwarzane w preprocesorze - ich nazwy tekstowo są podmieniane na ich definicję tak więc przed właściwym assemblerem preprocesor zamieni PD na 9 czyli z PD.1 zrobi 9.1.
    Zależnie od tego czy preprocesor jest oddzielnym programem czy ewentualnie jest jakaś flaga kompilacji można uzyskać z assemblera z makrami taki tekst assemblera z cyferkami (czy ogólnie rozwiniętymi makrami) ale etykiety zostają.
    Etykiety są symbolicznym zapisem adresów które zostają przypisane przy kompilacji - asemblacji i tego faktycznie jako tablicy symboli pilnuje "właściwy" assembler.
    Często preprocesor jest tylko fazą działania assemblera i nie widzimy go jako oddzielnego programu więc zakładamy, że makra i etykiety to rola assemblera.
  • #10 21331705
    gregor124
    Poziom 29  
    Posty: 1603
    Pomógł: 99
    Ocena: 851
    bart-projects napisał:
    To spróbuj odwołac sie do portów powyżej 0x3F...
    Potem spróbuj odwołac sie do portów Xmegi lub nowych AVRX...
    Tam porty mają adresy dwubajtowe.

    I co z tego?
    Dawno już nie robiłem niczego na AVR , ale taki ARM ma adresy 4-bajtowe (32-BITOWE) i nie ma z tym żadnego problemu.
    W asemblerze robi się to dziecinnie łatwo .
    Zapewne chodzi ci o adres Bazowy i offset s.428 ?

    https://mil.ufl.edu/4744/docs/XMEGA/doc8331_XMEGA_AU_Manual.pdf
    Pomogłem? Kup mi kawę.
  • #11 21332000
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1463
    gregor124 napisał:
    bart-projects napisał:
    Po krótce - w ASM musisz wiedzieć pod jakim adresem jest dany rejestr peryferium i do niego sie odnieść.

    A to ciekawe, co piszesz, bo asembler stworzono właśnie po to, aby nie trzeba było tych adresów pamiętać i zamiast tego używać właśnie ich nazw ;)


    Post nieprawidłowo łączy dwa tematy.
    Adresy symboliczne w JEZYKU assemblera
    Znajomość architektury konkretnej maszynki

    To są odmienne zagadnienia i nie ma sensu ich porównywać czy przeciwstawiać
  • #12 21332312
    gregor124
    Poziom 29  
    Posty: 1603
    Pomógł: 99
    Ocena: 851
    >>21332000
    Cała ta dyskusja tutaj nie ma sensu. Niestety, jak ktoś zapyta o coś innego niż C, to zaraz zlatuje się mnóstwo fundamentalistów, którzy sprowadzają ją do sporu na temat wyższości Świąt Bożego Narodzenia nad Wielkanocą.

    Zaczynam rozumieć, dlaczego autor już na wstępie poprosił o kontakt na priv ;)
    Pomogłem? Kup mi kawę.
  • REKLAMA
  • #13 21332972
    tadeko9
    Poziom 10  
    Posty: 26
    Tyle odpowiedzi, ale nikt nie zechciał podać mi konkretnego fragmentu programu a asemblerze, który byłby dokładnym odpowiednikiem mojego programu w bascom.
    A szkoda.
    tadeko9
  • #14 21333205
    michal.zd
    Poziom 31  
    Posty: 1684
    Pomógł: 84
    Ocena: 274
    tadeko9 napisał:
    nikt nie zechciał podać

    Nikt nie ma czasu na pisanie programu w asm (nie podałeś jaki procesor, ale bascom sugeruje jakies atmega).
    To nie jest tak, jak ci się wydaje ...
    tadeko9 napisał:
    który byłby dokładnym odpowiednikiem mojego programu

    To nie tak. Program twój jest tylko algorytmem, na podstawie którego trzeba napisać program w asm.
    Albo zlecenie konkretne, albo sam zacznij. Wówczas pomoc się znajdzie.
    W drugim, czy trzecim poście dostałeś podpowiedź, jak dostać kod w asm po kompilacji kodu w bascom, najprostszy sposób.
    Ogólnie sens żaden, już lepiej zacząć Arduino, co pozwoli na bezbolesne przejście na inne platformy, ot nawet ESP.
    Jeszcze na podstawie kodu asm wyciągniesz błędne wnioski, jak ten:
    tadeko9 napisał:
    Wiem, że odpowiednikiem dla: If PinD.2 = 1 'jeśli PinD.2(INT0)=1, czyli brak napięcia zasilaniajestsbic PinD, 2

    Nie, nie jest.
    To tylko jedna z wielu instrukcja porównania bitu i skoku warunkowego w dodatku tylko w arch atMega. Można to zrobić na kilka sposobów.
    Inaczej mówiąc, można napisać program w asm, który będzie robił dokładnie to co robi program w bascom, ale nie oznacza to że jest 'dokładnym odpowiednikiem'.

    Dodano po 6 [minuty]:

    bart-projects napisał:
    jesli kolejny raz pokaże sie Autorowi tematu i innym, że pisanie w ASM to wymaga duuużo większej uwagi i pilnowania kodu który normalnie kompilator C/C#/Basic itd. robią za programistę, to przestaną zadawać takie pytania.

    Dokładnie.


    Dodano po 9 [minuty]:

    gregor124 napisał:
    asembler stworzono właśnie po to, aby nie trzeba było tych adresów pamiętać i zamiast tego używać właśnie ich nazw

    Nie. Asembler stworzono po to, aby nie trzeba było pamiętać kodów maszynowych instrukcji procesora, zamiast tego używać mnemoników. Adresy to inna inszość, po prostu definicje 'equ', chyba że adresy kryjące się za etykietami.
  • #15 21333435
    gregor124
    Poziom 29  
    Posty: 1603
    Pomógł: 99
    Ocena: 851
    michal.zd napisał:
    Nie. Asembler stworzono po to, aby nie trzeba było pamiętać kodów maszynowych instrukcji procesora, zamiast tego używać mnemoników. Adresy to inna inszość, po prostu definicje 'equ', chyba że adresy kryjące się za etykietami.

    No popatrz, okazuje się, że tyle lat żyłem w błędzie. Używałem w życiu wielu asemblerów, połowa z nich nie rozumiała definicji 'equ', zamiast tego używała np. "=", niektóre z nich produkowały kod nie tylko maszynowy dla procesora, ale też dla programowej wirtualnej maszyny takiej jak np. UCSD i okazuje się, że to nie były assemblery. Podam te sensacyjną wiadomość swoim znajomym, niech się dzięki użytkownikowi @michal__.zd też dowiedzą, że to, czego używali, to nie są assemblery, tylko coś zupełnie innego.
    Pomogłem? Kup mi kawę.
  • #16 21333451
    oscil1
    Poziom 24  
    Posty: 645
    Pomógł: 50
    Ocena: 178
    gregor124 napisał:
    ale też dla programowej wirtualnej maszyny takiej jak np. UCSD

    To też jest procesor - tylko wirtualny.

    Cytat:
    In computer programming, a P-code machine (portable code machine[1]) is a virtual machine designed to execute P-code, the assembly language or machine code of a hypothetical central processing unit (CPU). The term "P-code machine" is applied generically to all such machines (such as the Java virtual machine (JVM) and MATLAB pre-compiled code), as well as specific implementations using those machines. One of the most notable uses of P-Code machines is the P-Machine of the Pascal-P system. The developers of the UCSD Pascal implementation within this system construed the P in P-code to mean pseudo more often than portable; they adopted a unique label for pseudo-code meaning instructions for a pseudo-machine.


    Procesor nie musi być w postaci sprzętowej. Z punktu widzenia instrukcji kodu maszynowego nie ma róznicy czy się wykonuje na sprzęcie,wirtualnej maszynie, emulatorze czy też są wykonywane w mikrokodzie jak w komputerze, na którym piszesz swoje mądrości
  • #17 21333584
    michal.zd
    Poziom 31  
    Posty: 1684
    Pomógł: 84
    Ocena: 274
    michal.zd napisał:
    Asembler stworzono po to, aby nie trzeba było pamiętać kodów maszynowych instrukcji procesora, zamiast tego używać mnemoników

    gregor124 napisał:
    okazuje się, że tyle lat żyłem w błędzie. Używałem w życiu wielu asemblerów, połowa z nich nie rozumiała definicji 'equ', zamiast tego używała np. "=",

    Poczytaj o historii powstania asemblera.
    Natomiast czepiasz się słowa 'equ' które jest w większości asm, znana tobie połowa która używa '=' zamiast 'equ'. Ja znam dwa, które również używają '=' tylko co to zmienia? Ot nieco inna składnia, ale sens ten sam.
    Jaki wniosek z tego wyciągasz? To argument przeciw faktowi:
    michal.zd napisał:
    Asembler stworzono po to, aby nie trzeba było pamiętać kodów maszynowych instrukcji procesora, zamiast tego używać mnemoników.

    ?

    Dodano po 2 [minuty]:

    gregor124 napisał:
    Podam te sensacyjną wiadomość swoim znajomym, niech się dzięki użytkownikowi @michal__.zd też dowiedzą, że to, czego używali, to nie są assemblery, tylko coś zupełnie innego.

    Absurdalny wniosek wyciągnąłeś. Już @oscil1 wytłumaczył.
    Chcesz podgrzać dyskusję?
  • #18 21333621
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1463
    gregor124 napisał:
    >>21332000
    Cała ta dyskusja tutaj nie ma sensu. Niestety, jak ktoś zapyta o coś innego niż C, to zaraz zlatuje się mnóstwo fundamentalistów, którzy sprowadzają ją do sporu na temat wyższości Świąt Bożego Narodzenia nad Wielkanocą.

    Zaczynam rozumieć, dlaczego autor już na wstępie poprosił o kontakt na priv ;)


    Zacznijmy od tego, że autor nie ma pojęcia o co pyta, a pytanie pozbawione szczegółów uniemożliwia merytoryczną odpowiedź.
    Jedyne jego przygotowanie do tematu to BARDZO CHCE dostać darmową odpowiedź
    Inne wątki człowieka są takie same.

    Fundamentalizmu w tym wątku nie jest tak dużo.

Podsumowanie tematu

✨ Dyskusja dotyczy konwersji kodu z Bascom do asemblera, szczególnie w kontekście kontroli zasilania i trybu IDLE. Uczestnicy podkreślają, że kluczowe jest określenie mikrokontrolera, dla którego kod jest kompilowany. Wskazano na narzędzia takie jak NoSave Tool i Microchip Studio7, które mogą pomóc w deasemblacji kodu. Zwrócono uwagę na różnice w adresowaniu portów w zależności od architektury mikrokontrolera, co wpływa na sposób pisania kodu w asemblerze. Uczestnicy dyskusji zauważają, że pisanie w asemblerze wymaga większej precyzji i zrozumienia architektury procesora, a także że nie ma jednego, uniwersalnego sposobu na przetłumaczenie kodu z Bascom na asembler.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA