Verwirrung: Wikibooks 2³²
-
noch eins (ich wiess ich bin hart): adressleitungen bedeutet, dass (bei 32bit z.b.) 32 pins(?) vorhanden sind, welche eigentlich als 32 bits gesehen werden können? durch diese 32 adressleitungen (also 32 bits) werden dann physikalisch die einzelnen bit zustände durchgejagt und das gerät am ende des bus erhält dann physikalisch den 32 bit binärcode? somit bei einer adressleitungen natürlich die adresse in physikalischer binärform.
wenn dies hin kommt, stimmt sicher auch folgendes: demnach gibt es also auch eine andere (namens?) leitung, wahrscheinlich die datenleitung, welche auch 32 bits hat. dort liest und schreibt dann der prozessor in physikalischer form die bit zustände. dies erklärt dann auch unser hier besprochenes 4 byte / lesevorgang. somit weiss ich dann auch wo man das lesen/schreiben auf physikalischer ebene (also wirklich da, wo es um anfassbaren strom geht)nachvollziehen kann.
-
treppe schrieb:
nun kann man mit einem 32 bit prozessor 2^32 mögliche (4.294.967.296) adressen benutzen.
richtig.
treppe schrieb:
und jetzt kommts: da im RAM jeweils immer genau 1 byte adressiert wird, spricht man von 4.294.967.296 byte. egal ob eine adresse aus 1,2,4 oder gar 8 bytes besteht. hab ichs jetzt endlich?
fast. bei den x86'ern ist es so, aber auf 'ner anderen architektur könnten unter einer adresse auch 2, 3 oder 4 bytes sein. die adresse selbst ist nur eine fortlaufende nummer, sagt aber nichts darüber aus was adressiert wird.
treppe schrieb:
und wenn man von adressieren spricht, meint man das im speicher eine 1 byte zelle mit einem wert hinterlegt wird, welcher die obige adresse aus 4 bytes bestehend, enthält. ja?
nein, im speicher an adresse x steht irgendwas und nicht die adresse selber. die adresse muss auch nirgends hinterlegt sein. stell dir eine strasse ohne hausnummern vor. zu haus 15 gelangst du, wenn beim ersten haus anfängst zu zählen, das ist haus #0, das nächste ist #1 usw. wenn du dich irgendwann gut in der strasse auskennst, dann brauchste nicht mehr zählen, sondern hast dir gemerkt, wo welches haus ist. wenn du 'nem computer sagst: 'hole mir was von adresse 913513', dann 'weiss' er auch sofort, wo er's finden kann.
-
@supertux: zunächst einmal vielen lieben dank für deine bemühung. tolles bild!
. klar ist mir das ganze ja schon ich sehe es ja auch so wie du es dort auf dem bild darstellst. was mich zu anfang verwirrt hat, waren schlussendlich die 4 bytes einer adresse. und du selber schreibst ja nun:
Wenn ich eine Adresse im Speicher ablegen will, dann benötige ich 4 Bytes.
mit ablegen meinst du jetzt als wert oder? dann sind das natürlich 4 bytes. aber ist es denn nun so, dass adressen garnie im speicher als wert vorhanden sind? sprich kommt es inetwa so hin wie in meinem posting vor +fricky geschrieben? also eine variable hat keine im speicher hinterlegte adresse, sondern nur den wert welcher an den zellen verteilt ist und die zellen sind die adressen? bei einem pointer nichts anderes, nur das der pointer als wert eben eine adresse in 4 bytes gespeichert hat, auf den er zeigt.
-
treppe schrieb:
mit ablegen meinst du jetzt als wert oder? dann sind das natürlich 4 bytes. aber ist es denn nun so, dass adressen garnie im speicher als wert vorhanden sind? sprich kommt es inetwa so hin wie in meinem posting vor +fricky geschrieben?
es widerspricht frickys Poist nicht. Du kannst Adressen im Speicher speichern, wenn du willst, musst du aber nicht. Darum geht es. Deine Verwirrung entsteht, weil du denkst/dachtest, dass die Adressen selber im Speicher angelegt/gespeichert werden. Aber Adressen selber sind nur eine Zahl, ein Name, mehr nicht. Deine Hausnummer ist auch nur eine Nummer, du kannst sie aber niederschreiben und dir vor der Tür ein Schildchen mit der Nummer stellen. Du kannst du auch zum Nachbarn gehen und dort ein Schild hängen: das Haus #10 ist das da gegenüber.
Der Memory Controller selber weiß, wo jede Adresse sich befindet. Der Programmier, der sich eine Adresse für die Zukunft merken muss, wird sie auch als eine Computerzahl darstellen und diese Darstellung speichern. In diesem Fall benötigst du eben 32 Bits für ihre Darstellung, also 4 Bytes.
-
hui, jetzt wirds durcheinander
. aber ich merke, scheinbar verstehe ich es nun da mein obiger text genau das beschreibt was +fricky nun sagte. wenn jetzt z.B. folgendes definiert wird:
int i = 1;
wird im speicher 1 byte hinterlegt, weil es 00000001 sein müsste. oder aber doch 4 bytes, weil es ein integer ist, dann 00000000 00000000 00000000 00000001. korrekt? dann machen wir jetzt folgendes:
int i = 2343289400; int *p_i = &i;
jetzt hat p_i die adresse von i. sagen wir die adresse ist 1. nun möchten wir den wert von p_i. der wert ist also an adresse 1. da der prozessor (nein, der compiler oder?), nun weiss, dass an der adresse auf welche p_i zeigt, ein 32 bit integer wert ist, wird die adresse 1, 2, 3 und 4 ausgelesen und zusammengehängt ergibt das sagen wir: 01100111 01100111 01100111 01100111, also unser wert von 2343289400. kommt das hin? der compiler muss also wissen das der wert von 2343289400 an 4 zellen abgelegt wurde, da es sich um einen 32 bit integer wert handelte.
wenn man nun ein char im speicher ablegt, welcher 0 bis 255 als integer im speicher hinterlegt, also 1 byte, dann müsste da nun nur eine zelle mit 8 bits belegt werden. beim zugriff auf diesen wert weiss der compiler wahrscheinlich, es handelte sich um einen char, also lese auch nur eine adresse aus, bzw. lese 4 zellen aus, behandle aber nur die erste zelle. korrekt?
-
@supertux: ja jetzt ist das thema endlich klar. thanks a lot!
-
Zum Wohle der Allgemeinheit schlage ich vor, diesen Thread zu löschen. Wenn den ein anderer Anfänger findet, würde er mit Sicherheit daran zerbrechen!
-
Safety First Gopher schrieb:
Zum Wohle der Allgemeinheit schlage ich vor, diesen Thread zu löschen. Wenn den ein anderer Anfänger findet, würde er mit Sicherheit daran zerbrechen!
ja, wäre gut.
-
warum sprechen eigentlich viele programmierer von "eine variable selbst hat eine adresse und der wert hinter der variable hat eine adresse" wenn dem doch nicht so ist? jetzt ist klar das nicht eine variable eine adresse hat, sondern nur der wert, der hinter einer variable verborgen ist, eine bzw. mehrere adressen hat.
-
Wer sagt das? Eine Variable ist höchstens eine Adresse.
-
+fricky schrieb:
abc.w schrieb:
Um die Verwirrung um den 32 Bit Adressbus noch mehr zu verstärken: Wenn man sich das Datenblatt vom 80386 anschaut, findet man "nur" 30 Adressleitungen, also "nur" 30 Bit...
Wie macht er denn das bloss mit 32 Bit?
stimmt das? ich dachte, die x86'er wurden von 32 auf 36 adressleitungen aufgemotzt. die älteren modelle 286/386 hatten weniger, 16 der 286'er und 24 der 386'er SX, der DX hatte doch bereits 32 adressleitungen, oder nicht?
Ja, der 386er DX hat 32 Adressleitungen, nur 30 sind wirklich als Pins da, A2..A31, und die Adressbits A0..A1 werden noch intern dekodiert und erscheinen als 4 "Byte enable" Pins (BE0...BE3)... um noch mehr Leute hier durcheinanderzubringen
-
treppe schrieb:
warum sprechen eigentlich viele programmierer von "eine variable selbst hat eine adresse und der wert hinter der variable hat eine adresse" wenn dem doch nicht so ist? jetzt ist klar das nicht eine variable eine adresse hat, sondern nur der wert, der hinter einer variable verborgen ist, eine bzw. mehrere adressen hat.
Ja, das ist alles verwirrend. Manchmal sagt man mir, schlage mal das Buch auf der Seite 25 auf. Das mache ich auch, alles klappt wunderbar. Ich finde die Seite mit der Seitenzahl 25 und wundere mich, warum ist die nächste Seite 26?
Die könnte doch genauso gut 25 sein, genau wie die Seite, die ich gefunden habe! Und dann frage ich mich immer, warum bekommt jede Seite eine eigene Seitenzahl. Man könnte doch genauso gut gleich 4 Seiten nehmen und sie alle mit der Seitenzahl 25 versehenDann hätte ich vier Seiten mit der Seitenzahl 25. Und 25 ist deutlich mehr als 24, aber weniger als 26. Was mache ich bloss falsch
-
im buch ist zwar jede seite adressierbar, wie im ram auch jedes byte. du kannst mit "seite 25" eine seite eindeutig beschreiben. aber du kannst immer nur eine doppelseite aufschlagen und der ansicht zur verfügung stellen, so wie immer nur 4 bytes auf einmal in den prozessor hüpfen können.
-
-
scherzkekse
also von mir aus kannst du den thread löschen volkard. stimme da "Safety First Gopher" selber zu.
-
ah, eine frage doch noch schnell: warum kann der pentium 2 64 gb speicher adressieren? der hat doch einen 32 bit adressbus
-
Schau mal im Datenblatt, Pentium 2 hat einen 36 Bit Adressbus...
-
achso stimmt. nur die register grösse betrifft 32 bit. ich sehe gerade die datenbus breite beträgt sogar 64 bit. das erklärt, warum der 36 bit durch den (grösseren) datenbus überhaupt ausgenutzt werden können. sehe ich das richtig? sprich: wenn der datenbus nun 32 bit wäre, dann wären 4 bit von den 36 bit garnicht nutzbar und ergo hätte der prozessor nur eine adressiermöglichkeit von 4 gb?
-
eine blöde frage noch am rande: die prozessorregister sind in ihrer ausführung jeweils auch nur einmalig vorhanden oder? also z.B. das ax register gibt es auch nur einmal mit 32 bit z.B.? das wiederum heisst, jede anwendung die vom prozessor gerade ausgeführt wird, kann auch nur pro takt das gleiche register nutzen oder? angenommen ich schreibe:
mov ax, 10h ;im register ax ist nun der hexadezimalwert 10 hinterlegt mov ax, 20h ;jetzt ist dort der wert 10 nicht mehr sondern 20 int 21h;
dann ist das so zu verstehen? also vielmehr sinn würde eher sowas machen:
mov ax, 10h ;im register ax ist nun der hexadezimalwert 10 hinterlegt int 21h; mov ax, 20h ;jetzt ist dort der wert 10 nicht mehr sondern 20 int 21h;
damit jeder wert der in ax ist auch einen nutzen hatte? was passiert wenn ich in ein prozessor register mehr als 32 bit schreibe?
-
treppe schrieb:
sprich: wenn der datenbus nun 32 bit wäre, dann wären 4 bit von den 36 bit garnicht nutzbar und ergo hätte der prozessor nur eine adressiermöglichkeit von 4 gb?
Nein, so ist es nicht. Das geht irgendwie mit "Physical Address Extension", weiss selbst nicht genau, wie...
treppe schrieb:
eine blöde frage noch am rande: die prozessorregister sind in ihrer ausführung jeweils auch nur einmalig vorhanden oder?
Ja! Zumindest tut die CPU so, als wären die Register für Dich als Programmierer nur einmalig vorhanden...
treppe schrieb:
was passiert wenn ich in ein prozessor register mehr als 32 bit schreibe?
Dann muss es sich bei dem Register um ein Register mit mehr als 32 Bit Breite handeln, anders geht es nicht, weil der Befehlssatz es so nicht unterstützt. So viel Freiheit hast Du da nicht. Der Befehlssatz gibt Dir die Grenzen vor, in denen Du dich bewegen darfst. Der Phantasie aber natürlich sind keine Grenzen gesetzt...