Gast
#488611
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
|
Anzeige
|
swapf befehl in C? (PIC)
Gast
#488611
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
Gast
#488621
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.
Gast
#488630
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?
Gast
#488631
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
.
.
Gast
#488687
@Peter: Vermutlich sieht das bei PIC a bissl anders aus...
Gast
#488782
@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
Gast
#488813
@Falk: Im Prinzip geht das. In der Doku der AVR-libC steht alles drin (Kapitel 7.4).
Gast
#489483
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.
Gast
#489501
@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
Gast
#489507
@Falk: Kann sein, dass ich ne ältere Version hab. Bei mir ist das letzte Kapitel der Doku Kapitel 7. 8 gibts gar nicht...
Gast
#489510
Ahhhchso. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|