Assembler CookBook (ASM Tutorial) + LASM + LASM Inline AutoIt

  • Moin!

    CookBook

    Für viele ist der Einstieg in Assembler zu schwer, da er mit einer extrem steilen Lernkurve verbunden ist. Deshalb habe ich mal dieses kurz-geratene Tutorial verfasst, dass einige Topics von Assembler und dem Drumherum. Dabei geht es vor allem nicht immer um konkrete (funktionierende) Code-Beispiele, sondern mehr um die Theorie an sich.

    Das Tutorial ist für absolute ASM Einsteiger. Ein wenig Programmierkenntnisse sind aber von Nöten. Trotzdem rolle ich auch noch einmal alles von den Zahlensystem angefangen auf.


    LASM

    Teil des CookBook sind Beispiele in LASM, meinem Assembler. Um das Tutorial durchzuarbeiten ist es nötig, sich das letzte Build von LASM zu laden. LASM ist ein x86 Assembler, welcher Marko-unfähig ist, dennoch aber alle wichtigen Befehle von SSE bis 3DNow! ( :P ) unterstützt. Er ist extrem klein etwa 52KB groß. Eine selbstgeschriebene IDE ist im Release inbegriffen. LASM generiert nichts außer Win32 Portable Executables und ist kompatibel mit allen kkompressor Packern. LASM hat einen internen Syntax-Check.

    LASM Inline

    Dies ist ein Wrapper um die LASM.dll, welche das Einbringen von LASM Code in AutoIt ermöglicht. Dabei ist das Prinzip das selbe wie das von FASM. Bloß ist die UDF hier deutlich übersichtlicher und portabler. Auch hier greift der Syntax-Check von LASM, der automatisch nach Au3Check ausgeführt wird, und ausführliche Fehlerinfos gibt.

    Download

    Aktuelle Version des CookBook (PDF): http://apaste.square7.ch/Release/Assembler%20CookBook/
    Aktuelle Version von LASM: http://apaste.square7.ch/Release/LASM/
    Aktuelle Version von LASM Inline: http://apaste.square7.ch/Release/LASM%20Inline/

    Einmal editiert, zuletzt von minx (14. Oktober 2013 um 12:45)

  • Sehr schön minx. :thumbup:

    Eigentlich hatte ich gerade mit C++ angefangen, aber ich werde einen Abstecher zu ASM machen.

    Vielen Dank für das Gesamtpaket!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Hab schon drauf gewartet :thumbup:

    Hatte ja schon die "Vorab"-Version teilweise gelesen, werd ich mir gleich mal downloaden, sobald ich von der Schule heimkomm :D

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

    Einmal editiert, zuletzt von PainTain (14. Oktober 2013 um 14:09)

  • Finde ich sehr schön. :thumbup: LASM werde ich in Zukunft wahrscheinlich sehr häufig benutzen, zumindest bis mein eigener Assembler in ferner Zukunft mal fertiggestellt ist. :D

    Wird es eigentlich auch irgendwann eine nicht-objektorientierte LASM.dll geben?

    AutoIt Version (Prod): 3.3.14.2

    AutoIt Version (Beta): 3.3.9.5

    ausgewählte Skripte: Chatbot, komplexe Zahlen (UDF)

    Einmal editiert, zuletzt von James (14. Oktober 2013 um 16:57)

  • Hi,
    feines Projekt :thumbup:

    Bei der Installation ist mein Virenscanner ausgestiegen wg. Packer in der LASM.EXE ;( Indiskutabel.....

    Die Beispiele funktionieren, allerdings steigt der Assembler aus mit folgender Fehlermeldung wenn im AutoItscript hinter dem Assemblercode die Consolewrite()-Anweisung steht (auch auskommentiert! )

    Code
    !> [LASM] Error in line 22 (Debug Console): Unknown label: Console
    !>17:36:52 AutoIT3.exe ended.rc:-1


    Die Line (in diesem Fall 22) ist immer 1 mehr als die Anzahl der #
    Steht Consolewrite vor dem Assemblercode ist Line =1

    Weitere Tests folgen^^

  • Zitat von Andy

    feines Projekt


    Danke ;)

    Zitat von Andy

    Packer in der LASM.EXE


    Der Packer ist mpress. Alle Antivirenprogramme sollten dann den String "mpress" in der "Bedrohung" enthalten. mpress ist ähnlich oft genutzt wie UPX, und eine bessere Alternative ^^ . Eine ungepackte Version vielleicht im nächsten Build. Allerdings ist die LASM.dll genau so gepackt worden, also ebenfalls per mpress!

    Ja teste weiter ^^ . Das mit dem Console-Write behebe ich in der nächsten Version ;)

  • Eigentlich wollte ich dir Punkte in der B-Note für das "Cookbook" abziehen, da meiner Meinung nach das Thema 16Bit viel zu viel behandelt wurde....
    Aber dafür bekam ich im 32Bit-Bereich fast durchgehend ein Grinsen aufs Gesicht gemalt, nur unterbrochen von einigen brüllenden Lachern! Köstlich geschrieben :thumbup:

    Den Hammer auf den Kopf-Smilie wirst du von mir nicht sehen, ich habe viel zu viel Respekt vor der offensichtlichen Arbeit die in LASM drin steckt!
    (Wobei ich sagen muss, dass AssembleIt2 doch noch etwas schlanker ist, komplett ohne FASM-UDF-Gedöns und ohne dll-file auskommt (lädt die dll aus dem Script direkt in den Speicher) und 64 Bit kann :P ...../EDIT/ und keine # braucht :D )
    Gesunder Wettbewerb ist klasse :rock:


    Eine Frage hätte ich noch:
    Wieso gibst du bei Jumps das "byte" mit?

    Code
    jle byte swap


    Und wieso bleibst du nicht bei dem "konventionellen" Datentyp,Wert,Datentyp,Wert,Datentyp,Wert bei der Übergabe?

  • Und wieso bleibst du nicht bei dem "konventionellen" Datentyp,Wert,Datentyp,Wert,Datentyp,Wert bei der Übergabe?


    int wird nun mMn häufiger gebraucht und ist deshalb der Standard. So wird der Aufruf kürzer, arbeitet man nur mit Ints. Persönlicher Geschmack, kann ja jeder ändern wie er will ^^

    Eigentlich wollte ich dir Punkte in der B-Note für das "Cookbook" abziehen, da meiner Meinung nach das Thema 16Bit viel zu viel behandelt wurde....
    Aber dafür bekam ich im 32Bit-Bereich fast durchgehend ein Grinsen aufs Gesicht gemalt, nur unterbrochen von einigen brüllenden Lachern! Köstlich geschrieben :thumbup:


    Hehe ;)

  • Aha, keine schlechte Idee immer dwords zu verwenden, da hätten gewisse Leute früher drauf kommen können... :rofl:

    Zitat von Cookbook

    ...Das Geschreibsel vor den Paramtern sollen die Datentypen sein. Jetzt kommt das dunkle Geheimnis: Das
    ist totaler Unsinn. Diese Datentypen sind so unnütz wie sonst nichts, weil sie schlichtweg nicht existieren.
    In der WinAPI lassen sich alle Funktionen eigenlich mit DWORD, also einem Double ansprechen. HWND
    ist DWORD, LPCTSTR ist DOWRD und UINT ist aber wirklich ein ... DWORD.

  • Das ist wahrscheinlich etwas hyperbolisiert, aber immerhin verdeutlicht es, dass man hier nicht nur um der Bezeichnung willen Datentypen "konvertieren" muss (wie in C++ :evil: ) ^^

  • Wird es eigentlich auch irgendwann eine nicht-objektorientierte LASM.dll geben?


    Eigentlich ist das nicht in Planung, technisch aber möglich. Sollte es eine Std-DLL geben, so werde ich trotzdem die OO aktuell halten ;)

  • Habs mir soeben ausgedruckt und in einen Schnellhefter getan für unterwegs (und gegen Langeweile in der Schule :rolleyes: ). Habs kurz uberflogen, paar Fehler sind noch drin, wie z.B. 'Internat' statt 'Internet' (oder direkt auf der ersten Seite in dem kleinen Text :P - 'kompelxes').

    Aber trotzdem super Buch. 47 Seiten, war ja sicher ganz schön Arbeit. Respekt. :thumbup:
    Wollte mich sowieso schon mal mit ASM beschäftigen, nachdem ich gesehen hab, was für Wunderwerke hier manche damit geschaffen haben.

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Meine gefundenen Fehler habe ich zwar wieder vergessen, ich kann das Buch aber auch irgendwann nochmal schnell durchlesen.

    Ich kann mich allerdings noch daran erinnern, dass du an einer Stelle Hex und Hexadezimal gleichsetzt. An dieser Stelle wäre es vielleicht ratsam zu erwähnen, dass Ersteres oft als Abkürzung für Letzeres verwendet wird, genau genommen aber ein ganz anderes Zahlensystem ist.

  • In meinem Schnellhefter sind noch ein paar Artikel, die interessante Themen betrachteten (wie das Faken von Interrupts in Win32 etc.) das wird natürlich noch später eingearbeitet :thumbup:

    Die Schreibfehler, joa, ist halt mit Wordpad geschrieben. ;)

  • Super Timing! Ich selbst bin ja auch noch in der Phase, in der mir Assembler zum Hals heraus hängt bevor ich damit richtig angefangen habe :whistling:
    In einem halben Jahr gehts dann aber in der Schule damit los, wäre also vieleicht keine schlechte Idee wenn ich mir das mal etwas anschaue. :thumbup:

    Danke sag ich aber erst, wenn es mir auch tatsächlich was gebracht hat ;)

    Bild1: Ich beim debuggen


  • Danke ;)


    Der Packer ist mpress. Alle Antivirenprogramme sollten dann den String "mpress" in der "Bedrohung" enthalten. mpress ist ähnlich oft genutzt wie UPX, und eine bessere Alternative ^^ . Eine ungepackte Version vielleicht im nächsten Build. Allerdings ist die LASM.dll genau so gepackt worden, also ebenfalls per mpress!

    Ja teste weiter ^^ . Das mit dem Console-Write behebe ich in der nächsten Version ;)

    Soviel zu dem :whistling:

    Eine ungepackte Version wäre wirklich nicht schlecht, da Avast ein wenig rumspinnt, was Ausnahmen betrifft. (Es blockiert gleich mal den Download)
    Habs mir das ganze jetzt mal in eine VM geladen (auch wegen den Grafik-Spielereien/Interrupts :D), da ich es geschafft habe, für die ganze Vbox mal eine Ausnahme hinzu zufügen.

    Und mal so nebenbei: Manche Absätze hast du auch mal ganz schnell runtergerattert, was? :D

    Zitat

    Wenn wir nund as Handle der Datei haben können wir sie auch benutzen. Zum Beispiel lesen. Wenn du die Lesen-Funktion as Interrupt 21h benutzen willst, muss due die Register wie folgt anlegen:

    Edit: Ähm...
    [Blockierte Grafik: http://m34.img-up.net/Capturee352.PNG]

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

    Einmal editiert, zuletzt von PainTain (15. Oktober 2013 um 16:15)

  • Das Datei-Kapitel hab ich geschrieben und dann ad acta gelegt. Ist auch nicht so wichtig, für mich :D

    Ja, die Zeilennummern sind quick'n'dirty ;)

    Einmal editiert, zuletzt von minx (15. Oktober 2013 um 17:04)

  • Was momentan möglich ist:

    Intructions
  • Hier noch eine schöne Referenz (sogar auf Deutsch) zu Asm Befehlen sowie Registern. i8086

    minx, schönes Buch! :)
    Inhaltlich war es auch ganz in ordnung und verständlich.
    Gab zwar ein paar Stellen die mich verwirrt haben, aber ich habe durchaus was dazu gelernt.

    LG. Make :)