Dezimale Zahlen in Register einlesen

Ebenso wichtig wie das Anzeigen einer Zahl ist es, eine im Parameter übergebene Dezimalzahl in ein Register einzulesen, um sie weiter verarbeiten zu können.

Dabei kommt uns, wenn wir uns wieder auf 8-Bit-Zahlen beschränken, ebenfalls einer dieser selten beachteten Befehle zugute: Es ist der Komplementärbefehl zu »AAM«, »AAD« (»ASCII Adjust for Division«). Er multipliziert den Inhalt von AH mit 10, löscht AH und addiert das Ergebnis der Multiplikation zu AL. Zum Einlesen einer Zahl mit beliebig vielen Stellen eignet sich am Besten eine Umkehrung des eben beschriebenen Algorithmus zum Anzeigen einer Zahl. Dabei werden sämtliche Ziffern aufsummiert, wobei vor jeder Addition die bereits ermittelte Summe mit 10 multipliziert wird. Natürlich muß vor dem Eintritt in die Schleife das Summenregister gelöscht werden. Das Ende der Zahl ist dadurch gekennzeichnet, daß das gelesen Zeichen keine Ziffer mehr darstellt. Das folgende Beispielprogramm liest eine als Parameter angegebene Dezimalzahl ein und gibt das zugehörige ASCII-Zeichen auf den Bildschirm aus:

A
MOV SI,5D       ;100 Parameter dem 1.FCB entnehmen
CLD             ;103 AH ist bereits 0
AAD             ;104 AL+AH*10 nach AL
MOV AH,AL       ;106
LODSB           ;108 Ziffer lesen
SUB AL,30       ;109 ASCII->binär
JNC 104         ;10B Ende der Zahl?
MOV DL,AH       ;10D dann Zeichen anzeigen:
MOV AH,2        ;10F DOS-Funktion
INT 21          ;111
RET             ;113

RCX
14
NDEMO5.COM
W
Q

Für größere Zahlen läßt sich auch dieser Alogrithmus erweitern, sodaß anstelle des AAD eine 16-Bit-Multiplikation tritt. Diese Änderung wollen wir hier aber nicht näher ausführen — als Beispiele für die Anwendung dieser Routinen seien stellvertretend die Tips CONVERT.DEB und RECHNE.DEB aus dem Kapitel »Andere Befehle« erwähnt.

Quelle: 200 Utilities für PC-/MS-DOS von Gerhard Schild und Thomas Jannot

Matomo