Fehler: LES



  • ...
    int x;
    
    __asm
    {
       les bx,x
    }
    ...
    

    (Visual C++ 6.0)

    Ich bekomme den Fehler "Die Anweisung bla bla verweist auf Speicher in bla bla. Der Vorgang "read" konnte nicht auf dem Speicher durchgeführt werden."
    Weiß jemand warum?



  • Moin, Moin...

    les lädt ja in das es-Register den Segmentanteil einer Adresse, die über den zweiten Operator übergeben wird. In Deinem Beispiel enthält die Variable x also eine vollständige Adresse(Segmentanteil, Offsetanteil), die in es:bx geladen werden soll. So weit, so gut.

    Da Du unter Windows arbeitest, also mit einem 32-Bit Betriebssystem, sieht die Sache nun etwas anders aus. Die Variablen x muss nun eine Selektor:Offset-Kombination enthalten. Der Selektor hat 16 Bit und der Offset 32-Bit(insgesamt 48 Bit). Du benutzt aber eine int-Variable mit 32 Bit. Also passt die Selektor-Offset-Kombination schon mal nicht in die Variable hinein.

    Du gibst als Offsetregister bx an. Der Offsetanteil hat aber 32 Bit. Also müsste hier ebx stehen. Außerdem wird beim Laden eines Segmentregisters im Protected Mode überprüft, ob Dein Programm überhaupt Zugriffsrechte für das Speichersegment besitzt, dessen Selektor geladen werden soll. Das ist hier nicht der Fall. Der Prozessor löst eine Exception aus und WIndows zeigt die Meldung, die Du angegeben hast.

    Ciao...

    [ Dieser Beitrag wurde am 21.06.2003 um 11:47 Uhr von Kal El editiert. ]



  • Na gut, dann frage ich anders:
    Ich wollte den Interrupt 13h verwenden, um in den Sektor 0 einer Diskette zu schreiben. Dafür muss man aber in ES die Segmentandresse des Buffers, wo die Daten stehen schreiben und in BX die Offstetadresse.

    Kann man das irgendwie unter Windows?

    MfG

    [ Dieser Beitrag wurde am 21.06.2003 um 12:36 Uhr von JokerXXL editiert. ]



  • Original erstellt von JokerXXL:
    **Na gut, dann frage ich anders:
    Ich wollte den Interrupt 13h verwenden, um in den Sektor 0 einer Diskette zu schreiben. Dafür muss man aber in ES die Segmentandresse des Buffers, wo die Daten stehen schreiben und in BX die Offstetadresse.

    Kann man das irgendwie unter Windows?
    **

    Nein, Dinge wie int13h, int21h sind unter Windows-Anwendungen unmöglich. Sowas kannst du nur unter DOS/Real-Mode benutzen oder wenn du ein DOS-Programm kompilierst (da versucht Windows nach bestem Willen das ganze zu emulieren). Unter Windows muss man schon die Windows-API benutzen.



  • Ja, API...
    Fange nur grad ein Bisschen mit Assembler an, und deswegen kommen mir so verrückte Einfälle 😃 🙄


Anmelden zum Antworten