Gustav schrieb:> Dass der Wert, der ganz links steht, verschwindet, hat ein Leftshift so> an sich. Das ist auch so erwünscht.
Ah, LSB versus MSB. Ich hatte wohl noch zuviel Blut im Kaffee und dachte
du würdest hier alle b7-s verlieren...
Hallo,
mit ähnlichem habe ich vor Jahren mal experimentiert und Jörg Wunsch hat
mir damals bei der inline-ASM Geschichte geholfen.
War für eine DCF77-Uhr, die alle Impulse in ein 64Bit Register schiebt
und das neue Bit anhängt.
Schiebt zwar nach rechts und hängt ganz links an, das zum links schieben
umzubauen und auf 32 statt 64 Bit zu kürzen sollte aber ja kein Problem
sein.
1
dcf77_bit_cnt++; // Bitcount erhöhen
2
asm volatile // shift long long right und höchstwertiges Bit bleibt 0
3
(
4
"lds __tmp_reg__, %0 + 7" "\n\t"
5
"lsr __tmp_reg__" "\n\t"
6
"sts %0 + 7, __tmp_reg__" "\n\t"
7
"lds __tmp_reg__, %0 + 6" "\n\t"
8
"ror __tmp_reg__" "\n\t"
9
"sts %0 + 6, __tmp_reg__" "\n\t"
10
"lds __tmp_reg__, %0 + 5" "\n\t"
11
"ror __tmp_reg__" "\n\t"
12
"sts %0 + 5, __tmp_reg__" "\n\t"
13
"lds __tmp_reg__, %0 + 4" "\n\t"
14
"ror __tmp_reg__" "\n\t"
15
"sts %0 + 4, __tmp_reg__" "\n\t"
16
"lds __tmp_reg__, %0 + 3" "\n\t"
17
"ror __tmp_reg__" "\n\t"
18
"sts %0 + 3, __tmp_reg__" "\n\t"
19
"lds __tmp_reg__, %0 + 2" "\n\t"
20
"ror __tmp_reg__" "\n\t"
21
"sts %0 + 2, __tmp_reg__" "\n\t"
22
"lds __tmp_reg__, %0 + 1" "\n\t"
23
"ror __tmp_reg__" "\n\t"
24
"sts %0 + 1, __tmp_reg__" "\n\t"
25
"lds __tmp_reg__, %0" "\n\t"
26
"ror __tmp_reg__" "\n\t"
27
"sts %0, __tmp_reg__"
28
: "+m" (dcf77_daten)
29
);
30
if (dcf77_time_cnt < 87) // Bit war 1
31
{
32
asm volatile // höchstwertiges Bit des long long auf 1 setzen
33
(
34
"lds __tmp_reg__, %0 + 7" "\n\t"
35
"set" "\n\t" // T setzen
36
"bld __tmp_reg__, 7" "\n\t" // und in Bit 7 kopieren
37
"sts %0 + 7, __tmp_reg__" "\n\t"
38
: "+m" (dcf77_daten)
39
);
40
}
Ist jetzt nur schnell rauskopiert...
Gruß aus Berlin
Michael