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

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

apis14 26 Lip 2008 01:42 3616 9
  • #1 5379025
    apis14
    Poziom 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 5379169
    cyberdar
    Poziom 31  
    Witam

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

    Cytat:


    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
  • Pomocny post
    #3 5379173
    mirekk36
    Poziom 42  
    oczywiście, że wystarczy

    $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óż:

    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:

    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 5380981
    apis14
    Poziom 12  
    pytanie dodatkowe: wstawka moze zawierac swoje wlasne zmienne (zadeklarowane w tej wstawce)?
  • Pomocny post
    #7 5381307
    ZbeeGin
    Poziom 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 5381826
    mirekk36
    Poziom 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 5381864
    ZbeeGin
    Poziom 39  
    mirekk36 napisał:
    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 napisał:
    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):
    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 5381982
    mirekk36
    Poziom 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
REKLAMA