Zitat Zitat von sternst
Kannst du bitte mal erläutern, inwieweit das meinen "Schnipsel" betrifft?
Dessen Beschreibung ist korrekt, allerdings sollte folgendes badacht werden:

-- Das Register muss nicht in der Klasse "d" liegen, Klasse "r" genügt vollauf. Falls das Register zB in "l" lebt, würden sonst überflüssige Reloads nach "d" fällig.

-- Wenn man das auf eine lokale Variable anwendet, ist der Code, den GCC zum Erzeugen der Adresse macht, oft mehr als der eigentliche Code des asm. Daher sollte wenn möglich Adressbildungen lokaler Variablen vermieden werden, insbesondere wenn man dichten, flotten Code haben möchte:

Code:
char c;
char foo (char b)
{
    char a = b;
    bitswp2_4 (&a);

    c = a;

    return b;
}
Das hab ich mal mit avr-gcc 4.4.0 übersetzt; ältere gcc-Versionen machen nicht unbedingt besser...

Code:
foo:
	push r29
	push r28
	push __tmp_reg__
	in r28,__SP_L__
	in r29,__SP_H__
/* prologue: function */
/* frame size = 1 */
	mov r25,r24
/* #APP */
 ;  7 "swap.c" 1
	mov __tmp_reg__, r25
	bst r25,2
	bld r25,4
	bst __tmp_reg__,4
	bld r25,2
	
 ;  0 "" 2
/* #NOAPP */
	sts c,r25
/* epilogue start */
	pop __tmp_reg__
	pop r28
	pop r29
	ret
Um die Adresse einer lokalen Variablen nehmen zu können, muss diese im Frame (bzw. im Speicher, hier aufm Stack) angelegt werden. Von Maschinenregistern kann nämlich keine Adresse genommen werden.

Teilweise gelingt es GCC, das wieder halbwegs optimal hinzubiegen, aber welch harte Nuss das ist, wird erst klar, wenn man ein bissl unter die Haube eines Compilers guckt...