Tutorial AutoIt und Assembler
//EDIT 11/03/2011
AssembleIt als Hilfsmittel für das Programmieren mit dem Embedded-FASM-Assembler nun inclusive Debugger!
//EDIT 19/10/2010
_AssembleIt() etwas angepasst, bitte Beispiele beachten! LÄUFT NICHT mit den hier im Tut gezeigten ASM-codes, da _AssembleIt() nun den Stack selbst aufräumt! Daher ist als Rücksprung zu AutoIt NUR EIN EINFACHES RET nötig! Also kein RET 8, um 2 Integer vom Stack zu räumen! Die hier im Tut vorgestellten Beispiele sind natürlich lauffähig.
Die Anpassung der bisherigen Beispiele habe ich vor, ggf gibts von euch weitere Ideen, was und wie man das "Handling" weiter verbessern könnte.
Links für Tutorials hinzugefügt im Abschnitt "Was muss ich an Vorwissen haben?"
Beispiele:
Beispiel_1: Addition von 2 Integer-Zahlen
Beispiel_2: Pixelsuchen32, findet ein Pixel innerhalb einer Bitmap
Beispiel_3 Verwenden eigener Variablennamen
Einfache Schleifen, der LOOP
Beispiel Stringbehandlung und Pointer auf AutoIt-Variablen
Aufruf von "Funktionen" mit CALL-Befehl, Beispiel Rekursion Fakultät
Beispiel Verwendung von Floatingpoint-Registern und ein Versuch, ein AutoIt-Script 1:1 in Assembler umzusetzen
Optimierung von Code am Beispiel des Tunnelfluges
Weitere Optimierung am "Tunnelflug" am Beispiel eines Arrays bzw. LookUpTabelle LUT
Einsatz von SSE/SSE2 Befehlen am Beispiel Tunnelflug
Beispiel für Übergabe und Rückgabe von Parametern an/von einer AutoItfunktion aus dem Assemblercode
Beispiel um aus einer Assemblerfunktion eine DLL zu machen
Verwendung von AutoIt-Variablen im Assemblercode NEU
Edit BugFix:
Fragen zum Thema bitte hier: Assembler Hilfe-Thread stellen.
Bisher hier gestellte Fragen sind dorthin verschoben.
Hallo zusammen,
da schon mehrfach die Frage nach der Verbindung von einfach zu erstellenden AutoIt-Scripten und sehr schnellen und kleinen Assemblerprogramen auftrat, stelle ich in diesem Tutorial einige Möglichkeiten vor.
Was ist ein Assembler?
- Ein Assembler ist ein recht einfaches Programm, welches nichts weiter macht, als Befehle in vom Prozessor direkt verarbeitbare Mnemonics (Maschinensprache) umzuwandeln.
Was muss ich an Vorwissen haben?
- Ich werde hier keine "Einführung" in Prozessortechnik machen, wer also keine Ahnung hat, um was es bei Assembler eigentlich geht, und warum jemand ein Prozessorregister oder Speicher braucht, dem empfehle ich die einschlägigen Seiten im Internet. Zum Beispiel HIER oder hier und für "oldschool"-Usenetnutzer hier. Sehr schön auch diese Seite und diese, welche auch hier teilweise in deutsch übersetzt wurde!
Mir geht es primär um die Frage, wie man Daten von AutoIt aus an das Maschinenspracheprogramm übergeben kann, und wie man Daten zurückbekommt.
Assembler ist MegaOUT!
- Für diejenigen, die meinen, Assembler gehöre zu den Dinosauriern, weil man auch objektorientiert mit Hilfe eines tonnenschweren Software-Supertankers ein 800 Megabyte großes "Hallo Welt" schreiben kann, sei gesagt, ja, macht das auch weiterhin! Es lebe die Zukunft!
Allerdings verpasst man dann, einen kompletten Sudoku-Löser incl. Ein- und Ausgabe in 67 Byte (ja BYTE! ) vorgestellt zu bekommen...
Was brauche ich?
- Wer nun nicht völlig abgeschreckt ist, dem würde ich empfehlen, HIER die Datei FASM.zip, einen in AutoIt "integrierten" Assembler, herunterzuladen und auszupacken, und schon kann´s losgehen. Bitte beachten, daß die vorgestellten Programme nur als 32Bit-Kompilat laufen, weiterhin sollte das System so "clean" wie möglich sein, ein neu aufgesetztes BS in einer virtuellen Maschine bietet sich an, ist aber keine Voraussetztung. Ich habe sowohl mit XP/32 als auch mit WIN7/32 in Produktivumgebung keinerlei Probleme gehabt.
Die im Programmpaket enthaltene FasmDemo.Au3 sollte ohne Probleme durchlaufen. Dann kanns losgehen...
EDIT: AssembleIt als Hilfsmittel für das Programmieren mit dem Embedded-FASM-Assembler sollte das arbeiten mit dem Code vereinfachen.
Wozu Assembler?
- Nun ja, mit keiner anderen Sprache ist man dichter "im" und am Prozessor dran, clever programmiert, kann ein sehr kurzes Programm aus einigen Bytes hunderte Male schneller als ein AutoIt-Script arbeiten..
Man benutzt also den Assembler dort, wo man große Geschwindigkeitsvorteile erreichen kann. Quasi nebenbei erfährt man einiges über Strukturen (Dllstructxxxxx) und den Aufruf von externen Funktionen z.B. aus DLL´s.
Das Errorhandling habe ich in den folgenden Beispielen weggelassen, aber gerade bei Assembler rächt sich das SEHR SCHNELL!
Ein einziges "fehlerhaftes" Bit in einem der Prozessorregister, und der Computer stürzt ab! Glücklicherweise sorgt der Protected Mode nur für eine Fehlermeldung^^
Zunächst stellt sich die Frage, warum in AutoIt "integriert"?
- Die Antwort ist relativ einfach, man hat EINE ausführbare Datei. Selbstverständlich ist es mit Assembler möglich, sehr einfach eine DLL zu erstellen, auch darauf werde ich natürlich eingehen!
Wie kommen die Assemblerprogramme ins AutoIt?
- Nun, ganz grob gesagt, reserviert AutoIt für den Assembler etwas Speicher, schreibt die aus dem Assemblercode erzeugten Maschinensprache-Befehle hinein, und springt aus dem AutoIt-Script in das Maschinespracheprogramm und nach der Abarbeitung der Befehle wird in das AutoIt-Script zurückgekehrt. Ähnlich einem DLL-Funktionsaufruf.
Hat man erst einmal Mit Hilfe des Assemblers die Maschinesprache-Sequenz (im folgenden nenne ich das Bytecode) an Befehlen erstellt, ist der Funktions-Aufruf mit einigen Zeilen AutoIt-Code erledigt.
Damit erübrigt sich auch ein Obfuscator, denn der "lesbare" Assemblercode wird nicht weiter benötigt!
Aber dazu später, los gehts mit einigen Beispielen!
Wir fangen damit an, einige einfache Funktionen zu erstellen. Die Eingabeparameter werden an die Assembler-Funktion übergeben, eine Berechnung wird ausgeführt und das Ergebnis wird an AutoIt zurückgegeben.
Dazu werden von AutoIt die Parameter auf den "Stack" (Stapel von Bytes) "gepushed" (geschoben), und von dort mit dem Assemblerprogramm weiterverarbeitet. Die Rückgabe erfolgt im AX (EAX)-Register.
Da wir meist im 32-Bit-Bereich arbeiten, verwende ich größtenteils die "großen" 32-Bit-Register (mit dem E-Präfix, bspw. EAX EBX ESP usw.), auch wenn das nicht immer notwendig sein sollte.
Die Beispiele sind natürlich kommentiert, wer trotzdem etwas nicht versteht, immer fleissig Fragen!
Eine 8088(286,386,486 usw)Befehlreferenz gibt es z.b. HIER oder HIER
Nur keine Panik, die allermeisten Befehle im ersten Link sind Erweiterungen (MMX, SSE usw), die man nicht unbedingt braucht. 2-3 Handvoll Befehle reichen aus, um effektive Assemblerprogramme zu schreiben.