www.mikrocontroller.net

Forum: Compiler & IDEs 2x rcall? Was will GCC hier sagen?


Autor: Andy H. (vinculum) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

so sieht das listing eines Timer Overflows bei mir aus. Den mittleren 
Teil habe ich mal entfernt, da passiert nichts wirklich relevantes 
(nichts was den Stack betrifft und keine Sprünge in den dargestellten 
Text).
Was mich interessiert, was sollen die beiden "rcall .+0"?
Es wird die Rücksprungadresse dann ja mit POP R0 vom Stack genommen, 
aber was passiert dann?
// Timer1 Overflow
ISR(TIMER1_OVF_vect)
{
     ba0:  1f 92         push  r1
     ba2:  0f 92         push  r0
     ba4:  0f b6         in  r0, 0x3f  ; 63
     ba6:  0f 92         push  r0
     ba8:  11 24         eor  r1, r1
     baa:  1f 93         push  r17
     bac:  2f 93         push  r18
     bae:  3f 93         push  r19
     bb0:  4f 93         push  r20
     bb2:  5f 93         push  r21
     bb4:  6f 93         push  r22
     bb6:  7f 93         push  r23
     bb8:  8f 93         push  r24
     bba:  9f 93         push  r25
     bbc:  af 93         push  r26
     bbe:  bf 93         push  r27
     bc0:  ef 93         push  r30
     bc2:  ff 93         push  r31
     bc4:  df 93         push  r29
     bc6:  cf 93         push  r28
     bc8:  00 d0         rcall  .+0        ; 0xbca <__vector_13+0x2a>
     bca:  00 d0         rcall  .+0        ; 0xbcc <__vector_13+0x2c>
     bcc:  cd b7         in  r28, 0x3d  ; 61
     bce:  de b7         in  r29, 0x3e  ; 62
  // reinit counter
  TCNT1H = 0xC2;
     bd0:  82 ec         ldi  r24, 0xC2  ; 194
     bd2:  80 93 85 00   sts  0x0085, r24
  TCNT1L = 0xF7;
     bd6:  87 ef         ldi  r24, 0xF7  ; 247
     bd8:  80 93 84 00   sts  0x0084, r24

  char buf[4];
  buf[0]='$';  //bold
     c3e:  84 e2         ldi  r24, 0x24  ; 36
     c40:  89 83         std  Y+1, r24  ; 0x01
  buf[1]=cchar;
     c42:  9a 83         std  Y+2, r25  ; 0x02
  buf[2]=0;
     c44:  1b 82         std  Y+3, r1  ; 0x03
  WriteString(ccol,crow,buf);
     c46:  80 91 8f 01   lds  r24, 0x018F
     c4a:  60 91 93 01   lds  r22, 0x0193
     c4e:  0e 94 eb 04   call  0x9d6  ; 0x9d6 <WriteString>
      blink=0;
     c52:  10 92 91 01   sts  0x0191, r1

     c56:  0f 90         pop  r0
     c58:  0f 90         pop  r0
     c5a:  0f 90         pop  r0
     c5c:  0f 90         pop  r0
     c5e:  cf 91         pop  r28
     c60:  df 91         pop  r29
     c62:  ff 91         pop  r31
     c64:  ef 91         pop  r30
     c66:  bf 91         pop  r27
     c68:  af 91         pop  r26
     c6a:  9f 91         pop  r25
     c6c:  8f 91         pop  r24
     c6e:  7f 91         pop  r23
     c70:  6f 91         pop  r22
     c72:  5f 91         pop  r21
     c74:  4f 91         pop  r20
     c76:  3f 91         pop  r19
     c78:  2f 91         pop  r18
     c7a:  1f 91         pop  r17
     c7c:  0f 90         pop  r0
     c7e:  0f be         out  0x3f, r0  ; 63
     c80:  0f 90         pop  r0
     c82:  1f 90         pop  r1
     c84:  18 95         reti

Autor: Ansgar K. (paulderbademeister)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rcall bewirkt, dass der Programm Counter auf dem Stack gespeichert wird 
und der Stack Pointer erhöht. AVR-GCC scheint sich auf diese Weise 
dynamsich RAM zu allokieren.
     bc8:  00 d0         rcall  .+0        ; 0xbca <__vector_13+0x2a>
     bca:  00 d0         rcall  .+0        ; 0xbcc <__vector_13+0x2c>
     bcc:  cd b7         in  r28, 0x3d  ; 61
     bce:  de b7         in  r29, 0x3e  ; 62
Hier wird der Y-Pointer vor den mit RCALL reservierten Bereich gesetzt.
     c40:  89 83         std  Y+1, r24  ; 0x01
  buf[1]=cchar;
     c42:  9a 83         std  Y+2, r25  ; 0x02
  buf[2]=0;
     c44:  1b 82         std  Y+3, r1  ; 0x03
Und hier in diesen Bereich geschrieben.

Autor: Andy H. (vinculum) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, ich hab's kapiert.
Register 61 und 62 sind ja der Stackpointer, das kann man leicht 
übersehen.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andy H. schrieb:
> Register 61 und 62 sind ja der Stackpointer, das kann man leicht
> übersehen.

Dann schau dir statt des disassemblierten Codes doch den generierten
Code des Compilers an (Compileroption -S):
        .file   "foo.c"
__SREG__ = 0x3f
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__CCP__  = 0x34
__tmp_reg__ = 0
__zero_reg__ = 1
        .text
.global foo
        .type   foo, @function
foo:
        push r29
        push r28
        in r28,__SP_L__
        in r29,__SP_H__
        sbiw r28,48
        in __tmp_reg__,__SREG__
        cli
        out __SP_H__,r29
        out __SREG__,__tmp_reg__
        out __SP_L__,r28
/* prologue: function */
/* frame size = 48 */
...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.