Forum: Mikrocontroller und Digitale Elektronik swapf befehl in C? (PIC)


von stefte (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Es gibt keinen Befehl dafür.
* Das musst du dir durch Schiebeoperationen zusammenbauen
* über Inline Assembler könnte man den CPU Befehl benutzen

von crazy horse (Gast)


Lesenswert?

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.

von stefte (Gast)


Lesenswert?

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?

von johnny.m (Gast)


Lesenswert?

1
unsigned char foo = 0x43;
2
foo = (foo << 4) | (foo >> 4);
3
//-> foo == 0x34

von Karl H. (kbuchegg)


Lesenswert?

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.

von Peter S. (psavr)


Lesenswert?

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
.
.

von johnny.m (Gast)


Lesenswert?

@Peter:
Vermutlich sieht das bei PIC a bissl anders aus...

von Peter S. (psavr)


Lesenswert?

Auja... is ja für nen PIC und nicht für den AVR!

von Falk (Gast)


Lesenswert?

@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

von johnny.m (Gast)


Lesenswert?

@Falk:
Im Prinzip geht das. In der Doku der AVR-libC steht alles drin (Kapitel 
7.4).

von Stefan B. (Gast)


Lesenswert?

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.

von Falk (Gast)


Lesenswert?

@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

von johnny.m (Gast)


Lesenswert?

@Falk:
Kann sein, dass ich ne ältere Version hab. Bei mir ist das letzte 
Kapitel der Doku Kapitel 7. 8 gibts gar nicht...

von Falk (Gast)


Lesenswert?

Ahhhchso.

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
Noch kein Account? Hier anmelden.