Dies ist eine alte Version des Dokuments!


Warum überhaupt Assembler auf x86?

Wir haben viele Hochsprachen, teilweise etwas hardware-näher, teilweise etwas höher. Wir haben Sprachen wie C, C++, Ada, Smalltalk, Baic, Pascal, COBOL, Fortran, aber auch funktionale Programmiersprachen wie Haskell, Lisp. Wir haben Skriptsprachen wie Javascript, PHP, Perl. Warum sollte man also noch Assembler lernen?

Assembler ist hardware-nah

Jede Zeile Assemblercode, die man in einem Programm schreibt, stellt bestimmte Vorgänge im Prozessor dar. Dh. wenn wir bspw. in einer Umgebung arbeiten, die genau gesteuert werden muss, dann ist Assembler unerlässlich. Mir ist keine höhere Programmiersprache bekannt, in der man Stackpointer oder Instructionpointer umsetzen kann - in Assembler kein Problem. Mir ist lediglich eine Programmiersprache mit eingebautem Interrupt-Befehl bekannt (Ada) - in Assembler kein Problem.

Wollen wir also bspw. ein Betriebssystem schreiben, wollen wir Prozesswechsel durchführen oder genaue Informationen über die CPU erhalten, dann ist Assembler unerlässlich.

Assembler kann effizient laufen

In einer höheren Programmiersprache hat der Programmierer nur wenig Einfluss darauf, wie der Compiler den Programmcode umsetzt. In Assembler steuert der Programmierer selbst genau, was der Prozessor tut. Dh. jede unnötige Operation kann vermieden werden und durch clevere Programmierung können bspw. Cacheeffekte optimal ausgenutzt werden.

Allerdings muss der Programmierer dafür genaue Kenntnisse über die CPU haben, bspw. wie viel Cache ist vorhanden, aber auch Kenntnisse über das Betriebssystem sind nötig - bspw. welcher Interrupt bzw. Syscall tut was, und wie übergibt das Betriebssystem bei Funktionsrufen die Parameter?

Wichtig sind auch Schnittstellen bspw. zur C-Bibliothek zu kennen bzw. zu eigenem Code zu kennen. Die Reihenfolge der übergebenen Parameter müssen genau beachtet werden, in Assembler gibt es kein Sicherheitsnetz, wie bei höheren Programmiersprachen - hier sagt der Übersetzer nicht, wenn Parameter in den falschen Registern übergeben werden.

Lerneffekt

Die oben dargestellten Gründe für Assembler überzeugen heute wohl eher niemanden mehr. In einer Zeit, in der die Programmierer dieser Welt immer mehr in Richtung Skriptsprachen ausweichen, mit dem Argument „Wir haben doch die Rechenleistung“, da holt man wohl niemandem mehr mit Effizienz oder Laufzeit hinter dem Ofen vor.

Assemblerprogrammierung hat aber noch den Vorteil, dass man dadurch tieferen Einblick in die CPU gewinnt und so weiteren Wissenszuwachs hat. Assemblerprogramme erschlagen den Lernenden schnell und überfordern mit vielen kryptischen Befehlen, dafür kann man sich mal vor Augen führen, wie ein Programm tatsächlich aufgebaut ist, wie es läuft, wie es ausgeführt wird, etc. Man erhält Hintergrundwissen, wie bspw. Programme in einer höheren Programmiersprache funktionieren können. Das Wissen könnte man bspw. für den Compilerbau etc. weiterverwenden.

Diskussion

Vorteile von Assembler:

  • es ist schnell
  • es ist extrem mächtig
  • es gewährt Einblicke in die CPU
  • es gewährt volle Kontrolle über den Prozessor

Nachteile von Assembler:

  • es ist extrem komplex
  • Lernende fühlen sich leicht überfordert oder erschlagen
  • es verlangt ein tiefes Verständnis der verwendeten CPU
  • es ist recht schwierig zu debuggen