Hello Martin,
Selbst Christian schreibt ja: "der Compiler sollte normalerweise Assembler-Code generieren...", hat also vermutlich auch noch nie nachgeschaut.
Ich halte ihm angesichts seines Alters zugute, dass er möglicherweise mit 16bit-Systemen keine allzu intime Bekanntschaft mehr gemacht hat.
Naja, dahinter dürfen wir uns ja auch nicht verstecken und werden hier ständig unter Druck gesetzt, uns mit den modernen[tm] Techniken auseinanderzusetzen ;-))
BTW: auf einigen meiner alten Möhrchen verwende ich auch noch Office 97 und bin damit zufrieden...
Haben die heutigen 64bit-CPUs (also IA64) einen 64bit-Adressbus, oder "nur" 64bit Datenbreite? Theoretisch müssten sie auch 64bit-Adressen haben, denn sonst könnten die ja auch wieder "nur" 4GB adressieren. Ich habe aber, ehrlich gesagt, keine Ahnung, wie die Speicherverwaltung und Segmentierung in IA64 organisiert ist. DASS es weiterhin eine Segmentierung gibt, wie auch in IA32, ist logisch, denn nur so kann man jeder Anwendung bzw. jedem Prozess seinen eigenen logischen Adressraum geben.
Das ging aber beim 8088 auch mit schmalem Bus. Der hatte dann eben für jede Adresse zwei Ladezyklen. Der Speichercontroller hatte dann wieder 20 (sic!) Bit Breite.
bezüglich Intel-Architektur:
Dass der erreichbare Speicherraum für eine geschlossene Struktur erstmal von der Registerbreite abhängig ist, ist logisch. Für den Segmentanteil gibt es ja im Protected Mode keine wirkliche Segmentadresse, sondern einen Deskriptor. Darüber kann man also nicht mehr durch den zugewiesenen Speicherbereich wandern, weil jeder Descriptor einen anderen Speicherbereich signiert.
Es bleibt also nur der Offset-Anteil der effektiven Adresse, um durch den zugewisenen Block zu geistern.
Wenn der Compiler nun größere Blöcke allokieren wollte, müsste er sich dafür mehrere Deskriptoren besorgen, die im einfachsten Falle nebeneinanderliegende Speicherbereiche beschreiben.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
