Forum: Mikrocontroller und Digitale Elektronik Adressierungsvorgang beim 8088


von Reiko (Gast)


Lesenswert?

Moin um diese frühe Stund. Doch einiges macht mir Kopfzerbrechen.

Weiß jemand, wie der Adressierungsvorgang beim 8088 aussieht? Bei einem
20 Bit Adressbus und einem 8 Bit Datenbus kann man doch nicht 1 MB
adressieren. Oder wird für die Adressierung ein WORD (=16 Bit)
verwendet. Wenn ja, dann als Offset oder als Segment?

Wie groß sind denn eigentlich die einzelnen Register beim 8088?

Reiko

von ---- (Gast)


Lesenswert?

2^20*8Bit=1MByte -> also kann man mit 20Adressleitungen 1MB
adressieren.
Registergröße: 8Bit afair.

----, (QuadDash).

von Gerhard Gunzelmann (Gast)


Lesenswert?

Hallo

laut Intel Microprocessors Data Book 1990:
8088: 8-Bit Prozessor mit interner 16-Bit Architektur. Register
8/16Bit:AH/AL = AX, BH/BL=BX...
20 Adressleitungen, gemultiplext mit 8 Bit Databus.

Wegen der Kompatibilität zu zum 8085 wurde der Speicher in 64KByte
segmentiert, die mit den Segmentregistern ES,CS,SS und DS einen 20Bit
Adressbus erzeugt. Damit ist 1MByte Speicher adressierbar (PC, IP, sind
16Bit Register, durch Überlappen mit Segmentregister entsteht 20 Bit
Adresse).

Gerhard

von Reiko (Gast)


Lesenswert?

Na super. Danke für die prompten Antworten. Jetzt sind mir einige Dinge
schon etwas klarer. Darf man mal fragen, was ihr beiden
"QuadDash" und "Gerhard Gunzelmann" beruflich macht, dass ihr euch
selbst in der Urzeit der CPUs derart auskennt?


Frage an Gerhard:
Wo bekommt man denn: Intel Microprocessors Data Book 1990 etc? Gibts da
noch welche zu früheren CPUs? Ich bin immer auf der Suche nach alter
Litaratur; meistens vergebens. Habe mir auch sagen lassen, dass die
technischen Bücher (CPUs betreffend) allesamt in englisch geschrieben,
seit Urzeiten aber nicht mehr erhältlich sind
Kennt/hat jemand von euch entsprechende Exemplare in deutsch?


Nemht mir meine Fragen nicht krum, aber wie ihr bestimmt auch wißt,
sind die Autoren etwas ungenau bei den Details, wenn sie jene überhaupt
erwähnen. Und aufgrund mangelnder Literatur, hab' ich halt kein
konkretes Bild von der Tatsachen ... zumal ich der Devise folge:
"Definitionen kann man nicht verstehen, nur das, was dahinter
steckt".
Und an das "dahinter" kommt man schwer heran :-(

Also, hier wieder einige Fragen:

1) Gerhards Zitat:
>> Wegen der Kompatibilität zu zum 8085 wurde der Speicher in 64KByte
segmentiert <<
=> Du meinst wohl, dass die CPU den Speicher in 64KB Segemente
organisiert. RAM ist doch eine unorganisierte Sequenz von Bytes.



2) Was heißt eigentlich "byte-adressierbar"?   Dass die CPU je ein
ganzes Byte pro Speicherzyklus liest?
Ist das der Grund für die 8Bit in QuadDashs Ausdruck: 2^20*8Bit = 1MB ?
Schafft eine CPU (egal welche) immer einen Datenzugriff von 8
Bit/Speicherzyklus?

____
Was ist der SpeicherZyklus genau? Worin unterscheidet er sich vom
Clock-Cycle? Dieser Begriffsunterschied wird auch in meinem Buch
erwähnt, aber nicht näher erläutert. Es heißt dort, der 8088 kann auf
ein Byte Daten pro memory cycle zugreifen.
Andererseits steht dort auch, dass er dafür 4 Clock Cycles braucht.
____


Um zu Punkt 2 zurückzukehren:
=============================
Ist Speicher heuzutage immer noch byte-adressierbar? Gibts 16- oder
mehr "bit adressierbare Speicher"? Wenn ja, dann wo?




