Мастер Ломастер писал(а):имхо, чем меньше ассемблерных вставок, тем спокойнее жизнь программиста.
Обойтись то можно, но дело в том, что эта часть программы будет часто вызываться и нужно реализовать выполнение этой функции максимально быстрым. К тому же, реализовать эту часть на асм-е, как ни странно, проще, чем на Си (а в железе так вообще тупо проводочки подпаял и всё

).
Вот, например, на Си:
Код: Выделить всё
uint8_t r, out = 0;
for (r = 0; r < buffersize2; r++)
{ out = (out << 1) | (in & 1); in >>= 1; }
return buf;
Этот кусок кода транслируется в это:
Код: Выделить всё
mov r18,r24 ldi r25,lo8(8) ldi r24,lo8(0) .L9:
lsl r24
mov r19,r18
andi r19,lo8(1)
or r24,r19
lsr r18
subi r25,lo8(-(-1))
brne .L9
ret
Что, собственно, близко к моему варианту, но всё таки здесь 7 команд против моих 4-х. Итого: 56 тактов против 32.
vitalik_1984, первая цитата, это
IfoR писал, а не
odnk. Я имел ввиду, что у меня транслируется всё правильно.

А какой у тебя компилятор и версия?