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:
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:
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
:
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.
Die simple Lösung war, einfach bei beiden ein unterschiedliches Register anzugeben:
Mit freundlichen Grüßen,
mcf
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 );
}
Zunächst wollte ich das Ganze jetzt mal mit Zahlen testen, habe die Funktion also so aufgerufen:
Code:
simple_xor( 0, 10 );
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

Code:
#APP
xorb %al, %al
#NO_APP
edit2:
So, jetzt habe ich's geschaft.

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