Verstehe if() nicht



  • unsigned char *DruckerStatusRegister;
    unsigned char Status;
    
    DruckerStatusRegister = 0x379;
    Status = *DruckerStatusRegister;
    
    if( Status & 0%10000000 )
    {
        //Drucker ist frei
    }
    

    Den Code habe ich in meinem Buch gefunden, aber ich verstehe die
    if( Status & 0%10000000 ) Zeile nicht. Was wird da abgefragt, was bezweckt das einzelne &? Kann mir da jemand helfen?



  • Das hier: 0%10000000 ist kein C, höchstens eine proprietäre Spracherweiterung eines Compilers. Wahrscheinlich soll das eine binäre Zahlkonstante sein, also der Dezimalwert 128. Man würde das in C normalerweise hexadezimal als if (Status & 0x80) schreiben.

    Das wiederum ist eine bitweise UND-Verknüpfung. Das Ergebnis ist 0x80 (also ungleich 0 und damit "wahr"), wenn das siebte Bit in Status gesetzt ist. Es ist 0 (also "falsch"), wenn das siebte Bit in Status nicht gesetzt ist. Das siebte Bit des Statusregisters, das vorher gelesen wurde, steht offensichtlich, wenn es gesetzt ist, für den Druckerstatus "frei".

    Darf man fragen, für welches System dieses Programm sein soll? Beim PC ist die Adresse des LPT1-Statusregisters zufällig 0x379, allerdings ist das ein I/O-Port, man kommt da nicht über eine Zeigerdereferenzierung ran.



  • Also hier steht in dem Buch, dass bei 0x379 "das Statusregister der ersten Druckerschnittstelle bei einem gängigen Intel-PC liegt". Desweiteren steht da noch, dass die Adresse für ein "normales Anwendungsprogramm" unereichbar ist und nur interessant wenn man einen Treiber schreiben möchte.

    Und danke für die Erklärung, nach mehrmaligen durchlesen kann ich mir jetzt etwas darunter vorstellen.



  • Tut nichts zur Sache, aber wenn ich mich nicht irre, dann würde das auch für einen Treiber nicht funktionieren, da die Adresse ein IO-Port ist, d.h. u.a. dass der Zugriff über spezielle Maschinenbefehle (IN und OUT) läuft. Ich hab grad mal den Linux-Treiber für den Parallelport dazu rausgesucht:
    http://www.gelato.unsw.edu.au/lxr/source/drivers/parport/parport_pc.c?a=i386

    Die inb/outb-Aufrufe sind die Portzugriffe.


Log in to reply