3) Bei 16 Bitern ist der Speicher in gerade und ungerade Bänke
organisiert. Sind folgende Vermutungen richtig?

Diese CPUs schaffen es also pro Speicherzyklus auf 16 Bit zuzugreifen,
wobei der Speicher immer noch "Byte-adressierbar" ist/bleibt ???
=> Begriff "byte-adressierbar" hat nichts mit dem Zugriff auf die
Größe eines Datums zu tun (8 oder 16 Bit)?
   => Greife ich beim 16 Biter auf ein Word zu, welches nicht
      an seinen natürlichen Grenzen liegt, dann braucht die CPU also
      2 Operationen um legt somit 2 Byte-Adressen auf den Adressbus,
      da "byte-adressierbarer" Speicher.


So, das wars fürs erste. Vielleicht habt ihr ja sogar Spaß daran,
solche Fragen zu beantworten. Danke schon mal im Voraus ;-)

Reiko

von Gerhard Gunzelmann (Gast)


Lesenswert?

Hallo Reiko

"Na super. Danke für die prompten Antworten. Jetzt sind mir einige
Dinge
schon etwas klarer. Darf man mal fragen, was ihr beiden
"QuadDash" und "Gerhard Gunzelmann" beruflich macht, dass ihr euch
selbst in der Urzeit der CPUs derart auskennt?"

------> das ist mehr ein Frage des Alters, zumindest was mich betrifft.
Ich bin in den 80ern damit "aufgewachsen", und hab ab den 286ern
diese Dinger in Assembler programmiert.



"Frage an Gerhard:
Wo bekommt man denn: Intel Microprocessors Data Book 1990 etc? Gibts da
noch welche zu früheren CPUs? Ich bin immer auf der Suche nach alter
Litaratur; meistens vergebens. Habe mir auch sagen lassen, dass die
technischen Bücher (CPUs betreffend) allesamt in englisch geschrieben,
seit Urzeiten aber nicht mehr erhältlich sind
Kennt/hat jemand von euch entsprechende Exemplare in deutsch?"

--------> leider nein. das erwähnte Exemplar steht seit der zeit eben
noch bei mir rum. Deutsche Datenbücher von Intel sind mir nicht
bekannt. Und vor dem 8086 gabs noch keine 16-Bitter. 8080 und 8085 oder
der Zilog Z80 das waren die Vorgänger des 8086. die 8-Bitter eben.


"Nemht mir meine Fragen nicht krum, aber wie ihr bestimmt auch wißt,
sind die Autoren etwas ungenau bei den Details, wenn sie jene
überhaupt
erwähnen. Und aufgrund mangelnder Literatur, hab' ich halt kein
konkretes Bild von der Tatsachen ... zumal ich der Devise folge:
"Definitionen kann man nicht verstehen, nur das, was dahinter
steckt".
Und an das "dahinter" kommt man schwer heran :-(

Also, hier wieder einige Fragen:

1) Gerhards Zitat:
>> Wegen der Kompatibilität zu zum 8085 wurde der Speicher in 64KByte
segmentiert <<
=> Du meinst wohl, dass die CPU den Speicher in 64KB Segemente
organisiert. RAM ist doch eine unorganisierte Sequenz von Bytes."

-------> das war eben das Erfolgsrezept von Intel. In der Industrie und
im privaten Bereich standen damaös eben 8-Bitter mit zugehöriger
Software. Um diesen Kunden die Benutzung der alten 8-Bit Software zu
ermöglichen und trotzdem dem Neuen Platz zu machen haben die
Intel-Burschen die Segmentierung erfunden. Die alten 8-Bitter hatten
nur 16 Adressleitungen, konnten also nur 64k Speicher adressieren. Die
Software hat also ebefalls nur Adresssen mit 16 Bit verwaltet. Die
"neuen" Prozessoren mit 16Bit und dem Ziel jetzt 1Mbyte Speicher
adressieren zu können benötigten aber 4 Asressleitungen mehr. Die
Segmentierung sag also vor, daß der ProgramCounter nach wie vor 16 Bit
hat, aber um 4 Bit aus den Segmentregistern erweiter zu werden.
Ram ist in soweit nicht unorganisiert, daß es eben 64kbyte linearenm
physikalischen Speicher gibt. Gibt der Prozessor die Adresse 1000H aus,
wird eine ganz bestimmte Adresse angesprochen. Anders wurde das erst
nit der Erfindung des Virtuellen Speichers, den es aber erst ab dem
80286 gab.


