// Вызов flash-массива как функции из IAR Си.
unsigned char (*foo)(void);
// Шаблоны команд AVR, чтобы в массиве можно было писать на "Асме".
#define asm_NOP 0x0000
#define asm_RET 0x9508
// Регистры AVR для команды MOV.
#define _R0_ (0)
#define _R1_ (1)
#define _R2_ (2)
#define _R3_ (3)
#define _R16_ (16)
#define _R31_ (31)
#define asm_MOV( dst, src) (0x2c00|((dst)<<4)|((src)&0x0f) | \
(((src)&0x10)?(0x0200):(0)) )
// Функция-массив.
__flash unsigned int shell[]= {
asm_MOV( _R2_, _R31_ ),
asm_NOP,
asm_MOV( _R16_, _R0_ ),
asm_RET
};
void main( void ){
// Вызов. Сдвиг адреса вправо - для IAR
foo = (unsigned char(*)(void))(((unsigned int)shell) >> 1);
printf( "%02x\n",foo());
}