Assembler-Code in Microsoft Visual C++6.0 möglich ?



  • Hallo an alle, Ist es möglich Assembler-Code in Microsoft Visual C++ 6.0 einzubinden. Möchte direkt in ein Register der seriellen Schnittstelle schreiben (Adresse: 0x3fC). Kann mir jemand helfen oder vielleicht sogar den Code posten oder mailen ? Danke für euere Hilfe C.Armbruster eMail: armbruster@plating-electronic.de



  • Hallo,

    du kannst in Microsoft Visual C++ durch

    __asm{

    Befehle

    }

    einbinden.



  • Habe ich getan wie Du unten siehst. Kommt aber ein error ?
    Könnt Ihr mir helfen !

    C:\C++\HelloWorld\HelloWorld\HelloWorld.cpp(30) : error C2415: improper operand type

    int APIENTRY WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
    {
    __asm
    {
    mov al, 2
    mov dx, 0x03FC
    out al, dx
    } // Hier kommt der Fehler !!!!!

    // TODO: Place code here.
    MSG msg;
    HACCEL hAccelTable;

    ...

    Möchte in die Adresse der seriellen Schnittstelle den Wert z.B. 0x02 schreiben (Adresse: 0x3fC)

    C.Armbruster



  • Moin, Moin...

    Du hast die Operanden bei out vertauscht.
    Richtig: out dx, al

    Ciao..



  • Danke Dir. Das hat mir sehr weitergeholfen. War ein Fehler in der Hilfe von Microsoft. Dort habe ich es 1:1 rauskopiert.

    Ist es übrigens richtig, daß wenn ich in die Register der seriellen Schnittstelle reinschreiben will (COM1 an der Adresse 0x3F8)

    daß ich dies so tue:
    __asm
    {
    mov al, 2
    mov dx, 0x03F8
    out al, dx
    }

    Wert 2 in die Adresse 0x3F8 reinschreiben, oder geht das anders.
    Muss ich vorher eventuell die Register noch sichern ?
    (Mein ersten C++ Projekt)
    Christian Armbruster



  • @Armbruster:

    Die Befehle in und out arbeiten automatisch mit (e)ax.
    Out schreibt den Wert in al oder ax an die entsprechende Port-Adresse. Der Befehl in liest von der Port-Adresse und schreibt das Ergebnis in al oder ax.

    Du kannst Byte-, Word- oder Dword-Werte lesen oder schreiben. Welche Datentyp Du lesen oder schreiben möchtest, hängt davon ab, ob Du das Register al, ax oder eax im Befehl in oder out verwendest.

    Ist die Port-Adresse zwischen 0 und 255, kann sie direkt im Befehl angegeben werden(als Konstante). Ist die Adresse größer als 255, MUSS sie in DX(!!) stehen.

    Generell gilt, wenn Du CPU-Register benutzt, solltest Du sie vorher auf den Stack sichern(z. B. push dx). Bevor Du die Assemblerroutine wieder verlässt, muss dann der gesicherte Inhalt wieder zurückgeschrieben werden(z. B. pop dx).

    Das Register(e)ax muss nicht unbedingt gesichert werden.

    Ciao...

    [ Dieser Beitrag wurde am 04.06.2002 um 14:15 Uhr von KalEl editiert. ]


Anmelden zum Antworten