Получилось вот так unsigned int OutSaveContekst(void){ return (*(unsigned int *)(SP + 2)); };
Возвращает адрес во Flash на оператор после вызова функции
18: it = OutSaveContekst(); +0000002B: D005 RCALL PC+0x0006 Relative call subroutine +0000002C: EDE4 LDI R30,0xD4 Load immediate +0000002D: E0F0 LDI R31,0x00 Load immediate +0000002E: 8300 STD Z+0,R16 Store indirect with displacement +0000002F: 8311 STD Z+1,R17 Store indirect with displacement Возвращает 0х002С
Корректно будет если 0х002С + 4, т.е unsigned int OutSaveContekst(void){ return ((*(unsigned int *)(SP + 2)) + 4); }; Тогда возвращает 0х0030 18: it = OutSaveContekst(); +0000002B: D005 RCALL PC+0x0006 Relative call subroutine +0000002C: EDE4 LDI R30,0xD4 Load immediate +0000002D: E0F0 LDI R31,0x00 Load immediate +0000002E: 8300 STD Z+0,R16 Store indirect with displacement +0000002F: 8311 STD Z+1,R17 Store indirect with displacement @00000030: _..X_RSTACK_BASE 19: }; +00000030: 9508 RET Subroutine return
Будет так работать, указывать на следующий оператор во флеш после вызова функции, затем можно выйти return, а потом вернуться icall, Будет работать?
PS _Alex на работе, Alex ma дома.
|