Discussion:
Segment Size
(zu alt für eine Antwort)
Jens Kallup
2021-06-19 11:23:40 UTC
Permalink
Hallo,

hier habe ich einen kleinen Auszug von einen etwas älteren Post
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
2021-06-20 06:30:25 UTC
Permalink
Post by Jens Kallup
hier habe ich einen kleinen Auszug von einen etwas älteren Post
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.
Post by Jens Kallup
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.
Post by Jens Kallup
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

Loading...