C a rotace dokola
Jan Waclawek
konfera na efton.sk
Čtvrtek Duben 11 15:09:48 CEST 2024
Dokelu, neodolal som.
SDCC z roku 2013 to zvladol:
#include <stdint.h>
volatile uint8_t a;
int main(void) {
uint8_t b;
b = a;
a = (b >> 7) | (b << 1);
b = a;
a = (b >> 1) | (b << 7);
while(1);
}
0062 127 _main:
0007 128 ar7 = 0x07
0006 129 ar6 = 0x06
0005 130 ar5 = 0x05
0004 131 ar4 = 0x04
0003 132 ar3 = 0x03
0002 133 ar2 = 0x02
0001 134 ar1 = 0x01
0000 135 ar0 = 0x00
136 ; dm.c:8: b = a;
137 ; dm.c:9: a = (b >> 7) | (b << 1);
0062 E5 08 [12] 138 mov a,_a
0064 23 [12] 139 rl a
0065 F5 08 [12] 140 mov _a,a
141 ; dm.c:10: b = a;
142 ; dm.c:11: a = (b >> 1) | (b << 7);
0067 E5 08 [12] 143 mov a,_a
0069 FF [12] 144 mov r7,a
006A 03 [12] 145 rr a
006B F5 08 [12] 146 mov _a,a
147 ; dm.c:12: while(1);
006D 148 00102$:
006D 80 FE [24] 149 sjmp 00102$
wek
----- Original Message ---------------
>Na 8bitu netuąím, ale na ARMU to určitě GCC i CLANG umí.
>
>Přesněji, na 8051 pouľívám prastarý kompilátor, který to neumí, ale dá
>se pouľít ebedded asm, tak to tolik nevadí.
>
>Tomáą
>
>
>> Při sousedním tématu jsem si vzpomněl, ľe mi v C někdy dost chybí rotace
>> dokola. Tzn. velká část assemblerů obsahuje posuny, které dělají totéľ
>> co << nebo >> v C a pak jeątě rotace, kde bity na konci nemizí, ale
>> přelezou na začátek.
>
>> Kdyľ udělám kus kódu, který s pomocí << a nějakých obezliček realizuje
>> rotaci 8bit proměnné a nezkomplikuju to, vzejde z optimalizace ta
>> skutečná rotace jednou instrukcí bez pomocných věcí okolo?
>
>> PH
Další informace o konferenci Hw-list