Benutzer:Pemu/Adressierung

aus Wikipedia, der freien Enzyklopädie

Die Adressierung ist der Vorgang, die Operanden für eine Rechenoperation im Speicher zu lokalisieren und den Speicherort für das Ergebnis anzugeben. Die Zuführung der Adressen zum Speicher erfolgt dabei über den Adressbus, während die Operanden aus den adressierten Speicherplätzen über den Datenbus dem Rechenwerk zugeführt werden. Je ‚lückenloser‘ die Operanden im Speicher abgelegt sind, desto schneller kann der Datenzugriff erfolgen. Bei idealer Speicherausrichtung erfolgt der Zugriff besonders schnell, je nach Prozessorarchitektur beispielsweise innerhalb eines Prozessortaktes.

Adressierung im Arbeitsspeicher

Im einfachsten Fall sind die einzelnen Speicherplätze des Speichers von 0 an durchnummeriert (linearer Adressraum). Eine Adresse stellt dann die Nummer eines bestimmten Speicherplatzes dar. Die Register eines Prozessors werden im Regelfall ebenfalls durchnummeriert.

<Im Folgenden werden Werkzeuge zur Adressierung beschrieben, die die Rechnerarchitektur (der Prozessor) zur Verfügung stellt.>

Man unterscheidet verschiedene Adressierungsarten:

  • Registeradressierung. Ziel der Adresse ist ein Register im Prozessor. Die Adresse des Registers wird direkt angegeben.
  • Unmittelbare Adressierung. Die Operanden sind Bestandteil des Befehls.
  • Absolute Adressierung. Ziel der Adresse ist eine Speicherzelle im Hauptspeicher. Die Adresse der Speicherzelle wird direkt angegeben.
  • Relative Adressierung. Ziel der Adresse ist eine Speicherzelle im Hauptspeicher. Die übergebenen Adresse wird zum Wert des Spezialregisters PC (program counter) als Offset addiert.
  • Indirekte Adressierung. Die übergebene Adresse verweist auf ein Register, in dem wiederum die Adresse des eigentlichen Ziels im Hauptspeicher abgelegt ist.
  • Indizierte Adressierung. Übergeben werden zwei Adressen. Die erste verweist auf ein Register, in dem ein Wert abgelegt ist. Dieser Wert wird als Offset zur zweiten Adresse addiert, das Ergebnis ist die Adresse des Ziels im Hauptspeicher.

Da normalerweise viel weniger Register als Speicherplätze existieren, benötigen Registeradressen viel weniger Stellen als Hauptspeicheradressen. (Beispiel: Bei einem System mit Prozessor mit 16 Registern sowie 4 GiB Speicher benötigt eine Registeradresse 4 Bit, während eine Hauptspeicheradresse 32 Bit benötigt.) In der Maschinensprache werden Registeradressen meist zusammen mit dem Befehlscode in einem Speicherwort gespeichert – stehen mithin dem Prozessor ohne weitere Speicherzugriffe zur Verfügung – während der Prozessor für die Übermittlung jeder Hauptspeicheradresse weitere Speicherzugriffe – und damit Ausführungszeit – benötigt.

Unmittelbare Adressierung

<Hinweis: Die in den Beispielen angegebenen Befehle sind in der MC68000-Assemblersprache angegeben. Links von den Assemblerbefehlen sind die entsprechenden Maschinencodes in sedezimaler Form angegeben. Das Semikolon ist ein Kommentarzeichen. Die MC68000-Assemblersprache benutzt die Operandenreihenfolge Quelle,Ziel. Die MC68000-Maschinensprache arbeitet mit 16-Bit-Worten.>

Der oder die Operanden sind Bestandteil des Befehls, gespeichert im Befehlscode selbst oder in den Speicherwörtern, die im Speicher unmittelbar nach dem Befehlscode folgen.

             ; Lade das Register d4 mit dem Wert 12345 (304916) (nicht mit dem Inhalt von Speicherplatz 12345)
383C 3049    move #12345,d4

Das #-Zeichen in der MC68000-Assemblersprache zeigt die unmittelbare Adressierung an.
Das erste Wort 383C16 ist der Maschinenbefehl, um einen unmittelbar adressierten 16-Bit-Wert in Register d4 zu laden. Das zweite Wort 304916 stellt den Operanden dar.

Das heißt, wenn der Prozessor bei der Programmabarbeitung auf die beiden Worte 383C16 und 304916 stößt, lädt er den Wert 12345 in das Datenregister d4.

Absolute oder direkte Adressierung

Bei dieser Adressierungsart wird die Speicheradresse bei jedem Befehl direkt und vollständig angegeben. Die Gesamtheit der möglichen Adressen bildet den Adressbereich dieser Adressierungsart.

             ; Addiere den Inhalt der Adresse 123 (= 007B16) zum Inhalt des Registers d6
DC78 007B    add 123,d6

Das erste Wort DC7816 ist der Maschinenbefehl, um den Inhalt einer Speicherzelle zu Register d6 zu addieren. Im folgenden Wort ist der Operand, d. h. die Quelladresse, angegeben.

