Функции загрузчика в отдельной секции, потом эта секция из .elf выдирается в отдельный .hex и зашивается отдельно.
Ну а по основному вопросу
Пусть функция принимает два char и возвращает int
typedef int (*some_func_t)(char,char);
/* вынимание-вынимание! у WinAVR тут адрес слова! */
#define loader_some_func ((some_func_t)0xF000)
...
i = loader_some_func(3,4);
// и вот скомпилированное
ldi r22,lo8(4)
ldi r24,lo8(3)
ldi r30,lo8(-4096)
ldi r31,hi8(-4096)
icall
sts (i)+1,r25
sts i,r24
Причём это не win-avr-ские штучки и даже не gcc-шные вообще, это чисто С-шное, любой более-менее вменяемый компилятор обязан это правильно скомпилировать.
Вот что сделал старичок Borland 5.02
push 4
push 3
mov eax,61440
call eax
add esp,8
mov dword ptr [_i],eax