Theorie
 
 
 
 
 
Computertechnik

 
 
 
 

Zahlen beschreiben elektrische Signale

 
 

.. BCD-Zahlen

 
 

 
 
 
 

Ungepackte BCD-Codierung
BCD bedeutet Binary Coded Dezimal oder binär verschlüsselte Dezimalzahl. Es handelt sich hierbei, wie der Begriff schon sagt, um einstellige, dezimale Zahlen 0-9, die binär in einem Speicher abgelegt wurden. Es können also die Binärinhalte 0000, 0001, bis 1001 vorkommen. Darüber hinausgehende Binärinhalte sind nicht möglich. Wandelt man einstellige Dezimalzahlen zu Binärzahlen, so benötigen diese ein Halbbyte (ein Nibble), oder 4 Bit. Dieses Halbbyte wird an der untersten Stelle eines Bytes abgelegt. Die oberen 4 Bit müssen den Wert 0 erhalten und werden bei der ungepackten, normalen BCD-Codierung nicht benutzt.

Nun können in 4 Bit insgesamt 16 einstellige Zahlen abgelegt werden. Bei der Hexadezimalcodierung sind dies die einstelligen Zahlen 0-F. Im dezimalen Zahlensystem beginnt man aber nach 9 bereits, Zahlen aus zwei Ziffern zu kombinieren. Es gibt also hinter 9 keine weitere einstellige Zahl. Da die Definition der BCD-Codierung aber nur einstellige Zahlen zulässt, bleiben die Bitkombinationen 1010, 1011, 1100, 1101, 1111 unbenutzt, derweil sie nicht auftreten dürfen und können.

Sollen normale zweistellige BCD-codierte Zahlen abgelegt werden, so wird von jeder Ziffer ein Byte benutzt. Die Zahl 36 würde im Speicher also zwei Byte mit den Werten 00000011 (3) und 00000110 (6) belegen. Die grösste zweistellige Zahl hätte den Wert 00001001 (9) 00001001 (9).

 
 
 

Gepackte BCD-Codierung
Die Aufteilung einzelner Ziffern für dezimale Zahlen auf je ein Byte, so wie es bei der ungepackten, normalen BCD-Codierung geschieht, benötigt eine Menge Speicherplatz. Da nun eine dezimale Ziffer nur ein Halbbyte belegt, liegt die Überlegung nahe, das hohe Halbbyte ebenfalls mit einer dezimalen Ziffer zu füllen. Dies geschieht und man kann nun zweistellige BCD-Zahlen in einem Byte unterbringen. Man spricht hierbei von einer gepackten BCD-Zahl. Die gepackte Version der Zahl 36 würde 00110110 (36) lauten und die von 99 10011001. Kombinationen mit den oben genannten, ungültigen Bitkombinationen 0101 .. 1111 bleiben weiterhin verboten, bzw. sind keine gültigen BCD-Codierungen.


 


Probleme mit der BDC-Codierung
Probleme treten unmittelbar dann auf, wenn man mit BCD-codierten Zahlen rechnen will. Schon bei der Addition einstelliger Zahlen ergeben sich Schwierigkeiten wenn das Ergebnis größer als 10 wird. CPUs, beherrschen normalerweise die Addition im hexadezimalen bzw. binären Zahlensystem. Die Addition von 5 + 7 würde zu dem Ergebnis 12 führen was sich binär durch .. 00000101 + 00000111 = 00001100 darstellen würde. Das Ergebnis wäre also weder die normale BCD-Codierung von 12, noch eine gepackte Darstellung. In der normalen BCD-Darstellung hätte das Ergebnis 00000001 00000010 lauten müssen, in der gepackten BCD-Darstellung 00010010.

Zumindest für die gepackte Darstellung ist eine Lösung des Problems schnell zu erkennen. In dem Moment, wo das Ergebnis der Addition zweier einstelliger BCD-Zahlen grösser wird als 9, muss zu dem entstandenen hexadezimalen Wert, der Versatz 6 addiert werden. Dies führt bei obigem Beispiel und auch bei den anderen 'übergelaufenen' BCD-Ergebnissen größer 9 zu der richtigen gepackten Darstellung. Im Beispiel: 00010010.
Um die richtige BCD-Normalcodierung zu erreichen wäre in einem zweiten Schritt die Verschiebung des oberen Nibbles der gepackten Form in ein eigenes Byte notwendig.

Die gleiche Problematik tritt auf, wenn gepackte zweistellige BCD-Zahlen addiert werden. Beispiel: 45 + 57 = 102. BCD-codiert und durch die CPU berechnet .. 01000101 + 01010111 = 10011100 (falsche gepBCD 9C). Da das niedrige Halbbyte grösser ist als 9, muss der Versatz von 6 addiert werden. Das führt zu 1010 0010 (A2). Das niedrige Halbbyte besitzt jetzt das richtige BCD-Ergebnis. Leider ist durch den Übertrag zwischen niederem und hohem Halbbyte, das hohe Halbbyte von 9 auf A angewachsen. Hier hilft zur Korrektur die Addition von 60. Durch den damit erreichten Versatz des hohen Halbbytes ergibt sich das richtige Ergebnis 1 0000 0010. Dabei steht die 1 im CarryFlag und muss in das niedrige Halbbyte eines zweiten Bytes übertragen werden.

Die oben geschilderten Probleme treten natürlich auch bei der Subtraktion, Multiplikation und Division von BCD-Zahlen auf. Einige Prozessoren, darunter auch der 80x86 besitzen allerdings bereits Maschinenbefehle, welche die notwendigen Korrekturen vereinfachen.


 


Verwendung von BCD-Zahlen
BCD-codierte Zahlen treten manchmal bei meßwertgebenden Bauelementen auf. Typische Beispiele sind Temperatursensoren oder die Echtzeituhren von Computersystemen. Der Vorteil liegt hier in der optionalen Anwendung dieser Baugruppen zusammen mit Anzeigeeinheiten. Bei der üblichen Arithmetik in Computern wird man die BCD nicht zwingend verwenden wollen.




www..de