Beim MC68000 können nur zwei Operanden angegeben werden, dabei wird dann das Resultat dort gespeichert, wo vor Ausführung der Addition einer der Operanden stand (Akkumulator-Prinzip). Diese Adressierungsart wird heute nur noch in Integrierten Schaltkreisen und eingebetteten Systemen mit wenig Speicherplatz angewandt. So benötigt in einem Rechner mit einem 32 Bit breitem Adressbus beispielsweise ein Additionsbefehl mit drei Operanden (für zwei Quellen und ein Ziel) allein für die Adressangaben 96 Bit. Zur Verringerung des Speicheraufwands werden weitere Möglichkeiten der Adressierung verwendet.

Indizierte und relative Adressierung

Beide Adressierungsarten verwenden ein Register zur Speicherplatzersparnis. Bei der indizierten Adressierung (auch indirekte Adressierung genannt) wird das so genannte Indexregister zu jeder Adressangabe addiert.

; Addiere den Inhalt der Adressen 22 (Index+002) zum Inhalt (Index+012) und speichere das Ergebnis in Adresse 24 (Index+102)
load index, 10110
add 00, 01, 10

Der Trick besteht darin, dass die relativen Adressen weniger Stellen haben. So kann der Befehl mit relativen Adressen von beispielsweise 8 Bit (8 Binärstellen) einen Bereich von nur 28=256 Speicherplätzen, relativ zur im Indexregister gegebenen Speicheradresse, ansprechen. Dafür verringert sich der Speicherbedarf für die Adressen von 96 Bit auf 24 Bit. (Wobei jedoch ggf. das Indexregister zunächst mit dem passenden Wert geladen werden muss.)

Für das Durchlaufen von Speicherbereichen ist dies hervorragend geeignet. Bei der relativen Adressierung speichert das Register die so genannte Basisadresse und die Adressen für die Befehle werden nur noch als Offset angegeben. Dabei sind negative und positive Offsets möglich.

# Basis ist 65536 (10000000000000002). Addiere den Inhalt der Adressen 65540 (Basis+01002)
# und 65549 (Basis+11012) und speichere das Ergebnis in 65537 (Basis+00012)
load index, 10000000000000000
add 0100, 1110, 0001

Da ein Rechner mehr als ein Register hat, muss ein jeder Befehl dieser Art eine Registeradresse enthalten (meist eine 4-bit- oder 8-bit-Angabe), die das Register angibt, das als Index-Register zu benutzen ist. Diese Registeradresse ist in den Beispielen oben nicht dargestellt.

Die relative Adressierung verläuft ähnlich, allerdings wird statt des Indexregisters der Befehlszähler (program counter, PC) benutzt. Die Adressierung erfolgt als nicht relativ zu einer im Indexregister angegebenen Adresse, sondern relativ zum Befehlszähler, d. h. der Speicherstelle, die den Befehl selbst enthält.

Normalerweise muss sich der Programmierer nicht um die Relativ-Adressen kümmern, da meist der Assembler oder Compiler die Berechnung der Offsets übernimmt.

Aber auch diese Adressierungsarten sind für heutige Rechner nicht mehr ausreichend.

Virtuelle Adressierung

<Im Folgenden werden Werkzeuge zur Adressierung beschrieben, die das Betriebssystem zur Verfügung stellt.>

Betriebssysteme verwenden die Virtuelle Adressierung, um Programme ausführen zu können, die mehr Speicherplatz benötigen als an physikalischem Arbeitsspeicher im RAM überhaupt zur Verfügung steht. Der gesamte zur Verfügung stehende Speicherplatz wird als Virtueller Adressraum bezeichnet und der Zugriff auf die darin enthaltenene Adressen ist die virtuelle Adressierung. Das jeweilige Betriebssystem verwendet eine Virtuelle Speicherverwaltung, die sich einer Memory Management Unit bedient, um Teile des Programms auf die Festplatte auszulagern und ggf. in den Arbeitsspeicher zu laden, falls sich eine gewählte Adresse außerhalb des im RAM befindlichen Adressraums befindet. Die Angabe der Adressen erfolgt dabei entweder direkt, relativ, indiziert oder auch symbolisch.

symbolische Adressierung

<Im Folgenden werden Werkzeuge zur Adressierung beschrieben, die so oder ähnlich vom Entwicklungssystem (Assembler) zur Verfügung gestellt werden.>

Symbolische Adressierung erlaubt es dem Programmierer Adressen mit Namen, sogenannten Mnemonics zu belegen, um Fehler bei der Angabe der Adresse zu vermeiden.

#Addiere die Adresse 65539 und 65549 und speichere das Ergebnis in 65537
define operand1, 1000000000000011
define operand2, 1000000000001101
define ergebnis, 1000000000000001
add operand1, operand2, ergebnis

Adressierung von Arrays

Eine spezielle Form der Adressierung erfordern mehrdimensionale Datenfelder, wie zum Beispiel Tabellen oder Assoziative Arrays, und die Umrechnung von Feldreferenz in Speicheradresse. Ausführlich behandelt dieses Thema der Artikel Array.

Siehe auch