wie kann ich das Zero Flag auslesen?



  • Hullo

    ich moechte einen interrupt aufrufen, und muss nach dem aufruf
    das ZF (das ist das dohc das Zero flag oder) ueberpruefen.
    aber wie komm ich an den zustand des ZF???

    ich habs mal mit regs.x.flags probiert, doch das sind 16 bit und ich komm nicht
    wirklich drauf welches das ZF ist.

    thx



  • Das ZF ist das Bit Nr. 6, erhältst du also per ((flags >> 6) & 1).



  • Hallo,
    das Zero-Flag liegt weit außerhalb der Welt von Standard-C++.

    -> Rund um



  • Also irgendwas muss ich da falsch machen

    Ich will mittels des Interupts 16h ueberpruefen, ob ein Zeichen eingeben worden
    ist. (Dies soll kbhit ersetzen)

    Dazu muss ich in das al register den wert 01h laden und den interupt 16h ausloese. (siehe http://www.ctyme.com/intr/rb-1755.htm))
    Falls ein Zeichen im Buffer steht, dann sollte ZF auf null gesetzt sein, dohc bei mir ist das sechste bit, softern das das ZF ist, immer auf null.

    Ich hab auch schon versucht mit Int 16/AH=04h den keyboard buffer zu leeren, aber das aendert auch nichts. Hat vielleicht jemand eine Idee woran da liegt?

    Die zwei funktionen:

    int i_flushkb()
    {
    union REGS regs;

    regs.h.ah = 0x04; /* flush keyboard buffer */
    int86(0x16, ®s, ®s);
    return 1;
    }

    unsigned int ui_kbhit()
    {

    union REGS regs;

    regs.h.ah = 0x01; /* get keystroke */
    int86(0x16, ®s, ®s);
    return regs.x.flags;

    }

    thx



  • Die einzige Möglichkeit den Status des ZF auszulesen, ist die von TriPhoenix angegebene. Hier ein kleines Beispiel: es wird solange das Zeichen '-' ausgegeben, bis eine Taste gedrückt wird. Dann wird das gedrückte Zeichen angezeigt und das Programm beendet.

    #include  <stdio.h>
    #include  <dos.h>
    
    union  REGS  regs;
    
    int  main ()
    {
       char  zeichen;    /* zukünftige Werte: 0 = kein Zeichen, sonst 1 */
    
       do  {
          regs.h.ah = 1;
          int86 (0x16, &regs, &regs);
          zeichen = !((regs.x.flags >> 6) & 1);
    
          if (!zeichen)  printf ("-");
          else  {
             printf ("%c\n", regs.h.al);
             regs.h.ah = 0;
             int86 (0x16, &regs, &regs);
          }
       }
       while (!zeichen);
    
       return  0;
    }
    


  • Ergänzung:
    reg.h.ah = 4 von Interrupt 0x16 löscht normalerweise _nicht_ den Tastaturpuffer.



  • Ah, mich hat es etwas verwirrt, als TriPhoenix gesagt hat das das ZF an der Nummer 6
    steht und ich dann mit 6 mal shiften zum bitt komme. Aber 6 mal shiften ist ja zuviel
    fuer die sechste stelle. ok jetzt gehts, das siebte bit ist das ZF



  • Auch bei den Bits fangen Programmierer bei 0 an zu zählen 🙂


Anmelden zum Antworten