switch() Merkwürdigkeiten

Gast #178652
Lesenswert?
• ▲
▼
Ein Register würde ich noch verstehen: der switch-Ausdruck wird als
`int' behandelt und daher auf 16 bits expandiert.  Es gibt (bislang)
keine Optimierung herauszufinden, ob das obere Byte dabei gar nicht
benötigt würde und daher ignoriert werden kann.

Zwei Register verstehe ich nicht wirklich.
OP #178653
Lesenswert?
• ▲
▼
Hier nochmal der komplette Sprungcode:

    switch( cmd  ){
 3d4:   99 27           eor     r25, r25
 3d6:   aa 27           eor     r26, r26
 3d8:   bb 27           eor     r27, r27
 3da:   fc 01           movw    r30, r24
 3dc:   4e 97           sbiw    r24, 0x1e
 3de:   08 f0           brcs    .+2
 3e0:   7e c0           rjmp    .+252
 3e2:   ed 5c           subi    r30, 0xCD
 3e4:   ff 4f           sbci    r31, 0xFF
 3e6:   09 94           ijmp


R24 = cmd und R25 ist für die Erweiterung auf 16 Bit.


Peter
Gast #178654
Lesenswert?
• ▲
▼
kann ich nicht bestätigen

Compiler:   avr-gcc (GCC) 3.4.1


  95:be_cmd.c      ****
  96:be_cmd.c      **** UCHAR getaxisnumber(UCHAR c){
 185                 .LM7:
 186                 /* prologue: frame size=0 */
 187                 /* prologue end (size=0) */
  97:be_cmd.c      ****   switch( c ) {
 189                 .LM8:
 190 0028 9927          clr r25
 191 002a 8835          cpi r24,88
 192 002c 9105          cpc r25,__zero_reg__
 193 002e 71F0          breq .L10


MooseC
Gast #178656
Lesenswert?
• ▲
▼
gebe ich Dir Recht...

1975:be_cmd.c      ****   switch( ascii_cmd[0] ) {
 5870                 .LM680:
 5871 20a4 892F          mov r24,r25
 5872 20a6 9927          clr r25
 5873 20a8 AA27          clr r26
 5874 20aa BB27          clr r27
 5875 20ac FC01          movw r30,r24
 5876 20ae B897          sbiw r30,40
 5877 20b0 E333          cpi r30,51
 5878 20b2 F105          cpc r31,__zero_reg__
 5879 20b4 08F0          brlo .+2
 5880 20b6 4FC0          rjmp .L497
 5881 20b8 E050          subi r30,lo8(-(pm(.L498)))


MooseC
 5882 20ba F040          sbci r31,hi8(-(pm(.L498)))
 5

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.