;************************************** ;* Hexadezimalwerteingabe * ;* 2010 H.V.Viehof * ;************************************** ;______________________________________ ; ; stapelsegment : ;______________________________________ stack segment stack word 'stack' dw 10 dup (?) stack ends ;______________________________________ ; ; programmsegment : ; ab hier muss der Code Stehen ;______________________________________ code segment public word 'prog' org 0 main: mov ax, seg Buffer ; daten- und extrasegment initialisieren mov es, ax mov ds, ax mov dx, offset intro mov ah, 9 int 021 mov w Save, 0 call GetHex cmp al, 'q' jnz >Q1 mov ax, 04c00 ; dos eqivalent zu 'ExitProccess' int 021 Q1: mov di, offset Buffer mov ax, w Save call _output mov dx, offset Ausg mov ah, 9 int 021 jmp main GetHex: ; aus der Hexadezimalen Eingabe ein unsigned Integer bilden mov ah,1 ; Int 021 Funktion 1: Zeichen von der Tastatur lesen int 021 and ax, 0ff ; nur das in al wird benötigt cmp al, 0d ; ist es die Enter Taste? jz >Y3 ; dann ist das hier fertig cmp al, 'q' ; Ist es die 'q' Taste jz ret ; Rücksprung und das Programm wird geschlossen cmp al, 'f' ; Grösser als f? jg GetHex ; Keine Ziffer, also nochmal cmp al, '0' ; kleiner 0? jl GetHex ; wohl auch keine Ziffer cmp al, '9' ; ist 0 <= Eingabe <= 9? jng >Y2 cmp al, 'a' ; 9 <= Eingabe <= a: das ist kein Hexadezimalwert jl GetHex sub al, 39 ; ASCII - 39 = Zwischenwert (falls a <= Eingabe <= f ) Y2: sub al, 48 ; Zwischenwert - 48 = Integer eines eingegebenen Zeichens add Save, ax ; abspeichern rol Save, 4 ; eine Stelle links schieben jmp GetHex ; Und die nächste Ziffer holen Y3: ror Save, 4 ret _output: cld mov bx,10 mov cx,0 X1: xor dx ,dx ; dx löschen div bx ; dx:ax durch bx (10) teilen add dl, 030 ; dem divisionsrest 30h hinzuaddieren push dx ; auf den stapel legen inc cx ; durchlauf zähler erhöhen cmp ax, 0 ; ist ax schon 0? jnz X1 ; nicht? dann das ganze noch einmal... rücksprung nach X1 X2: pop dx ; Ok, die Zahl wird einmal rumgedreht: dx vom stapel mov [di],dl ; und dl in den an position [di] Puffer schreiben inc di ; schreibzeiger erhöhen loop X2 ; bis Durchlaufzähler = 0 mov al,10 stosb mov al,13 stosb mov al, '$' stosb ret code ends ;______________________________________ ; ;datensegment : ;______________________________________ data segment public word 'daten' Ausg db 0a, 0d db "Ausgabe: " Buffer db 8 dup ($) Save dw ? Intro db 0a,0d db "****************************",0a,0d db "* Hexadezimalwerteingabe *",0a,0d db "* Programm Beenden mit *",0a,0d db "* 2010 H.V.Viehof *",0a,0d db "****************************",0a,0d db 0a,0d,0a,0d db "Eingabe: $" data ends end