[ gandalf @ 05.05.2002. 14:15 ] @
Ako moze neko da mi objasni princip segmenta i offseta???

[ 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()