Maus Position ermitteln..
-
Hi,
Ich weiss nicht obs hier reinpasst, wenn nicht einfach verschieben...Also ich habe folgendes Problem, ich weiss nicht wie ich die Speicherzellen auslesen kann in die mit dem inline-assembler von gcc (AT&T Syntax) geschrieben wurde. Ich denke mal mit einem Zeiger wuerde es doch sicher gehen, wenn ja wie?
Fragt mich nicht warum ich fuer die position der Maus asm benutze, wollte das ganze einfach nur mal so ausprobieren...
#include <iostream> using namespace std; int mouse_on(); int mouse_off(); int mouse_status(); int main() { mouse_on(); //Wie mouse_status(); //denn mouse_off(); //nun? return 0; } int mouse_on() { asm("movw $0x01, %ax\n\t" "int $0x33\n\t"); return 0; } int mouse_off() { asm("movw $0x02, %ax\n\t" "int $0x33\n\t"); return 0; } int mouse_status() { asm("movw $0x03, %ax\n\t" "int $0x33\n\t" "movw %cx, (0x500)\n\t" "movw %dx, (0x503)\n\t" "movb %bl, (0x506)\n\t"); return 0; }
Danke im voraus
mfg enA
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Andere Compiler verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
nur nebenbei:
zu maus findest du zwei beiträge im dos konsolenfaq
eine für dos
eine für windows.vielleicht hilfts weiter.
-
Nunja das wuerde gehen allerdings seh ich da noch nicht so durch, von wegen DWORD usw. bin naemlich cpp anfaenger. Die FAQ Hilft mit sicherheit allerdings wuerde ich es lieber auf diesem wege loesen, sollte doch funktionieren oder ?
Am einfachsten waers natuerlich wenn mir jmd. erklaeren koennte wie ich eine variable fuer asm mit AT&T Syntax definiere und dieser dann den Wert uebergebe oder eben einen zeiger darauf definiere. Denn ehrlich gesagt ist die AT&T Syntax nicht so mein ding.
Also vielleicht kann mir ja noch jmd. helfen, aber bitte nicht solche seiten wie linuxassembly.org oder so, bei den anleitungen versteh ich nur bahnhof.
-
Hi,
das Problem hat sich jetzt insofern geloest das ich in
http://www.c-plusplus.net/forum/viewtopic-var-t-is-101526.html gefunden habe wie man die werte in eine variable uebergibt und die Syntax auf INTEL umstellt#include <iostream> using namespace std; void mouse_on(void); void mouse_off(void); void mouse_status(void); signed short X; signed short Y; signed short button; int main() { mouse_on(); mouse_status(); cout << "X: " << X << "\tY: " << Y << "\n" << button; mouse_off(); return 0; } void mouse_on() { asm("mov ax, 01"); asm("int 33"); } void mouse_off() { asm("mov ax, 02"); asm("int 0x33"); } void mouse_status() { asm("mov ax, 03"); asm("int 33"); asm("mov cx, _X"); asm("mov dx, _Y"); asm("mov bx, _button"); }
Das Programm laesst sich jetzt zwar compilieren allerdings bekomm ich keine Ausgabe!?!?
Was nu?
-
Hab das Programm jetzt mal in Turbo Pascal geschrieben der assembler code bleibt ja der gleich, komischerweise funzt das Teil in Turbo Pascal.
Hat jmd. ne ahnung wieso? Liefert TP ne eigene Konsolen Anwendung mit oda wie is das....?
mfg ena
-
hallo
es sieht so aus als wären bei den 3 letzten asm-zeilen
quelle und ziel vertauscht beim 2.code und wahrscheinlich
auch beim 1.code.
mein c++ test-compiler hat eine andere syntax deshalb die
vorsichtige antwort.mfg f.-th.
-
hallo nachtrag
hab gerade beim 2.quelltext noch entdeckt int 33 != int 0x33
mfg f.-th.
-
hi f.-th.
also recht haste du auf jedenfall mit den letzten drei asm befehlen weil ich da ja auf intel syntax bin
(Ziel, Quelle). Nunja funzt aber damit immer noch nicht, achso und ob 0x33 oder 33 macht auch irgendwie keinen unterschied und wenn ich n h dranklemm kommt n compile fehler.
Ich versteh aber ehrlich gesagt absolut nicht, wieso die gleichen funktionen, also der gleiche asm code, in tp funzt -> ohne probleme.
program maus_mit_assembler; (*Beispielprogramm zur Nutzung des Interrupts 33h zur Einbindung einer Mausunterstuetzung in Turbo Pascal Programm. Erstellt von Sebastian Stein am 05.05.1999*) uses crt; {nur um den Bildschirm zu loeschen} var status : record {hier wird die Position und der Tastenstatus der} x, y : word; {Maus gespeichert} taste : byte; end; str1 : string; x, y, i : integer; procedure maus_an; assembler; {Mauscursor-Darstellung aktivieren} asm mov ax, 01h int 33h end; procedure maus_aus; assembler; {Mauscursor-Darstellung deaktivieren} asm mov ax, 02h int 33h end; procedure maus_status; assembler; {Mausposition und Tastenstatus abfragen} asm mov ax, 03h int 33h mov status.x, cx mov status.y, dx mov status.taste, bl end; begin {Das omin”se Hauptprogramm} clrscr; maus_an; i := 0; repeat maus_status; gotoxy(1,1); writeln('X: ',status.x,' '); writeln('Y: ',status.y,' '); case status.taste of 0 : str1 := 'keine'; 1 : str1 := 'linke'; 2 : str1 := 'rechte'; else str1 := 'beide'; end; write('Taste: ',str1,' '); gotoxy(20,10); writeln('^'); IF (status.x = 152) AND (status.y = 72) AND (status.taste = 1) THEN BEGIN gotoxy(30,10); i := i + 1; writeln(i); END; until keypressed; maus_aus; end.
Das testen ob der Zeiger auf pos x, y und taste 1 gedrueckt ist hab ich selbst dazugeschrieben, nur so zum test ;).
-
Hi,
Ich hab mir jetzt mal n1 Open Watcom zugelegt
is wirklich supa, zwar koennte in die IDE auch gleich der texteditor aber naja...
Nun habe ich mein Programm mal mit Watcom compiliert und ausgefuert mit folgendem Ergebnis:
The instruction at 0x0040102a referenced memory at 0xffffffff. The memory could not be read. Exception fielded by 0x00402600 EAX=0x00000100 EBX=0x00000108 ECX=0x0006fea4 EDX=0x00000000 ESI=0x00000000 EDI=0x00000010 EBP=0x0006fe58 ESP=0x0006fe58 EIP=0x0040102a EFL=0x00010202 CS =0x0000001b SS =0x00000023 DS =0x00000023 ES =0x00000023 FS =0x0000003b GS =0x00000000 Stack dump (SS:ESP) 0x0006fe7c 0x00000010 0x00000000 0x00000000 0x0006fea4 0x00000108 0x00401132 0xfffffffc 0x00000108 0x0006fe98 0x00000010 0x00000000 0x00000000 0x0006fea4 0x00000108 0x00403624 0x0006ffb4 0x00070000 0x00401f41 0x00033000 0x00000000 0x00000000 0x00000001 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x0006ffac 0x00000000 0x00000000 0x00000002 0xffffffff 0x00000001 0xffffffff 0x00000002 0xc000001d 0x00000002 0xc000013a 0x00000002 0xc0000005 0x00000002 0xc000013a 0x00000002 0xc000013a 0x00000001 0xffffffff 0x00000001 0xffffffff 0x00000001 0xffffffff 0x00000002 0xc0000094 0x00000001 0xc0000095 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
Hat das vielleicht etwas mit dem protected mode zutun? Dann versteh ich aber immer noch nicht wieso es unter Pascal laeuft?!
Der debugger von Watcom bleibt bei "INT 33h" stehen und meint Access Violation!Hat jmd. vielleicht ne idee worans liegen koennte oder eine andere loesung, bis auf die in der faq?
-
also nachtrag c-syntax : 0x33 = 063 = 51 (hex - oct - dec)
ich hoffe ich hab mich nicht verrechnet.
meine inline-assembler akzepzieren für hexadezimalzahlen 0x33 = 33h
alternativ (entweder - oder).
frage : warum rückgabewert (_X oder _Y) wenn anders declariert ( X oder Y) ?
die _X -variante soll nach meinen info's nur bei projekten mit c++ und externem
assembler erforderlich sein.zur fehlermeldung : hast du nach dem compilieren nur die fehlermeldung oder
auch eine object-datei; wenn ja versuch diese seperat zu linken. dann ist
der code vielleicht nicht optimal. aber manchmal funktioniert's trotzdem.viel spaß bei testen f.-th.
-
Nunja das mit den unterstrichen deshalb weil wenn diese nicht vorhanden sind compiler = error. (undefined reference to 'X' bei gcc [-masm=intel]) Also funktionieren tut beim gcc 0x33 und 33 beim 'h' meint er "junk 'h' after expression".
void mouse_on() { asm("mov ax, 0x01"); asm("int 0x33"); } void mouse_off() { asm("mov ax, 0x02"); asm("int 0x33"); } void mouse_status() { asm("mov ax, 0x03"); asm("int 0x33"); asm("mov cx, X"); asm("mov dx, _Y"); asm("mov bx, _button"); }
Mit diesen Funktionen wird das ganze ohne error compiliert und auch gelinkt blos ich bekomm keine ausgabe, das programm stuerzt sicha an der stelle 'INT 0x33' ab. Und ich glaube nicht das (inline)assembler die syntax von c interessiert bei hex zahlen.
-
hallo
ich hab in einem anderen beitrag gesehen (assemblercode mit Dev-C++ in intel-
syntax), daß es doch funktionieren soll, mit _X und so.
ein "future" von moderneren betriebssystemen ist es, daß sie hardwarenahe
programmierung, und dazu zählen interrupt-aufrufe, abfangen und deren aus-
führung teilweise verhindern. diese funktionen können teilweise über entsprech-
chende andere aufrufe realisiert werden. siehe dockumentation zu deinem com-
piler zu entsprechenden funktionen zu deinem betriebssystem. bei windows war es
durchaus auch so, das nicht alle vorhandenen funktionen dockumentiert waren.wenn du decimal- und hexadecimal-zahlen verwechselst rufst du zum beispiel
ganz anderen interrupts ab. die zahlen-dialekte bei c- und c++-compilern sind
weitgehend ähnlich aber nicht unbedingt indentisch. in zweifel in der doku
zum jeweiligen compiler nachsehen oder die hoffentlich vorhandenen beispiele
testen.mfg f.-th.
-
nachtrag
die interrupts dürften auf den betriebssystemen win NT, win 2000, win Xp und
OS2 entweder zu fehlerhaften oder gar keinen ausgaben führen.
unter Dos, win 95, win98 und wahrscheinlich win ME könnte das programm laufen.
hab ich nur teilweise überprüft.assembler in C oder C++ wird in den compilern unterschiedlich eingeben!
deshalb ist es bei problemen damit sinnvoll die betriebssystemversion und
die compilerversion anzugeben. beim versuch das problem nachzustellen brauchten
meine testcompiler unterschiedlichen sourcen!mfg f.-th.
-
Hi,
ich habe mal in meinem asm buch geschaut und festellen muessen das es speziell "DOS" - Interrupts sind was dazu fuehrt, wie du schon sagst, das es unter dos win95, -98 usw. funktionieren sollte. Es gibt aber leider kein "BIOS" (Maus) - Interrupt, welches dann eigendlich os unabhaengig waere. Werd mal schauen ob ich eine Interrupt tabelle fuer xp (nt) finde und nochmal die hife von gcc (DevCpp) nachlesen bezueglich der Interrupt-Aufrufe.
Allerdings wundert mich immer noch eine sache, warum funzt das ganze unter TP mit den gleichen Interrupts?Danke fuer deine Muehe
mfg enA