Was kann Assembler, was C++ nicht kann?

... komplette Frage anzeigen

3 Antworten


Der Einsatz von Assembler kann im Ausnahmefall durchaus sinnvoll sein. Auf einer PC-Plattform ist eine gemischtsprachliche Programmierung aber eher nicht mehr angebracht, da die C/C++ Compiler heute sehr effizienten Code erzeugen. 

Die Hardwarenähe, die klassische Domäne von Assembler, bringt in Win32-Systemen wenig, da in der Anwenderebene (Ring 3) keine Vorteile, wie I/O-Privileg, existieren . 

Kurz: Auf einer PC-Plattform kann mit Assembler normalerweise nicht mehr erreicht werden, als mit einem normalen C-Compiler.

In Mikrocontroller- oder Signalprozessoranwendungen ist der Einsatz von Assembler verbunden mit einer Hochsprache jedoch keine Frage. Manches kann in Assembler direkter (und daher laufzeiteffizienter) realisiert werden. In solchen Systemen werden die zeitkritischen Teile in Assembler codiert, der Rest in der Hochsprache.

Quelle: http://www.krucker.ch/skripten-uebungen/InfUeb/Assembler%20in%20C-CPP%20Programmen%20BCB.pdf

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von TeeTier
28.07.2016, 23:46

Kurz: Auf einer PC-Plattform kann mit Assembler normalerweise nicht mehr erreicht werden, als mit einem normalen C-Compiler.

Kleiner Einspruch: Ich habe gerade vorgestern ca. 50 Zeilen C++ Code einer Bibliothek zur Audiokodierung in eine (!) einzige (!) CPU-Intruktion verwandelt!

Alle getesteten Compilier haben sogar bei -O3 und (falls verfügbar) -O4 mindestens 15 Instruktionen erzeugt. Ein Benchmark hat mir die fast 30fache Geschwindigkeit meiner Optimierung bestätigt und ein vollumfänglicher Unittest hat die Korrektheit der Implementierung bestätigt.

Aaaaaber: Es hat zwei Tage gedauert, um darauf zu kommen, die besagte Instruktion für die vorliegende Aufgabe zu "missbrauchen", denn sie tut eigentlich etwas völlig anderes, und der wichtige Teil der Kodierung fällt als Nebeneffekt dabei ab. :)

Der Zeitaufwand für die Entwicklung war also enorm, aber es hat sich verdammt gelohnt! :)

Und mal völlig abgesehen von alle dem ... Assembler macht einfach viel zu viel Spaß, als dass ich darauf verzichten würde ... wenn du mich fragst: "Warum?", dann würde ich antworten: "Weil ich es kann!". ;)

Wirtschaftlichkeit ist (glücklicherweise) nicht alles. hahaha ...

Ansonsten wie immer eine sehr gute Antwort! :)

1

Assembler-Programme sind kleiner und - wenn man es kann - performanter. Das ist wichtig, wenn man auf einer Hardware programmiert, die nicht viele Ressourcen bietet (Mikrocontroller z.B.) oder wenn man Programme bzw. Programmteile hat, die möglichst schnell laufen sollen.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von PWolff
28.07.2016, 15:03

Für Microcontroller gibt es Cross-Platform-Compiler, sodass man ohne weiteres auf "großen" Maschinen entwickeln kann. (Und mit Hilfe von Emulatoren und/oder Hardware-Interfaces auch testen kann.)

Das "kleiner" und/oder "performanter" gilt nur, wenn der Programmierer sein Handwerk wirklich versteht und wenn der Algorithmus nicht so verschachtelt ist, dass ein Mensch den Überblick über alle Einzelheiten nicht mehr halten kann. Sonst sind moderne Compiler ohne weiteres imstande, Optimierungen vorzunehmen, die einen Menschen blass aussehen lassen. (Man braucht natürlich einen Compiler, der für diese Anwendugnsfälle gebaut ist.)

1

Mini-HTTP-Server in C++: mehr als 20 KB

Funktionsgleiche Assembler-Implementierung: weniger als 500 Byte

Deshalb ist Assembler auch so beliebt bei Malware Autoren für ihren Shellcode oder einfache Downloader, die per Spammail verteilt werden.

Eine sinnvolle Anwendung ist hingegen zum Beispiel die Möglichkeit der Optimierung (stichwort AVX, oder davor SSE). So ziemlich alle Bibliotheken, die irgendetwas (de-)kodieren können,  haben im Kern ein paar Zeilen Assembler. (ffmpeg, lame, libvpx, etc.)

Ein C++ Compiler erzeugt zwar sehr guten Code, aber ein wirklich sehr sehr erfahrener alter Hase wird mit Assembler (fast) immer noch mehr Leistung (im Punkto Geschwindigkeit und Speicherverbrauch) herausholen können.

Faktoren um die 100x schnellerer Code sind hierbei absolut keine Seltenheit. Faktoren um die 2x bis 10x mal eher die Regel.

Wie der Zeitaufwand hierbei aussieht, steht allerdings auf einem ganz anderen Blatt, denn handoptimierter Assembler-Code frisst (i. d. R. deutlich mehr) Zeit. :)

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?