[C] Inline-Assembler - XOR

Hallo zusammen,

ich bin gerade dabei zu lernen, mit Inline-Assembler im gcc umzugehen.
Im Zuge dessen habe ich mir vorgenommen, einen kleine Funktion zu schreiben, die zwei chars übergeben bekommt und diese mittels XOR verknüpft.

Hier mal meine Funktion:
Code:
void simple_xor( char des, char key ) {	

	asm (
		"xorb %1, %0"
		:"=r" (des)
		:"r" (key)
	);
	
	// Kontrolle
	printf( "%d\n", des );
	printf( "%d\n", key );
}
DIe Funktion bekommt also zwei chars übergeben, welche ja beide 1 Byte groß sein sollten, des wegen benutze ich hier xorb.
Zunächst wollte ich das Ganze jetzt mal mit Zahlen testen, habe die Funktion also so aufgerufen:
Code:
simple_xor( 0, 10 );
Erwartet hätte ich jetzt als Ergebnis, dass "des" den Wert 10 bekommt, da 0 xor 10 ja wieder 10 ergibt. Allerdings hatte "des" nach dem "asm-Teil" immer noch den Wert 0.

Woran liegt das? Beziehungsweise, was mache ich denn falsch?

edit:
Ich habe das ganze mal mittels gcc -S in eine Assemblerdatei übersetzen lassen. Da fand ich dann folgende Zeile(n):
Code:
#APP
	xorb %al, %al
#NO_APP
Das erklärt, warum ich am Ende 0 erhalte... aber, ich habe doch in meinem Code gar nicht zwei mal dasselbe Register angegeben?

edit2:
So, jetzt habe ich's geschaft. :D
Die simple Lösung war, einfach bei beiden ein unterschiedliches Register anzugeben:
Code:
asm (
		"xorb %1, %0"
		:"=a" (des)
		:"b" (key)
	);

Mit freundlichen Grüßen,
mcf
 
Zurück
Oben