Wie der Rechner rechnet

weitersagen ...
Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedIn

Rechnen mit Binärzahlen.

Die unterschiedlichen Zahlensysteme und die boolschen Operatoren sollten jetzt ja bekannt sein, aber wie der Computer (in diesem Fall die 6510 CPU) rechnet wissen wir immer noch nicht.

Die Addition

Beginnen wir einfach damit zwei Binärzahlen zu addieren.

Wir addieren also so wie wir es in der Schule gelernt haben, nur dass wir schon bei %10 bzw. 2 einen Übertrag für die nächste Stelle erhalten.

Kurzer Hardware-Ausflug: Passt das Ergebnis nicht mehr in 8-Bit, so wird im Statusregister des Prozessors das Carry-Flag (Übertrag) gesetzt (= 1), passt das Ergebnis in 8-Bit wird das Carry-Flag gelöscht (= 0). Das Carry-Flag dient also so zu sagen aushilfsweise als neuntes Bit. Mit dem Carry-Flag können wir z. B. 16-Bit Additionen realisieren, die unsere 8-Bit CPU ja nicht beherrscht.

Die Subtraktion

Der Prozessor ist so dumm, dass er nicht mal ‚normal‚ subtrahieren kann, er addiert stattdessen immer eine negative Zahl. Dazu kehrt er das Vorzeichen der zu subtrahierenden Zahl einfach um und addiert diese dann.
Mit unseren 8-Bit lassen sich bekanntlich Zahlen von 0 bis 255 abbilden. Da die CPU nur Binärzahlen verarbeiten kann, stellt sich nun die Frage, wie man, wenn man nur nullen und einsen zur Verfügung hat, ein Vorzeichen abbildet?
Die Lösung ist recht einfach, der Prozessor verwendet das höchste Bit (also Bit-7) zur Unterscheidung, ob es sich um eine positive oder negative Zahl handelt. Da wir dieses Bit aber auch benötigen um Zahlen über +127 darzustellen, ist das Vorzeichen von unserer Interpretation abhängig. Im Programm müssen wir also entscheiden, ob wir die Zahl als vorzeichenbehaftet oder als vorzeichenlos betrachten wollen.
Sorry, aber hier ist ein erneuter Ausflug in die Hardware angebracht: Um das Erkennen des Vorzeichens zu erleichtern, gibt es im Prozessor ein spezielles Flag (das Negativ-Flag). Dieses Flag wird immer dann gesetzt (= 1), wenn wir mit einer Zahl arbeiten, bei der das 7. Bit gesetzt ist (die also negativ ist) und gelöscht (= 0) wenn das Bit nicht gesetzt ist. Vereinfacht gesagt, es enthält den gleichen Wert wie das höchste Bit der Zahl mit der wir gerade arbeiten.
Da das höchste Bit für die Vorzeichenerkennung benutzt wird können wir mit unseren 8-Bit also einen vorzeichenbehafteten Wertebereich von -128 bis +127 abbilden.

Werft doch mal einen Blick auf die folgende Tabelle, um zu sehen, wie diese unterschiedliche Interpretation aussieht.

Wie kann man nun die Vorzeichenumkehr vornehmen?
Als Beispiel dient mal wieder die gute alte 42 / $2A / %00101010, versuchen wir nun das Vorzeichen umzukehren, um auf -42 zu kommen.

Da wir schon wissen, dass das höchste Bit zur Kennzeichnung einer negativen Zahl verwendet wird, könnte man nun meinen, dass es reicht dieses einfach zu setzen.

Wie wir an der Gegenprüfung, durch Addition der beiden Zahlen sehen, stimmt das nicht, statt 0 kommt -44 raus. Es muss also einen anderen Weg geben.

Die CPU bildet als erstes das sog. Einerkomplement, das heißt wir kehren die Nullen und Einsen einfach um. Dabei wird wieder, wie eben, automatisch das höchste Bit gesetzt, wenn wir von plus nach minus wechseln, bzw. im umgekehrten Fall gelöscht.

Wir scheinen der Lösung näher zu kommen, aber unsere Gegenprüfung ist immer noch nicht Null. Das Problem wird durch das Zweierkomplement behoben, dabei wird zum Einerkomplement noch eins addiert.

Endlich, wie erwartet kommt bei unserer Gegenprüfung 0 heraus. Den Übertrag können wir hier bei unserer 8-Bit-Addition ignorieren, darum müssen wir uns kümmern, wenn wir z. B. 16-Bit-Operationen implementieren möchten.

Da ich behauptet habe, die CPU kann nur addieren, muss also auch bei einer negativen Zahl durch das Zweierkomplement das Vorzeichen korrekt umgewendelt werden. Wenn man z. B. 42 – -42 rechnen möchte, kehrt der Prozessor (wie oben erwähnt) das Vorzeichen der zweiten Zahl um und addiert diese dann zur ersten. Es wird also 42+42 gerechnet. Kontrollieren wir mal ob die Umkehr des Vorzeichens auch bei einer negativen Zahl funktioniert.

