Forum: Compiler & IDEs rol in GCC


von tt (Gast)


Lesenswert?

Hallo,

wie kann ich den Assemblerbefehl rol in GCC ersetzen?

Danke

von Stefan (Gast)


Lesenswert?

#include <stdint.h>

uint8_t c;
c = (c << 1) | (c & 0x80);

uint10_t i;
i = (i << 1) | (i & 0x8000);

oder Inline-Assembler benutzen.

von Stefan (Gast)


Lesenswert?

s/uint10_t/uint16_t/ natürlich

von Stefan (Gast)


Lesenswert?

Was schreibe ich denn für einen Mist ;-) Es ist zu heiss...

#include <stdint.h>

uint8_t c;
c = (c << 1) | ((c & 0x80) >> 7);

uint16_t i;
i = (i << 1) | ((i & 0x8000) >> 15);

von Stefan (Gast)


Lesenswert?

Vergiss es. Ich habe nicht an das Carrybit gedacht. Obiges ist falsch.

von tt (Gast)


Lesenswert?

Ja, ist heiß heute, und ich hab ne Baustelle vorm Fenster!!!

Carry ist nicht so wichtig, ... nur die bits die links rausfallen müssen 
rechts wider rein in mein Byte.

Noch Vorschläge ??

Ach ja, muss halt schnell gehen, ist in ner Interruptroutine.

von Falk B. (falk)


Lesenswert?

@ Stefan

>Was schreibe ich denn für einen Mist ;-) Es ist zu heiss...

Wohl wahr. In der Ruhe liegt die Kraft.

uint8_t c;
c = (c << 1) | ((c >> 7) & 1);

uint16_t i;
i = (i << 1) | ((i >> 15) & 1);

MfG
Falk

von Falk B. (falk)


Lesenswert?

@ tt

>Noch Vorschläge ??
>Ach ja, muss halt schnell gehen, ist in ner Interruptroutine.

Wens ohne Assembler sein soll, dann vielleicht so

// unit8_t

if (a & 0x80)
  a = (a<<1) | 1;
else
  a = (a<<1);

// uint16_t

if (a & 0x8000)
  a = (a<<1) |1;
else
  a = (a<<1);

MfG
Falk


von tt (Gast)


Lesenswert?

@ Falk

Danke, so hatte ich es auch bisher gemacht, dachte es gibt vielleicht 
noch was eleganteres.

von Falk B. (falk)


Lesenswert?

@ tt

>Danke, so hatte ich es auch bisher gemacht, dachte es gibt vielleicht
>noch was eleganteres.

Hmm, ich wüsste im Moment nicht, wie man es eleganter und schneller 
macht. Der AVR hat keinen ROL ohne Carry.

MfG
Falk


von Simon K. (simon) Benutzerseite


Lesenswert?

> Hmm, ich wüsste im Moment nicht, wie man es eleganter und schneller
> macht. Der AVR hat keinen ROL ohne Carry.

Na dann schau mal LSL und LSR an.

LSL:

>Shifts all bits in Rd one place to the right. Bit 7 is cleared. Bit 0 is
>loaded into the C flag of the SREG. This operation effectively divides an
>unsigned value by two. The C flag can be used to round the result.

von Falk B. (falk)


Lesenswert?

@  Simon Küppers

>> macht. Der AVR hat keinen ROL ohne Carry.

>Na dann schau mal LSL und LSR an.

LSL != ROL

MFG
Falk

von Simon K. (simon) Benutzerseite


Lesenswert?

Eben, denn LSL arbeitet ohne Carry. ROL mit.

von Falk B. (falk)


Lesenswert?

@ Simon Küppers (simon)

>Eben, denn LSL arbeitet ohne Carry. ROL mit.

Sicher, aber wie ist dein Posing zu verstehen?
Was willst du damit sagen?

>>> Hmm, ich wüsste im Moment nicht, wie man es eleganter und schneller
>>> macht. Der AVR hat keinen ROL ohne Carry.

>>Na dann schau mal LSL und LSR an.

MfG
Falk

von tt (Gast)


Lesenswert?

Also ich bin es dann nochmal.

Im moment mach ich das:

mst= (signal_out & 0x80);
if (mst) PORTB |=(1<<PB3);
else PORTB &= ~(1<<PB3);
signal_out= signal_out<<1;


geht das einfacher?

von Falk B. (falk)


Lesenswert?

@ tt

>Im moment mach ich das:

>mst= (signal_out & 0x80);
>if (mst) PORTB |=(1<<PB3);
>else PORTB &= ~(1<<PB3);
>signal_out= signal_out<<1;

Wo brauchst du dabei ein ROL? Du willst doch nur das MSB auf ein Portpin 
kopieren und die Daten um ein Bit weiterschieben. Sieht nach Soft-SPI 
aus.

>geht das einfacher?

Nein. Wozu auch?

MFG
Falk





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.