Erlernen von Assembler



  • Hallo,
    mich interessiert Assembler immer mehr, und vor allem was damit alles möglich ist. Ich hab 2 Fragen:

    1. Kann man Assembler Code in C++ Code irgendwie einfügen?
    2. Ein sehr gutes und lehrreiches Tutorial oder Buch zu Assembler, dass bitte auch alle einzelne Details wie die Mathematik erklärt, wär was für mich...
    -> und kein englischsprachiges Tutorial/Buch wie in der FAQ

    [ Dieser Beitrag wurde am 05.03.2003 um 09:55 Uhr von pAngel editiert. ]



  • Original erstellt von pAngel:
    **1. Kann man Assembler Code in C++ Code irgendwie einfügen?
    **

    Das hängt ein wenig vom Compiler ab, aber ansich kann das jeder heutige Compiler. MSVC z.B. per __asm { hier dein assemblercode }, die Syntax im GCC ist ein wenig komplizierter, aber möglich ists trotzdem.

    **
    2. Ein sehr gutes und lehrreiches Tutorial oder Buch zu Assembler, dass bitte auch alle einzelne Details wie die Mathematik erklärt, wär was für mich...
    -> und kein englischsprachiges Tutorial/Buch wie in der FAQ
    **

    Ich habe selber mit "Das Assemblerbuch" von Trutz EIke-Podschun gelernt, aber das ist ansich nicht das ideale Einsteigerbuch. Es wird halt mehr erzählt, was welcher Befehl macht, die Brücken muss man sich dann selber bauen. Aber sobald man ein wenig drauf hat ein sehr gutes Buch.

    Das einzige deutsche Tutorial was ich kenne steht in der FAQ rum (nicht genau gelesen, wa? ;)) unter ASM TUTORIALS-->Intel Syntax Assembelr Tutorials, Assembler - EInführung 1 bis Assembler - DOS (Teil 3). Ich habs zwar selber nicht gelesen und ein kleiner Blick darüber verrät dass es nicht mehr ganz neu ist, für den Einstieg macht das aber nichts, die 32-bit-Teile kann man danach recht einfach dazulernen.



  • Jep, jetzt hab ich das Assembler- Tutorial.
    Wo krieg ich einen Assembler Compiler oder was ich alles fürs Programmieren für Assembler brauche (ich will nur wichtige Sachen durch C++ erledigen)?



  • Original erstellt von pAngel:
    Jep, jetzt hab ich das Assembler- Tutorial.
    Wo krieg ich einen Assembler Compiler oder was ich alles fürs Programmieren für Assembler brauche (ich will nur wichtige Sachen durch C++ erledigen)?

    Fürs programmieren mit ASsembler brauchst du - oh wunder - einen Assembler 😉 Welchen du brauchst hängt ein wenig von deinem Tutorial ab, weil es einfacher ist, wenn du die ganze Syntax durmherum nicht immer umschreiben musst. Meistens braucht man MASM, TASM oder NASM, letzteren findet man unter nasm.soureforge.net. Für die anderen wirds nen Tick schwieriger. Zumindest TASM kostet nämlich ansich Geld afair, bei MASM bin ich mir nicht ganz sicher.



  • Was ist der Unterschied zwischen MASM, TASM und NASM (ich nutze nur mal so damit ich es sage, WinXP)?
    UND: ich hab Visual C++ standard edition. Würde beispielsweise folgender Code funktionieren?

    #include <iostream.h>
    
    __asm
    {
       mov dx, 070h
       mov al, 02Eh
       out dx, al
       inc dx
       xor al, al
       out dx, al
    }
    
    void main()
    {
         __asm
    }
    


  • Ich hab zwar überhaupt keine Ahnung von Assembler, aber müsste das nicht wenn dann so aussehen:

    #include <iostream.h>
    
    void main()
    {
      __asm
      {
        mov dx, 070h
        mov al, 02Eh
        out dx, al
        inc dx
        xor al, al
        out dx, al
      }
    }
    

    So dachte ich es immer 🙄



  • Mal ne Frage was willst du mit Assembler Programmieren ?

    Anwendunssoftware oder Hardwaresoftware(8051,PIC...)
    Wenn es um Hardware geht kann ich dir evtl. helfen :

    Wenn du etwas Technischeswissen hast

    BUCH : "Applikationen zur 8051-Mikrocontroller-Familie"
    ISBN: 3-89090-657-5

    Compiler : Keil

    MFG



  • Original erstellt von pAngel:
    **Was ist der Unterschied zwischen MASM, TASM und NASM (ich nutze nur mal so damit ich es sage, WinXP)?
    **

    Die Unterschiede liegen in den Metainstruktionen, das sind Befehle, die nicht in das fertige Programm kommen, sondern dem Assembler sleber Dinge sagen, z.B. irgendwelche Werte an bestimmten Grenzen ausrichten etc.

    **
    UND: ich hab Visual C++ standard edition. Würde beispielsweise folgender Code funktionieren?

    #include <iostream.h>
    
    __asm
    {
       mov dx, 070h
       mov al, 02Eh
       out dx, al
       inc dx
       xor al, al
       out dx, al
    }
    
    void main()
    {
         __asm
    }
    

    **

    Nicht ganz...
    a) Du musst den __asm{ ... } Teil in eine FUnktion kapsel und die dann aufrufen
    b) in/out sind priviligierte Instruktionen. Die Funktionieren wzar unter Win9x (dank mangelhaftem Schutzkonzept), aber in Win2k/WinXP fliegt damit dein programm nur, weil Userprogramme eben nicht direkta uf die Hardware zugreifen dürfen 🙂



  • Mal ne Frage was willst du mit Assembler Programmieren ?

    ich will in die betriebsystemprogrammierung einsteigen, das geht mit c++ leider nicht...

    in/out sind priviligierte Instruktionen. Die Funktionieren wzar unter Win9x (dank mangelhaftem Schutzkonzept), aber in Win2k/WinXP fliegt damit dein programm nur, weil Userprogramme eben nicht direkta uf die Hardware zugreifen dürfen

    war nur ein beispiel. ein anderes asm- programm kannte ich derzeit nicht. soweit ich weiß killt es die daten des bios.



  • Original erstellt von pAngel:
    **in/out sind priviligierte Instruktionen. Die Funktionieren wzar unter Win9x (dank mangelhaftem Schutzkonzept), aber in Win2k/WinXP fliegt damit dein programm nur, weil Userprogramme eben nicht direkta uf die Hardware zugreifen dürfen

    war nur ein beispiel. ein anderes asm- programm kannte ich derzeit nicht. soweit ich weiß killt es die daten des bios.**

    Ein Grund mehr, warum WinXP das nicht zulassen sollte 😉 Ein Beispiel wäre:

    #include <stdio.h>
    
    int addiere(int a, int b) {
       int sum;
    
       __asm {
          mov eax, a
          mov ebx, b
          add eax, ebx
          mov sum, eax
       }
    
       return sum;
    }
    
    int main() {
       printf("%i", addiere(3, 5));
    }
    

    (Anmerkung für Erbsenzähler: Ja, man kann auch bei add eax, ebx schluss machen und das ganze noch um einiges kürzen, aber es soll ja anschaulich bleiben ;))

    [ Dieser Beitrag wurde am 05.03.2003 um 21:11 Uhr von TriPhoenix editiert. ]



  • man kann C- Variablen auch in Assembler verwenden? 😕



  • Original erstellt von pAngel:
    man kann C- Variablen auch in Assembler verwenden? 😕

    im inline-Assembler von MSVC ja, sonst wird die interaktion so schwer 🙂



  • fang erst morgen an zu lernen.
    mal ne frage zu fortgeschrittenen:
    was kann man mit assembler alles machen, was man mit anderen sprachen nicht machen kann?
    UND: ist es schwer Assembler zu lernen?



  • Original erstellt von pAngel:
    fang erst morgen an zu lernen.
    mal ne frage zu fortgeschrittenen:
    was kann man mit assembler alles machen, was man mit anderen sprachen nicht machen kann?
    UND: ist es schwer Assembler zu lernen?

    Nun ich weiß nicht ob es viel gibt, was man nur in asm machen kann. ASM arbeitet ja vor allem in drei Bereichen:

    1. Gerätetreiberprogrammierung. Für Direkt-IO wie die oben genannten Befehle in und out hat C meistens kein äquivalent, weils in User-Programmen ja auch nichst zu suchen hat. In Kerneltreibern kann das durchaus mal notwendig sein. In Treibern werden deswegen oft kleine Assembler-Routinen benutzt
    2. Hocheffektive Grafikprogrammierung. Auch heutzutage nutzen die Compiler selten Features wie MMX/SSE/3DNow. Wenn es um Parallelverarbeitung von großen Daten geht, nutzt man dann ab und zu assembler, weil der Compiler manchmal einfach zu "dumm" ist, um richtig zu optimieren.
    3. Betriebssystemprogrammierung. Einige Teile der OS-Programmierung (Startup, Speicherverwaltung, Protected-Mode-Kommunikation) lassen sich in C nunmal einfach nicht lösen und es muss asm her. Jedoch ist es auch hier üblich so wenig wie möglich, so viel wie nötig in asm zu schreiben. Ohne geht es jedoch auf KEINEN Fall.

    Ob asm nun leicht zu lernen ist hängt sichelrich vom lernenden ab. Hilfreich ists, wenn du shcon eine Programmiersprache beherrscht, wichtig ist dann vor allem das Konzept von asm zu lernen, dass man keine großen Sprachkonstrukte hat sondenr nur kleine Mini-Befehle mit denen man sich alles zusammensetzt. Wenn du das Konzept begriffen hast, ist der Rest fast nur noch lernen welche Bedeutung welcher Befehl hat.



  • wie spricht man "Mnemonic" aus?



  • man übt 😉 oder läßt das M weg



  • Warum wird Assembler heute nicht mehr so oft benutzt, obwohl es komplexer ist als andere hochsprachen?



  • Original erstellt von pAngel:
    Warum wird Assembler heute nicht mehr so oft benutzt, obwohl es komplexer ist als andere hochsprachen?

    Heutzutage sind die Rechner schneller und Compiler optimieren besser. Da muss man keine komplette Grafikengine in ASsembler mehr schreiben um mickrige 320x200 Pixel bei 15 fps auf den Bildschirm zu rendern. C-Code (oder andere Hochsprachen) sind wesentlich übersichtlicher und bei der heutigenm SOftwareindustrie ist verständlicher, wartbarer Code auch extrem wichtig, da sich die Produkte teilweise ewig halten (--> Starcraft, Half-Life...wäre das in ASM geschrieben wüsste schon längst kein Blizzard/Valve-Progger mehr, was man machen muss um dieses und jenes zu patchen ;))



  • Warum funktioniert folgender Code mit TASM nicht (jedenfalls erhalte ich einen Laufzeitfehler):

    DATEN SEGMENT
          MELDUNG DB "Hello World!", "$"
    DATEN ENDS
    
    STAPEL SEGMENT BYTE STACK
          DW 128 DUP (?)
    STAPEL ENDS
    
    CODE SEGMENT
    ASSUME CS:CODE, DS:DATEN,ES:NOTHING,SS:STAPEL
    
    START:  MOV AX, DATEN
            MOV DS, AX
            MOV DX, OFFSET MELDUNG
    
            MOV AH, 9H
            INT 21H
    
       CODE ENDS
            END START
    


  • was für einen laufzeitfehler genau?



    Diese Anwendung wird aufgrund eines unzulässigen Zugriffs beendet.
    Alle Anwendungen beenden und Computer neu starten

    Falls bei der Arbeit mit dem Programm permanent Probleme auftreten, klicken Sie auf die Schaltfläche "Start" und dann nacheinander auf "Hilfe", "Problembehandlung" und "Wenn Probleme beim Ausführen von MS-DOS-Programmen auftreten".

    In dieser Anwendung ist ein unbekannter Ausnahmefehler aufgetreten.

    Ort des Fehlers: 1434:40DA
    Bediente Interrupts: Keine*


Anmelden zum Antworten