Zahlensysteme in DOS umrechnen

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 erzeugt

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