Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Bascom/ASM] Zasady łączenia kodów.

apis14 26 Jul 2008 01:42 3493 9
  • #1
    apis14
    Level 12  
    Witam.
    przeszukałem elektrodę i znalazłem szczątkową odp na moje pytanie.
    Chodzi mi o metodę i zasady właczania tzw wstawek asemblerowych do kodu w bascomie. Czy wystarczy tylko taką wstawkę ująć w $asm i na końcu $ end asm? Czy jeszcze coś?
  • #2
    cyberdar
    Level 31  
    Witam

    Myślę, że to rozwieje wątpliwości:

    Quote:


    Dyrektywa $ASM używana jest razem z dyrektywą $END ASM, podczas tworzenia bloków kodu w języku asembler, umieszczanych jako wstawki w programach języka BASCOM BASIC. Zamiast używać tych dyrektyw, można także przed każdą linią zawierającą mnemonik postawić znak !.
    Większość mnemoników asemblera nie potrzebuje przedrostka !, gdyż są one rozpoznawane automatycznie przez kompilator BASCOM. Choć istnieją instrukcje języka BASCOM BASIC, brzmiące tak samo jak mnemoniki: OUT, SWAP; które dla odróżnienia muszą być poprzedzone wykrzyknikiem.



    --
    pozdrawiam
  • Helpful post
    #3
    mirekk36
    Level 42  
    oczywiście, że wystarczy

    Code:
    $asm
    

    ... kod twojej wstawki

    $end asm

    ale oczywiście przydałoby się jeszcze wiedzieć jak można uzyskiwać w asemblerze dostęp do zmiennych itp, otóż:

    Code:
    Dim Zmienna1 as Byte
    

    $asm
    lds   R16, {Zmienna1}
    ... coś tam robimy sobie w asm ze zmienną i chcemy ją uaktualnić, więc:

    sts   {Zmienna1}, R16
    $end asm


    powyżej widać w jaki prosty i fajny sposób uzyskujemy dostęp do zwykłych zmiennych Bascoma pisząc wstawki w asm

    oczywiście przydałoby się także mieć możliwość wczytania także adresu zmiennej a nie tylko jej samej - aby coś porobić np na tablicach, wtedy warto skorzystać we wstawce asm w Bascomie z takiego bascomowego rozwiązania jak:

    loadadr czyli:

    Code:
    Dim S As String * 12
    

    $asm

    loadadr S , X ; załaduj adres zmiennej S do pary rejestrów X  R26 and R27
    ld R16, X ; załaduj do R16 zawartość pierwszej zaadresowanej przez X komórki

    $end asm


    nie wspomnę już, że do stałych zdeklarowanych w Bascomie typu Const coś tam - masz także bezpośredni dostęp we wstawce asm

    nawiasem mówiąc fajnie się pisze a przez to można naprawdę podrasować i przyśpieszyć programy w Bascomie

    pozdrówka
  • #4
    apis14
    Level 12  
    pytanie dodatkowe: wstawka moze zawierac swoje wlasne zmienne (zadeklarowane w tej wstawce)?
  • Helpful post
    #7
    ZbeeGin
    Level 39  
    Z tą dowlnością w używaniu rejestrów byłbym bardzo ostrożny. Nieodpowiednia zmiana - program się wysypie. Nie wolno używać w trybie zapisu bez wcześniejszego zapamiętania: Y (soft stack pointer), R4:R5 (frame stack pointer), R6 (status register), R8:R9 (data pointer), R23 (translate register), R12:R13:R14:R15 (fp calculator). W sumie można bez zapamiętania używać R24:R25 (first accumulator) gdyż jest on tymczasowy, choć tutaj też nie przerywałbym ciągu działań na jednej zmiennej. Optymalizacja może skasować przekazywanie danych do zmiennej za każdym odwołaniem i zmiana R24:R25 może przynieść nieoczekiwany skutek.

    Trzeba też pamiętać o przerwaniach, które są pisane w języku BASCOM BASIC. A tam mogą być instrukcje dowolnie korzystające z zasobów. Np. GETRC5() w przerwaniu napewno niszczy R17, R18, gdyż to tam lądują dane Command i Adress. W przypadku zwykłych przerwań większość rejestrów ląduje na stos i zostanie potem odtworzona. Chyba, że się on przepełni... Stosowanie klauzuli NoSave i instrukcje BASCOM-a w przerwaniach to już gwóźdź do trumny dla wstawki. Na czas działania wstawki można przerwania wyłączyć, jeśli czas od przyjęcia przerwania a jego pełną obsługą nie jest krytyczny.
    Rejestry które wymieniłem w poprzednim akapicie nie są zapamiętywane w przerwaniu, zatem przypadku programu używającego przerwań ich użycie nie jest wskazane w pełnym tego słowa znaczeniu.

    Jak potrzebujesz zmiennych we wstawce polecam zdefiniować te zmienne w zakresie języka BASCOM, a we wstawce odwoływać się do nich. Wtedy nie będzie żadnego konfliktu i wszystko zostanie ułożone przez kompilator w obszarze IRAM.
  • #8
    mirekk36
    Level 42  
    ZbeeGin -> no tak z tą dowolnością użycia rejestrów to mogłem przesadzić. Wprawdzie czytałem o tych zarezerwowanych rejestrach - ale ciarki mnie przeszły po plecach jak czytam w twoim poście, że przerwanie w Bascomie nie zapamiętuje wszystkich rejestrów i to co się dzieje we wstawce, która ich używa może zostać "zniszczone" .

    Jesteś tego PEWIEN ???? przecież też gdzieś tam doczytałem, że każde przerwanie bez opcji NOSAVE odkłada na stos wszystkie rejestry co zresztą powoduje znaczne wydłużenie czasem jego działania. Dlatego gdy ostatnio przerobiłem sobie przerwanie od Timera0 (służące do multipleksowania) na asm - to dodałem parametr NOSAVE oraz sam zająłem się odłożeniem na stos rejestrów, które sam używałem i wszystko działa ślicznie.

    Poza tym choć dopiero zaczyna pisać wstawki to często używam do jakichś operacji na zmiennych Bascomowych rejestrów typu R16, R17, R18 lub X ..... i też jak narazie nic mi się nie działo dziwnego.

    .... ale oczywiście ja mogę czegoś nie wiedzieć, dlatego się ciebie dopytuję, w końcu po tym jak widać tu i tam tlumaczenia instrukcji do helpa Bascoma to można domniemywać, że masz w tym spore doświadczenie.

    i gdyby tak było , że te przerwania niszczą rejestry (chociaż tych kilka, które wymieniłem powyżej) używane we wstawkach (czego mogłem jeszcze poprostu nie zauważyć ze względu na szczęśliwy traf) to byłoby trochę kiepsko :(
  • #9
    ZbeeGin
    Level 39  
    mirekk36 wrote:
    ZbeeGin -> no tak z tą dowolnością użycia rejestrów to mogłem przesadzić. Wprawdzie czytałem o tych zarezerwowanych rejestrach - ale ciarki mnie przeszły po plecach jak czytam w twoim poście, że przerwanie w Bascomie nie zapamiętuje wszystkich rejestrów i to co się dzieje we wstawce, która ich używa może zostać "zniszczone".

    Zniszczone lub zmienione mogą być te rejestry które wymieniłem na początku. Zresztą pomyśl. W przerwaniu używasz READ. Jeśli na stos wylądują R8:R9 a potem zostaną odtworzone to kolejny odczyt z linii DATA rozpocznie się od tego samego miejsca. Dane będą stać w miejscu.

    mirekk36 wrote:
    Jesteś tego PEWIEN ???? przecież też gdzieś tam doczytałem, że każde przerwanie bez opcji NOSAVE odkłada na stos wszystkie rejestry co zresztą powoduje znaczne wydłużenie czasem jego działania.

    Proszę. Tylko tyle jest ładowane na stos (Przykładowy prolog przerwania w BASCOM):
    Code:
    int0_isr:
    
            push    r0               
            push    r1               
            push    r2               
            push    r3               
            push    r4               
            push    r5               
            push    r7               
            push    r10             
            push    r11             
            push    r16             
            push    r17             
            push    r18             
            push    r19             
            push    r20             
            push    r21             
            push    r22             
            push    r23             
            push    r24             
            push    r25             
            push    r26             
            push    r27             
            push    r28             
            push    r29             
            push    r30             
            push    r31             
            in      r24, SREG       
            push    r24

    Czy trzeba dodatkowo komentować?
  • #10
    mirekk36
    Level 42  
    aa no to dobrze - czyli spokojnie można sobie używać we wstawkach tych rejestrów, które nie są jakby zarezerwowane przez Bascom (czyli te o których pisałeś na początku właśnie) - dzięki za dodatkowe wyjaśnienia - to było bardzo cenne

    pozdrawiam