Erlaubt Assembler die tiefstmöglichsten Leistungsanforderungen für ein Programm?

5 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Assembler ist eine Art für den Menschen lesbare Maschinensprache. Abgesehen von irgendwelchen Makros wird in der Assemblersprache für jeden Opcode (zusammen mit dessen Parameter/ involvierte Register etc.) der CPU ein entsprechende Statement zur Verfügung gestellt. Es gibt also eine (fast-) 1:1 - Beziehung zwischen Maschinensprache und Assembler.

Z.B. entspricht der Hexdezimalwert 0xC3 (im ISO 8859-1 Characterset entspricht das dem Zeichen "Ã") auf der Intel-Plattform einem (short-) RET (=return to calling procedure). In der Marko-Assemblersprache schreibst Du ein "RET" Statement. Der Makro-Assembler-Compiler übersetzt Dir das dann in eine in das Zeichen "Ã" und zusammen mit einem Linker wird die fertige z.B. .exe Datei erstellt. Mit einem Hex-Editor findest Du in der .exe drin dann irgendwo das Zeichen "Ã" wieder und weisst dann, dass das vermutlich Dein RET-Statement ist. Das ist natürlich eine übermässig vereinfachte Darstellung des Ganzen, weil in einer .exe noch diverse andere Metadaten enthalten sind, und etwa der Wert 0xC3 auch in anderen Kontexten vorkommen kann, etwa bei einer Wertzuweisung zu einem Register. Aber prinzipiell funktioniert es so.

Wenn Du ein Programm in Assembler schreibst, kannst Du mit entsprechendem Wissen dadurch ein besonders laufzeiteffizientes Programm schreiben. Allerdings sind die heutigen C-Compiler stark optimierend und der Geschwindigkeitsvorteil eines reinen Assembler-Programms ist dessen mühsame, unübersichtliche, fehleranfällige Entwicklung nur in den seltensten Fällen wert. Für die allermeisten Programme, die laufzeiteffizient sein müssen, reicht C völlig aus.

Für das Verständnis hingegen, wie ein Computer funktioniert, ist Assemblerprogrammierung von sehr grossem Wert (meine Meinung). Wenn Du später mit C programmierst und Dich schon gefragt hast, warum man eigentlich für i=i+1 ein i++ schreiben sollte, hat das viel mit Maschinensprache zu tun. Denn dort gibt es z.B. auf der Intelplattform die Anweisung INC (Inkrement), die besonders effizient den Wert eines CPU-Registers um eins erhöhen kann, während allgemeine Additionen mit dem Befehl ADD ausgeführt werden.

Ein in Assembler geschriebenes Programm läuft nur auf der jeweiligen Zielplattform, z.B. Intel. Ein für Intel-CPU's geschriebenes Assemblerprogramm läuft beispielsweise nicht auf einer ARM-Architektur.

Und selbst wenn Du Dein Programm für die Intel-Architektur schreibst, das fertig kompilierte und gelinkte Assemblerprogramm bekommt für jedes Betriebssystem seinen eigenen Headers und jedes Betriebssystem hat seine eigenen Kernelfunktionen (Syscalls), die sich in Name, Funktion und Aufrufskonvention stark unterscheiden. Deshalb kannst Du ein auf der Intel-Plattform entwickeltes Assemblerprogramm für das Zielsystem Windows nicht einfach auch für Linux kompilieren. Wenn Du gar keine Syscalls verwenden würdest, dann könntest Du Deinen Assembler-Code ohne grosse Änderungen für beide Plattformen compilieren und ausführen - allerdings müsste das Programm auf Input -und Outputmöglichkeiten verzichten, was oft ziemlich sinnlos ist. Und die fertig kompilierten/ gelinkten Binaries haben sowieso ein Format, das sich nur auf der jeweiligen Betriebssystem-Plattform ausführen lässt. Also eine .exe kannst Du nicht einfach so unter Linux ausführen beispielsweise.


Sleacen 
Fragesteller
 23.10.2021, 13:03

Vielen Dank! Das war eine super Antwort! 😁

0

Einfach gesagt, jein.

Zwar erlaubt Programmierung in Assembler die Nutzung von SIMD-Instruktionen, andererseits sind moderne C/C++ Kompilierer wie GCC oder Clang sehr, sehr gut im Optimieren, sodass du auch in höheren Sprachen schnelle Programme schreiben kannst, wenn du kannst.

Woher ich das weiß:Hobby

Assembler ist erstmal nichts anderes als eine menschengerechte Version des Maschinencodes. In der Regel bieten Assembler darüber hinaus Konstrukte an, die zu weiteren Vereinfachungen führen. (Komfort)

Letztlich programmierst Du in der ISA der CPU, was bedeutet, daß Du die ISA der entsprechenden CPU besser kennenlernst. Du lernst dabei aber relativ wenig über die Intrinsik von CPUs oder dieser speziellen CPU.

Mehr noch, ein Programm in einer Hochsprache, von einem orentlichen Compiler übersetzt, wird in der Regel schneller sein als Dein Assemblercode. Es sei denn Du hast etwas sehr spezielles umzusetzen und kennst die ISA wirklich gut.

Binaries für Windows und Linux unterscheiden sich schon strukturell, dazu kommt, daß die Schnittstellen und somit Syscalls sich unterschieden.

Wenn ich mit Maschinensprache und Assembler programmieren könnte, könnte ich ... so programmieren, dass es weniger Leistung braucht, als wenn ich es mit Assembler programmiert habe

Assembler wird eigentlich direkt in Maschinensprache übersetzt, daher verstehe ich deine Unterscheidung hier nicht.

Aus der Wikipedia:

Das Programm im Maschinencode besteht aus einer Folge von Bytes, die sowohl Befehle als auch Daten repräsentieren. Da dieser Code für den Menschen schwer lesbar ist, werden in der Assemblersprache die Befehle durch besser verständliche Abkürzungen, sogenannte Mnemonics, dargestellt.

Möchtest du effizienter als "Assembler per Hand" programmieren solltest du C verwenden, da der Compiler hier effizienteren Maschinencode erzeugt, als du es von Hand als Anfänger könntest.

Für den Anfang würde es auch reichen über ein Reverse-Engineering-Programm den erzeugten Maschinencode/Assembler anzusehen, um die zugrundeliegenden Operationen zu verstehen.


Sleacen 
Fragesteller
 23.10.2021, 01:25
Assembler wird eigentlich direkt in Maschinensprache übersetzt, daher verstehe ich deine Unterscheidung hier nicht.

Kann ich also wirklich absolut jeden Programm-Code direkt in Assembler umwandeln (nicht so wie in anderen Programmiersprachen)?

0
palindromxy  23.10.2021, 01:40
@Sleacen

Verstehe die Frage nicht. Programm wird zu Maschinencode übersetzt.

1

jeder chip hat seinen eigenen befehlsatz , somit musst du dann für jeden chip eigenen assembler nutzen .