[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: