Цитата(IgorKossak @ Nov 16 2006, 20:38)

prottoss, Вы получили таким образом значение SP, а никак не PC, как требовалось.
Очевидно, что после выталкивания двух байт из стека, их надо затолкать обратно, а копию в r16, r17 вернуть из подпрограммы.
Либо как в Вашем случае привести SP к типу указателя на int и взять по нему значение (с прединкрементом по-моему).
В любом случае эту операцию надо делать атомарно (непрерываемо).
Сорри, конечно же надо не было не так - сказал одно, а думал о другом))) Наверное вот так правильнее:
Код
unsigned int OutSaveContekst(void)
{ return *((unsigned int __flash *)SP);
}
Тогда получается в асме:
Код
19 unsigned int OutSaveContekst(void)
\ OutSaveContekst:
20 { return *((unsigned int __flash *)SP);
\ 00000000 B7ED IN R30, 0x3D
\ 00000002 B7FE IN R31, 0x3E
\ 00000004 9105 LPM R16, Z+
\ 00000006 9114 LPM R17, Z
\ 00000008 9508 RET
21 }
Цитата(IgorKossak @ Nov 16 2006, 20:38)

prottoss, Вы получили таким образом значение SP, а никак не PC, как требовалось.
Очевидно, что после выталкивания двух байт из стека, их надо затолкать обратно, а копию в r16, r17 вернуть из подпрограммы.
Либо как в Вашем случае привести SP к типу указателя на int и взять по нему значение (с прединкрементом по-моему).
В любом случае эту операцию надо делать атомарно (непрерываемо).
Нет, думаю что я правильно привел, то что привел в первом своем посте. Функция возвращает адрес в стеке - а этот адрес и есть функция. Пожалуйста - вот еще один вариант
Код
unsigned int __flash *OutSaveContekst(void)
\ OutSaveContekst:
20 { return (unsigned int __flash *)SP;
\ 00000000 B70D IN R16, 0x3D
\ 00000002 B71E IN R17, 0x3E
\ 00000004 9508 RET
21 }
Абсолютно тоже самое))) А то что я привел в выше в этом же посте (извиняюсь за калабур) возвратит код команды
B7ED IN R30, 0x3D