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?


  • Mod

    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


  • Mod

    STFW
    z.b.
    http://www.clipx.net/ng/bios/index.php

    einfach 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.


Anmelden zum Antworten