indirekteAdressierung

Hallo,

und noch eine Frage.
In einfachen Worten gesagt, was macht eine indirekte Adressierung für einen Sinn? Wo ist ihr Vorteil gegenüber Adressierung?
Es ist doch ein Aufwand den InstructionPointer und das CodeSegment zu Addieren um so die Adresse zu ermitteln, warum hat man also beim 8085 nur direkte Adressierung verwendet und beim 8086 auch eine indirekte?

Könnte das der Grund sein

* Direkte Adressierung:
In diesem Modus ist die Adresse des
Operanden direkt im Befehlscode ent-
halten. **Diese Adresse ist nur ein Byte
breit - es können daher 256 Speicher-
stellen direkt adressiert werden.
Für den 8051 ist das ausreichend - das
ganze interne RAM (Data-Bereich 0 bis
7FFH, SFR-Bereich 80H bis 0FFH) ist
dort direkt adressierbar.

Im 8052 wird die Sache komplizierter:
Der SFR-Bereich und die zweite Hälfte
des internen Daten-RAMs teilen sich den
Adressraum 80H bis 0FFH.**

Die Entscheidung, ob ein Befehl ein
SFR-Register oder eine Speicherstelle
in der oberen Hälfte des internen
Daten-RAMs als Operand benutzt, wird
nur durch den Adressiermodus getroffen:

gefunden bei http://your.orf.at/teletext/cbarchiv/8051win.txt

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

und noch z.B. :

Über den Datenpointer (DPTR) ist der
volle Adressraum von 64 KByte ansprech-
bar.

In einfachen Worten gesagt, was macht eine indirekte
Adressierung für einen Sinn? Wo ist ihr Vorteil gegenüber
Adressierung?
Es ist doch ein Aufwand den InstructionPointer und das
CodeSegment zu Addieren um so die Adresse zu ermitteln, warum
hat man also beim 8085 nur direkte Adressierung verwendet und
beim 8086 auch eine indirekte?

Mir scheint, du meinst hier die indizierte Adressierung. Bei der absoluten Adressierung muss die Zieladresse zum Zeitpunkt der Codeerstellung bekannt sein - was nur sehr statische Programme ermöglichen würde. Bei der indirekten Adressierung wird die Zieladresse einem zweiten Register entnommen, womit du die Möglichkeit hast, auf variable Adressbereiche zuzugreifen.

Willst du jetzt in einer Schleife auf mehrere Elemente eines Arrays zugreifen, müsstest du bei der indirekten Adressierung den ursprünglichen Wert der Basisadresse im Adressregister zunächst auf den Stack schreiben, um den Offset manipulieren und für die nächsten Schleifendurchlauf wiederherstellen. Bei der indizierten Adressierung bleibt die Basisadresse hingegen unverändert, der Offset zur Basisadresse muss dann aber tatsächlich vom Prozessor aufwändiger addiert werden. Du hast aber damit wesentlich bessere Möglichkeiten, mit geringem Codeaufwand sehr flexibel Arrays abzuarbeiten.

Gruss
Schorsch

P.s.:

Bei
der indizierten Adressierung bleibt die Basisadresse hingegen
unverändert, der Offset zur Basisadresse muss dann aber
tatsächlich vom Prozessor aufwändiger addiert werden.

Wobei natürlich der Aufwand für den Adresszugriff zwar höher, der Aufwand für die Adressbestimmung und damit der Gesamtaufwand aber deutlich niedriger ist.

Hallo,

In einfachen Worten gesagt, was macht eine indirekte
Adressierung für einen Sinn? Wo ist ihr Vorteil
gegenüber [direkter] Adressierung?

Die ‚indirekte Addressierung‘ erlaubt
die Verwendung von Variablen in der
Speicheradressierung und die sog.
Adressarithmetik. Kein sinnvolles
Programm kommt ohne so etwas aus.

Es ist doch ein Aufwand den InstructionPointer und das
CodeSegment zu Addieren um so die Adresse zu ermitteln,
warum hat man also beim 8085 nur direkte Adressierung
verwendet und beim 8086 auch eine indirekte?

‚Instruction Pointer‘? Kaum.
Vielleicht DS (data segment pointer)?

Ansonsten: Weil man beim 8085 noch nicht
so weit war, derart sinnvolle Dinge auch
nutzbar einzubauen. Daher war ja auch der
x86 so ‚revolutionär‘.

Der 8086 hatte in etwa folgende Addressierungsmodi:

=> Displacement Only Addressing Mode

  • (das was Du unter „direkter“ Adressierung verstehst.)

    mov ax, [1000h]

=> Register Indirect Addressing Mode

  • ein Register dient als Variabe, in der die
    Speicheradresse steht:

    mov ax, [bx]

=> Indexed Addressing Mode

  • zur im Register abgelegten Adresse wird ein
    Offsett (z.B. Feldelement) addiert

    mov cx, 20h[bx]

=> Based Indexed Addressing Mode

  • sowohl Feldindex als auch Basisadresse
    sind Variablen

    mov ax, [bx][si]

=> Based Indexed Plus Displacement Addressing Mode

  • Kombination der drei vorhergehenden Fälle

    mov ax, 24h[bx][si]

siehe dazu z.B. auch: http://www.dcc.unicamp.br/~celio/mc404s2-03/addr_mod…

Grüße

CMБ

Hallo Fragewurm,

und noch eine Frage.
In einfachen Worten gesagt, was macht eine indirekte
Adressierung für einen Sinn? Wo ist ihr Vorteil gegenüber
Adressierung?
Es ist doch ein Aufwand den InstructionPointer und das
CodeSegment zu Addieren um so die Adresse zu ermitteln, warum
hat man also beim 8085 nur direkte Adressierung verwendet und
beim 8086 auch eine indirekte?

Das war eine Frage des Konzepts.
Intel wollte weiterhin zu seinen Vorgänger-CPUs kompatibel bleiben.
Eigentlich war die ganze Linie 4004 -> 8008 -> 8080 -> 8086 kompatibel zum Vorgänger.

Um konkret zu werden:
Die Register müssen nur 16-Bit lang sein, mann kann aber 24-Bit Adressen erzeugen. Zur damaligen Zeit (8086 war 1976, zumindest die Datenblätter) waren 16MB wahnsinnig viel, eigentlich nur was für ganz grosse Grossrechner !!!

Eigentlich hatte man also eine 16-Bit CPU mit einer vorgeschalteten Speicherverwaltung (Paging MMU).
Das benötigte wesentlich weniger Transistoren als ein 24-Bit CPU.

Der Aufwand beschränkte sich eigentlich auf einen 8-Bit-Addierer, was recht einfach als Hardware zu realisieren ist.

MfG Peter(TOO)

Eigentlich war die ganze Linie 4004 -> 8008 -> 8080
-> 8086 kompatibel zum Vorgänger.

Kleine Korrektur: Der 4004/4040 hatte ein völlig anderes Adressierungskonzept als die 8008/8080-Linie. Man kann eher die 8048/8051-Linie als Nachfolger sehen. Ich vermute mal, das waren damals bei Intel einfach verschiedene Abteilungen.

Gruß
Bianca