Assemblertutorials für x86-Prozessoren


Einleitung

Wahrscheinlich stellen Sie sich die Frage, warum es neben den ungezählten Büchern über Assembler noch diese Tutorials geben muß. Und wahrscheinlich fragen Sie sich, warum Sie sich in einer Programmiersprachenwelt, die von C++ und Java(tm) regiert wird, auch noch mit Assembler auseinandersetzen sollten.
Und ich gebe Ihnen völlig recht: Assembler paßt immer schlechter in die heutige Zeit, vor allem, weil die Portabilität von Programmen, und sei es nur im Quellcode, immer mehr in den Vordergrund rückt. Zudem ist die Programmierung in Assembler fehleranfällig und zeitaufwendig, zwei Faktoren, die in der modernen Softwareentwicklung ein klares Ausschlußkriterium darstellen.

Es ist mit Sicherheit nicht die Aufgabe dieser Tutorials, Sie von Assembler zu überzeugen. Ich möchte Ihnen lediglich zeigen, daß viele negative Dinge, die Sie von der Assemblersprache bisher vielleicht gehört haben, nur bedingt den Tatsachen entsprechen.

  1. Assembler ist wesentlich unkomplizierter als Sie annehmen
  2. Assemblerprogrammierer müssen keine Zahlensystemprofis sein
  3. Assemblerprogrammierer müssen Binärcode nicht wie ein Buch lesen können

Natürlich verlangt Assembler, wie jede andere Programmiersprache auch, einen gewissen Grad an Einarbeitung, der durchaus höher ausfallen kann, als Sie das vielleicht von anderen Programmiersprachen kennen.

Ich möchte Ihnen verschiedene Tutorials zur Verfügung stellen, die völlig unterschiedliche Themenbereiche behandeln. Beachten Sie bitte, das die bereits existierenden Tutorials als "work in progress" zu betrachten sind. Es kann immer wieder mal zu Änderungen, Erweiterungen und Korrekturen kommen. Haben Sie bitte auch Verständnis für die Tatsache, dass diese Seiten ein Hobby darstellen, das unter meiner relativ knappen Freizeit zu leiden hat.

Im Grundlagentutorial erfährt der Einsteiger, was er wissen muß, um die einzelnen Elemente eines Assemblerprogramms zusammenzufügen und zum Laufen zu bringen. Gearbeitet wird mit dem Turbo Assembler (TASM) der Firma Borland unter MS-DOS. TASM ist ein kommerzielles Produkt von dem es meines Wissens keine Test- oder Probierversionen gibt. Wenn Sie also im Internet auf ein Download-Angebot fü den TASM stoßen, dann handelt es sich mit hoher Wahrscheinlichkeit entweder um ein anderes Produkt (es gibt mindestens einen Cross-Compiler gleichen Namens aber für andere Befehlssätze) oder um ein illegales Angebot. Borland legt TASM jedoch verschiedenen anderen Entwicklungsumgebungen bei (Borland Pascal 7.0, vielleicht auch Delphi und C++ Builder).

Im OOP-Tutorial, das noch in der Vorbereitung ist, wird dem Anwender das Wissen vermittelt, um mit dem TASM der Firma Borland objektorientierte Programme zu schreiben. Sie benötigen mindestens den TASM ab Version 3.0.

Das Windows-Tutorial wird sich der Programmierung in der Assemblersprache für die 32-Bit-Windows-Welt widmen. Mangels Testmöglichkeiten kann keine Aussage über die Lauffähigkeit unter Windows 95 und Windows 98 gemacht werden.

Im ebenfalls geplanten Linux-Tutorial kann der Anwender die Assemblerprogrammierung unter dem Betriebssystem Linux lernen. Hierfür wird der Netwide Assembler (NASM) verwendet. Als Hardwarebasis ist ein Prozessor der Intel-x86-Familie notwendig.

Warum Assembler

