int 16h macht Probleme
-
Hi.
Ich will ein Programm schreiben, das sich beendet, außer, wenn die Eins ("1") gedrückt wird:
.MODEL SMALL .STACK 100h .DATA .CODE Entrypoint: mov ax,@data mov ds,ax Weiter: mov ax, 0 ; ganz sicher gehn und lehr machen mov ah,01h int 16h ; taste gedrückt? jz weiter ; keine taste gedrückt glich zurück cmp al,49 ;Wenn die eins gedrückt wurde auch weiter je weiter mov ah,4Ch ; ansonsten beenden int 21h END Entrypoint
ich habe follgende erklärung zum int 16h gefunden:
D. Keyboard - Check for keystroke:
Interrupt 16h Funktion 01h
Eingabe:
AH = 01h
Ausgabe:
Gesetztes Zero-Flag wenn keine Taste gedrückt wurde (Funktion sieht im Tastaturpuffer nach)
Wenn Taste gedrückt wurde: Zero-Flag clear und ASCII Zeichen in AL.
--> Gut um z.B. eine Schleife durch Tastendruck zu unterbrechen. Wie z.B. Turbo-Pascal:
"Repeat until keypressed"Wenn ich nun zuerst die "1" drücke, ist alles ok, das Programm läuft weiter. Aber wenn ich dann eine andere Taste drücke, wird das Programm nicht mehr beendet!
Wenn ich nun wiederum zuerst eine andere Taste als die 1 zuerst drücke, funktioniert es und das Programm beendet sich.
Warum funktioniert das nicht, wie ich mir das vorstelle?
-
ich tippe, dass die funktion lediglich prüft, ob etwas im tatstaturpuffer ist, aber diesen nicht verändert. d.h. sobald einmal etwas im puffer steht, bleibt es auch dort stehen, bis eine funktion benutzt wird, die dieses zeichen dann tatsächlich aus dem puffer entnimmt. dass sollte also am besten noch geschehen, bevor der test auf '1' erfolgt.
-
könntest du bitte gleich noch eine Funktion nennen die das macht? Thx
-
STFW
z.b.
http://www.clipx.net/ng/bios/index.phpeinfach int 16h, ah=01 durch int 16h ah=0 oder int 16h ah=10h ersetzen; dann ist auch das testen des zero-flags unnötig und der prozessor hängt nicht in einer warteschleife fest
-
BIOS Interrupts funktionieren nur im Real-Mode (zB DOS). Linux, Windows (seit 95?) und alle (größeren) Betriebssysteme, die seit dem 80286/80386er für PCs rausgekommen sind, sind Protected-Mode Betriebssysteme.