assembler noch aktuell??



  • 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