assembler noch aktuell??



  • im grunde ist der titel schon die frage?

    ich hab früher auch mal in assembler geschriebe, aber das is jetzt schon ca.4 jahre her. ich dachte eigentlich keiner schreibt mehr in assembler, da es doch heute so viele andere gut compiler gibt.😕

    was sind die vorteile von assembler?? die nachteile kenn ich 🙂 :
    - man muss sehr viel schreiben, um das gleiche zu erreichen, wie in anderen sprache
    - es ist schwerer
    - ........

    aber ich lass mich gern eines besseren belehren ;)(das Bessere ist der Feind des Guten)


  • Mod

    ich glaube an den vor- und nachteilen hat sich seit urzeiten nicht viel verändert, ausser dass der potentielle vorteil bzgl. code grösse und geschwindigkeit gegenüber einem guten compiler i.d.r. erheblich schwerer zu erhalten ist.

    ein wesentlicher vorteil, der auch gleichzeitig ein nachteil ist :p, ist, dass man mitbekommt und auch kontrolliert, was wirklich im prozessor passiert. schon aus diesem grund kann ich jedem nur empfehlen, sich wenigsten ein kleines bisschen damit zu beschäftigen. diesen wissen richtig angewendet, kann oft zu besserem hochsprachen code führen. das ist nat. gleichzeitig ein grosser nachteil in der praxis, weil die vielzahl kleiner details, die zu beachten sind, für ein konkretes problem auf der abstraktionsebene, auf der es eigentlich gelöst wird, völlig irrelevant sind. primär ist und bleibt es ein werkzeug gewisse funktionen, die durch den compiler nicht adäquat erzeugt werden zu optimieren - oder überhaupt möglich zu machen (z.b. für vektorcode (MMX/SSE) bis zur einführung entsprechender intrinsics - die allerdings leider nicht alles komplett abdecken oder gewisse low-level funktionen und primitive auf betriebssystemebene, für die es ebenfalls keine mittel in höheren sprachen gibt, oder deren semantik nicht korrekt ist: siehe volatile und die unmöglichkeit korrekten multi-threaded code in C oder C++ zu schreiben).



  • na gut, das klingt logisch.
    wie kann man denn am besten assembler lernen?
    ich meine c/c++, pascal/delphi und java sind mir geläufig, nur wenn ich mal assembler lernen möchte, dann scheiter ich schon an den simpelsten problemen.
    texte ein und wieder aus zu geben is nicht das problem, nur wenn es dann etwas anspruchsvoller wird, dann komm ich meistens nicht weiter. Da hilft mir auch kein
    Beispielprogramm, da ich nicht verstehe, wie das genau funzt 🙂

    gibt es da gute buecher oder tutorials??



  • Am besten lernt man es immer noch, wenn man sich einfach kleine Funktionen in C oder Pascal schreibt und dann anschaut, was der Compiler draus macht.



  • verstehe, der compiler wandelt den quellcode erst in assembler quellcode um und dann in die masschinensprache :).



  • Nicht jeder, aber man kann sich's ja immer mit einem Disassembler anschauen.



  • jo, ich hab mal ein kleines prog disassembeld.

    das sieht folgendermaßen aus:

    #include "stdio.h"

    int main(){
    printf("hello world");
    return 0;
    }

    ich glaube ich muss hier nicht eklären, was es macht 🙂
    das sind also sage und schreibe 5 zeilen, 6 wenn man die leerzeile mitzählt. das hab ich dann compiliert und disassembeld.
    ich hab den disassembler "Hackman Disassemlber 8.02 lite" dafür benutzt.
    wenn ich die exe, die ich hello world.exe 🙂 genannt hab, disassmble, dann gibt mir dieser hackman über 6000 zeilen aus.
    hallo, hab ich was verpasst?
    also entweder der disassemlber ist total schlecht, ich hab irgendwas falsch gemacht oder c++ generiert einen ziemlich schlechten code.
    außerdem wird total viel wiederholt z.b:

    ADD [eax],al 8086
    ADD [eax],al 8086
    ADD [eax],al 8086
    ADD [eax],al 8086
    ADD [eax],al 8086
    ADD [eax],al 8086
    ADD [eax],al 8086
    ADD [eax],al 8086
    ADD [eax],al 8086
    ADD [eax],al 8086........... das geht noch ca. 30 zeilen so weiter 🙂 dann kommt was anderes und wieder das gleiche

    ich kann mir nicht helfen, aber für mich macht es keinen sinn, wenn man mehrer 100 mal al zu [eax] addiert.
    ......naja sicher könnt ihr mir da weiter helfen 🙂



  • Ähm, wenn du stdio.h includest, muss der kompiler die Bibliothek dazulinken! Versuchmal lieber standalone Programme anzugucken.



  • Hm...

    Also ich wuerde ja das Hantieren mit dem Disassembler ehrlichgesagt eher zum Abschluss des Assemblereinstiegs ansetzen. 🙄
    Viele neuere Compiler erzeugen derartig verwirrenden Code, dass einem Anfaenger der Blick auf die erzeugten Codes einfach mal gar nichts bringt ausser Frust und Verwirrung.
    Ein Disassembler ist IMHO nunmal wirklich nur ein Werkzeug fuer Profis.

    Mein Vorschlag:
    Anfaengertutorials durcharbeiten (siehe FAQ).
    Sich anderer Leute Quellcodes anschauen (nicht die vom Disassembler erzeugten Dinger 😉 ), um so ein Gefuehl fuer Assembler zu kriegen.
    Viel selber probieren. 😉
    Mit einem Debugger (ich habe dafuer den TurboDebugger genommen) mal einige kleinere Programme durchgehen.



  • das wird dann wohl das beste sein 😉
    ich hab mir dann mal ein asm prog angeschaut, was genau das machen soll, wie das c-prog.

    .MODEL small
    .STACK 100h
    .DATA
    HelloMessage DB 'Hello world',13,10,'$'
    .CODE
    mov ax,@data
    mov ds,ax
    mov ah,9
    mov dx,OFFSET HelloMessage
    int 21h
    mov ah,4ch
    int 21h
    END

    .....das ist doch wenigsten überschaubar 🙂
    wobei ich bin mir nicht sicher, aber kann man .MODEL small, .STACK 100h, .DATA, und .CODE nicht weg lassen?? ach und END nicht auch??



  • Wenn du es einfach in der IDE im Debugger ausführst, hast du ein schönes Disassembler-Listing und siehst auch, zu welcher Funktion bzw. Zeile der Code gehört. Das ganze exe disassemblen bringt natürlich nix. Aber wenn ich z.B. wissen will, wie man zwei Integer addiert, schreibe ich sowas:

    int addnumbers(int a, int b) { return a+b; }
    

    Heraus kommt (in AT&T-Schreibweise):

    movl    8(%esp), %eax
        addl    4(%esp), %eax
        ret
    

    Wenn du dir jetzt ein paar so einfache Funktionen anschaust, stellst du bald fest, dass die Parameter offenbar irgendwas mit dem Stack zu tun haben müssen. Was add tut, ist eh klar (bzw. kannst du es in der Intel-Referenz nachschauen). Dass der Rückgabewert immer in eax stehen muss, verrate ich dir hier... Und ret (also Return) kannst du wieder nachschauen.

    Man muss also eigentlich zwei Dinge lernen: calling conventions und instructions. Für zweiteres gibt's eine gute Referenz von Intel, das erstere würde ich eher experimentell machen (wobei es vermutlich auch irgendwo niedergeschrieben ist).



  • Und wenn sich jetzt wer beschwert, dass das zu mühsam ist und dass es mit N00b-HOWTOs ganz einfach erlernbar ist --> http://www.norvig.com/21-days.html


Anmelden zum Antworten