Hallo zusammen,
AssembleIt ist ja schon ein guter Weg, Assemblercode in AutoIt zu integrieren. Allerdings besteht immer das Handicap, dass der Assemblercode nicht so funktioniert wie er soll.
Welcher Wert steht in welchem Register, wie siehts zzt auf dem Stack aus, wie ist der aktuelle Zustand der Prozessorflags, warum stürzt der Code ab?
Die Antwort auf diese Fragen war bisher nur durch Klimmzüge herauszufinden, daher habe ich mir gedacht, schreib mal schnell einen Debugger, der diese Daten während der Laufzeit des Programms anzeigt.....
autoit.de/wcf/attachment/12907/
Dazu war nötig, aus dem Assemblerscript während der Laufzeit in eine AutoIt-Funktion zu springen und die Daten im DEBUG-Fenster anzuzeigen, also das Script dort "anzuhalten". Soweit nicht sonderlich schwer, allerdings ergab sich das Problem, dass das in der Callbackfunktion angezeigte DEBUG-Fenster wohl Probleme mit dem Messagehandler von Windows hatte. Wenn man versucht, per GuiGetMsg()- oder Endlos-Schleife Nachrichten zu bekommen, erscheint die gefürchtete "Keine Rückmeldung"-Nachricht im Fenstertitel.
Dies konnte umgangen werden, indem ein Fenster mit eigenem Messagehandler, ein sog. "modales" Fenster angezeigt wurde, z.B. eine Messagebox. Erst nach schliessen dieses modalen Fensters läuft das Script und somit der Assemblercode weiter. Dank progandys Hilfe gelang es, dieses modale Fenster als Button auszubilden (ein Control wird Windowsintern wie ein Fenster behandelt). Danke dafür!
Daher "hängt" der "NEXT...."-Button so seltsam unter dem Fenster....
Apropos, um die Debug-GUI zu schliessen d.h. das ASM-Programm läuft dann ohne Stop bis zum Ende, RECHTSKLICK auf den Next-Button, das ist nicht schön, aber selten....
/EDIT/ progandy hat freundlicherweise eine "3-Button-Version" geschrieben (siehe Bild oben), damit lässt sich der Debugger während der Runtime des Assemblercodes ausschalten (End Debugging) und auch der gesamte Prozess schliessen (Kill)
Anwendungs Beispiel:
Um die Debug-Gui anzuzeigen reicht es, mitten im Assemblercode die Zeile
_ASMDBG_()
[/autoit]
einzufügen. Dann hält das Assemblerprogramm an dieser Stelle an und zeigt die Debug-Gui. Mit Linksklick auf den "Next..."-Button oder Betätigen der "Enter"-Taste gehts dann weiter bis zum nächsten _ASMDBG_()
Als Goodie kann man noch einen Parameter mitgeben, zzt nur die 32-Bit-Register $edi, $esi, $ebp, $esp, $ebx, $edx, $ecx, $eax, und diese mit einer beliebigen Abbruchbedingung versehen!
Bei Einfügen von z.B.
_ASMDBG_("$eax=22")
[/autoit]in einer Schleife läuft der Assemblercode so lange, bis das EAX-Register den Wert 22 enthält und zeigt erst dann das Debug-Fenster an!
[autoit]_ASMDBG_("$edx>35662")
[/autoit]lässt das Debugfenster erst erscheinen, wenn das EDX-Register grösser ist als 35662.
Alles was innerhalb der Anführungsstriche steht wird als logischer Ausdruck ausgewertet und bei TRUE wird das Debug-Fenster angezeigt!
Bekannte Einschränkungen:
- Die Zeile _("org " & FasmGetBasePtr($Fasm)) ist im ASM-Code erforderlich, sie veranlasst den Assembler den Bezug zu den Adressen richtigzustellen
- DllCallbackFree($_DBG_) sollte am Ende des Scripts aufgerufen werden
-
/EDIT 07/04/2011 gelöst durch progandy
Ab und zu gibts einen Fehler, z.B. wird hin und wieder das vorderste Fenster beim Debuggen hinter/unter den NEXT...-Button verkleinert, lässt sich dann aber problemlos wieder vergrössern.
- Bei Verwendung des Debuggers innerhalb einer LOOP-Schleife (im Assemblercode) kommt es zu einer Fehlermeldung, da LOOP nur maximal +-127 Bytes weit springt, aber der intern abgehandelte Debuggercode wesentlich grösser ist. Das kann man umgehen, indem man den "LOOP Sprungadresse" durch
ersetzt und nach dem debuggen wieder durch "LOOP Sprungadresse" ersetzt. Ggf. baue ich diese Umwandlung sogar in den Debugger ein....
Naja, ganz fertig ist der Debugger noch nicht (welches Programm wird je fertig ), der Code ist total chaotisch, aber ich habe Hoffnung, dass es weitergeht.
Eins noch zum Schluss, ich persönlich finde die GUI echt hässlich, wer da meint, die Aufteilung /Ansicht besser gestalten zu können ist herzlich eingeladen!!!
/EDIT/ Debuggerupdate 12.05.2012
AssembleIt incl. Debugger und Testdatei:
autoit.de/wcf/attachment/15678/