Integrale Adresse - wer kann mit helfen?

Hallo,

und zwar mach ich grad nen PC-Kurs (Fernschule), staatlich anerkannt usw. Nun mein Problem:

Ich versteh das ganze mit der integralen Adresse nicht. Hat ja auch was mit programmieren zu tun (ich wusste nicht, wohin sonst mit der Frage).

  1. warum wird ein integrale Adresse auch integrale Grenzte genannt

  2. Warum ist die integrale Adresse eines 32-bit-Wortes durch 4 teilbar (steht so im Text, dass es durch 4 teilbar ist)

  3. Auszug: „Sind Informationsstrukturen so gespeichter, dass sie diese integralen Grenzen überlappen, so führt der i486 für jede Doppelwortüberlappung einen zusätzlichen Buszugriff aus. Das bedeutet naturgemäß eine Leistungsminderung. Deshalb sollten Datenstrukturen, die für die Verarbeitungsleistung maßgeblich sind, an integralen Adressen gespeichert werden.“
    Wie soll das durch eine integrale Adresse verhindert werden?

  4. Kennt ihr noch irgendwelche Online-Computerlexikons?

Bin dankbar für jeden Tipp

Wolfgang

Hallo Wolfgang

und zwar mach ich grad nen PC-Kurs (Fernschule), staatlich anerkannt usw.

Heisst sicher Fernschule, weil die Erklärungen etwas fern der Praxis sind :wink:.
Die ernsthafte Erklärung ist am ENDE des Textes!

Nun mein Problem:

Ich versteh das ganze mit der integralen Adresse nicht. Hat ja auch was mit programmieren zu tun (ich wusste nicht, wohin sonst mit der Frage).

  1. warum wird ein integrale Adresse auch integrale Grenzte genannt

  2. Warum ist die integrale Adresse eines 32-bit-Wortes durch 4 teilbar (steht so im Text, dass es durch 4 teilbar ist)

  3. Auszug: „Sind Informationsstrukturen so gespeichter, dass sie diese integralen Grenzen überlappen, so führt der i486 für jede Doppelwortüberlappung einen zusätzlichen Buszugriff aus. Das bedeutet
    naturgemäß eine Leistungsminderung.
    Deshalb sollten Datenstrukturen, die für die Verarbeitungsleistung maßgeblich sind, an integralen Adressen gespeichert werden.“
    Wie soll das durch eine integrale Adresse verhindert werden?

Also normalerweise wird das ganze mit ALIGN (ausrichten) bezeichnet und das Problem existiert nicht nur beim i486.

Also wenn du einen Prozessor mit einem 8-Bit Daten-Bus hast, dann hat jedes Byte eine eigene Adresse und der Prozessor muss für jedes Byte einen Speicherzugriff machen und das Problem existiert gar nicht!

Hast du aber einen Prozessor mit einem 16-Bit Bus so kann der Prozessor 2 Bytes auf einmal lesen. Der Speicher wird also nicht mehr nach Bytes adressiert, sonder ist in sogenannten WORTEN (hier 16Bit/Wort) organisiert.
Also Speicher-Adresse 0000 und 0001 bilden das erste WORT, 0002 und 0003 das nächste…
Willst du nun einen 16-Bit Wert aus dem Speicher lesen so gibt es 2 möglichkeiten, entweder es sind beide Bytes im gleichen Wort abgelegt (dein 16-bit Wert ist an einer geraden Adresse abgelegt; die Adresse ist also restlos durch 2 teilbar), dann ist das mit einem Zugriff erledigt oder aber das 1. Byte ist an Adresse 0001 und das 2. an 0003, dann muss der Prozessor 2 Speicherzugriffe machen und das braucht eben die doppelte Zeit.
Bei einem 32-Bit Bus ist dann die optimale Speicher-Adresse für einen 32-Bit Wert restlos durch 4 teilbar.

Normalerweise ist der Linker dafür verantworlich dafür zu Sorgen, dass die Variablen richtig an den Speicheradressen ausgerichtet werden.

Das ganze ist übrigens hautsächlich ein Intel-Problem, da ja MS-DOS für einen 8-Bit Prozessor geschrieben wurde, aber auch noch auf einem Pentium lauffen muss.
Andere Prozessoren erlauben es gar nicht erst z.B. 16-Bit Werte auf ungeraden Adressen abzulegen.

MfG Peter(TOO)

Hallo,

und zwar mach ich grad nen PC-Kurs
(Fernschule), staatlich anerkannt usw.

Weber ?

angenommen du hast einen datenbus mit einer breite von 32bit (4 byte)…
die ADRESSENBERECHNUNG wird darauf optimiert (weils schneller ist). er teilt seinen speicher in „seiten“ zu je 4byte auf.

jetzt speichert der compi ein 32bit datenwort ab:
adr 1: bit 0-7
adr 2: bit 8-15
adr 3: bit 16-23
adr 4: bit 24-31
-> alles ok…
der compi kann alle 32bit in einem rutsch über seinen bus jagen.

jetzt wird erst ein 16bit-wort aund dann ein 32bit-wort gesichert:
adr 1: (16) bit 0-7
adr 2: (16) bit 8-15
adr 3: (32) bit 0-7
adr 4: (32) bit 8-15
adr 5: (32) bit 16-23
adr 6: (32) bit 24-31
-> hoppla…
versucht der compi jetzt die adresse des 32bit-wortes zu berechnen, so stellt er fest, daß er die seitengrenze von adr4 zu adr5 überschreitet. er muß also ZWEI adressen berechnen:
berechne adresse 1
übertrage 4byte
die ersten 2 byte verwirf (das ist das 16bit-wort)
berechne adresse 2
übertrage 4byte
verwirf die letzen 2 byte
erstelle aus den ersten und letzen beiden byte das wort

es ist ersichtlich, daß diese sache sehr aufwendig - und damit langsam ist -.

die ausrichtung auf integrale adressen bewirkt nun folgendes:
adr 1: (16) bit 0-7
adr 2: (16) bit 8-15
adr 3: leer
adr 4: leer
adr 5: (32) bit 0-7
adr 6: (32) bit 8-15
adr 7: (32) bit 16-23
adr 8: (32) bit 24-31

-> nu is wieder alles ok
jetzt braucht der compi zwar mehr speicher, aber er kann ohne aufwendige adressberechnung auf die daten zugreifen.

ich hoffe ich war einigermaßen verständlich
DiJey