Diese Frage wird immer wieder gerne gestellt und ist auch Bestandteil vieler anderer Tutorials. Tatsächlich fallen mir nur zwei Gründe ein, die für die Verwendung von Assembler in professioneller Softwareentwicklung sprechen:

  1. es muss besonders klein sein
  2. es ist präzise Maschinenkontrolle notwendig

Die Motivation für den zweiten Punkt kann natürlich wieder sehr vielfältig sein.
Von den o. g. Punkten abgesehen halte ich es trotzdem für sinnvoll, wenn man sich einmal näher mit Assembler auseinandersetzt. Assembler vermittelt praktisch zwangsläufig ein tieferes Wissen über das Zusammenspiel der Hardware und die Vorgänge im Computer im Allgemeinen. Auch wenn man im Anschluss nie wieder etwas mit Assembler zu tun hat, so kann es trotzdem leichter fallen, zu verstehen, was ein Hochsprachencompiler mit dem Quelltext tut und so vielleicht zu effizienteren Programmen führen. Und nicht zuletzt (und auch meine Motivation): Assembler ist spannend macht jede Menge Spaß.

Warum nicht Assembler

Wie immer in solchen Vergleichen werden mindestens genauso viele Argumente für wie gegen eine Programmiersprache aufgeführt. Und im Anschluss werden die Argumente von den Befürwortern des Gegenteils mit Gegenargumenten "zerpflückt".

  1. Assembler ist schlecht les- und wartbar
  2. Assembler ist zu plattformspezifisch und deshalb nicht portierbar
  3. Programme in Assembler zu schreiben ist zu langsam und zu fehleranfällig

Um es vorweg zu nehmen: alle Punkte (und es gibt sicher noch viel mehr) können richtig sein. Es sei aber auch gesagt, dass es in der Verantwortung des jeweiligen Entwicklers liegt, welche Programmiersprache er für ein Projekt verwendet. Es macht sicherlich wenig Sinn, einen HTML-Browser in Assembler zu entwickeln. Sehr wohl kann es aber Sinn machen, Teile des Parsers oder Tokenizers in Assembler zu schreiben. Das man sich mit Assembler auch die Abhängigkeit von einer Prozessorarchitektur erkauft, sollte auch klar sein und entsprechend bei der Sprachwahl beachtet werden. Und zu guter Letzt (und auch bei vielen Gelegenheiten erwähnt): es ist in jeder Sprache möglich, schlecht lesbaren Code zu schreiben. Einige Sprachen machen es einem dabei allerdings einfacher als andere. So schnörkellos und zielgerichtet man mit Assembler auch programmieren kann, der Sinn eines Befehls oder einer Befehlsmenge ergibt sich teilweise erst nach mehreren Zeilen oder liegt in den Tiefen der Hardware verborgen. Gerade deswegen sollte man sich früh angewöhnen, den Quelltext sinnvoll zu kommentieren.

Ich habe mich bemüht, alle Informationen sorgfältig wiederzugeben. Trotzdem lassen sich Fehler vermutlich nicht vermeiden.
Wenn innerhalb der Tutorials geschlechtsspezifische Bezeichnungen (z. B. für Berufe) verwendet werden, dann ist davon auszugehen, dass die Bezeichnung geschlechtsneutral gemeint ist.
Für Fragen, Anregungen und selbstverständlich auch Korrekturvorschläge bin ich unter der Adresse _amasm_ at gmx de (entfernen Sie bitte die Unterstriche; die Spambots greifen sich alles was sie bekommen können) erreichbar.

Alle in diesen Tutorials verwendeten Markennamen sind Eigentum ihrer jeweiligen Inhaber.

Die von mir in diesen Tutorials verwendeten Verfahren wurden von mir sorgfältig geprüft. Trotzdem ist das Material mit keiner wie auch immer gearteten Garantie verbunden. Ich übernehme folglich keine Verantwortung für Schäden, die aus der Verwendung des Materials entstehen.

Viel Spaß beim Lesen und Programmieren wünscht Ihnen
André Müller

Danksagungen
Referenz (BIOS/DOS - Interrupts)
Nützliche Links