Assembler Grundsatzfragen wenn ...

  • Hallo,


    wenn man Assambler programmieren wollte (ich), was muß ich da wissen? Wie muß ich denken? kann das jeder Compiler? Wäre das egal ob BASIC oder C ? Brauche ich ein extra Compiler? Welche Kenntnisse brauche ich? Muß ich Binär können? Was ist mit Assambler möglich? Alles oder mehr als andere Sprachen?


    Ist Assambler alt?


    danke

  • Was ist mit Assambler möglich? Alles oder mehr als andere Sprachen?

    Mehr und zugleich weniger als in anderen Sprachen: Du kannst richtig heftig Tricksen und Konstrukte umsetzen die keine andere Sprache ermöglicht, aber selbst vermeintlich einfachste Aufgaben können in Assembler ziemlich kompliziert und Aufwändig werden.


    Wie muß ich denken?

    Problem- und Schrittorientiert: Was will ich machen? Was für möglichkeiten bietet die Hardware- und Softwareumgebung? Welche Schritte muss ich unternehmen damit am Ende das passiert was ich will?

    Was muss ich dabei beachten: Stichwörter Parameterübergabe (passiert über Register, den Stack, oder Speicheradressen - bei Hardware auch über Ports, die teilw. indexiert sind (über Port A wird festgelegt welches Hardwareregister an Port B zu sehen ist)), Sicherung von Daten (damit die nach einem Unterprogrammaufruf nicht weg sind), Aufräumen, Speicherzugriff.

    was muß ich da wissen?

    http://www.ctyme.com/intr/int.htm

    ist schonmal eine gute Anlaufstelle


    Muß ich Binär können?

    Binär und Hex (meineswegen auch Oktal - als untermenge von Hex) sind sehr von Vorteil, ja. Damit lässt sich eben am heftigsten tricksen.

    kann das jeder Compiler?

    Viele können inlineassembler. z.b. Turbopascal - allerdings musst du schauen welche Rechnerklasse da unterstützt wird - TP kann z.b. nur 86er und 286er Code

    Von allen Dingen auf Erden ist die Intelligenz am gerechtesten verteilt: Jeder glaubt, er hätte genug davon.

    2 Mal editiert, zuletzt von Dosenware ()

  • .. das klingt danach das man vorher eine andere Sprache kennen sollte. Und es klingt danach das man das richtige Werkzeug nutzt um die richtige Schraube zu lösen, also sehr speziell.

  • Ganz so schlimm ist es nicht, aber Assembler ist eine Grundsprache - sehr mächtig, aber alleine kann die erstmal nichts.


    In Pascal gibt es z.b. den Befehl write(Variable,'Text'); der konvertiert so ziemlich alle Daten in Text (also auch Zahlen) und hat auch kein Problem mit Zeigern - ist dem Befehl alles egal - und gibt es auf deinem Bildschirm aus.

    Sowas gibts in Assembler nicht, da musst du alles per Hand konvertieren und die Ausgabefunktionen des/der Betriebssystems/Bios/Hardware direkt ansprechen.


    Assembler ist cool - nur musst du jede Treppe selber steigen, Aufzüge gibts nur in Hochsprachen.


    Für Dos wirst du wohl Hauptsächlich INT 10h (Videofunktionen) und INT 21h (Dos) brauchen.

    Von allen Dingen auf Erden ist die Intelligenz am gerechtesten verteilt: Jeder glaubt, er hätte genug davon.

  • Mahlzeit :)


    also um mit Assembler programmieren anzufangen, sind meiner Meinung nach erstmal etwas tiefere Kenntnisse ueber den PC und seine Architektur notwendig. Ich nehme an, wir reden hier auch von Intel x86er Assembler und nicht z.B. Z80 Assembler...


    Jedenfalls sollte man schon wissen, dass der Prozessor sog. Register besitzt und wie viele es davon gibt und welche Funktion sie haben. Die wichtigsten Register sind AX, BX, CX und DX, dann gibt es noch CS, DS, Pointer wie SP und BP.


    Was Interrupts sind sollte man wissen und welche es gibt. Beispiele wie INT 10h und INT 21h wurden schon genannt, fuer die Maussteuerung bietet sich INT 33h an ;) Also Hexadezimal in Dezimal und Dual umrechnen koennen sehe ich auch als Grundvoraussetzung an.


    Es ist fuer dein Vorhaben in jedem Falle sinnvoll, vorher schon mal mit einer Hochsprache wie Pascal, BASIC oder C/C++ oder anderem gearbeitet zu haben.


    Wenn du dich ohne Vorkenntnisse in diese trockene Materie einarbeiten willst, wirst du wohl wenig bis gar kein Spass daran haben... ;)


    Ich habe bisher auch nur ein bischen Assembler genutzt, um in meine Pascal-Programme ein paar nette Sachen einzubauen, aber wenn man sich mehr damit beschaeftigt, faengt es an Spass zu machen 8) Nur auf blauen Dunst mit Assembler anfangen ist vielleicht ein bischen zu viel fuer den Anfang...

  • Hallo, nimm das Turbo Pascal 6 oder 7.


    Damit kannst du ASM betreiben zum lernen , auch ohne sich mit Pascal auseinander zu setzen.

    Pascal und das ASM ergibt später auch eine gute Ergänzung.


    Ich benutze mit 71 Jahren das PDS-Basic mit Turbo C 3.0 Objekte zusammen.

    Auch eine gute Ergänzung.

  • Assembler ist die simpelste Sprache jedoch hast Du das Problem das die hardware etwas kennen musst. In C passiert das nur in Grenzfällen, in Assembler in "jeder Zeile". Alle kompilierten Sprachen entblössen irgendwann und irgendwie ein wenig vom "Motor".


    Falls Du in x86 Assembler eintauchen willst dann geh die 386+ Route und benutze einen assembler der das flat memory model unterstützt(z.B. Tasm(32), Masm, Wasm, etc.) - dadurch ersparst Du Dir die segment-Problematik und kannst auch die 32bit Register nutzen. Dies wiederum entbindet Dich zusätzlich von den meist unangenehmen Problemen bei Multiplikation und Division von "grösseren" Zahlen(im Prinzip immer dasselbe aber ein wenig einfacher).


    Du kannst das Duo WatcomC und z.B. Tasm(32) benutzen und so "spezielle" Routinen in assembler schreiben und diese dann vom C source aufrufen. Dabei lernst Du auch gleich Funktionsdeklarationen und "calling conventions".


    Das Feld ist riesig aber Du kannst mit einem sehr puristischem Ansatz sehr viel machen. Falls Du ein professionelles source-Beispiel für die Assembler / (Watcom)C Option einsehen willst dann wirf einen Blick auf Alexey's "PCDoom-v2", dem DOS "port" vom originalen Linux Doom code.

  • Hmm, gibts in Assembler soetwas wie Compilerdirektiven... bzw. Konstanten die der Compiler einsetzt?


    z.b.

    Von allen Dingen auf Erden ist die Intelligenz am gerechtesten verteilt: Jeder glaubt, er hätte genug davon.

  • Was mit Assembler möglich ist, ist erstmal alles, was die benutzte Prozessorarchitektur kann.

    Wenn du in Assembler programmierst, arbeitest du ja direkt mit den Prozessorregistern und hast den kompletten Befehlssatz zur Verfügung. Es gibt durchaus ganz aktuelle Assembler, die auch die modernsten Befehlssätze und Erweiterungen beherrschen. Damit kannst du also durchaus mehr machen, als in anderen Sprachen. Vor allem, wenn es nah an der Hardware und stark optimierter Code sein soll.

    Beispiele dafür, wo Assemblercode auch heute noch gefragt ist, wären zum Beispiel die Programmierung eines Videobios, Code für Mikroprozessoren, Maschinensteuerungen.

    Ich kenne zum Beispiel jemanden, der hat in Assembler Menüs für Kaffeevollautomaten programmiert:)


    Für einen guten aktuellen Assembler (der aber auch 8086er code und DOS kann), guck dir mal den NASM, den Netwide Assembler an.


    Binär und Hex (meineswegen auch Oktal - als untermenge von Hex) sind sehr von Vorteil, ja. Damit lässt sich eben am heftigsten tricksen.

    Kleiner Tipp: Den Windows-Taschenrechner mal auf "Programmierer" stellen. Macht einem das Leben deutlich leichter, wenn man mit Binär, oder Hexadezimal noch nicht gut vertraut ist.

    Meine DOS-Rechner:

    Kleiner Industrie-486er mit 100 MHz (Intel 80486DX-4), 32 MB SD-RAM, Diamond SpeedSTAR 24 und SB 16 ( CT2770 ) + TNDY

    "Frankenstein" Pentium II mit 266 MHz, Elsa Winner 1000 TrioV + Voodoo I, SB 16 (CT2290) + Yamaha DB50XG


    Von mir geschriebene DOS-Programme gibt es hier.

  • Windows

    Ketzer! ;)


    Ich finde eher man sollte Hex selbst lernen, sobald man das Konzept verstanden hat ist es auch sehr einfach. Vor allem da es eine 1:1 Repräsentation des Binärformats ist und - anders als Oktal - auch die Wortbreite dem in der Informatik üblichen entspricht.

    Lediglich die Wandlung HEX->Dez ist etwas aufwendig.


    PS. Bin -> HEX -> Dez

    Von allen Dingen auf Erden ist die Intelligenz am gerechtesten verteilt: Jeder glaubt, er hätte genug davon.

  • Ich finde eher man sollte Hex selbst lernen, sobald man das Konzept verstanden hat ist es auch sehr einfach. Vor allem da es eine 1:1 Repräsentation des Binärformats ist und - anders als Oktal - auch die Wortbreite dem in der Informatik üblichen entspricht.

    Lediglich die Wandlung HEX->Dez ist etwas aufwendig.

    Ja, man muss sich einmal überwunden haben, offen für andere Konzepte zu sein und Zahlen nicht immer nur dezimal denken zu wollen. :)


    Ich habe noch einen Literaturtipp für euch:


    Mit Hilfe dieses Buches habe ich damals Assembler gelernt. Eine sehr gut geschriebene Einführung und ich nutze es heute noch gerne als Nachschlagewerk (drum ist meines auch so zerfleddert).

    Das Buch beinhaltet nämlich auch eine verständliche Einführung in die Funktionsweise eines 8086er Prozessors und zudem ausführliche Anhänge (Tastaturscancodes, häufig benötigte Interruptfunktionen usw. Natürlich auch die Hex-Binär-Dezimaltabellen :)).

    Und das schönste an dem Buch ist, dass ein 80286er als Prozessor mit "rasanter Rechengeschwindigkeit" bezeichnet wird und natürlich gibt es nur DOS. :D


    Siehst du Dosenware , du musst keine Sorge haben. Ich bin doch nicht abgefallen von der reinen Lehre. :D

    Meine DOS-Rechner:

    Kleiner Industrie-486er mit 100 MHz (Intel 80486DX-4), 32 MB SD-RAM, Diamond SpeedSTAR 24 und SB 16 ( CT2770 ) + TNDY

    "Frankenstein" Pentium II mit 266 MHz, Elsa Winner 1000 TrioV + Voodoo I, SB 16 (CT2290) + Yamaha DB50XG


    Von mir geschriebene DOS-Programme gibt es hier.

  • Gibt es eigentlich ein Buch, in dem die x86-Befehle zusammengefaßt und erklärt sind?


    Von 8086 bis möglichst weit in die 64-bit Ära hinein. Erklärungen auf Deutsch mit Beispielen wären toll, Englisch geht aber auch (zur Not). Mehr muß nicht drinnen stehen, also kein DOS, kein Windows. Ein reines Nachschlagewerk für Assemblerbefehle.

    mov, and, or, call, jmp, loop, rep und so kann ich ja inzwischen. Aber manchmal taucht halt auch immer wieder mal so was auf wie bts, rdmsr, wrmsr oder anderes.

    Bisher bemühe ich dafür immer die Suchmaschine, weil keine Seite alle Befehle erklärt. Da muß ich dann erst wieder zwei drei Seiten anklicken, bis ich die richtige gefunden habe, die den Befehl vernünftig erklärt und nicht einfach irgendwelche Forumsbeiträge auflistet, wo zufälligerweise das Stichwort drin vorkommt. :rolleyes: Das nervt und ich bin halt mehr ein Bücherwurm, dem das ständige Hin- und Herklicken zwischen verschiedenen Fenster auf den beiden kleinen Bildschirmen noch mehr auf die Nerven geht. :S

    Ich werde mich von keinem einzzzigen Prozzzessor trennen.
    Jedoch lockt es mich beinahe, ihn Dir zu überlassen, nur um zu sehen, wie er Dich in den Wahnsinn treibt :evil:


    Meine Begehren

  • Die Befehle an sich sind in der Spezifikation, also Datasheets zu der Intel CPU, zu finden. Die Syntax ist Compiler spezifisch, daher musst Du ein Buch suchen, welches Assembler Syntax für einen bestimmten Compiler beschreibt. Da werden aber kaum alle Befehle von Ur-Zeit bis Neuzeit beschrieben. Vor allem, wenn Du Sachen wie AVX verwenden möchtest, kriegst Du einen Knoten im Hirn. Die meisten neuen Befehle sind nicht mehr dazu gedacht um diese per Hand zu schreiben. Das ist eher dafür da, damit die Compiler für Highlevel-Sprachen den Code generieren und nicht um es per Hand zu schreiben.

  • Probier eine der Assembler Befehlsreferenzen wie z.B. "Assembler Ge-Packt" - welches bis SSE2 "vordringt".

    Für x64 solltest Du Dir vielleicht ein gutes Buch wie Low-Level Programming oder ein fokusiertes Beginning x64 Assembly Programming zulegen.


    Bezüglich Syntax - Intel oder AT&T. Intel ist einfacher aber AT&T hilfreicher wenn du z.B. auf gcc unterwegs bist - speziell inline-"asm" ist extrem penibel. Fasm kann glaub ich beides.

    Je nach assembler gibt es kleine Unterschiede wie man ein gültiges file deklariert, aber meistens wirst nicht mehr als ein Objekt generieren dessen code Du von C aus auf"rufts".

    Die neueren Befehle sind meist der selbe alte Käse wie z.B. 3DNow oder SSE jedoch hat sich die Wortbreite in die 64Byte Region vorgekämpft - z.B. sind 16 floats parallel bearbeitbar. Selbst die Befehle in einem Assembler file zu benutzen ist meisten besser, da intrinsics oft Fehler aufweisen oder "veraltet" sind.


    Was sich grundlegend seit damals(3DNow, MMX) verändert hat ist das es einen eigenen physikalischen Registersatz gibt(bei MMX noch nicht der Fall) und meist integer sowohl float/double bearbeitet werden können. Dazu kommen noch cache/Kryptographie/usw. spezifische Befehle. Falls Dich das wirklich interessiert dann ist Agner Fog's Seite ein kleines Paradies - er ist einer der ganz wenigen der sich wirklich auskennt und auch hochqualitativen source code seiner Projekte frei anbietet.

  • Danke für die Tips, werde ich mir mal anschauen. :)

    Inzwischen bin ich hierauf gestoßen: https://www.felixcloutier.com/x86/index.html basierend auf

    Intel 64 and IA-32 Architectures Software Developer’s Manual Combined Volumes 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D, and 4, was ich in der Fassung vom Mai 2020 schon habe. Ist aber ein echt dicker Wälzer. Da hat der Bücherwurm viel zu bohren. ;)

    Ich werde mich von keinem einzzzigen Prozzzessor trennen.
    Jedoch lockt es mich beinahe, ihn Dir zu überlassen, nur um zu sehen, wie er Dich in den Wahnsinn treibt :evil:


    Meine Begehren

  • Hallo!


    Der Thread ist schon recht alt, aber mich würde interessieren wie Deine Assembler Story weitergegangen ist. Gerade bei Assembler ist es oft so dass man begeistert anfängt aber dann oft leider nicht so richtig dran bleibt.


    Vor allem dauert es ja ein wenig bis man sichtbare Ergebnisse erzielt für die man in einer Hochsprache nur wenige Zeilen benötigt, das fängt schon bei einfachen Ausgaben auf dem Bildschirm an, z.B. bei Zahlen, Text allein geht ja noch recht einfach.


    Seitdem ich mich in Sachen Programmierung voll und ganz auf den DOS Bereich konzentriere ist Assembler mehr oder weniger regelmäßig im Einsatz und es macht echt viel Spaß weil man nur durch Beschäftigung mit Assembler erst so richtig erkennt wie die Dinge unter der Motorhaube ablaufen.


    Lg, Markus

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!