Maschinensprache i8086/ CPU-Register/ Architektur

Aus Wikibooks

Die Halbleitertechnologie erlaubte im Jahr 1978, als die i8086 CPU entstand, nicht wesentlich mehr als die darin enthaltenen 29000 Transistoren. Die Entwickler mussten sparsam damit umgehen, um alle notwendigen Funktionen zu realisieren. Intel hat es geschafft, mit 14 Registern alle notwendigen Funktionen abzudecken. Allerdings gibt es keine zwei Register mit identischer Funktion. Es gibt keine Universalregister, sondern nur Spezialregister. Das ist am Anfang verwirrend und schwierig zu lernen. Warum hat Intel diese Architektur gewählt?

Nicht alle Transistoren wurden für die Grundfunktionen benötigt, ein Teil blieb übrig. Was hat Intel mit den übriggebliebenen Transistoren gemacht bzw. nicht gemacht? Hier eine kleine Wunschliste der damaligen Systemarchitekten:

  • Eine schnellere Arithmetik
  • größere Möglichkeiten für zukünftige Erweiterungen
  • Universalregister
  • Cache-Speicher

Schnellere Arithmetik[Bearbeiten]

Beim Addieren kann in jeder Stelle ein Übertrag entstehen, der an alle höheren Stellen durchgereicht wird. Bei einem einfachen 16-Bit-Addierwerk kann das bis zu 17 Takte dauern. Es gibt natürlich Schaltungen, welche den Übertrag schneller berechnen und die Addition in der halben Zeit oder schneller erledigen. Sogar eine Addition in einem einzigen Takt ist möglich - allerdings wird der Schaltungsaufwand gewaltig. Ähnliche Hardware-Beschleunigungen sind an vielen anderen Baugruppen der CPU möglich. Wie die verfügbaren Transistoren auf die „Beschleunigungsvorhaben“ aufgeteilt werden, wird mit mathematischen Modellen optimiert.

Erweiterungsmöglichkeiten[Bearbeiten]

Der erste IBM-PC wurde mit 64 kByte RAM ausgeliefert. Die CPU war jedoch bereit, mit bis zu 640 kByte RAM zu arbeiten. Faktor Zehn für Erweiterungen - das war weit in die Zukunft geschaut! Zehn Jahre später, im Jahr 1990, hatten die meisten PCs bereits eine 286-er CPU, aber nur 512 kByte RAM - weniger als die maximal mögliche Bestückung. Intels Fähigkeit und Bereitschaft, nicht zu kleckern, sondern zu klotzen, trug wesentlich zum Siegeszug des IBM-PCs bei. Der PC wurde dadurch von einer schnelllebigen Mode zu einer relativ langfristigen Investition.

Universalregister[Bearbeiten]

Betrachten wir als einführendes Beispiel das Arithmetikregister. Das Rechenwerk schickt das Ergebnis jedes Arithmetik-Befehls ins AX_Register. Wird der Wert in einem anderen Register gebraucht, muss er mit einem MOV-Befehl dorthin kopiert werden. Es wäre doch prima, wenn das Rechenwerk auf Wunsch des Programmierers das Ergebnis auch direkt in jedes andere Register schicken könnte!

Im Prinzip wäre das möglich. Einerseits müsste die direkte Verbindung vom Rechenwerk zum AX-Register getrennt und eine Verteilerschaltung eingeschoben werden, welche zwischen mehreren Ziel-Registern wählt. Andererseits würde auch die Schaltung der Register aufwändiger, weil mehr Signalquellen angeschlossen werden. Beide Schaltungsmaßnahmen vergrößern die Signallaufzeit. Außerdem müsste in jedem Befehl angegeben werden, wohin das Ergebnis geschickt werden soll.

Ziehen wir Bilanz: Die Schaltung wird umfangreicher und die Signallaufzeiten wachsen. Der CPU-Takt müsste verringert werden. Die Programme werden länger, was die CPU-Leistung weiter reduziert. Und das alles nur, damit es die Programmierer einfacher haben?

Die Zweckbestimmung der Register und die darauf maßgeschneiderten Befehle ermöglichen kurze, elegante Programme. Nehmen wir als Beispiel den Befehl „LOOPZ“. Er ist nur ein Byte lang und macht folgendes:

  1. SI-Register um 1 erhöhen (Quelladresse)
  2. DI-Register um 1 erhöhen (Zieladresse)
  3. CX-Register um 1 verringern (Schleifenzähler)
  4. Wenn CX-Register = 0, Schleife beenden
  5. Wenn AX-Register = 0, Schleife beenden
  6. Andernfalls Schleife wiederholen

Wenn man die Register entgegen ihrer Zweckbestimmung einsetzt, wäre das recht unpraktisch. Beispielsweise könnte ich das BX-Register durchaus als Schleifenzähler verwenden. Allerdings würde das Programm sehr lang, unhandlich und langsam.

Cache[Bearbeiten]

Die i8086 CPU hatte noch keinen Cache. 29000 Transistoren reichten dafür nicht aus. Die Technologie war aber bereits erfunden. Cache wurde schon in den 70er Jahren in manchen Großrechnern eingesetzt. Im Jahr 1970 war die mathematische Modellierung und Optimierung von Cache-Speichern bereits Thema von studentischen Diplomarbeiten. Dabei stellte sich heraus, dass ein Cache eine bestimmte Mindestgröße haben muss, andernfalls bremst er das System, statt es zu beschleunigen. Erstmals beim i80386 mit seinen 275.000 Transistoren wurde es möglich, einen Teil der Transistoren abzuzweigen, um einen internen Cache und die Steuerung für einen externen Cache einzurichten.

Siehe auch:  Register