HEX-Zähler zählt nicht richtig



  • Folgende Code:

    .model small
    .386
    .stack 100
    
    .data
            ZAHL   DW 0H
            ZEIT   DW 0H
            DIFF   DW 0H
            BACKUP DW 0H
    
    .code
    
    START:
    
            MOV AX,@data
    	MOV DS,AX
    
    ; Hauptprogramm (main)
    
    CONT:                   ; Main-Schleife
    
            CALL TIME                       ; UP Aufruf - Zeitschleife
    
            MOV AX, ZAHL                    ; Zahl initialisieren
    
            CALL SHOW                       ; UP Aufruf - Ausgabe HEX-Zahl
    
            ADD ZAHL, 1                     ; ZAHL erh”hen
    
            MOV AH, 0BH                     ; Test ob Taste gedrckt
            INT 21H
    
            CMP AL, 0FFH                    ; ist Taste gedrckt? -> Schleifenabbruch
            ;CMP IF, 1                       ; ist Interrupt Enable Flag gesetzt?
            JNE CONT                        ; wenn Bed. erfllt ist -> Schleifenabbruch
    
            ;MOV AH, 07H                     ; Tastaturpuffer l”schen
            ;INT 21H
    
            MOV AH,4CH                      ; Rcksprung zu DOS
            INT 21H
    
    ; Unterprogramme
    
    SHOW:                   ; Show Funktion
            MOV BACKUP, AX                  ; Speichern der Zahl
    
            AND AL, 0FH                     ; Zehnerstelle durch Maske ausw„hlen
            SHR AL, 4                       ; Zehnerstelle ganz nach rechts verschieben
    
            CMP AL, 0AH                     ; Abfrage ob HEX-Wert vorhanden
            JAE HEX                         ; Sprung zu HEX
    
            ADD AL, 30H                     ; ASCII-bedingte Addition von 30 (Zahlen)
            JMP NEXT                        ; Sprung zu NEXT
    
    HEX:                                    ; HEX Werte
            ADD AL, 41H-0AH
    
    NEXT:
            MOV AH, 2                       ; Ausgabe Zehnerstelle
            MOV DL, AL
            INT 21H                      
    
            MOV AX, BACKUP                  ; erneutes Laden
    
            AND AL, 0FH                     ; Auswahl der Einerstelle durch Maske
    
            CMP AL, 0AH                     ; Abfrage ob HEX-Wert vorhanden
            JAE HEX2                        ; Sprung zu HEX2
    
            ADD AL, 30H                     ; ASCII-bedingte Addition von 30 (Zahl)
            JMP NEXT2                       ; Sprung zu NEXT2
    
    HEX2:                                   ; HEX Werte
            ADD AL, 41H-0AH
    
    NEXT2:
            MOV AH, 2                       ; Ausgabe Einerstelle
            MOV DL, AL
            INT 21H
    
            MOV AH, 2                       
            MOV DL, 0AH                     ; Neue Zeile
            INT 21H
    
            MOV AH, 2                       
            MOV DL, 0DH                     ; Wagenrcklauf
            INT 21H
    
            RET                             ; Ende SHOW, Rckkehr zu main
    
    TIME:                   ; Time Funktion
            MOV AH, 00H                     ; Z„hler initialisieren
            INT 1AH
            MOV ZEIT, DX                    ; Zeit initialisiert
    
    MARKE:
            MOV AH, 00H                     ; aktuelle Zeit
            INT 1AH
    
            SUB DX, ZEIT                    ; Differenz:aktuelle Zeit - Startzeit
            MOV DIFF, DX                    ; DIFF abspeichern
            ;MOV CX, DX
    
            CMP DIFF, 9                     ; Abfrage ob DIFF = 9 (10 Systemtakte)
            ;CMP CX, 9
            JNE MARKE                       ; wenn Systemtakt = 10 -> Return zu main
    
            RET                             ; Ende TIME, Rckkehr zu main
    
    END START
    

    Er läuft auch soweit durch bis 0F, dann fängt er wieder von vorne an.
    Er sollte aber weiterlaufen, also nach 0F -> 10, 11, 12...
    Wo liegt der Fehler ? Ich steh grad auf der Leitung...


  • Mod

    Zickedi schrieb:

    Folgende Code:

    AND AL, 0FH                     ; Zehnerstelle durch Maske ausw„hlen
    


  • Oh danke. 👍
    Da hab ich ja ne 0 vergessen. 🙄


  • Mod

    ist sogar völlig überflüssig



  • Hallo,

    ich würde mal versuchen etwas Strucktur in den Code zu bringen, vereinfacht
    die Fehlersuche.

    SHOW:                   ; Show Funktion
            MOV BACKUP, AX                  ; Speichern der Zahl
    
            AND AL, 0FH                     ; Zehnerstelle durch Maske ausw„hlen
            SHR AL, 4                       ; Zehnerstelle ganz nach rechts verschieben
    
            CMP AL, 0AH                     ; Abfrage ob HEX-Wert vorhanden
            JAE HEX                         ; Sprung zu HEX
    
            ADD AL, 30H                     ; ASCII-bedingte Addition von 30 (Zahlen)
            JMP NEXT                        ; Sprung zu NEXT
    
    HEX:                                    ; HEX Werte
            ADD AL, 41H-0AH
    
    NEXT:
            MOV AH, 2                       ; Ausgabe Zehnerstelle
            MOV DL, AL
            INT 21H                      
    
            MOV AX, BACKUP                  ; erneutes Laden
    
            AND AL, 0FH                     ; Auswahl der Einerstelle durch Maske
    
            CMP AL, 0AH                     ; Abfrage ob HEX-Wert vorhanden
            JAE HEX2                        ; Sprung zu HEX2
    
            ADD AL, 30H                     ; ASCII-bedingte Addition von 30 (Zahl)
            JMP NEXT2                       ; Sprung zu NEXT2
    
    HEX2:                                   ; HEX Werte
            ADD AL, 41H-0AH
    
    NEXT2:
            MOV AH, 2                       ; Ausgabe Einerstelle
            MOV DL, AL
            INT 21H
    
            MOV AH, 2                      
            MOV DL, 0AH                     ; Neue Zeile
            INT 21H
    
            MOV AH, 2                      
            MOV DL, 0DH                     ; Wagenrcklauf
            INT 21H
    
            RET
    

    Würde ich mal folgendermaßen programmieren

    //-----------------------------------------------
    SHOW:
    	push	ax
    	shr	al,4
    	call	DisplayIt
    	pop 	ax
    	call	DisplayIt
    	ret
    //-----------------------------------------------	
    DisplayIt:
    	and 	al,0x0f	
    	cmp	al,0x0ah
    	jae	Hex
    	add	al,0x30
            jmp     do
    hex:
    	add	al,0x41-0x0a
    do:
    	mov 	ah,2
    	mov	dl,al
    	int	21h
    	ret
    

    Mit dem Code kannst du alle Nibles in Ax darstellen.

    //-----------------------------------------------
    SHOW:
    	mov	cl,12
    next:	
    	push	ax
    	shr	al,cl
    	call	DisplayIt
    	pop	ax
    	sub	cl,4
    	jnc	next
    	ret
    //-----------------------------------------------	
    DisplayIt:
    	and 	al,0x0f	
    	cmp	al,0x0ah
    	jae	Hex
    	add	al,0x30
            jmp     do
    hex:
    	add	al,0x41-0x0a
    do:
    	mov 	ah,2
    	mov	dl,al
    	int	21h
    	ret
    

    Die beiden Codes habe ich nicht ausprobiert!
    Zur Fehlersuche das ganze Debugen.[u]



  • Sieht gut aus ... und läuft 😉


Anmelden zum Antworten