int 10h - Cursor setzen - Error



  • Guten Tag,

    ich würde gerne den Cursor in meinem C++ Code in der Konsole über Inline Assembler setzen. Ich nutze MVS 2003. Verstehe leider nicht warum mein Code nicht zum gewünschten Ergebnis führt.

    void mygotoxy(char xk, char yk)
    {
    	xk--;
    	yk--;
    
    	__asm {[asm]
    		mov ah, 02H; Cursor setzen
    		mov bh, 0H;  Bildschirmseite
    		mov dh, 5H;  Spalte
    		mov dl, 5H;  Zeile
    		int 10H;[/asm]
    	}
    }
    

    Wäre super, wenn mir jemand dazu helfen könnte. 🙄
    Bekomme immer eine Fehlermedlung von VS: "Nicht behandelte Win-32 Ausnahme"... oder so ähnlich. Hat jemand eine Idee???



  • Mal ganz allgemein gesagt: Windows kennt keine Interrupts.
    Wenn du auf die Konsole zugreifen willst, ist die WinAPI idR. das unterste Level, das du dazu benutzen solltest.
    Dazu brauchst du auch kein Assembler.



  • Ist es überhaupt nicht möglich per Inline Assembler Interrupts zu benutzen? Mein "tolles" C - Programmieren Buch behauptet es würde gehen und schlägt per Interrupt sogar die Löschung des Konsolenfensters vor!! Ich würde mich gerne weiter damit auseinander setzen und deswegen wäre es schon gut, wenn jemand wüsste, wie man das umgehen kann.
    Kann es vielleicht auch daran liegen, dass ich einen 32/64Bit Prozessor habe und der Quellcode für 16Bit Prozessoren ausgelegt ist?

    Grüße... 😕



  • Kronos_m schrieb:

    Ist es überhaupt nicht möglich per Inline Assembler Interrupts zu benutzen? Mein "tolles" C - Programmieren Buch behauptet es würde gehen und schlägt per Interrupt sogar die Löschung des Konsolenfensters vor!!

    Sicher ist das moeglich. Allerdings nicht in Windows-Programmen. Dein tolles Buch behandelt offenbar DOS. Siehe auch Unterschied: DOS / MS-DOS und Windows32-Konsole.

    Kronos_m schrieb:

    Ich würde mich gerne weiter damit auseinander setzen und deswegen wäre es schon gut, wenn jemand wüsste, wie man das umgehen kann.
    Kann es vielleicht auch daran liegen, dass ich einen 32/64Bit Prozessor habe und der Quellcode für 16Bit Prozessoren ausgelegt ist?

    Fast. Der Code ist offenbar fuer 16Bit DOS gedacht. Das laeuft auch nativ auf 64Bit x86 CPU, da diese abwaertskompatibel sind. Allerdings nur in einem echten DOS.
    Damit die Beispiele aus deinem Buch funktionieren, musst du sie wahrscheinlich als 16Bit-Code compilieren und zu einem DOS-Programm linken. Beides kann das VisualStudio mit den mitgelieferten Tools nicht.
    Ich wuerde vorschlagen, du benutzt um Probleme zu vermeiden genau die Tools, die mit Sicherheit irgendwo in dem Buch empfohlen werden und startest die so erzeugten DOS-Programme in DOSBox.



  • Dann bedanke ich mich erstmal für deine Hilfe 🙂 Hast recht, das "tolle" Buch geht von einer Dos-Umgebung aus...
    Dann muss ich mir wohl was anderes überlegen. 😮



  • Nobuo T schrieb:

    Sicher ist das moeglich. Allerdings nicht in Windows-Programmen. [...]musst du sie wahrscheinlich als 16Bit-Code compilieren und zu einem DOS-Programm linken. Beides kann das VisualStudio mit den mitgelieferten Tools nicht.

    Habe 'ne andere Idee. Habe den Cursor setzen Code unter NASM kompliliert und daraus eine *.obj Datei erzeugt. Kann ich diese *.obj Datei eventuel linken / einbinden? Wenn ja, wie spreche ich dann den Algorithmus aus der *.obj Datei an, wie starte ich die "Funktion" Cursor setzen?



  • Wie ich bereits 2 mal schrieb: Du kannst in Win32-Programmen keine BIOS-/DOS-Interruptfunktionen nutzen.
    Das was du da benutzen willst, ist ein BIOS-Interrupt und das einzige, was du mit dem compiler/linker im VisualStudio erzeugen kannst, sind Windows-Programme. Faellt dir die Widerspruechlichkeit deines Vorhabens langsam auf?

    Da hilft es auch nichts, irgendwie rumzufrickeln und zB. 16Bit-Obj-Dateien mit anderen Tools zu erzeugen: Du kannst sie in den mit dem VisualStudio erzeugten Windows-Programmen einfach nicht benutzen.
    Du musst schon eine komplett andere Toolchain benutzen, die wirklich vollstaendige [16Bit,DOS]-Programme erzeugen kann. Und nein: es gibt wirklich ueberhaupt keine andere Moeglichkeit, diese Interrupt-Funktionen zu benutzen.



  • ok 😞 Aber danke noch ein mal für deine Hilfe... Dann muss ich wohl mal umdenken *seufz*



  • Tja, wie gesagt: Entweder beim VS bleiben und WinAPI benutzen (evtl. mit einem aktuelleren Buch, das die auch behandelt 😉 ) oder mit dem Buch bei DOS bleiben - dann musst du aber auch erstmal eine entsprechende Umgebung mit passenden Tools und einem passenden System (wohl DOS - ggF. in einer VM oder Emulator) einrichten.

    Wenn du mehr daran interessiert bist, viel produktiv in einer Hochsprache (also nach C evtl. weiter mit C++, etc.) fuer ein aktuelles System zu arbeiten, bietet sich 1. Moeglichkeit an. Falls du mehr an Low-Level/Systemprogrammierung interessiert bist und nach C in Richtung Assembler gehen willst, evtl. die 2.


Anmelden zum Antworten