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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren