| Vorheriges Kapitel (Prozessoraufbau) | Nächstes Kapitel (Variablen und eingebaute Datentypen) |
Wie Sie sicherlich wissen, handelt es sich bei unserem normalen
Dezimalsystem um ein sogenanntes Stellenwertsystem. Auch wenn wir darüber
nicht nachdenken, berechnet sich der Wert der Zahl 4512 aus folgender
Rechnung:
4*10^3 + 5*10^2 + 1*10^1 + 2*10^0 = 4000+500+10+2 = 4512
Standardmäßig ist TASM auf das Dezimalsystem eingestellt, d. h. alle Ihre
Zahlenangaben beruhen auf der Basis 10.
Unter TASM können Sie von der Assembliererseite aus noch mit drei weiteren
Basen arbeiten: Basis 2 (binär), Basis 8 (oktal) und Basis 16 (hexadezimal /
hexadekadisch / sedezimal).
Um dem Assemblierer mitzuteilen, daß Sie einen bestimmten Zahlenwert nicht
dezimal interpretiert haben möchten, müssen Sie der Zahl einen das
Zahlensystem kennzeichnenden Buchstaben anhängen. Im Dezimalsystem ist dies
das d (in der Standardeinstellung unnötig), im Binärsystem das b, im
Oktalsystem das o und im Hexadezimalsystem das h. Soll die Zahl 12 also ein
hexadezimaler Wert sein, dann muß sie 12h geschrieben
werden.
Nun läßt sich die Standardeinstellung (Basis 10) natürlich noch auf eine der
anderen Zahlenbasen einstellen. Dies wird durch die Anweisung RADIX
n erreicht, wobei n eine der vier Basen 10, 2, 8 oder 16 ist.
Allerdings verbirgt sich hier ein kleiner Stolperstein, der bei der
Fehlersuche vielleicht überhaupt nicht ins Auge fällt:
Wenn mittels RADIX 16 die hexadezimale Interpretation eingestellt
und dann an einer Stelle der Wert 1D verwendet wird, im guten Glauben, die
(dezimale) Zahl 29 zu verwenden, dann wird dieser Wert jedoch aufgrund des
nachgestellten D als Dezimalzahl interpretiert, also 1.
Es ist zu beachten, daß Zahlen vom Assemblierer nur dann als solche erkannt werden, wenn sie mit einer Ziffer beginnen. Die hexadezimale Zahl FFFFh wird also als Symbol (Variable, Sprungmarke, Prozedurname etc.) interpretiert und führt, wenn es nicht aufgefunden wird, zu einer Fehlermeldung. Um die Interpretation als Zahl durchzusetzen, muß eine 0 (Null) vorangestellt werden: 0FFFFh.
Genau wie im Dezimalsystem lässt sich auch im Binärsystem der Wert
einer Zahl errechnen, nur dass hier mit Zweierpotenzen gerechnet wird.
Nehmen wir die Zahl 00101101 als Beispiel. Die beiden links stehenden Nullen
können weggelassen werden, ebenso wie im Dezimalsystem haben führende
Nullen keinen Einfluss auf den Zahlenwert. Das rechte Bit hat die Position 0
(Null), die Position steigt von rechts nach links. Der Wert eines einzelnen Bits
errechnet sich aus 2^Position. Von rechts nach links ergibt sich für die
gesetzten Bits also 2^0=1 + 2^2=4 + 2^3=8 + 2^5=32. Dezimal ergibt dies 45.
Im Binärsystem können auch gebrochene Zahlen dargestellt werden.
Nehmen wir diesmal die Zahl 101,101101b. Die Zahl vor dem Komma (5d) sollte keine
Probleme bereiten. Die Ziffer hinter dem Komma hat die Position 1 (eins), nicht
Null. Die Position steigt von links nach rechts. Der Bitwert ergibt sich aus
2^-Position. 2^-1=0,5 + 2^-3=0,125 + 2^-4=0,0625 + 2^-6=0,015625 = 5,703125.
Es sei an dieser Stelle deutlich darauf hingewiesen, dass das Binärsystem
bestimmte Zahlen nicht richtig darstellen kann. Schon eine im Dezimalsystem sehr
leicht darstellbare Zahl 0,1 ist binär nur als Näherungswert darstellbar,
der aufgrund der endlichen Registerbreite ungenau gerundet bleiben muss. Beim
weiterrechnen mit diesem Wert, z. B. Potenzieren, wird auch der Fehler potenziert.
Dies kann insbesondere dann zu Problemen führen, wenn sie auf einen bestimmten
Wert vergleichen - so kann es passieren, dass dieser Sprung aufgrund der
Rundungsdifferenzen nie ausgeführt wird.
Bei negativen Zahlen übernimmt das höchstwertige Bit die Aufgabe des
Vorzeichens - ist es gesetzt, dann handelt es sich um eine negative Zahl. Dadurch
ergibt sich zwangsweise der kleinere Wertebereich gegenüber vorzeichenlosen
Werten mit der gleichen Bitzahl. Die 80x86-Familie verwendet für negative
Zahlen die sogenannte Zweier-Komplement-Darstellung. Das Zweier-Komplement ergibt
sich aus der Negierung der kompletten Bits und Addition einer Eins. Das bedeutet
gleichzeitig, dass das Vorzeichenbit nicht nur ein einfacher Schalter ist. Ein
Beispiel soll dies verdeutlichen.
Die Zahl 9d entspricht 00001001b. Wäre das Vorzeichenbit ein einfacher
Schalter, dann wäre -9d gleichbedeutend mit 10001001b. Mit dieser Zahl ist es
allerdings nicht mehr über eine normale Addition möglich, 9 + -9 zu
berechnen:
00001001b ; 9
+10001001b ; nur Vorzeichenbit gesetzt
---------- ; die Addition funktioniert wie im Dezimalsystem
=10010010b
= 146d
00001001b ; 9
11110110b ; alle Bits negiert, entspricht NOT
+00000001b ; 1 addieren
----------
11110111b ; fertiges Zweier-Komplement
00001001b ; 9
+11110111b ; +(-9)
----------
00000000b ; hier gibt es einen Ueberlauf, der aber ignoriert wird
Wie sie sehen wird die negative Zahl genauso behandelt wie die positive, es ist
kein Extra-Rechenschritt oder gar ein anderes Rechenwerk notwendig.
An dieser Stelle muss dringend betont werden, dass der Prozessor keine Ahnung hat, ob er eine negative oder eine positive Zahl addiert. Das wissen haben nur sie, entsprechend sind sie auch für die korrekte Interpretation des Ergebnisses verantwortlich. Wie das obige Beispiel zeigt, entsteht ein Überlauf, der in diesem Falle ignoriert werden kann. Wenn die beiden Bitfolgen jedoch als vorzeichenlos betrachtet werden, dann werden hier die beiden Zahlen 9d und 247d addiert. Das Ergebnis 256d (100000000b) passt nicht mehr in ein Byte. Für ein korrektes Ergebnis ist die Betrachtung des Überlaufs, der hier durch das Carry-Flag angezeigt werden wird von entscheidender Bedeutung. Im Kapitel über die Arithmetischen Befehle wird auf die möglichen Flagstellungen nochmal eingegangen.
Wenn das Vorzeichenbit gesetzt ist können sie auch folgende Eselsbrücke
verwenden: Mit x Bits lassen sich 2^x Zustände anzeigen. Setzen Sie ein Minus
vor diese Potenz. Addieren sie zu dieser Zahl den Betrag der Zahl im 2er-Komplement.
Bei einer Zahl mit maximal acht Bit ergibt sich: -(2^8) + 247 = -256 + 247 = -9.
| Vorheriges Kapitel (Prozessoraufbau) | Nach oben | Nächstes Kapitel (Variablen und eingebaute Datentypen) |
| Zum Inhaltsverzeichnis | ||
| Zur Startseite |