"2) Was heißt eigentlich "byte-adressierbar"?   Dass die CPU je ein
ganzes Byte pro Speicherzyklus liest?
Ist das der Grund für die 8Bit in QuadDashs Ausdruck: 2^20*8Bit = 1MB
?
Schafft eine CPU (egal welche) immer einen Datenzugriff von 8
Bit/Speicherzyklus?"

-----------> richtig. Alle PC'S arbeiten heute noch Byte-orientiert.
das heißt auch ein Pentium 4 oder AMD XP Prozessor arbeitet
Byte-orientiert. Sonst könnte man nicht mehr auf ein einzelnes byte
zugreifen, bzw Byte-variable müßten immer auf einer Bestimmten Adresse
liegen, das heißt bei einem 32-Bit Prozessor mit 32 Adressleitungen
wäre die Adresse immer xxxxxxxx xxxxxxxx xxxxxxxx xx00 x = 1 Bit für 1
einzelnes Byte.
____
"Was ist der SpeicherZyklus genau? Worin unterscheidet er sich vom
Clock-Cycle? Dieser Begriffsunterschied wird auch in meinem Buch
erwähnt, aber nicht näher erläutert. Es heißt dort, der 8088 kann auf
ein Byte Daten pro memory cycle zugreifen.
Andererseits steht dort auch, dass er dafür 4 Clock Cycles braucht."

---------->Die alten Prozessoren brauchten immer mehrere Takt-Zyklen
(Clock-Cycles) um irgend eine Aktion - Speicherzugriff oder
Befehslausführung -  auszuführen.
____


"Um zu Punkt 2 zurückzukehren:
=============================
Ist Speicher heuzutage immer noch byte-adressierbar? Gibts 16- oder
mehr "bit adressierbare Speicher"? Wenn ja, dann wo?"

---------> Echte Bitzugriffs gibts nur bei Microkontrollern. Die
"normalen" Mikroprozessoren verwenden für Bit-Manipulationen logische
Befehle wie AND und OR. Abfolge: 1 byte lesen, logische Operation, byte
schreiben. Der Zugriff bei 32 Bit-Prozessoren erfolgt dabei mit 1 byte,
1 Word oder Doppelwort-Länge.




!3) Bei 16 Bitern ist der Speicher in gerade und ungerade Bänke
organisiert. Sind folgende Vermutungen richtig?

Diese CPUs schaffen es also pro Speicherzyklus auf 16 Bit zuzugreifen,
wobei der Speicher immer noch "Byte-adressierbar" ist/bleibt ???
=> Begriff "byte-adressierbar" hat nichts mit dem Zugriff auf die
Größe eines Datums zu tun (8 oder 16 Bit)?
   => Greife ich beim 16 Biter auf ein Word zu, welches nicht
      an seinen natürlichen Grenzen liegt, dann braucht die CPU also
      2 Operationen um legt somit 2 Byte-Adressen auf den Adressbus,
      da "byte-adressierbarer" Speicher.


So, das wars fürs erste. Vielleicht habt ihr ja sogar Spaß daran,
solche Fragen zu beantworten. Danke schon mal im Voraus ;-)
"
-----------> Deine Vermutung ist richtig. Wenn man z.B. mit Visual C
oder einem anderen Hochsprachen-Compiler arbeitet kann man bei den
Optionen immer das "Alignment" angeben. Gebe ich "BYte" an, wird
der Code zwar kompakter aber langsamer. Gebe ich beim 32-Bitter DWORD
an fürs Alignment, beginnen alle Vriablen auf einner Adresse, bei der
die 2 niederwertigsten Bits 0 sind. Damit "verschenk" zwar ein paar
byte Speicher, der Code ist dafür aber schneller.




gruß
Gerhard
Reiko

von Reiko (Gast)


Lesenswert?

Hallo.

