Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.assembler > #1217 > unrolled thread

Segment Size

Started byJens Kallup <kallup.jens@web.de>
First post2021-06-19 13:23 +0200
Last post2021-06-20 08:30 +0200
Articles 2 — 2 participants

Back to article view | Back to de.comp.lang.assembler


Contents

  Segment Size Jens Kallup <kallup.jens@web.de> - 2021-06-19 13:23 +0200
    Re: Segment Size "Peter J. Holzer" <hjp-usenet3@hjp.at> - 2021-06-20 08:30 +0200

#1217 — Segment Size

FromJens Kallup <kallup.jens@web.de>
Date2021-06-19 13:23 +0200
SubjectSegment Size
Message-ID<ij62dtFa7a9U1@mid.individual.net>
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

[toc] | [next] | [standalone]


#1218

From"Peter J. Holzer" <hjp-usenet3@hjp.at>
Date2021-06-20 08:30 +0200
Message-ID<slrnscto41.2ugb.hjp-usenet3@trintignant.hjp.at>
In reply to#1217
On 2021-06-19 11:23, Jens Kallup <kallup.jens@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

[toc] | [prev] | [standalone]


Back to top | Article view | de.comp.lang.assembler


csiph-web