hallo zusammen kann mir jemand sagen, was für einen befehl ich im C quellcode nehmen muss, damit ich wie in assembler die zwei nibbles vertauschen kann(swapf)? danke für eure hilfe
Es gibt keinen Befehl dafür. * Das musst du dir durch Schiebeoperationen zusammenbauen * über Inline Assembler könnte man den CPU Befehl benutzen
mit einem C-Befehl wird das gar nicht gehen. Du kannst es logisch nachbasteln und hoffen, dass der Optimierer erkennt, dass es mit einem swap erledigt ist (was durchaus nicht selbstverständlich ist), oder mit inline-Assembler.
also könnte ich *2*2*2*2 (also*16) rechnen, und dann würden die bits um vier stellen nach links verschoben werden, oder? beim inline Assembler habe ich das problem, dass ich die in C deklarierten variabeln nicht als diese im inline Assembler gebrauchen kann!! könnte ich nicht irgendwie der variabel eine Adresse zuweisen (im C) und danach diese im inline Assembler so benützen?
1 | unsigned char foo = 0x43; |
2 | foo = (foo << 4) | (foo >> 4); |
3 | //-> foo == 0x34
|
unsigned char i = 0x5F; i = ( i << 4 ) | ( i >> 4 ); Wenn du keinen unsigned hat, zuerst auf unsigned casten! Es ist wichtig, dass der Compiler nicht mit einem vermeintlichem Vorzeichen rechnet.
Am effizientensten geht es wohl mit einem Makro welcher per Inline-ASM einen swap-Befehl generiert: #define SWAP(x) asm volatile("swap %0":"=r"(x):"0"(x)) . . unsigned char MyByte = 0xC3; . . SWAP(MyByte); // => MyByte = 0x3C . .
@Peter S. >Am effizientensten geht es wohl mit einem Makro welcher per Inline-ASM >einen swap-Befehl generiert: >#define SWAP(x) asm volatile("swap %0":"=r"(x):"0"(x)) Ich kann mit Inline Assembler direkt auf C-Variablen zugreifen? Das geht mit WinAVR? MFG Falk
Das hängt ja auch vom C-Compiler ab. Beim CC5X-Compiler gibt es zB. einige vordefinierte Funktionen die der Assembleranweisung entsprechen. z.B. NOP() und für swapf gibts auch einen, nur weiß ich jetzt gerade nicht genau wie der heißt swap(Variablenname), oder swapf(variablenname,Parameter) oder so. Schau doch mal ins manuel zu deinem C-Compiler. Stefan B.
@johnny.m >Im Prinzip geht das. In der Doku der AVR-libC steht alles drin (Kapitel >7.4). Danke. Allerdings ist es 8.4 ;-) MfG Falk
@Falk: Kann sein, dass ich ne ältere Version hab. Bei mir ist das letzte Kapitel der Doku Kapitel 7. 8 gibts gar nicht...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.