>> Ram ist in soweit nicht unorganisiert, daß es eben 64kbyte linearenm
physikalischen Speicher gibt<<
Beziehst du diesen Satz auf den RAM für den 8086er oder allgemein auf
Speicher, der aus 64KB Chips besteht? Du meinst doch die Chips damit?

Andererseits versteh ich die Stelle so, dass wenn ich 1000h (=
4096d)adressiere, so mapped die Speicherbaustein-Logik diese Adresse
in die 4096-zigste Speicherstelle, die sich folglich im ersten 64KB
Chip befindet ?!
Geb ich 70000d ein, wo wird in die 70000-ste Zelle des 2ten Chips
geschrieben/ von dort gelesen. Das meinte ich mit dem unorganisierten
Speicher.
erster Chip:  Adressen 0-65535 (dezimal)
zweiter Chip: Adressen 65536-????? (dezimal) und so weiter.....
-------------------------------------------------------------------

Was ist denn nun der Unterschied zwischen "memory cycle" und "clock
cycle"?
-------------------------------------------------------------------

>> bei einem 32-Bit Prozessor mit 32 Adressleitungen wäre die Adresse
immer xxxxxxxx xxxxxxxx xxxxxxxx xx00 x = 1 Bit für 1 einzelnes Byte.
<<

>> ... beginnen alle Vriablen auf einner Adresse, bei der
die 2 niederwertigsten Bits 0 <<

Unter beiden Aussagen kann ich mir nichts vorstellen.
Im ersten Satz sehe ich 28 Bit, davon die letzten beiden 00. Wieso sind
es 28 statt 32 bit und weshalb müssen die letzten 2 Bits 00 sein?


Reiko

von Gerhard Gunzelmann (Gast)


Lesenswert?

Hallo


""Hallo.

>> Ram ist in soweit nicht unorganisiert, daß es eben 64kbyte
linearenm
physikalischen Speicher gibt<<
Beziehst du diesen Satz auf den RAM für den 8086er oder allgemein auf
Speicher, der aus 64KB Chips besteht? Du meinst doch die Chips damit?

Andererseits versteh ich die Stelle so, dass wenn ich 1000h (=
4096d)adressiere, so mapped die Speicherbaustein-Logik diese Adresse
in die 4096-zigste Speicherstelle, die sich folglich im ersten 64KB
Chip befindet ?!
Geb ich 70000d ein, wo wird in die 70000-ste Zelle des 2ten Chips
geschrieben/ von dort gelesen. Das meinte ich mit dem unorganisierten
Speicher.
erster Chip:  Adressen 0-65535 (dezimal)
zweiter Chip: Adressen 65536-????? (dezimal) und so weiter.....

>>>>>>>>>>> Also das "unorganisiert" versteh ich vielleicht falsch.
Für mich gibts kein unorganisiertes RAM. Vermutlich versteh ich Dich da
irgend wie falsch. Ich meine der Speicher des RAN ist in sofern
organisiert, daß der Prozessor Adressleitungen an den Baustein anlegt.
Die Speicherbausteine sind organisiert zu z.B. 64KByte*8 Bit. Das ist
das was ich unter "organisiert" verstehe. Aber vielleicht erklärst Du
was Du damit meinst.
Weiter: bei Mikroprozessoren ist es einfacher, wnn man bei
Hexadezimalen Zahlen bleibt: 1000h ist zwar 4096, aber bei der
Hex-darstellung sieht man gleich den binären Aufbau:
1000h = 0001 0000 0000 0000 binär. Sodann kommt es eben darauf an was
für Speicherchips verwendet werden. Wäre es wie oben beschrieben 1 Chip
der zu 64k*8 organisiert ist, so hätte der Chip 16 Adressleitungen und
die Adresse 1000h spricht eine Speicherzelle in diesen Chip an. 70000d
= 11170h = 0001 0001 0001 0111 0000 liegt damit ausserhalb des Chips,
und könnte, wenn es an einem 8-Bitter mit 16 Adressleitungen hängt, gar
nicht angesprochen werden (ausser mit Tricks).
<erster Chip:  Adressen 0-65535 (dezimal)
zweiter Chip: Adressen 65536-????? (dezimal) und so weiter.....>

>>>>>>>ist richtig



-------------------------------------------------------------------

