mikrocontroller.net

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


Autor: stefte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: stefte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned char foo = 0x43;
foo = (foo << 4) | (foo >> 4);
//-> foo == 0x34

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter S. (psavr)
Datum:

Bewertung
0 lesenswert
nicht 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
.
.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter:
Vermutlich sieht das bei PIC a bissl anders aus...

Autor: Peter S. (psavr)
Datum:

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

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

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

Autor: Stefan B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

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

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahhhchso.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.