Kleines Makro, inline asm so richtig?

Gast #2041020
Lesenswert?
• ▲
▼
Guten Morgen,

bin grad ein wenig am Code optimieren.
Prozessor ist ein ATTiny

ich hab ein kleines Makro zum Bit setzen/rücksetzen in C geschrieben:
1
#define SETBIT(BYTE,BIT)     ((BYTE) |=  (1<<(BIT)))

und ihr wisst ja selber was der compiler daraus macht...
jetzt wollte ich das ganze in ein inline asm packen, in etwa so:
1
#define setbit(BYTE, BIT)     asm("SBI  (BYTE), (BIT)") // SBI P,b
ist das so möglich bei inline assembling einzubinden??

grüße und schon mal danke im voraus :))
Gast #2041038
Lesenswert?
• ▲
▼
> #define setbit(BYTE, BIT)     asm("SBI  (BYTE), (BIT)") // SBI P,b

Unter der Voraussetzung, das dein "P" ein I/O-Register ist, dann ist das 
auch die effektivste Methode, dort ein Bit einzuschalten.
Spricht in meinen Augen für den Compiler.
mfG ingo
Gast #2041081
Lesenswert?
• ▲
▼
Also bei mir nicht, da macht der Compiler sehr zuverlässig SBI/CBI, wenn 
das Code einspart und möglich ist.

Z.B.
1
#include <avr/io.h>
2

3
int main(void) {
4
    PORTA |= 1<<4;
5

6
    for(;;);
7
}

Kompiliert mit
1
avr-gcc -mmcu=attiny2313 -Wall -Os -S -c foo.c

Dann sieht das so aus in foo.s:
1
main:
2
/* prologue: function */
3
/* frame size = 0 */
4
        sbi 59-32,4
5
.L2:
6
        rjmp .L2
#2041106
Lesenswert?
• ▲
▼
Micha s. schrieb:

> ich hab ein kleines Makro zum Bit setzen/rücksetzen in C geschrieben:
>
1
> #define SETBIT(BYTE,BIT)     ((BYTE) |=  (1<<(BIT)))
2
>
>
> und ihr wisst ja selber was der compiler daraus macht...

Ja.
Er macht ein sbi oder cbi draus, je nachdem ob Setzen oder Löschen 
angesagt ist.
Und das Schönste am Ganzen: Der Compiler weiß auch, wann das nicht geht 
und benutzt dann sts bzw lds wenn er das I/O Register anders nicht 
erreichen kann.

Wozu also inline Assembler?

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.