És volt még az EMS: egy 64KB-s 'ablakban' 4 darab 16KB-s darabban lehetett az 1MB feletti memóriát elérni valós módban, először csak hardver segítségével, azután 386-tól pusztán szoftverrel is
80x88-ból mindössze egyetlen féle létezett, a 80188-as, de az sohasem terjedt el a piacon. A 80186-os sem.
Ami pedig a 80x86-ot illeti, nem kellene azokat mind egy kalap alá venni.
A 80286 még 16 bites processzor volt, max 16 mega memóriát tudott címezni, és 64k szegmens határ volt (protected módban is). A 80386-os pedig már 32 bites volt, és 4 giga fizikai memória határra tervezték, amit egyetlen szegmenssel is át tudott fogni.
De sőt, majdnem 64KB-t használhatunk az 1MB felett is, ha a hardverünk is engedi, ez a HMA, FFFF:0010 - FFFF:FFFF (= 100000 - 10FFEF). (Ha a hardverünk nem engedi, akkor persze a memória legelejét látjuk viszont ezeken a címeken,)
A szegmentált címzést annak idején azért találták ki, mert a 8088-as processzornak 16 bites regiszterei voltak és 20 címvonala. Hagyományos címzéssel csak 16 bites címeket tudott volna tárolni a regisztereiben, amely 64K memória elérését tette volna lehetővé.
Ennek a problémának a megoldására találták ki, hogy a fizikai címeket 16 bites szegmens és 16 bites offszet logikai címekkel határozzák meg, melyeket már el lehet tárolni a processzor regisztereiben.
Az elképzelésed jó, valóban átlapolják egymást a szegmensek, tehát egy fizikai címet többféleképpen is felírhatunk logikai címekkel.
Egy példa:
Legyen egy logikai cím A000:0000.
Ebből úgy kapunk fizikai címet, hogy a szegmens címet balra léptetjük 4 bittel (16-tal szorozzuk), majd hozzáadjuk az ofszet címet:
A000 << 4 = A0000 és A0000 + 0000 = A0000.
Most nézzük meg az A000:FFFF logikai címet:
A000 << 4 = A0000 és A0000 + FFFF = AFFFF.
A két fizikai cím különbsége: AFFFF - A0000 = FFFF.
Tehát egy szegmens valóban FFFF bájt, azaz 64K.
Most vizsgáljuk meg az A001:0000 logikai címet:
A001 << 4 = A0010 és A0010 + 0000 = A0010.
Mivel A0010 - A0000 = 10, vagyis 16 bájt, így a szegmensek valóban 16 bájtonként lapolódnak át (vigyázat: nem 16K, hanem 16 bájt).
Végül arra kell még figyelni, hogy ezzel a címzési móddal a maximálisan megcímezhető memória:
FFFF:000F, vagyis FFFF0 + 000F = FFFFF, vagyis 1M.
Túlbonyolítod, pedig már magától is túl bonyolult. Húszbites címet állítanak elő kétszer tizenhat bitből, mégpedig úgy, hogy az első rész (szegmens) tizenhattal szorozzák, és ahhoz hozzáadják a másodikat (offszet).
Forditva. 8086 modban egy 20 bites cimbusz van, es 16-val maradek nelkul oszthato cimeken kezdodnek a szegmensek. Magyarul a segment:offset cim az segment*16 + offset modon szamolodik "fizikai" cimme. Nincs olyan, hogy "fizikai szegmens", ez csak memoriacimzesi eljaras.
A 80x86 CPU-k memóriakezelésével kapcsolatban szeretnék egy kis felvilágosítást kérni. Utánaolvastam a dolognak, mert eddig nem teljesen volt világos a számomra.
-A 80x88 processzorok szegmens:offszet címzést használnak, minden szegmens 64kbyte.
Ezt úgy értelmeztem, hogy az egész memória -pl legyen a gépben 32Mb- mondjuk egy csomag A4-es lap, és minden egyes lap egy 64kbyt-nyi területet jelent.
-Minden 16 kbyt-nél egy új szegmens kezdődik. Na itt már egy kicsit kavar van. Ha jól értem itt arról lenne szó, hogy a legelső A4-es lapra úgy teszük rá a következőt, hogy a tetejénél maradjon ki mondjuk 10 cm??? Így a második lap, az elsőnek majdnem a 75%át lapolná át? Viosszatérve a 80x88 hoz. Tehát egy szegmensnyi területet 4 szegmens lapol át? Az első szeg 16k nál, a második 32k-nál, a harmadik 48k nál, a negydik pedig 64k nál, azaz a 0. szegmens végénél kezdődik... Ez így rendben van-e, vagy valamit félreértelmeztem?
Még az nem világos, hogy ha fizikai címet akarunk számolni, akkor minek kell szorozni 16-al a szegmenst, meg osztani az offszettel, jobbra léptetni, meg 0 kal feltölteni???