Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.assembler > #1217 > unrolled thread
| Started by | Jens Kallup <kallup.jens@web.de> |
|---|---|
| First post | 2021-06-19 13:23 +0200 |
| Last post | 2021-06-20 08:30 +0200 |
| Articles | 2 — 2 participants |
Back to article view | Back to de.comp.lang.assembler
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
| From | Jens Kallup <kallup.jens@web.de> |
|---|---|
| Date | 2021-06-19 13:23 +0200 |
| Subject | Segment 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]
| From | "Peter J. Holzer" <hjp-usenet3@hjp.at> |
|---|---|
| Date | 2021-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