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.
Assembler Tutorial
-
-
-
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 Lokale Variablen, die Du selbst erzeugen willst, realisiert Du als "Loch" im Code:Codejmp weiter variable1: dd 0 ; reserviet 4 Byte, Zugriff über die Adresse variable1 weiter: 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...
-
Also ich hab damit angefangen: Frank Abbing: Assembler-Grundkurs Deutsch
Hilfreich war dann auch Wikipedia, z.B. über das EFlags-Register
Und das x86-32 bit Registermodell finden wir auf Seite 16 eines PDF der Uni Dortmund. -
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?
-
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.
GrussP.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:
Code
Alles anzeigenJMP Start a: DD 0 b: DD 0 c: DD 0 ang: DD 0 Start: < ab hier wird der Code ausgeführt>
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
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!