Zahlensysteme

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.

Das Binärsystem bzw. Dualsystem

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

In der Zweier-Komplement-Darstellung sieht es hingegen schon viel besser aus:
        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.