Verwechslung zwischen Registergröße, Adressgröße, Datengröße

Ich fing an, etwas über Zeiger in C++ zu lernen, und dachte mir, ich sollte mich ein wenig darüber informieren, wie Speicher funktioniert und wie auf sie zugegriffen wird. Ich habe gelesen, dass, wenn wir sagen, dass ein Prozessor 64-Bit ist, er ein 64-Bit-Register hat und auf 2^64 Adressstellen zugreifen kann. Ich habe auch gelesen, dass es 64/8 abrufen kann, also 8 Bytes Daten gleichzeitig, aber der Datenbus ist nicht dasselbe wie das Register, oder? Müssen sie die gleiche Größe haben oder ist das einfach der Fall? Und ist es die Größe des Registers oder die Größe des Datenbusses, die bestimmt, wie wir es bezeichnen, z. B. 32/64-Bit? Gibt es auch einen Unterschied zwischen Registergröße und Adressgröße?

Es gibt so viele Unterschiede und Varianten und Variationen, dass es fast nicht der Mühe wert ist, darüber nachzudenken, wie sie überhaupt zusammenhängen.

Antworten (2)

Wenn Sie sich auf 64-Bit oder 32-Bit beziehen, muss dies nicht nur eine Registerbreite oder Busbreite bedeuten. Sie können einen Bus so multiplexen, dass er 64 Bit in zwei Lesevorgängen oder vier Lesevorgängen usw. liest. Ein CPU-Design kann so kreativ sein wie der Ingenieur hinter den Logikblöcken. Ein gutes Beispiel ist der 8086 mit 20 Bit Adressraum und 16 Bit Datenbus. Die Software, die Sie in C++ schreiben, umschließt viele Schichten von Kompilierungs- und Hardware-Zustandsmaschinen, sodass diese abstrahiert werden. Beim RISC-Design werden Sie feststellen, dass Registerbreite und ALU-Breite fast immer gleich breit sind, aber beim CISC-Design muss dies nicht so sehr der Fall sein.

-1: Wenn wir eine Maschine mit N Bits bezeichnen, bezieht sich das meistens nicht auf den Speicheradressraum (das würde alle klassischen 8-Bitter als 16-Bitter klassifizieren!), sondern auf die dominante Breite der ALU, des Datenpfads und der Register.
Wouter hat Recht. Diese Antwort ist völlig falsch. Die meisten 8-Bit-CPUs haben zwischen 11 und 16 Bit Adressraum. Dann haben Sie das Problem, dass Harvard-Maschinen unterschiedliche Adressräume für Programm und Daten haben.
Ok, ich nehme an, dass es sich hauptsächlich auf den Adressraum bezieht. Das war kein großer Teil des Punktes, den ich gemacht habe, also ist es nicht "völlig falsch". Bei Intel-Systemen sagen wir 64-Bit/32-Bit, weil uns der Adressraum des Speichers interessiert. Wenn die CPU 32-Bit-Register verwendet, bedeutet das nicht, dass sie 64-Bit-Mathematik nicht unterstützen kann. Wenn Sie einen Mikroprozessor verwenden, sind Sie sich der tatsächlichen Hardware besser bewusst. In diesem Fall geben sie die Adressbreite und die Datenbreite an. In komplizierteren CISC-CPU-Designs arbeiten Sie sogar in Assembler-Code auf einer gewissen Abstraktionsebene.

Die Breite des Prozessors wird durch die Breite der Register im Inneren definiert. Die ALU kann die Register direkt verarbeiten. Die Datenbusbreite und die Adresskapazität definieren selten die Prozessorbits.

PS: Ein 32-Bit-Compiler und ein 64-Bit-Compiler liefern auf einer 64-Bit-Maschine unterschiedliche Ergebnisse.

Die ALU muss nicht die gleiche Breite wie der Adressraum haben. Sie können Carry-Bits und aufeinanderfolgende Additionen, Subtraktionen, Multiplikationen verwenden, um eine Schaltung zu entwerfen, die sich so verhält, als ob die Adressbreite dieselbe wäre wie die ALU-Breite und die Register usw. Schauen Sie sich den Intel 8086 an.
@ Matt Ja. ALU muss nicht die gleiche Breite wie der Adressraum haben
ALU muss nicht einmal die gleiche Breite wie die Register haben. Dies hängt alles von der Implementierung ab, aber wenn die Designer ein Diagramm beifügen, können Sie sich darauf als Referenz verlassen. Ich kann ein 32-Bit-Register und eine 16-Bit-ALU mit Zustandsmaschinen entwerfen und etwas erreichen, das sich anfühlt, als wären wir 32-Bit