Overflow

Da sind wir also, wir können nun addieren und subtrahieren, haben das Carry- und Negativ-Flag kennengelernt, dann wenden wir unser neues Wissen doch gleich nochmal an.
Rechnen wir noch etwas und gehen davon aus, dass unsere Zahlen auch mal ins Negative reichen. Wie es der Zufall aber so will, haben wir jetzt zwei positive Zahlen, die wir addieren möchten…

Ooops, was ist denn hier passiert?
Durch die Addition wurde das 7. Bit gesetzt, es wurde also versehentlich das Kennzeichen für eine negative Zahl gesetzt. Hier kommt meine Aussage von oben zum Tragen, dass wir selbst entscheiden müssen, wie wir die Zahlen interpretieren. Gehen wir hier von vorzeichenbehafteten Zahlen aus, dann ist das Ergebnis offensichtlich falsch. Bei diesen liegt der Wertebereich (wie bereits erwähnt) zwischen -128 und +127. Unser Ergebnis sprengt diesen Bereich, es kommt zum Overflow (Überlauf), ohne auf die Vorzeichen zu achten wäre es korrekt, da wir es dann als 138 werten würden.

Hardware-Alarm: (zum letzten Mal auf dieser Seite, versprochen 😉 )
Um den Overflow zu erkennen, gibt es wieder ein Flag im Statusregister, es ist das OVerflow-Flag. Nun wird es aber nicht einfach immer gesetzt, wenn wir einen Übertrag von Bit 6 nach 7 haben, sondern nur den folgenden Bedingungen:

  1. Es findet nur ein Übertrag von Bit 6 nach 7 statt, aber kein gleichzeitiger Übertrag ins Carry-Flag.
    Das trifft auf unser Beispiel von eben mit 67+71 zu!
  2. Es findet kein Übertrag von Bit 6 nach 7 statt, aber einer ins Carry-Flag.
    Dies ist z. B. bei der Addition von zwei negativen Zahlen möglich:
         %10000000 (-128)
       + %11100000 ( -32)
     ——————–
    %(1)01100000 ( +96)
    Hier wurde ‚versehentlich‚ das Bit 7 gelöscht und wir erhalten plötzlich eine positive Zahl. Es hat zwar einen Übertrag ins Carry-Flag gegeben, aber von Bit 6 nach 7 gab es keinen, daher wird das Overflow-Flag gesetzt.

Ihr werdet jetzt bestimmt denken, aber ich kann mir doch nicht immer genau überlegen, welche Zahlen wann, wo auftreten können. Doch!
Ihr müsst euch beim Programmieren immer vor Augen halten, was für Werte die jeweilige Rechnung benötigt und zurückliefert. Zählt ihr z. B. die Punktzahl des Spielers hoch, dann wird eure Punktzahl wohl nie negativ (ihr zieht max. mal Starpunkte ab, aber unter Null wird die Punktzahl wohl nie fallen), schreibt ihr aber eine Wirtschaftsimulation, in der das Konto auch mal zeitweise ins Minus fallen kann, dann müsst ihr euch wohl oder übel um die negativen Zahlen kümmern. Davon, dass ein max. Wert von 255 für beide Zwecke viel zu klein ist, will ich erst gar nicht reden.
Einige Probleme lassen sich durch Verwendung von 16 oder gar 32 Bit Zahlen umgehen, aber da wir einen 8-Bit-Prozessor vor uns haben, müssen wir uns darum selbst kümmern und dürfen dabei auch nicht die Geschwindigkeit unseres Programmes  vernachlässigen.

Multiplizieren und dividieren

Tja, was soll ich sagen, wer sich den Befehlssatz des 6510 angesehen hat, wird es schon wissen: Der Prozessor kann das überhaupt nicht! Diese Rechen-Operationen müssen von euch bei Bedarf selbst implementiert werden oder ihr greift auf vorhandene Routinen (z. B. vom BASIC) zurück.

Abschließend bleibt noch anzumerken, dass unsere CPU natürlich auch nicht mit Kommazahlen umgehen kann. Für diese gilt das Selbe wie für Multiplikation und Division, selbst ist der Mann (bzw. die Frau).
Spätere CPUs haben erst durch mathematische Co-Prozessoren und schließlich durch Integration dieser in die eigentliche CPU viel mehr Möglichkeiten beim Umgang mit Zahlen.

 


Schrott!!Naja...Geht so...Ganz gut...SUPER! (8 Bewertungen | Ø 4,88 von 5 | 97,50%)

Loading...


<<< zurück | weiter >>>

 

weitersagen ...
Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedIn

2 Gedanken zu „Wie der Rechner rechnet“

Schreibe einen Kommentar


Beachtet bitte, dass ich eure Kommentare erst manuell freigegeben muß, bevor sie auf der Seite erscheinen! Da ich nicht pausenlos am Rechner sitze, kann es schon mal etwas dauern, bis ein Kommentar für alle sichtbar ist.

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Protected by WP Anti Spam