5. Technik: Aufbau eines Rechners

An dieser Stelle wollen wir einen Ausflug in die Niederungen des Rechners machen – das Wissen, wie (jedenfalls ungefähr) ein normaler Rechner aufgebaut ist (man spricht dabei gerne von einem Von-Neumann-Rechner, im Gegensatz zu einem Harvard-Rechner, in dem Code und Daten in separaten Speichern liegen) wird helfen, das Design von C zu verstehen.

Stark vereinfachte Skizze eines modernen Rechners:

Er besteht aus dem

  • Prozessor (der CPU, Central Processing Unit), mit allgemeinen und speziellen Registern – das sind ein paar Byte Speicher, auf die der Prozessor besonders schnell zugreifen kann und die eventuell auch noch eine spezielle Bedeutung für ihn haben – und der Arithmetic and Logic Unit (ALU), die die eigentliche Rechnung macht (in der Tat haben moderne Prozessoren normalerweise eine Handvoll von denen, und dazu noch eine FPU, die Fließkommarechnungen macht, und dazu noch Gerätschaften, die auf andere Operationen spezialisiert sind, z.B. MMX oder AltiVec),
  • dem Hauptspeicher, in dem Daten und Programme liegen (etwa im Normalfall unsere Variablen) – der Speicher ist heute fast immer in Bytes eingeteilt, und jedes Byte hat eine Nummer, seine Adresse,
  • zwischen CPU und Hauptspeicher einige Caches, deren Funktion ist, der CPU häufig gebrauchte Daten schneller zur Verfügung zu stellen, als es relativ billiger Hauptspeicher kann,
  • einem Bus zur Kommunikation zwischen CPU und “Peripherie”, also Festplatten, dem Netzwerk, der Tastatur, dem Bildschirm usf. Meist kann die Peripherie auch direkt mit dem Speicher sprechen (DMA, Direct Memory Access), was ProgrammiererInnen im Zweifel das Leben schwer machen kann.

Dieses Bild ist beliebig vereinfacht, ist aber genau genug, um uns später zu helfen, das Verhalten von C-Programmen und auch klassische Kompromisse, die beim Programmieren so anfallen, zu verstehen.

Was sind die Spezialregister?

  • PC: Program Counter – die Adresse des augenblicklich ausgeführten Maschinenbefehls.
  • SP: Stack Pointer – die Adresse der augenblicklichen “Oberkante” des Maschinenstacks
  • Flags: Eine Sammlung von Bool’schen Informationen. Darin steht z.B., ob bei einer Rechnung ein Überlauf eingetreten ist, ein Übertrag vorliegt, Null herausgekommen ist, welche Rechte der gerade laufende Prozess hat und vieles mehr.

Vieles kommt in diesem Modell nicht vor, etwa Memory Management (die Übersetzung von logische in physikalische Adressen, Speicherschutz) und Interrupts, mit denen z.B. die Peripherie die CPU über Wünsche informieren kann. Fürs erste soll das aber reichen.

Wir werden uns nachher (leider) an der x86-Architektur von Intel orientieren, wenn wir uns CPUs genauer ansehen. Auf dieser haben auch die nicht-speziellen Register lustige Namen, die zum Teil nur noch historische Bedeutung haben.

An für uns relevanten Registern gibt es in solchen CPUs ax (gern auch als Akkumulator bezeichnet, woran noch eine Unzahl von Befehlen erinnert, die nur mit ax gehen), bx, cx (das c sollte mal an Counter erinnern), dx, si (das soll an Source Index errinnern), di (analog Destination Index) und bp (Base Pointer). Diese Register existierten schon in den alten Tagen des 8086, der 16-bit breite Register hatte. Die Namen, wie ich sie jetzt hingeschrieben habe, beziehen sich dann auch nur auf die “unteren” 16 bit dieser Register. Seit dem 80386 haben aber alle x86-Prozessoren (mindestens) 32-bittige Register, die durch Voranstellen eines “e” gekennzeichnet werden, aus ax wird also eax. Im Fließtext werde ich keinen Unterschied zwischen ax und eax machen, im Code natürlich schon.

Tatsächlich gab es etliche dieser Register schon im längst vergessenen 8-bit-Prozessor 8080. Der hat z.B. das ax-Register nochmal zerlegt in ah und al (a high und a low, die oberen und unteren 8 bit). Es ist kaum zu glauben, aber auch der neueste und schickste Pentium 27 kennt noch ah und al von 1974.

Schon das ist alles absurd genug, um zu bedauern, dass die x86-Architektur nicht mit dem 80286 untergegangen sind.

Übungen zu diesem Abschnitt

Ihr solltet euch wenigstens an den rötlich unterlegten Aufgaben versuchen

(1)

Schraubt euren Rechner auf (ich bin nicht verantwortlich, wenn ihr etwas kaputt macht) und seht (ggf. anhand eines Handbuchs zum Motherboard oder geeigneter Hilfen aus dem Netz, die ihr euch vorher besorgt habt), ob ihr darin die CPU und den Hauptspeicher, vielleicht auch Hinweise, dass es etwas wie einen Bus gibt, vielleicht auch einen Cache findet.


Markus Demleitner

Copyright Notice