Цитата(Т.Достоевский @ Mar 10 2008, 17:05)

...из которой вызывается АСМ вставка...
Так вы все-таки определитесь, что используете: асм вставку или функцию на асме. Это разные вещи. В файле у вас подобие функции, но как вы передаете параметры, не понятно.
Код
EXTERN rx_buff
...
ldi r30,rx_buff
Это вы так пытаетесь передать указатель??
Если вы хотите применить именно асм вставку, то там все в ручную, компилятор текста на асме не видит. Все на совести программиста.
Цитата(Т.Достоевский @ Mar 10 2008, 17:05)

То-есть как указать компилятору, что в АСМ функции используются такие-то регистры?
Например:
Код
for(i=0;i>100;i++)
crc_asm(* pointer); // <- вот сдесь может портится(и портится) i
Если функция, то нужно выполнять требования ИАР по передаче параметров: Calling convention.
Все регистры делятся на PRESERVED & SCRATCH.
SCRATCH (рабочие) R0–R3, R16–R23, and R30–R31 - их можно применять в подпрограммах без сохранения.
PRESERVED (сохраняемые) R4–R15 and R24–R27 - если их применяют в подпрограмме, они должны быть сохранены и потом восстановлены.
Параметры в/из функций передаются через регистры и через стек. Первый параметр передается через R19:R18:R17:R16. Второй параметр через R23:R22:R21:R20. Остальные (если есть) через стек.
Впрочем, это хорошо расписано в хелпе. Кстати, есть программы-переводчики, напр. наш PROMT, которые даже в Lite версии отлично переводят.
Вот вам рабочий пример функции на асме в си программе:
func.asm
Код
;===============================================================;
; Delay 100 mks * time (max: 6.55 sec; Clock: 7.3728 MHz) ;
; __version_1 void Wait100mks(unsigned int time); ;
;===============================================================;
PUBLIC Wait100mks
Wait100mks:
ldi r18, 244
wait2: dec r18
brne wait2
subi r16, 1
sbci r17, 0
mov r18, r16
or r18, r17
brne Wait100mks
ret
defines.h
Код
extern __version_1 void Wait100mks(unsigned int time);
code.c
Код
while (1) // Wait Watchdog RESET
{
poGreenLED = 1;
Wait100mks(1000); // 100 ms
poGreenLED = 0;
Wait100mks(2000); // 200 ms
}
Двухбайтовый unsigned int time передается через R17:R16. Компилятор об этом знает, поскольку функция имеет один параметр. Это видно в тексте на си и компилятор эти регистры не применяет.