@Josef
Kann sonicht verallgemeinert werden, denn es ist compilerabhängig.
Beim avr_gcc ergibt die ganze sache z.B. genau den gleichen Code.
Ein kleines Testprogramm:
typedef struct _BITS{
unsigned bit0:1;
unsigned bit1:1;
unsigned bit2:1;
unsigned bit3:1;
unsigned bit4:1;
unsigned bit5:1;
unsigned bit6:1;
unsigned bit7:1;
} BITS;
BITS bitfeld;
unsigned char bitfeld_set;
int main(void){
bitfeld.bit1 = 1;
bitfeld.bit2 = 0;
bitfeld_set |= 1<<1;
bitfeld_set &= ~(1<<2);
}
Ergebnis aus dem .lst File
test.c **** int main(void){
42 .LM1:
43 /* prologue: frame size=0 */
44 0000 C0E0 ldi r28,lo8(__stack - 0)
45 0002 D0E0 ldi r29,hi8(__stack - 0)
46 0004 DEBF out _SP_H_,r29
47 0006 CDBF out _SP_L_,r28
48 /* prologue end (size=4) */
19:test.c ****
20:test.c **** bitfeld.bit1 = 1;
50 .LM2:
51 0008 8091 0000 lds r24,bitfeld
52 000c 8260 ori r24,lo8(2)
21:test.c **** bitfeld.bit2 = 0;
54 .LM3:
55 000e 8B7F andi r24,lo8(-5)
56 0010 8093 0000 sts bitfeld,r24
22:test.c ****
23:test.c **** bitfeld_set |= 1<<1;
58 .LM4:
59 0014 8091 0000 lds r24,bitfeld_set
60 0018 8260 ori r24,lo8(2)
24:test.c **** bitfeld_set &= ~(1<<2);
62 .LM5:
63 001a 8B7F andi r24,lo8(-5)
64 001c 8093 0000 sts bitfeld_set,r24
25:test.c ****
26:test.c ****
27:test.c **** }