So, dann will ich mal die Experten mit ner dummen Newbee-Frage nerven ;-) Mich würd mal der technische Unterschied zwischen Assembler und C interessieren. Ich hab zwar den Beitrag gefunden, wo es "Assembler gegen C" heißt, aber da ging es mehr um Effektivität und Zeitersparnis ect., aber warum ist das so. Was unterscheidet Assembler technisch von C? Habe bisher nur ein wenig mit C++ programmiert, daher interessiert mich das. Danke im Voraus für die Antworten!
Assembler ist sozusagen die Muttersprache eines Prozessors und C eine Fremdsprache. Damit der Prozessor die Fremdsprache versteht, übersetzt der C-Compiler die Fremdsprache in die Muttersprache. Und wie das bei Übersetzungen nun mal so ist, gibt es gute und weniger gute Ergebnisse. Ein moderner C-Compiler bringt bei mittleren bis großen Projekten in der Regel gleich gute Ergebnisse wie ein guter Assembler-Programmierer. Nur bei kleinen Projekten ist der Assembler in der Regel effizienter im Sinne von Ausführungsgeschwindigkeit und Speicherplatzbedarf des Programms. Gruß, Frank
Danke Frank! Also wenn ich das richtig verstanden haben, dann wird ein c++ Programm erst in Assembler übersetzt, damit es lauffähig wird!? Das bedeutet dann wahrscheinlich auch, dass ein Assemblerprogramm nicht auf anderen Rechnern lauffähig ist und ein C++ Programm immer entsprechend dem Prozessor compiliert werden kann? Dadurch das ein c++ Programm universell übersetzt wird ist es dann aber wahrscheinlich nicht so effektiv? Gibts noch weitere Unterschiede? Gruß Udo
Assembler ist nicht die Muttersprache des Prozessors. Was Frank meint, ist die Maschinensprache. Der Assembler setzt die Mnemonics der jeweiligen CPU in Maschinensprache um (der jeweilige Binärcode). Es gab/gibt durchaus auch Assemblersprachen, wo ein Mnemonic mehrere Befehle kodieren kann. Ausserdem behersschen alle aktuellen Assembler auch Makros, bedingte Assemblierung, etc.
jede Compilersprache ist irgendwie ein bisschen menschlicher (auch wenn manche gerade von C eher das Gegenteil behaupten...), d.h. man kann Anweisungen schreiben, wie sie auch im normalen Leben vorkommen. A=B+C, das versteht jeder, ich will 2 Zahlen addieren und das Ergebnis in einer 3.Variable speichern. Ich brauch mich nicht drum kümmern, wo und in welcher Form diese Variablen abgespeichert sind, und kein anderes Programmteil wird auf die Idee kommen, versehentlich eine dieser 3 Variablen zu überschreiben. Diesselbe Operation in Assembler sieht etwas anders aus. Insbesondere mathematische Funktion gibts beim Compiler gratis dazu, und wer sich schon mal mit Gleitkommzahlen und Assembler rumgequält hat, weiss das schätzen, ebenso Winkelfunktionen oder Logarithmen o.ä. Einen weiteren grossen Vorteil sehe im Handling von mehrdimensionalen Arrays, eine Variable mit 3 oder 4 oder noch mehr Dimensionen mit dem Assembler zu beherrschen, ist auch eine kleine Kunst. Verschachtelte Abfragen ((wenn dies und das) oder (nur das, aber nicht jenes)) und (noch irgendwas anderes) können mit dem Assembler schnell zur fehlerträchtigen Bitklauberei werden. Alles Sachen, die prinzipiell auch mit Assembler machbar sind - es ist eine Frage des Aufwands, der Programmerstellungszeit, der Lesbarkeit und der Testbarkeit.
@Andy: Ich meinte das schon so, wie ich es geschrieben habe, denn in der realen Maschinensprache (Binärcode) schreibt wohl kein Mensch ein Programm. Assembler ist damit die maschinennächste Programmiersprache, die Menschen verwenden und deshalb habe ich den Begriff "Muttersprache" verwendet. Wie in jeder Prgrammiersprache, kann (und sollte) man sich natürlich auch in Assembler zu höheren Abstraktionsebenen hangeln (Makros, Unterprogramme ...), um die Übersicht zu behalten. @Udo: Richtig, ein Assembler-Programm ist - wenn überhaupt - nur mit viel Mühe auf einen anderen Prozessor übertragbar, während ein C-Programm theoretisch überall läuft, sofern ein passender Compiler zur Verfügung steht. Im Kontext der Microcontroller sieht das allerdings schon wieder ganz anders aus, denn da hat jeder Controller seine Spezialitäten, die doch wieder manuelle Programmanpassungen erfordern. Trotzdem ist ein C-Programm sicherlich leichter zwischen verschiedenen Controllern übertragbar als ein Assembler-Programm. Gruß, Frank
C ist eine Hochsprache u. damit weitgehend unabhängig von der Plattform, während Assembler stark von der Plattform abhängt. Dadurch ist C besser wiederverwendbar. Problematisch ist aber bei vielen Compilern für embedded Systeme, dass die einerseits weit vom ANSI-Standard weg sind, also ANSI-C-Code nur teilweise verstehen und andererseits undefinierte Ausdrücke meist kommentarlos akzeptieren, obwohl solche Ausdrücke auch nach dem ANSI-C-Standard ALLES bewirken können, also auch hangup oder reboot. Nach einigen Reinfällen mit Compilern (u. Assemblern u. Debuggern sowie Präprozessoren) von IAR kann ich deshalb nur gcc-crosscompiler empfehlen.
Hallo Udo, die Sache ist relativ einfach: In Assembler programierst Du jedes Register und jeden PUSH, POP selbst. Du hast die Hardware also voll im Griff. In C und C++ wird dir der ganze Kram wie die Parameterübergabe usw. abgenommen. Du kanst dich halt um die eigentliche Anwendung kümmern. Wenn du die eigentlichen Hardwarezugriffe in extra Funktionen und Modulen organisierst, ist ein Hardwarewechsel leicht möglich. Nachteile von Assembler: Ab einer gewissen Programmgrösse wird die Sache einfach unübersichtlich. Was war doch gleich in Register5 oder wie oft wurde in welcher Reihenfolge gepusht? Also gewöhnt man sich eine Standardvorgehensweise an, die dann auch nicht mehr so effektiv ist. Läuft auf keiner anderen Hardware. Nachteile von C: Je nach Compileroptimierung wohl etwas langsamer und evtl. nicht ganz so flexibel (oder wild) zu programieren wie Assenbler. Fazit: Zum Üben und zum Kennenlernen der Maschine Assembler. Auf Dauer dann C und C++. Oryx
Beitrag #7018588 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.