Odp: assembler
Dnia 29-08-2006 o godz. 14:36 Henio Paszczak napisał(a):
> cześć.
> Mam pytanie które nie dotyczy konkretne debiana ale
> ogólnie porgramowania pod linuxem.
> w Swoich programach w assemblerze (as) chciaiłbym
> skorzystać z jednej ze sztuczek to znaczy zmieniania
> kodu programu podczas jego działania, nie wiem czy to
> jest możliwe. Aby sprecyzowac o co mi chodzi
> zamieszcze przyklad:
>
> 1 movb $57,.+n # .- adres wykonywanej instrukcji
> # n ilosc bajtow do $78
> 2 shufs $78,%xmm0,%xmm0.
>
> teraz procesor powinen widziec w lini 2
>
> 2 shufs $57,%xmm0,%xmm0
>
> niestety zawsze przy takich próbach otrzymuje błąd
> ochrony pamięci .. czego należało by się spodziewać .
> Czy jest jaiś sposób aby to ominąć ?
>
> Pozdrawiam
> Lukas
Hmm. nie znam sie na asm za bardzo (koduję w C/C++), ale nasuwa mi się pewne rozwiązanie.
Może spróbuj przechowywać w jakiejś zmiennej (w pamięci RAM, a nie w rejestrze
procesora) adres do jednej funkcji (części kodu, która się normalnie wykonuje) a w innej
zmiennej adres do innej funkcji (części kodu, która ma być podstawiona zamiast tej domyślnej).
Potem jeśli w pewnym momencie programu chcesz żeby wykonała się inna funkcja niż domyślna,
wystarczy że podmienisz adresy w wywołaniu funkcji.
Używam terminu "funkcja" ale mam na myśli dowolny kawałek kodu.
Mniej więcej wyglądało by to tak:
...
wskaznik_do_funkcji_domyslnej:
<kod funkcji domyslnej>
ret
...
wskaznik_do_funkcji_zastepczej:
<kod funkcji zastepczej>
ret
...
zmienna_przechowujaca_do_funkcji = wskaznik_do_funkcji_domyslnej (<-to jako definicja globalnej zmiennej)
...
potem w kodzie programu, w miejscu gdzie wywolujesz funkcję:
call zmienna_przechowujaca_do_funkcji
a jesli chcesz zmenic wywoływaną funkcję (np. po wciśnięciu jakiegoś klawisza) to piszesz:
zmienna_przechowujaca_do_funkcji = wskaznik_do_funkcji_zastepczej
gdy chcesz wrócić do domyślnej funkcji:
zmienna_przechowujaca_do_funkcji = wskaznik_do_funkcji_domyslnej
Mniej więcej tak się to rozwiązuje w C/C++ - używa się tam po prostu wskaźników do funkcji
(które są definiowanym przez programistę typem zmiennej), a jeśli idzie to zrobić w języku
wysokiego poziomu to znaczy że w asm na pewno. Tylko nie mam pojęcia czy jest to realizowane
w przedstawiony przeze mnie sposób;)
Tomek
----------------------------------------------------
Weekendowe trunkowanie czyli przepisy na drinki i nalewki - Kliknij:
http://klik.wp.pl/?adr=http%3A%2F%2Fadv.reklama.wp.pl%2Fas%2Fk23.html&sid=859
Reply to:
- References:
- assembler
- From: Henio Paszczak <blurrpp@yahoo.com>