Skocz do zawartości

[Bascom] Obsługa przerwanai z opcją NOSAVE


slawko_k

Pomocna odpowiedź

Witam.

Wiadomo ze bascom zrzuca wszystko na stos przy wejściu do programu obsługi przerwania i pod koniec wszystko ściąga.

Rozważmy program

On Int1 Przerwanie

Przerwanie:
 Portb.0 = Not Portb.0
Return

Jego kod po deassemblacji wygląda tak:

avr0024:  push   r0           ; 0024 920F
         push   r1           ; 0025 921F
         push   r2           ; 0026 922F
         push   r3           ; 0027 923F
         push   r4           ; 0028 924F
         push   r5           ; 0029 925F
         push   r7           ; 002A 927F
         push   r10          ; 002B 92AF
         push   r11          ; 002C 92BF
         push   r16          ; 002D 930F
         push   r17          ; 002E 931F
         push   r18          ; 002F 932F
         push   r19          ; 0030 933F
         push   r20          ; 0031 934F
         push   r21          ; 0032 935F
         push   r22          ; 0033 936F
         push   r23          ; 0034 937F
         push   r24          ; 0035 938F
         push   r25          ; 0036 939F
         push   XL           ; 0037 93AF
         push   XH           ; 0038 93BF
         push   YL           ; 0039 93CF
         push   YH           ; 003A 93DF
         push   ZL           ; 003B 93EF
         push   ZH           ; 003C 93FF
         in     r24, SREG    ; 003D B78F
         push   r24          ; 003E 938F
         in     r24, PORTB   ; 003F B388
         ldi    r25, 0x01    ; 0040 E091
         eor    r24, r25     ; 0041 2789
         out    PORTB, r24   ; 0042 BB88
         pop    r24          ; 0043 918F
         out    SREG, r24    ; 0044 BF8F
         pop    ZH           ; 0045 91FF
         pop    ZL           ; 0046 91EF
         pop    YH           ; 0047 91DF
         pop    YL           ; 0048 91CF
         pop    XH           ; 0049 91BF
         pop    XL           ; 004A 91AF
         pop    r25          ; 004B 919F
         pop    r24          ; 004C 918F
         pop    r23          ; 004D 917F
         pop    r22          ; 004E 916F
         pop    r21          ; 004F 915F
         pop    r20          ; 0050 914F
         pop    r19          ; 0051 913F
         pop    r18          ; 0052 912F
         pop    r17          ; 0053 911F
         pop    r16          ; 0054 910F
         pop    r11          ; 0055 90BF
         pop    r10          ; 0056 90AF
         pop    r7           ; 0057 907F
         pop    r5           ; 0058 905F
         pop    r4           ; 0059 904F
         pop    r3           ; 005A 903F
         pop    r2           ; 005B 902F
         pop    r1           ; 005C 901F
         pop    r0           ; 005D 900F
         reti                ; 005E 9518

gdzie:

XL =r26

XH =r27

YL =r28

YH =r29

ZL =r30

ZH =r31

ten sam program z opcją NOSAVE:

avr0024:  in     r24, PORTB   ; 0024 B388
         ldi    r25, 0x01    ; 0025 E091
         eor    r24, r25     ; 0026 2789
         out    PORTB, r24   ; 0027 BB88
         reti 

Teraz czy dobrze rozumię że mam zrzucić tylko rejestr SREG oraz R24 i R25 bo tylko one są użyte w obsłudze?? Czy może coś jeszcze?

zatem czy następujący program obsługi będzie ok?

On Int1 Przerwanie NOSAVE

Przerwanie:
  !push r24
  !push r25
  !in     r24, SREG    
  !push   r24    
  Portb.0 = Not Portb.0
  !pop    r24          
  !out    SREG, r24  
  !pop r25
  !pop r24
Return
Link do komentarza
Share on other sites

Zasadniczo tak, chyba że masz 100% pewność że SREG nie zostanie zmodyfikowany, w czasie obsługi podprogramu, to możesz go nie odkładać na stos.

Natomiast deasemblacja BASCOMA dowodzi tylko, jak bardzo nierozumnym jest on językiem, i na jaką łatwiznę poszli jego twórcy. Odkładanie wszystkich rejestrów, na stos jak leci to bzdura kompletna. Po pierwsze marnowanie ogromnej ilości RAM na stos. Po drugie marnowanie cykli procesora na przekładanie danych z jednego miejsca w drugie, bez wyraźnej konieczności, takiej operacji. Aż strach myśleć, jakie jeszcze uproszczenia w tym języku zastosowano, dla wygody.

Link do komentarza
Share on other sites

No kurcze wydaje mi się ze dla twórcy nie byłoby wielkim problemem stworzenie jakiejś funkcji która wywalałaby zbędne instrukcje, skoro kompilator wie których rejestrów roboczych użyje. No chyba ze to nie jest takie proste jak mi się wydaje.

Ale natrafiłem na pewien problem.

Disassembler jaki zdarłem z sieci (Atmel AVR Disassembler v1.30) nie tworzy prawidłowo kodu dla m328p którego najczęściej używam.

MA ktoś coś pewnego?

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.