Code ASM -> C



  • Hallo Forum!

    Habe ein Mainboard, bei dem ich gerne den DIO (digital in out) ansteuern würde. Ich habe folgenden Assembler-Beispielcode vom Hersteller bekommen:

    Enable the DIO Output Function:

    MOV AX, 6F09H Sets the digital port as output
    MOV BL, 09H
    INT 15H

    Das Gleiche gibts für die Input-Geschichte:

    MOV AX, 6F08H Sets the digital port as input
    INT 15H Initiates the INT 15H BIOS call

    Der Port hat 4 Eingänge und 4 Ausgänge. Würde das Ganze nun aber von C aus ansprechen. Mit einem anderen Board hat es geklappt, hatte da die genaue Port-Adresse und habe dann nur mit inp und outp die Bits setzen müssen. Auf Anfrage direkt in Taiwan habe ich folgende Werte bekommen:
    DIO :Port A21h[3:0] (4 Out)
    A22h[3:0] (4 In)
    Aber outp(0xa21, 0xFF) bzw. 0xF bzw. 0x0 bringt alles nichts!
    Jemand ne Idee, wie ich das anstelle? Mit dem ASM-Code kann ich mal gar nichts anfangen.

    Grüße an alle
    Nummer5



  • Ich weiss zwar nicht genau, was dieser "DIO" sein soll oder wie dieser funktioniert, aber was hindert dich daran Inline-Assembler zu benutzen (wenn du im RealMode bist) oder die Treiber (wenn du fuer ein entsprechendes Betriebssystem programmierst) zu benutzen?
    Dass du fuer outp und inp auch bestimmte Rechte oder Treiber brauchst, ist dir klar?

    Wenn der Hersteller ansonsten keine ausfuehrliche Doku zur Verfuegung stellt, boote halt in DOS und benutze einen Debugger, um den Code des angegebenen Interrupt-Handlers zu disasseblieren und dadurch herauszufinden, wie die Sache funktioniert.



  • Ich löse jetzt das gleiches Problem füt ekino 945gse.
    Ich versuchte zuerst ein assemler Program starten, in denen wird diese Registern eingestellt und dann c-program wurde Datenschreibung durchgeführt.
    Aber das bringst auch nichts.



  • Ein paar Informationen mehr wären schon sehr hilfreich gewesen.

    Also für die Entwicklung unter Windows.

    Interrupts sind eigentlich untersagt! Und das direkte schreiben an einen Port auch. Ich würd mal ehr sagen, dass das in die Treiberentwicklung fällt. Dort kannst du dann tun und lassen was du willst. Du kannst dich aber auch genauso gut vor die Wand fahren wenn du nicht weißt was du tust.

    Solltest du dich für Treiber entscheiden, so gibt es die Mögichkeit via Inline auch Interrputs aufzurufen(im C/C++ Code). Willst du was an den Port senden oder etwas vom Port empfangen so kann ich dir den Link hier empfehlen. Und natürlich auch die Funktionen die damit verwandt sind..

    http://msdn.microsoft.com/en-us/library/ff560788(VS.85).aspx

    Sollte das ganze nicht unter Windows stattfinden, dann arbeite eben mit DOS oder bastel dir was eigenes...



  • windows läuft doch nur im protected mode, und damit auch die treiber. wie es mit dos ist weiß ich nicht. int 15 sollte der bios interrupt sein und der geht soweit ich weiß nicht (nur über umwege) im protected mode.

    Nobuo T hat auch schon eine anmerkung zum (real mode) gemacht.

    lg lolo



  • ich arbeite unter linux und war ich auch nicht erfolgreich.



  • jedes "normale" os arbeitet im protected mode 😉

    lg lolo



  • noobLolo schrieb:

    jedes "normale" os arbeitet im protected mode 😉

    64-Bit? 🙄

    Privileg Level solltest du im PM auch beachten.


Anmelden zum Antworten