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 gedrckt INT 21H CMP AL, 0FFH ; ist Taste gedrckt? -> Schleifenabbruch ;CMP IF, 1 ; ist Interrupt Enable Flag gesetzt? JNE CONT ; wenn Bed. erfllt ist -> Schleifenabbruch ;MOV AH, 07H ; Tastaturpuffer l”schen ;INT 21H MOV AH,4CH ; Rcksprung 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 ; Wagenrcklauf INT 21H RET ; Ende SHOW, Rckkehr 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, Rckkehr 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...
-
Zickedi schrieb:
Folgende Code:
AND AL, 0FH ; Zehnerstelle durch Maske ausw„hlen
-
Oh danke.
Da hab ich ja ne 0 vergessen.
-
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 ; Wagenrcklauf 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