Modyfikacja program pointer przy wyjsciu z funkcji

0

Witam

Czy ktokolwiek z szanownych forumowiczów wie w jaki sposób sprawić żeby funkcja ISR (jak niżej).
W przypadku gdy warunek 'ADC_buff>20' jest spełniony nie wróciła do adresu spod którego została wywołana, a wróciła pod zmodyfikowany adres?

Rozwiązanie typu wywołanie innej funkcji przed 'return' nie wchodzi w gre (hardware na to niemożliwe).
Za pomocą 'PUSH' próbowałem zmodyfikować stos i tam zmienić adres jednak bez pozytywnego rezultatu.


void ISR (_no_auto_psv_, _interrupt_)   // parametry odnoszą się do kompilatora (kwestia wywoływania przez hardware)
{
     ADC_buff = ADC1; // odczytaj pomiar adc
     IFS0.ADC1 = 0; // wyczysc flage przerwania
        if (ADC_buff > 20)
        {
         /* zmodyfikowac adres pod ktory funkcja wroci za pomoca 'return' */
        }
     return;
}
 
0

po wywołaniu funkcji, esp wskazuje na adres powrotu[0] i int[1], int[2].
Wystarczy tylko pod adres esp nadpisać pointer.

0

Dzięki za odpowiedź, wracam do walki z tą funkcją.

0

A czym i jak to kompilujesz? Bo jeśli jest tam jakiś stackprotector to musisz ominąć kanarka najpierw. Najlepiej załaduj to sobie pod debugerem i zobacz gdzie masz adres powrotu. Jeśli nie ma żadnego kanarka to faktycznie adres powrotu będzie pod ebp (a nie esp jak tu ktoś wyżej twierdzi). Najwygodniej byłoby przeskoczyć do tego adresu z parametrów funkcji bo będą zaraz obok na stosie, ale to tylko jeśli nie ma tu żadnej dziwnej konwencji typu fastcall. Jeśli jest to wtedy lepiej zadeklarować zmienną lokalną na początku tej funkcji i sprawdzić pod debugerem jak daleko jest ta zmienna od szczytu stosu i potem możesz po prostu zrobić sobie *(&zmienna+ile_bajtów_do_pointera) = nowy_adres;

0

A od d**y strony nie możesz tego zrobić?

zwracasz adres, pod który ma skoczyć i jeśli jest nullpointerem to robi z jmp nopa, a tak skaczę po powrocie z przerwania.

0

Zmodyfikowałem wartość rejestru przechowującego stack pointer w asm (tylko cholernie duzo tam warunków - koniecznie trzeba wykorzystać akumulator W0 itp), w symulacji działa, jak zmontuje PCB to będę miał pewność czy jest ok

1 użytkowników online, w tym zalogowanych: 0, gości: 1