Was ist denn nun der Unterschied zwischen "memory cycle" und "clock
cycle"?

>>>> Menory Cycle ist der Zugriff auf den Speicher. das heißt eine
Leseoperation mit Anlegen der Adresse und Lesen der Daten in den
Prozessor bzw eine Schreiboperation mit Anlegen der Aresse und
Schreiben der daten in das RAM. Jede solche Operation benötigt eine
bestimmte Anzahl an Clock-cycles. Ein Clock-cycle ist nichts anderes
als ein Takt des Oszillators oder Quarzes mit dem der prozessor
betriebn wird. beispiel: Der prozessor arbeitet mit einem 10MHz Quarz,
arbeitet also mit einem Clock-cycle von 10MHz = 100ns. Benötigt das
Lesen einer Speicherzelle (Memory-cycle) 12 clock-cycle, dann dauert
das lesen also 12*100ns = 1,2us.

-------------------------------------------------------------------

>> bei einem 32-Bit Prozessor mit 32 Adressleitungen wäre die Adresse
immer xxxx xxxx xxxx xxxx xxxx xxxx xx00 x = 1 Bit für 1 einzelnes
Byte.
<<

>> ... beginnen alle Vriablen auf einner Adresse, bei der
die 2 niederwertigsten Bits 0 <<

Unter beiden Aussagen kann ich mir nichts vorstellen.
Im ersten Satz sehe ich 28 Bit, davon die letzten beiden 00. Wieso
sind
es 28 statt 32 bit und weshalb müssen die letzten 2 Bits 00 sein?

>>>>> Auf dem ersten Blick erscheint das undurchsichtig, ist aber
eigentlich ganz einfach. Der 32-Bit Prozessor hat 32 datenleitungen,
die zu 4*8Bit organisiert sind. Ich sag jetzt mal "Reihen" dazu. Die
niederwertigste Reihe liegt an den Bits 0..7, die nächste an 8..15,
dann 16..23 und die höchstwertigste Reihe ist 24..31.  Die Adresse
00000000h adressiert das byte 0, aber auch das Word 0 oder das
Double-Word 0. Nehmen wir jetzt mal nur 32-Bit Daten, also Double-Word,
das aus 4 byte besteht. das erste 32-Bit-wort liegt also auf 00000000h,
das nächste dann auf 00000004h, dann 00000008, dann 00000010 usw.

Binäre Betrachtung der letzten Stellen
00h = 0000 0000
04h = 0000 0100
08h = 0000 1000
10h = 0001 0000
             ^^  diese beiden Adress-Leitungen sind bei 32 Bit-daten
immer 0, nur bei Byte-Adressierung innerhalb eines solchen double-words
werden sie verwendet. Bei 32-Bit-daten Adressierung wird also
tatsächlich nur mit 30 Adressleitungen gearbeitet. Die 28 die Du
gezählt hast kommen daher, daß ich 1*xxxx vergessen habe, sorry, es
sollten natürlich insgesamt 32 Bit werden und nicht 28.



gerhard

von Reiko (Gast)


Lesenswert?

Na, dann biste ja richitg zu beneiden. Ich hätte nichts dagegen, die
80er erlebt zu haben.

Jetzt versteh' ich. Da hab ich doch innerhalb nur eines Tages das
gelernt, was ich 2 Monate lang nicht verstanden habe.


Erstmal zum organisieren von RAM. Wenn ich vom organisieren des
Speichers spreche, dann meine ich damit nicht die hardwaremäßige
Organisation. In diesem Punkt, dass ein RAM auf Hardwarebasis
organisiert ist, hast du natürlich Recht.

Es heißt ja, dass ein RAM eine Sequenz von Speicherzellen ist, die
durchnummeriert sind. Das versteh ich unter unorganisiert, weil man
jede Zelle einzeln ansprechen kann.

Organisiert wäre, wenn der Hersteller den RAM "hardwaretechnisch" in
feste 65536 Segmente zu je 16 Byte einteilt (ähnlich wie die CPU),
sodass man dass erste Segment ausschließlich mit z.B. 1:15 anspricht,
wobei 15 der Offset ist.
Zweites Segment mit 2:??
Drittes    "     "  3:?? usw.
Die CPU passt sich an den RAM an.

