Цитата(V_G @ May 11 2011, 18:04)

vvppvv
Тут, по-моему, как раз тот случай, когда помимо хороших знаний языка Си стоит хорошо знать конкретную архитектуру конкретного процессора. Да, в его ассемблере есть команда косвенного перехода IJMP по адресу из r31:30. Но не думаю, что IAR C умеет ее использовать для целей, потребных топикстартеру.
Ну, во-первых, корректней использовать не косвенный переход, а косвенный вызов, раз уж мы о функциях

Во-вторых, IAR можно настроить под свои, сугубо специфические заскоки. Вот, навскидку, мой пример, косвенный вызов каких-то функций (их может быть хоть сотня), указатель на которые лежит в регистрах R15:R14 (сделано для быстроты):
__no_init __regvar void (* volatile Ufunc_ptr)(void) @14;
Использование 3х разных прерываний для вызова этих функций (а какая будет вызвана функция, т.е. какой загружен указатель, зависит от предыдущего контекста):
__interrupt __raw void irqOverflowTimer2 (void)
{
interrupt_entry ();
TCCR2=0; // остановить Timer2
(* Ufunc_ptr)();
interrupt_exit ();
}
__interrupt __raw void irqUSART0_UDRE (void)
{
interrupt_entry ();
(* Ufunc_ptr)();
interrupt_exit ();
}
__interrupt __raw void irqUSART0_RXC (void)
{
interrupt_entry ();
(* Ufunc_ptr)();
interrupt_exit ();
}
сам вызов (* Ufunc_ptr)() очень изящен, если он из регистров:
1436 (* Ufunc_ptr)();
\ 0000000E 01F7 MOVW R31:R30, R15:R14
\ 00000010 9509 ICALL
Как-то так..

)