Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Segment Size

1 view
Skip to first unread message

Jens Kallup

unread,
Jun 19, 2021, 7:23:43 AM6/19/21
to
Hallo,

hier habe ich einen kleinen Auszug von einen etwas älteren Post
von Bernhard:

> Segmentregister (CS, DS, ES, SS) enthalten immer das 5. Digit der
> Adresse, also 0000.0000 ... 000F.FFFF = 64 kiB * 16 = 1 MiB.

habe ich das richtig verstanden:

für CS: 000F:FFFF = 64 kiB * 16 = + 1 MiB
für DS: 00FF:FFFF = 64 kiB * 16 = + 1 MiB
für ES: 0FFF:FFFF = 64 kiB * 16 = + 1 MiB
für SS: FFFF:FFFF = 64 kiB * 16 = + 1 MiB
--------------------------------------------
= 4 MiB

???

Jens

Peter J. Holzer

unread,
Jun 20, 2021, 2:30:26 AM6/20/21
to
On 2021-06-19 11:23, Jens Kallup <kallu...@web.de> wrote:
> hier habe ich einen kleinen Auszug von einen etwas älteren Post
> von Bernhard:
>
> > Segmentregister (CS, DS, ES, SS) enthalten immer das 5. Digit der
> > Adresse,

Die Aussage ist so, wie sie dasteht, falsch. Aber vielleicht ist sie aus
dem Zusammenhang gerissen.

Im Real-Mode ist die physische Adresse = Segmentregister * 16 + Adresse.

> > also 0000.0000 ... 000F.FFFF = 64 kiB * 16 = 1 MiB.

Der 8086 kann mit seinen 20 Adressleitungen 1 MB ansprechen, richtig.
Durch die Adress-Arithmetik ist die höchste Adresse theoretisch
FFFF0 + FFFF = 10FFEF, aber dafür bräuchte man eine 21ste Adressleitung.
Die gab es dann ab dem 286, allerdings musste man auf PC-kompatiblen das
berüchtigte A20-Gate abdrehen, um sie nutzen zu können.

> habe ich das richtig verstanden:
>
> für CS: 000F:FFFF = 64 kiB * 16 = + 1 MiB
> für DS: 00FF:FFFF = 64 kiB * 16 = + 1 MiB
> für ES: 0FFF:FFFF = 64 kiB * 16 = + 1 MiB
> für SS: FFFF:FFFF = 64 kiB * 16 = + 1 MiB
> --------------------------------------------
>= 4 MiB

Nein, Du kannst die nicht addieren. Jedes Segment-Register zeigt auf
einen Bereich von 64 kB innerhalb dieses 1 MB-Bereichs. Es können z.B.
alle vier Register den Inhalt 1234 haben, dann verwendet Dein Programm
den Speicherbereich von 12340 bis 2233F. Oder jedes der 4 Register zeigt
auf einen eigenen 64 kb-Bereich, z.B. CS = 2000, DS = 3000, SS = 4000,
ES = 5000. Die können natürlich auch teilweise überlappen und man kann
des Segmentregistern auch Werte zuweisen, damit man nicht auf 4*64 kB
eingeschränkt ist, sondern den ganzen Speicher verwenden kann.

Die C-Compiler hatten damals verschiedene "Memory-Models", die jeweils
eine Größe (32 oder 16 Bit) für Code- und Datenpointer vorgegeben haben
und auch, ob sich Segmente überlappen und ob Pointer-Arithmetik 16 oder
32 Bit hat. Das war alles sehr kompliziert :-).

hp

0 new messages