Forum: Mikrocontroller und Digitale Elektronik unterschied assembler und c


von udo telaar (Gast)


Lesenswert?

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!

von Frank Linde (Gast)


Lesenswert?

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

von udo telaar (Gast)


Lesenswert?

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

von Andy (Gast)


Lesenswert?

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.

von crazy horse (Gast)


Lesenswert?

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.

von Frank Linde (Gast)


Lesenswert?

@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

von Rolf F. (Gast)


Lesenswert?

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.

von Oryx (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.