;Eingabe von HexZahlen, Umwandlung nach BIN, Ausgabe als ASCII DEC.
;by Marcus Roming (c) 2001.
.MODEL Small ;EXE-Datei
.STACK 100h
.286 ;wegen pusha+popa
.DATA
Msg1 DB "HEX --> DEC. Geben Sie die Hex-Zahl ein: $"
CR_LF DB 10,13,"$" ;Anf. nächste Zeile
Puffer1 DB 6 DUP (?) ;Puffer für Ausgabeproz.
Puffer STRUC ;Puffer für Numin
Max DB 6
Anz DB ?
Txt DB 6 DUP (?)
Puffer ENDS
Buffer Puffer <> ;Speicher für Puffer
.CODE
Start: mov ax,@data ;Datenseg. initialisieren
mov ds,ax
mov dx,OFFSET Msg1
mov ah,09h
int 21h ;Msg1 anzeigen
call NumIn ;Nummer eingeben
jc Fehler ;Zahl zu groß
mov dx,OFFSET CR_LF
mov ah,09h
int 21h
mov ax,cx ;CX nach AX
call Ausgabe ;Nummer ausgeben
Fehler: mov ah,4Ch
int 21h ;Prog. beenden
NumIn PROC NEAR ;Eingabeproz.
push ax bx dx si di ;geht nur bei TASM
mov dx,OFFSET Buffer
mov ah,0Ah
int 21h ;Zahlenstring einlesen
xor cx,cx ;CX=0
mov cl,Buffer.Anz
mov si,cx
mov bx,OFFSET Buffer+1
add bl,Buffer.Anz ;Ende des Zahlenstrings
adc bh,0 ;Falls Überlauf
mov di,1 ;DI=1=Faktor f. Ziffer
xor cx,cx ;CX=0
cmp Buffer.Anz,0 ;Gar keine Eingabe?
je NullZ
LoopA: mov al,[bx] ;Ziffer bei BX nach AX
xor ah,ah ;AH=0
cmp ax,96 ;Kleiner Buchstabe?
jng Weiter1
sub ax,87 ;ASCII nach BIN Buchstabe!
jmp Fertig
Weiter1:
cmp ax,64 ;Großer Buchstabe?
jng Weiter2
sub ax,55 ;ASCII nach BIN Buchstabe!
jmp Fertig
Weiter2:
sub ax,30h ;ASCII nach BIN Zahl!
Fertig:
mul di ;AX*DI=DX:AX DX immer 0
jc NullZ ;Überlauf, Zahl zu groß
add cx,ax ;CX=CX+AX
mov ax,di ;AX=DI
mov di,16 ;di=16
mul di ;AX*DI=DX:AX DX immer 0
mov di,ax ;DI=AX, DI ist Faktor!
clc ;Lösche CF0
dec bx ;BX-1
dec si ;SI-1
jnz LoopA ;SI = 0 ?
NullZ: pop di si dx bx ax ;Nur bei TASM
ret ;Zurück zum Hauptprog.
Numin ENDP ;Ende der Proz.
Ausgabe PROC NEAR ;Ausgabeprozedur
pusha ;Register sichern
xor cx,cx ;CX=0=Zeichenzähler
mov di,OFFSET Puffer1+6 ;DI an Pufferende
mov bx,10 ;Nachher durch 10 dividieren
Loop1: xor dx,dx ;DX=0
div bx ;AX/10, Rest in DX bzw. DL
add dl,30h ;DL nach ASCII
dec di ;DI-1
mov [di],dl ;ASCII Ziffer in Puffer
inc cx ;CX+1
cmp ax,0 ;Ist AX=0 ?
jne Loop1 ;Springe wenn nein
mov ah,40h ;Funktionsnummer
mov bx,1 ;Handle-Nummer
mov dx,di ;DS:DX auf String!
int 21h ;ASCII-Zahl ausgeben!
popa ;Register wiederherstellen
ret ;und zurück!
Ausgabe ENDP ;Ende Prozedur
END ;Ende Programm
END Start ;Ende des Programms+
¤ Dauer der Verarbeitung: 0.4 Sekunden
(vorverarbeitet)
¤
|
Haftungshinweis
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.
|