Unorganisiert ist für mich also, dass sich der RAM an die CPU anpasst.
Er hat keine Struktur und die CPU dominiert ihn; sie kann ihn z.B.
mittels Segmente+Offset ansprechen oder mit Desktiptoren oder im
einfachsten Fall als Sequenz auffassen.
Bei letzerem wenn ich also 1000h eingebe, lande ich in der 1000h-sten
Zelle, bei 2 lande ich in der zweiten etc



Wie sieht es denn aus, wenn sich Segmente überlappen?
Welchen Nutzen bringt das? Oder ist es ein nebenläufiger Nachteil der
Segmentierung?

Mal angenommen, im RAM gibts 2 Datenobjekte (DW,W), welche in dieser
dieser Reihenfolge an folgenden Adressen beginnen und auch so
gespeichert wurden:

W  -> 193d
DW -> 190d

Das Problem dabei ist doch, dass wenn ich als zweites das DW speichere,
das L.O-Byte des W  vom H.O-Byte des DW überschrieben wird oder nicht?
Somit kann ich, wenn ich an der Adresse 193d mein ursprüngliches W
anfordere, nun einen anderen Wert bekomme. Das L.O-Byte des W ist ein
anderes, das H.O-byte des W bleibt allerdings dasselbe.

Aus diese Situation würde ihn nun interpretieren, dass das Überlappen
keinen Vorteil bringt, sogar die ganzen Daten zerstört. Ist doch so
oder?

Reiko

von Gerhard Gunzelmann (Gast)


Lesenswert?

Hallo Reiko

diese Frage muß mit einem klaren jein beantwortet werden. Wie ich ja
schon geschrieben hab, haben sich die Intel-Leute schon was dabei
gedacht - Stichwort:Abwärts-Kompatibilität der Software - aber wenn man
das aus Programmierer-Sicht betrachtet, ist es ein ziemlicher Mist.
Wenn ich z.B. Daten habe die mehr als 64kByte Platz brauchen, muß ich
mich um die Segmentierung kümmern. Aber Gott sei Dank gibts ausser
Assembler auch noch die Hochsprachen. Da gibt man sein Speichermodell
an, und läßt dann den Compiler arbeiten.

Nochmal zur Segmentierung: das Segmentregister hat ja 8 Bit

z.B: CS yyyyyyyy
     PC     xxxxxxxxxxxxxxxx

(so jetzt sollten sich nur 4 Stellen überschneiden)
Damit ist erkennbar, was man mit den Segmentregistern alles anstellen
kann. Wenn man die 4 unteren Bits auf 0 läßt und nur die oberen 4
verändert, dann hat man eben 16*64kByte zur Verfügung, wenn man aber
die unteren 4 manipuliert, gibts ne Überlappung, diese Bits werden zum
Program-Counter addiert, und da kanns dann rund gehen, wenn man nicht
aufpaßt.

Gerhard

von Gerhard Gunzelmann (Gast)


Lesenswert?

Ach ja

das Überschreiben von Daten:

Grundsätzlich kann ich - wenn ich nicht aufpasse immer daten
überschreiben:

variable a, byte, Adresse 1001h
variable b, word, Adresse 1000h

Da überschreibe ich variable a mit b, Aber das hat nicht mit der
Segmentierung zu tun. Angenommen ich habe 2 * 64KByte Speicher, die ich
mit den Segementregistern anspreche:

xx00yyyy ist Bank 0, ADresse 0...0FFFF
xx01yyyy ist Bank 1, Adresse 10000...1FFFF

wenn ich jetzt alle y zu 0 mache, gibts keine Probleme.
Auch wenn ich innerhalb eines Programmes die Segment-Register in Ruhe
lasse, gibts keine Probleme, aber wenn ich im Programm die
Segmentregister auf den unteren 4 Bit ändere, dann sollte man sich
vorher bewußt sein was man macht.

Bei den PC's war es bisher so üblich 3 Segmentregister zu verwenden:
das SS für den Stackpointer, DS für die Daten und CS für den Code.

Richtig spannend ist es ja nur, wenn der Code größer als 64 K wird und
im laufenden Programm das Segmentregister CS umgeschaltet wird.

Gerhard

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.