[ gandalf @ 05.05.2002. 14:15 ] @
Ako moze neko da mi objasni princip segmenta i offseta??? |
[ gandalf @ 05.05.2002. 14:15 ] @
[ Mikky @ 05.05.2002. 15:58 ] @
potrazi po starijim porukama bilo je o tome reci
evo citat iz jednog tutoriala Citat: Segment i offset: Idemo sada raspraviti ono zbog _ega nam se vlasnici Motorolinih maÜina smiju - adresiranju memorije. Kada je Intel davnih dana razvijao svoj procesor (8088, na osnovu kojeg je nastao 8086), memorija je bila skupa (prvi PC je imao 64K memorije) - i nitko nije vjerovao da ľe ikada biti viÜe od 1 Mb memorije, pa su, da bi uÜtedili neÜto vremena, pojednostavili konstrukciju i joÜ neke stvari u procesoru, odlu_ili da je to maksimum. Problem je u tome Üto za 1 Mb nam treba 20 bita. A registri su 16-bitni. A 2 16-bitna registra za memoriju? Pa to je 32-bita, a to je definitivno previÜe. Nikada nikome neľe trebati toliko. I tada su doÜli na ideju koja je tada dobro izgledala: segment i offset. I dalje se koriste dva registra za adresiranje memorije, ali nisu 32 bita. Ideja koju su smislili je slijedeľa: Kako imam 16 bita za adresiranje (iliti 0-65535, tj. 64K), a mogu 2 registra upotrijebiti za adresiranje, neka mi prvi pokaPe blok od 64K u kojem je podatak, a drugi to_nu lokaciju unutar tog bloka. To su nazvali segmentom i ofsetom. I kona_na formula za apsolutnu adresu je: ADRESA = SEGMENT*16 + OFFSET Jedan registar sadrPi segment, a drugi sadrPi offset. Ako ih spojimo zajedno, dobijemo 20 bitnu adresu. SEGMENT 0010010000010000---- OFFSET ----0100100000100010 20-bit Address 00101000100100100010 ====== DS ====== ====== SI ====== I sada ide onaj vaPan dio. DIO ADRESE SE PREKLAPA!!! To je na_in na koji dva registra daju 20-bitnu adresu (naj_eÜľe se piÜe DS:SI ili neki drugi registri). Segment je DS, odnosno neki od segmentnih registara (CS, DS, ES, SS), dok je SI offset (ili AX, BX, CX, DX, DI, SI, BP, SP, IP). To zna_i da istom podatku moPete doci preko razli_itih vrijednosti segmenta i offseta. Nekada je to vrlo zgodno, ali obi_no je samo zbunjujuľe. Evo par o_itih i manje o_itih primjera. SEG:OFS=1200h:0001h=1000h:2001h=0DFFh:4011h MoPda donja slika bolje ilustrira ideju Segment*16 (shift za jedno mjesto lijevo) + Offset ---------- Adresa 1200h 1000h 0DFFh +0001h +2001h +4011h ----- ------ ------ 12001h 12001h 12001h Kada su otkrili da su osu_eni na segmente, programeri su im dodijelili imena: CODE_SEG, DATA_SEG, STACK_SEG i EXTRA_SEG. Isto tako postoje i registri sa tim imenom: CS, DS, SS i ES. CS segment sluPi da u njemu drPimo naÜ program, DS sluPi da u njemu drPimo podatke, SS sluPi za stack, a ES je pomoľni i naj_eÜľe sluPi za razna kopiranja i pomjeranja podataka. Naravno, Vi registrima slobodno upravljate (OSIM CS registra koji UVIJEK pokazuje na onaj segment gdje se nalazi program koji se izvrÜava, ali njega ne moPete samo tako promijeniti, nego samo sa naredbom skoka na drugo mjesto u programu, ili sa raznim programskim trikovima sa stackom). [ SEH @ 05.05.2002. 16:49 ] @
Windoze koriste flat memory model velicine 4GB u koji cine overlapping segmentni registri + 32-bitni offseti; nemoj ovo pobrkat sa onim gore sto je Mikky napisao. U win32asm ti segment override nece gotovo nikad trebati (osim u nekim slucajevima, ali to je vec druga prica).
[ gandalf @ 05.05.2002. 17:18 ] @
Tnx()
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|