[ glamoc @ 22.05.2007. 22:05 ] @
naime imam na faksu neki zadatak koji generise dogadjaje sa tastature i nista mi nijejasno.Zapravo slabo poznajem asembler i ne razumem sledeci kod
push word ptr es:0026h
pop word ptr oldKbdSEG
push word ptr es:0024h
pop word ptr oldKbdOFF
Upomoc ako imate neku dobru literaturu za asm kazite
[ glorius @ 24.05.2007. 18:20 ] @
Evo malo definicija:

word ptr val - govori asm da val posmatra kao word ( 16-bitna vrednost ).

push a
pop b

ovo je ekvivalentno: b = a

znaci, kod tebe je:

oldKbdSEG = es:0026h ; mislim da ovako cuvas keyboard segment za kasnije
oldKbdOFF = es:0024h ; offset ( primeti da je razlika 2 bajta [ 16 bita ] izmedju 0024h i 0026 h pa zbog toga zahteva WORD PTR )

ovo je standardan kod za cuvanje pocetka segmenta i segmenta

ako imamo segment i adresu offseta

es:bx

mov mestoUmemoriji, word ptr bx - pocetak segmenta
mov mestoUmemoriji + 2, word ptr es - segment

Uff... i ja sam, inace, pocetnik ali mislim da ce ovo da ti pomogne ( bar malo )
[ glamoc @ 27.05.2007. 00:20 ] @
Ok pomoglo mi je mnogo ali da li tacno znas znacenje ovoga dela
es:0026h pri cemu je vrednost registra es=0
pozdrav
[ glorius @ 27.05.2007. 01:31 ] @
Teorija je dosta duboka...

es je ( extra segment ). Deo u memoriji. Segmenti su komplikovana tema ali, recimo da se memorija deli na segmente.
npr...

Ulica moze biti segment... a broj kuce je ova druga vrednost.... grad je RAM memorija koja se sastoji od kuca ( memorijskih lokacija ), ali, delimo ga na ulice ( segmente ) da bi se lakse snasli ( al ga ja objasni :) )

Ulica:broj = 5

es:1234 npr... es = 0 'neshto' = 1234

znaci, konacna adresa u memoriji (RAM) je 1234

Razmisljaj o tome kao da ti podatak postavljas na neko mesto u mem koje je odredjeno adresom ( u ovom slucaju ) 1234 ( 0 + 1234 )

Art of Assembly ( google-uj ga ) opasna knjiga. Ako te ne mrzi.. procitaj, vidi, nauci...



[ Eurora3D Team @ 27.05.2007. 02:45 ] @
Da dodam nesto vezano za push i pop instrukcije kao i za Stack.
Inace je nisam pocetnik.
Stack je deo memorije koji se cesto koristi za cuvanje podataka (u Windowsu i za postavljane dodatnih argumenata pri pozivanju funkcije).
Za upis i citanje Stack memorije se koriste instrukcije Push (cuvanje) i Pop (uzimanje).
Ono sto je upisano cita se obrnutim redom (zadnji podatak se cita prvi) bez preskakanja.

primer
Code:

mov eax,2 ; 2 u eax 
push eax ; 2 u stack
mov eax,3 
push eax ; 3 u stack
xor eax,eax ; cistimo eax
pop eax ; eax je sad 3
pop eax ; eax je sad 2

Isto je vazna i duzina podataka. Npr eax je cervorobajtni registar i kad uzimamo podatak treba i o tome da vodimo racuna. Naprimer ako prvo unesemo dvobajtni podatak pa cetvorobajtni kada uzimamo podatak prvo ocekujemo 4 pa 2 bajta. Ovde postoje i neki trikovi , ako naprimer hocemo da podelimo dword (4 bajta) na 2 worda (2) bajta uradimo
Code:

push m_dword
pop m_word1
pop m_word2

Pri radu sa Stack-om registar ESP je stack pointer.
Isto treba voditi racuna o balansiranju Stack memorije. U jednoj funkciji (do ret instrukcije) treba uzeti iz Stak-a isti broj bajtova koliko je upisano.
Toliko
Pozdrav


[ glamoc @ 27.05.2007. 09:55 ] @
E puno hvala a,razumem ja segmente i offsete(ulice i kuce)...
Mucilo me je zasto 0:0026h ali sad skapirah da se sve prekidne rutine nalaze na 0-tom segmentu..
A ova knjiga jel moze negde da se nadje za dzaba posto mi izbacuje samo neke kes sajtove(negde na torrentu ...)

[Ovu poruku je menjao glamoc dana 27.05.2007. u 11:57 GMT+1]