Assembler Tutorial

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Unsere Datenschutzerklärung wurde aktualisiert. Mit der Nutzung unseres Forums akzeptierst Du unsere Datenschutzerklärung. Du bestätigst zudem, dass Du mindestens 16 Jahre alt bist.

    • Assembler Tutorial

      Wir brauchen ein Assembler Tutorial für XProfan. Ich hab im Internet gesucht und einiges gefunden, man lernt auch viel über die Grundlagen, aber viele Erklärungen konnte ich nicht finden. Die überhäufen einen mit gut erklärten Beispielen, aber nirgendwo wird erklärt wie ich auf bestimmte Werte komme, wie es dich mit variablen verhält, warum manchmal Register gelöscht werden und manchmal nicht. Da wird mit einem String hantiert, aber die Grundlagen zu Strings fehlen.
      Entweder bin ich zu blöd, was gut sein kann, oder die Tutorials sind wirklich nicht der Hit.
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/65TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 7 8GB/256GB
      jacdelad.bplaced.net
    • Ob ein Register geändert wird oder nicht hängt vom jeweiligen Befehl ab. ADD oder SUB schreibt das Ergebnis nach EAX, damit wird das Register EAX dadurch verändert. CMP führt zwar intern ein SUB aus, aber das Ergebnis wird verworfen, da es nicht gebraucht wird. EAX bleibt erhalten, als Ergebnis werden nur die Flags gesetzt. Man muß sich da also mit den Eigenarten des einzelnen Befehls auseinandersetzen.
      Variablen für die Parameterübergabe laufen über den Stack. Das hat Roland ja prima gelöst, damit muß man sich gar nicht weiter rumquälen :top: Lokale Variablen, die Du selbst erzeugen willst, realisiert Du als "Loch" im Code:

      Quellcode

      1. jmp weiter
      2. variable1:
      3. dd 0 ; reserviet 4 Byte, Zugriff über die Adresse variable1
      4. weiter:
      5. mov [variable1], eax ; variable1 wird hier mit dem Inhalt von EAX gefüllt
      Für Strings muß die Adresse, an der ein String steht in ein Register geladen werden und eventuell ein weiteres Register mit der Adresse, wo das Ergebnis abgelegt werden soll. Findet sich wieder in der Beschreibung des Befehles. Der Befehl wird für genau ein Byte ausgeführt. Der Befehl wird dann in einer Schleife ausgeführt, wobei die Zeiger automatisch bei jedem Befehlsaufruf hoch oder runter zählen (abhängig vom Richtungsflag).

      Sich Codestücke ansehen ist das Eine, um das alles zu verstehen muß man auch die Eigenschaften aller verwendeter Befehle mit im Blick haben.


      Gruß Volkmar
    • Und da fehlt mir eine Menge Grundwissen...
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/65TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 7 8GB/256GB
      jacdelad.bplaced.net
    • Das ist auf jeden Fall schon mal aufschlussreich. Aber wie deklariere ich Variablen und wie übergebe ich Parameter? Woher weiß ich welcher Befehl in welchen Register stattfindet?
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/65TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 7 8GB/256GB
      jacdelad.bplaced.net
    • gute fragen für den Anfang!
      da empfehle ich dir, dich von Grund auf mal in diese Materie einzuarbeiten und nicht gleich deinen stiel von "Einleitungsschnippsel" abhängig zu machen.

      Empfehlungen: Grundlagen der PC-Programmierung, Maschinennahes Programmieren von Anfang an. dort werden dir auch gleich noch andere Bücher mit angeboten. ich würd mich aber nicht nur auf die x86 beschränken, sondern dann gleich weitergehen zur x64. ist ja fast das gleiche, nur mehr Register udg.
    • Meinung: 32bit vs. 64bit-Assembler
      ==========================
      Bei x86-64 haben viele gute Programmierer bisher die Waffen gestreckt: x64 ist (imho) um ein Eckhaus schwieriger, hat viermal so viele Befehle, andere Übergabekonventionen und neue (relative) Indirektionen, verlangt einen ausführlichen PROLOG und einen schwierigen Beendingung-EPILOG, insgesamt auch viel mehr Übersicht darüber, was nun wirklich quasiparallel geht. Ein optimierender 64bit-Compiler ist übrigens händisch nicht zu toppen, bei 32 bit hat das noch Sinn.
      Gruss

      P.S.: Die gängigen XProfan-Versionen sind 32bit, weshalb auch nur 32bit Inline-Assembler funktioniert - das aber Anfänger-tauglich.
    • In Assembler gibt es keine Variablen. Aber du kannst Speicherplätze mit einem Label versehen und damit so ähnlich wie Variablen verwenden. In dem hier geposteten Beispiel mit der Dreiecksberechnung geschieht dies mit den Speicherplätzen a, b, c und ang:

      Quellcode

      1. JMP Start
      2. a:
      3. DD 0
      4. b:
      5. DD 0
      6. c:
      7. DD 0
      8. ang:
      9. DD 0
      10. Start:
      11. < ab hier wird der Code ausgeführt>
      Alles anzeigen
      Hier werden für jede "Variable" vier Byte (DD = Define Doubleword) reserviert und mit 0 gefüllt. 4 Byte reichen für einen Longint- oder einen Single-Wert.

      Parameterübergaben werden über den Stack abgewickelt. Mit PUSH wird ein Wert auf den Stack geschoben. Wenn eine Funktion drei Prameter erwartet, musst Du drei Parameter mit PUSH auf den Stack schieben, bevor du sie mit CALL aufrufst. Die Funktion verarbeitet dann die Parameter und entfernt sie beim Rücksprung vom Stack (wenn sie sauber programmiert ist).

      Welche Register verändert werden, wird im Befehl als Parameter angegeben oder es ist das Rechenregister EAX betroffen. "ADD 5" ohne Registerangabe erhöht EAX um 5.

      Im Prinzip kommt in den bisherigen Beispielen alles vor, aber die Beschreibung ist noch etwas dünn. Ich arbeite daran, es ist der Hilfe ausführlicher zu gestalten!

      Gruß
      Roland
      (Intel Duo E8400 3,0 GHz / 4 GB RAM / 250 GB HDD / ATI Radeon HD4770 512 MB / Windows Vista - ausgemustert zum Verkauf)
      AMD Athlon II X2 2,9 GHz / 8 GB RAM / 500 + 1000 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X4


      http://www.xprofan.de