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ś?
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.
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
trudno mi odgadnąć o jakiego typu zmienne ci chodzi, ale jeśli potrzeba to można sobie wykorzystać do tego dowolne rejestry lub ram. Można też deklarować stałe
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 stackpointer), 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.
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
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):
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