AssembleIt2_64 incl. Debugger uvm...

  • //UPDATE 04.09.2016 Bugfix in Anzeige XMM-Register 2xDOUBLE
    //UPDATE 26.08.2016
    Debugger jetzt "schöner" mit eigener Schrift (Monospaced) und im Fenster, bitte Anmerkungen hier unten im Text dazu beachten , bitte Rückinfo bzgl. gewünschter Erweiterungen/Bugs.
    Bitte auf verschiedenen BS testen und ggf. Screenshots posten, falls bzgl. Anzeige/Fensterinhalt etwas nicht stimmt.
    Bei den Listviews sollte nur das untere einen waagrechten Scrollbalken haben
    Debugger AssembleIt.jpg

    Hi zusammen,

    seit einiger Zeit geistert die AssembleIt2_64 durchs Forum, hier die aktuelle
    Version 1.08:
    AssembleIt2_64.zip

    Wer noch "alte" Versionen von AssembleIt() benutzt, sollte umsteigen :D

    Der FASM-Assembler ist in Form einer direkt aus dem Speicher (also nicht als Datei beigelegten!) ausgeführten DLL integriert, daher reduziert sich der Overhead der AssembleIt2()-Funktion beim Ausführen auf einige Millisekunden!
    Der ASM-Code wird im AutoIt-Script einfach zwischen die #cs und #ce-Tags geschrieben, es genügt ein einfaches RET, AssembleIt sorgt intern für das Aufräumen des Stack.
    Im ASM-Code können, soweit sinnvoll, auch AutoIt-Variablen als Datenquelle eingesetzt werden. MOV EAX,$AutoItvariable funktioniert, MOV $AutoItvariable,EAX "natürlich" nicht...

    Mit der Funktion _AssembleIt2("retbinary", "asm_Funktion") wird der assemblierte Code zurückgegeben, dieser kann dann per DllCallAddress() aufgerufen werden, wenn es mal "richtig schnell" gehen muss.

    Der Debugger ist noch der "alte", bitte das Debugger-Beispiel testen und anschauen, damit man sehen kann, was damit "geht". Bei jedem Aufruf von _ASMDBG_() im Code wird in Scite die entsprechende Zeile im ASM-Code angesprungen. Es macht also Sinn, beim Debuggen das Debuggerfenster links, und rechts daneben Scite geöffnet zu haben.
    man kann _ASMDBG_() auch mehrere parameter in Form von Registern mitgeben, es wird dann das Programm so lange laufen, bis der Ausdruck TRUE ist.
    Bei _ASMDBG_("$EAX=12345 or $EBX=0xFF00FF") läuft der Code also so lange bis entweder der Registerinhalt von EAX=12345 ist, oder EBX=0xFF00FF. Da während dieser Abfragen der Debugger bei jedem _ASMDBG_() aufgerufen wird, "flackert" dessen GUI und das Programm läuft entsprechend "langsam. Ich würde also nicht EAX von 1e6 runterzählen und mit dieser Methode warten wollen, bis EAX=0 ist....
    Ich habe mittlerweile schon am neuen Debugger angefangen, der wird, so hoffe ich, irgendwann mal fertig und bietet auch neue Features....Anregungen dazu sind gern gesehen!!!

    Bitte die Beispiele testen, vor allem der 64-Bit-Modus sollte nun problemlos laufen. Dort wird, da die FASM-DLL nur im 32-Bit-Modus assemblieren kann, eine Hilfsdatei AssembleIt64_Helper.exe (im 32-Bit-Modus) erstellt, welche das assemblieren übernimmt und den so assemblierten Code ins Script überträgt. Diese Hilfsdatei muss nur ein einziges Mal erstellt werden. Bitte in den 64-Bit-Scripten darauf achten, daß, wie in den Beispielen gezeigt, dieser Prozess auch zusammen mit dem AutoIt-Script beendet wird!

    Macros können nun auch verwendet werden, siehe Beispiele.
    SSE-Befehle sind bis zu SSE4 (nicht 4.2) im Assembler enthalten, AVX fehlt auch ....ich weiß nicht, ob diese jemals als Assembler-DLL integriert werden. Ist imho auch unnötig!
    Wer irgendwelche esoterischen ASM-Befehle benutzen will, welche zzt. nicht unterstützt werden, muss eben, wie die Profis, die OPcodes "hartcodieren" :thumbup:

    Und weil ich es seit 30 Jahren runterbete, hier nochmal: "Mit ca. 10-12 ASM-Befehlen ist JEDES programmiertechnische Problem umzusetzen..."

    Viel Spass damit!

  • Na wie wärs wenn du uns dann ein paar Beispiele mitlieferst mit Standardproblemen und den immensen Zeitgewinn durch ASM-Realisierung?

    Wie wäre es, wenn du hier im Forum (und nicht nur hier, UEZ hat im "blauen" Forum einige Threads dazu am laufen) selbst nachschaust... :D

    Gerade bei extrem aufwendigen Berechnungen in langen Schleifen bspw. Grafikfilter, wird "Zeit gutgemacht".
    Wenn man sein Programm beschleunigen will, ist es zunächst wichtig, festzustellen wo wieviel Zeit verbraucht wird, also profilen.
    Dann den "inner loop" finden und diesen analysieren. Ist dieser durch bspw. eine Compilersprache oder ASM zu beschleunigen, dann los!
    Eukalyptus und auch einige andere hier im Forum haben schon wahre Meisterstücke gezeigt...

    Nichtsdestotrotz ist AutoIt in einigen Bereichen (ich bin mal vorsichtig) "suboptimal" aufgestellt. So werden beim Übergeben von bspw. Pointern "by reference" also bspw. str* , der String zunächst komplett kopiert, und dessen Pointer dann übergeben. Das dauert bei einem 100MB langen String eine knappe Sekunde! Ohne dass nur eine einzige Berechnung durchgeführt wurde....
    Man muss also abwägen, ob es sich lohnt, Zeit in die Entwicklung einer Funktion zu stecken, wenn deren Umgebung schon "bremst".

    In 99% aller Fälle ist AutoIt bei weitem schnell genug, aber ab und zu stellt sich ja schon die Frage nach etwas mehr "wums".
    Übrigens ist mit AssembleIt auch der Weg nach Multithreading/tasking überhaupt nicht weit, denn einfachst-"handcoded" ASM ist threadsicher und die Threadverwaltung ist per AutoIt ein Kinderspiel...

  • Update, siehe Post #1