Wie in unserem Einführungskapitel »Umgang mit anderen Zahlensystemen« versprochen, zeigen wir Ihnen jetzt ein Programm, mit dem Sie ganze Zahlen unterschiedlichster Systeme ineinander umrechnen können. SYS2SYS wandelt die als Parameter angegebene Zahl des Quellsystems in die entsprechende Zahl des Zielsystemes um und zeigt diese auf dem Bildschirm an. Dabei darf der Parameter allerdings keine Zeichen zur Unterteilung der Zahl (Leerzeichen oder Punkt) enthalten, die gerade bei größeren Zahlen den Überblick erleichtern. Die Zahlenbasen von Quell- und Zielsystem stehen im Listing am Ende des eigentlichen Assembler-Textes. Die Zeile beginnt mit »DW« beginnt und endet mit zwei Angaben: Der erste Wert bezeichnet das Zahlensystem aus der die umzurechnende Zahl stammen soll. Der zweite Wert bestimmt das Zielsystem, in welchem das Programm die Zahl auf dem Bildschirm anzeigen soll. Sie können wie bereits erwähnt zwei völlig beliebige Zahlenysteme verwenden – also auch Systeme mit einer größeren Basis als 16.
Die einzige Einschränkung resultiert aus der Notwendigkeit, die umzurechnende Zahl mit »sichtbaren« ASCII-Zeichen darstellen zu müssen. Hexadezimale Zahlen bestehen bekanntlich aus den Ziffern von 0 bis 9 und den Buchstaben A bis F. Für größere Zahlensysteme brauchen Sie zusätzliche Buchstaben. Ein System mit der Basis 17 müßte demnach noch den Buchstaben G als mögliche Ziffer erhalten. Mit Z (sinnvollerweise für ein Zahlensystem mit der Basis 36) dürften Sie hart an der Grenze des Überschaubaren angelangt sein. Obwohl das Programm auch mit größeren Zahlen fertig wird, sollten Sie diese Grenze nicht überschreiten, weil Sie sonst mit Sonder- und Grafikzeichen arbeiten müßten – ein leicht verwirrendes Unterfangen.
Die Wandlungskapazität von SYS2SYS ist auf Zahlen beschränkt, die sich mit 32 Bit darstellen lassen (0 bis 4.294.967.295). Zum Einlesen des umzurechnenden Wertes verwendet SYS2SYS eine spezielle Routine, die eine 32-Bit-Zahl mit einer 16-Bit-Zahl multipliziert. Der Multiplikator ist die Basis des ursprünglichen Zahlensystems. Zum Ergebnis gelangt SYS2SYS über eine Divisionsroutine mit den umgekehrten Eigenschaften. Diese besondere Berechnung ist deshalb notwendig, weil der Mikroprozessor 8086 bzw. 8088 bei der Division nur 16-Bit-Ergebnisse verarbeiten kann. Der Versuch, 655.360 durch 10 zu teilen, würde z. B. bereits einen »Overflow«-Interrupt auslösen, der auch nach einer für Computer »haarsträubenden« Division durch Null in Aktion tritt. Durch geschickte Kaskadierung mehrerer Divisonsanweisungen kann SYS2SYS aber eine 32-Bit-Zahl durch eine 16-Bit-Zahl dividieren, ohne daß ein solcher Interrupt wegen Überlaufs auftritt. Das Eregbnis dieser Division ist daher auch wiederum eine 32-Bit-Zahl. Als Divisor verwendet SYS2SYS die Basis des gewünschten Zielsystems, die ebenso wie die Basis des Quellsystems natürlich ungleich Null, ja sogar größer als eins sein muß. Eine genauere Beschreibung der verwendeten Routinen finden Sie in Anhang »Für den Programmierer…«.
Erzeugen Sie mit SYS2SYS am besten für alle Richtungen der drei gängisten Zahlensysteme 6 ausführbare Programme: DEZ2HEX-, HEX2DEZ-, DEZ2BIN-, BIN2DEZ-, HEX2BIN- und BIN2HEX.COM. Verändern Sie dazu die Zeile »nSYS2SYS.COM« entsprechend in »nDEZ2HEX.COM« für ein Programm zur Umwandlung von dezimalen Zahlen in hexadezimale, »nHEX2DEZ.COM« für den umgekehrten Weg und so weiter. Die Zeile »DW…« ersetzen Sie durch die für die gewünschte Umwandlung gültigen Werte, die Sie der Tabelle in Bild # entnehmen können.
Quell- | Ziel- | Name | Werte |
Basis | Basis | ||
10 | 16 | NDEZ2HEX.COM | DW A,10 |
16 | 10 | NHEX2DEZ.COM | DW 10,A |
10 | 2 | NDEZ2BIN.COM | DW A,2 |
2 | 10 | NBIN2DEZ.COM | DW 2,A |
16 | 2 | NHEX2BIN.COM | DW 10,2 |
2 | 16 | NBIN2HEX.COM | DW 2,10 |
Name: | SYS2SYS.DEB |
Funktion: | Wandelt eine Zahl eines beliebigen Zahlensystemes inein anderes System um. Aus dem hier abgedruckten Grund- programm sollten verschiedene COM-Programme für beide Richtungen der drei gängigsten Zahlensysteme 6 erzeug werden. |
Übersetzung: | DEBUG <SYS2SYS.DEB |
Prüfsumme: | 3323 |
Anwendung: | z. B. DEZ2HEX WertWert: Eine dezimale Zahl zwischen 0 und 4.294.967.295 oder HEX2BIN Wert Wert: Eine hexadezimale Zahl zwischen 0 und FFFF FFFF oder BIN2DEZ Wert Wert: Eine binäre Zahl zwischen 0 und
1111 1111 1111 1111 1111 1111 1111 1111 |
Einschränkungen: | Die umzurechnende Zahl muß eine mit 32 Bit darstellbare ganze Zahl sein. |
A XOR DX,DX ;100 XOR CX,CX ;102 MOV BX,81 ;104 CMP By[BX],D ;107 JZ 15B ;10A CMP CL,9 ;10C JBE 114 ;10F SUB CL,27 ;111 MOV BP,AX ;114 MOV AX,DX ;116 MUL Wo[15C] ;118 DB 95 MUL Wo[15C] ;11D ADD AX,CX ;121 ADC DX,BP ;123 INC BX ;125 MOV CL,[BX] ;126 OR CL,20 ;128 SUB CL,30 ;12B JNB 10C ;12E MOV BP,AX ;130 MOV AX,DX ;132 XOR DX,DX ;134 DIV Wo[15E] ;136 DB 95 DIV Wo[15E] ;13B XCHG BP,DX ;13F PUSH BP ;141 MOV BP,AX ;142 OR BP,DX ;144 JZ 14B ;146 CALL 130 ;148 POP DX ;14B ADD DL,30 ;14C CMP DL,39 ;14F JBE 157 ;152 ADD DL,27 ;154 MOV AH,2 ;157 INT 21 ;159 RET ;15B DW A,2 RCX 60 NSYS2SYS.COM W Q
Quelle: 200 Utilities für PC-/MS-DOS von Gerhard Schild und Thomas Jannot