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

Odp: Odp: assembler



> 
> 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

Dziêki za odpowied¼.
Twój pomys³ jest niez³y jednak mi przedewszystkim
zale¿y na szybko¶ci operacji, a co za tym idzie
ograniczenia korzystania z pamiêci (z poza prcesora)
do minimum ( oczywi¶cie s± komendy przesuwaj±ce
odpowiednie bloki do pamiêci do cache ale moja
znajomo¶æ assemblera niesiêga jeszcze tak daleko i
narazie tylko z nimi eksperymentuje). Mozna by równie¿
zmeniaæ rejestr %eip wskazujêcy na kolejn± wykonywana
instrukcjê ..ale to równie¿ wi±¿e sie z korzystniem ze
stosu.
np. w programie z podanych z zewn±trz danych obliczam
ile razy ( 0<n<5  'n' naturalne ) powinienem obrocic
cyklicznie podwojne slowa w rejestrze %xmm0,
za³u¿my ¿e w %al otrzymuje 2*n, w %bl binarnie
0b11100100=x03020100, teraz jezeli móg³bym pisac
bezpo¶rednio do  programu wystarczy ze zrobie
1) rorb %al,%bl     #obracam rz±dan± ilosæ razy %bl   
                                      
2) movb %bl,.+n     # zastap $1
3) shufs $1,%xmm0,%xmm0

moglbym oczywiscie w zalezno¶ci od wyniku w %al
ustawiac adres skoku do procedury z ustalonym
parametrem przestawienia dla shufs ale wiaze sie to z
instrukcjami prownanwczymi ( chociaz tego mozna
uniknac) no i odwolaniem do pamieci, co ma znaczenie
kiedy podobne operacje dla ro¿nych 'n' wykonuje 2^1000
razy.
A nawet gdyby mo¿na by³o napisaæ inn± szybszê
instrukcjê ( nie twierdzê ¿e nie mo¿na :) ) to z samej
ciekawo¶ci chcia³êbym umieæ dowolnie manipulowaæ
programem :)

Pozdrawiam
Lukas

__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 



Reply to: