Adressspeicherung

Hallo,

auch wenn die Frage vielleicht blöd klingt:
Wo legt ein Microcontroller Adressen ab? Oder wo speichert er sie?
Gibt es vielleicht einen Adressregister, wo Adressen während des Betriebs abgelegt werden. Muss man Adressen überhaupt mal speichern/zwischenspeichern?

gruß
lignuslibri

Hallo,

vielleicht Hilft das http://www.batronix.com/elektronik/know-how/mikrocon…

Hallo lignuslibri,

Huch, der Link im anderen Post führt zum 8051, einer der unmöglichsten CPUs, was die Speicherverwaltung angeht ;-((

auch wenn die Frage vielleicht blöd klingt:
Wo legt ein Microcontroller Adressen ab? Oder wo speichert er
sie?
Gibt es vielleicht einen Adressregister, wo Adressen während
des Betriebs abgelegt werden. Muss man Adressen überhaupt mal
speichern/zwischenspeichern?

Es gibt zwei wichtige Adressen, welche jede CPU irgendwie Speichern muss:

  1. Programm-Zähler (PC)
  2. Stack-Pointer (SP)

Bei einem Reset wird wird entweder der PC auf einen bestimmten Wert gesetzt oder dieser Wert wird von einer bestimmten Adresse geladen (dort sollte sich dann das ROM befinden). Diese bestimmten Adressen sind vom Hersteller festgelegt und in der Hardware der CPU fest verdrahtet.
Damit ist einmal festgelegt, wo die CPU anfängt Code abzuarbeiten. Nirmalerweise sind dann alle Interrupts gesperrt, auch der NMI zumi9ndest bis der erste Befehl abgearbeitet wurde. Somit muss bei diesem Konzept der erste Befehl den SP laden.
Es gibt auch Konzepte, bei denen PC, SP und noch andere Register direkt aus dem ROM geladen werden.

Dann, auch wieder je nach CPU-Konzept, haben einige CPUs speziallisierte Register für Adressen. Grundsätz6ich bedeutet das, dass bestimmte Adressierungsarten automatisch bestimmte Register verwenden. Bei anderen CPUs gibt es diese speziallisierung nicht und es kann jedes Register sowohl für Daten als auch für die Addressierung verwendet werden. z.B. besitz die H8/300 Familie 8 Register (R0 bis R7, welche für alles gleichberechtig verwended werden können. R7 ist aber auch der SP. Man kann bei dieser CPU also auch den Wert des SPs durch 3 dividieren (das macht zwar keinen Sinn, aber die Befehle werden dadurch symetrisch).

Grundsätzlich sind aber auch Adressen nur Daten.
Wenn du also soetwas hast (in C):

long ll[10];
int i;

i = 3;
ll[i] = 5;

Hier kennst du nur die Basis-Adresse von ll also &ll[0].
zudem nehmen wir noch an, dass derDatentyp ‚long‘ 4 Byte belegt.
Um jetzt an die Adresse von ‚ll[i]‘ zu kommen muss erst gerechnet werden. Also:
Adresse von ll[i] = &ll[0] + (4 * i);

Hier besteht noch das kleine Problem, dass sich ‚i‘ eigentlich auch noch hinter einer Adresse verbirgt oder in einem CPU-Register abgelegt ist, aber um solche DInge kümmert sich zuerst einmal der Compiler, welcher den richtigen Maschinen-Code erstellt.

MfG Peter(TOO)