QUOTE (fritsu @ May 3 2011, 09:29)

Например output и input параметры нужно заполнять для каждой команды или не для каждой?
Если вы каждую ассемблерную команду оформляете как отдельную асм-вставку - то нужно для каждой. Но это не имеет особого смысла. Вам надо весь этот блок оформить как единую вставку и уже для всего этого блока описать параметры.
QUOTE (fritsu @ May 3 2011, 09:29)

Также не понятно для чего нужны модификаторы. Например есть параметр
CODE
"=r" (value)
про value понятно внешняя переменная, а что такое "=r" непонятно.
Ими вы сообщаете компилятору, какие переменные/константы программы компилятор должен загрузить в регистры или выгрузить (включая тип этих переменных), а также какие регистры или память портит ваша вставка, чтобы компилятор мог учесть это при генерации остального кода.
В частности, =r означает, что под переменную компилятор должен выделить в любой регистр и после вставки забрать значение из этого регистра (ваша асм-вставка производит запись в эту переменную). =r означает, что ваша вставка и читает из этой переменной и пишет в нее, т.е. компилятор должен еще и загрузить значение переменной в выделенный регистр перед вставкой (аналогичного эффекта можно достигнуть указав =r в output constraint и r для этого же параметра в input constraint)
Ваша вставка будет выглядеть примерно так:
CODE
#include <stdint.h>
__attribute__((__always_inline__))
inline uint8_t read_port()
{
uint8_t Counter = 8;
uint8_t Result;
asm volatile(
"1: \r\n"
" SEC \r\n"
" SBIC %2, %3 \r\n"
" CLI \r\n"
" ROL %0 \r\n"
" DEC %1 \r\n"
" BRNE 1b \r\n"
:"=r"(Result),"+r"(Counter)
:"I"(_SFR_IO_ADDR(PINB)), "I"(data_in)
);
return Result;
}
Я немного сократил ее...
Обратите внимание, что Counter объявлен как +r, ибо эта вставка его портит.
Можно красивее:
CODE
__attribute__((__always_inline__)) inline uint8_t read_port()
{
uint8_t Counter = 8;
uint8_t Result;
asm volatile(
"1: \r\n"
" SEC \r\n"
" SBIC %[port], %[pin] \r\n"
" CLI \r\n"
" ROL %[Result] \r\n"
" DEC %[Counter] \r\n"
" BRNE 1b \r\n"
:[Result]"=r"(Result),[Counter]"+r"(Counter)
:[port]"I"(_SFR_IO_ADDR(PINB)), [pin]"I"(data_in)
);
return Result;
}
Вообще, ответы на основные свои вопросы вы найдете в документации на avr-libc в файле doc/avr-libc/avr-libc-user-manual/inline_asm.html