Die logische Adressierung findet auf einer höheren Ebene statt als die physische und ist abhängig vom verwendeten CPU-Typ (bzw. vom CPU-Hersteller). Motorola Prozessoren der 680x0-Reihe unterscheiden zum Beispiel nicht zwischen physischer (linearer) und logischer Adressierung. Dadurch läßt sich der komplette Adressraum durchgängig ansprechen.
Im Gegensatz dazu verwendet Intel bei seinen zum 8086 Prozessor kompatiblen Modellen eine Aufteilung des Hauptspeichers in abgegrenzte Bereiche, die Segmente. Eine Adresse wird dabei aus einem genau definierten Segmentbeginn und einer "Offsetadresse" von diesem Segmentbeginn aus gebildet. Lineare Adressierung ist dabei nur innerhalb eines Segmentes möglich.
Bei näherer Betrachtung zeigt sich, daß eine Segmentierung des Arbeitspeichers der Struktur der meisten Anwenderprogramme entgegenkommt.
Gründe für die Segmentierung sind dabei:
Bei dem von Intel 1978 vorgestellten 8086 handelt es sich um einen 16 Bit Prozessor mit einem adressierbaren Arbeitsspeicher von 1 MB. Die logische Adressierung des Arbeitsspeichers erfolgt dabei immer über ein Registerpaar, das aus Segment- und Offsetadresse besteht. Bei beiden Adressen handelt es sich um 16 Bit Register.
Wie kann der Prozessor mit diesen zwei 16 Bit Registern einen Adressraum von 20Bit (220=1048576=1 MB) adressieren?
Eine einfache Addition der zwei 16 Bit Register würde höchstens eine 17 Bit Adresse ergeben! Deshalb verschiebt der 8086 (intern) die Segmentadresse um 4 Bit nach links, das entspricht einer Multiplikation mit 16 oder dem Anhängen einer hexadezimalen "0" am unteren Ende. Anschließend wird die originale Offsetadresse addiert.
Dadurch ergibt sich eine physische 20 Bit Adresse, mit der der gesamte Adressraum angesprochen werden kann (Vgl. Abb. 1.2).
Abb. 1.2: Physische Adressierung
Durch die Multiplikation mit 16 hat sich auch die kleinste, durch die Segmentadresse adressierbare Einheit verändert. Sie beträgt nun nicht mehr 1 Byte, sondern insgesamt 16 Byte. Diese 16 Byte werden in diesem Zusammenhang auch als "Paragraph" bezeichnet.
Die folgenden Segment:Offset-Adressen sollen in ihre jeweilige physische 20-Bit Adresse umgerechnet werden (alle Angaben hexadezimal, die fett gedruckte Null entspricht dabei dem (internen) Linksschieben der Segmentadresse um 4 Stellen). Segment:Offset physische (lineare) Adresse 0001:000E 00010 + 000E = 0001E 0001:000F 00010 + 000F = 0001F 0002:0000 00020 + 0000 = 00020 0000:0020 00000 + 0020 = 00020 Wie die beiden letzten Beispiele zeigen, kann eine (!) physische Adresse durch mehrere unterschiedliche Segment:Offset Kombinationen gebildet werden. |
Das größte Problem in der Realmode Programmierung der 80x86-Prozessorfamilie stellt die Begrenzung eines Segments auf maximal 64 KB dar. War es zur Einführung des 8086 1978 noch eine "riesige" Speichermenge, die zur Verfügung stand (damals wurden die meisten Computer mit 16 KB ausgeliefert!), so stellt diese Begrenzung bei den heutigen Anforderungen nur noch ein unnötiges Hindernis dar.
Wo aber liegt die Ursache für diese Segmentbegrenzung?
Da zur Adressierung innerhalb eines Segmentes nur eine 16 Bit Offsetadresse verwendet wird, kann auch nur die maximale Speicherzelle: 216=65536=64 KB innerhalb eines Segments angesprochen werden. Diese Offsetadresse wird dabei als NEAR-Zeiger bezeichnet. Der eigentliche Nachteil besteht dabei darin, daß es schwierig ist, größere Speicherbereiche direkt anzusprechen bzw. zu bearbeiten.