Frage von ZeroclawX, 50

Gibt es einen plattformunabhängigen Assembler?

Ich habe mich schon seit einer Weile mit C beschäftigt, und am meisten interessiert mich gerade wie ein Computer Programme angeht bzw. die einzelnen Befehle ausführt. In C habe ich mich intensiv mit Zeigern auseinandergesetzt und herausgefunden dass man, wenn man sie richtig und effizient benutzt, eine Menge mit ihnen anstellen kann. Jetzt wollte ich aber versuchen aus Spaß Assembly auszuprobieren, da diese "Programmiersprache" ja als einzige wahre low-level Sprache gilt. Jedoch finde ich die einzelnen "Dialekte", die von Prozessor zu Prozessor anders sind abschreckend und frage mich, ob es mittlerweile eine Art "platformunabhängiger Assembler" gibt, der sich wie der C Compiler an den Computer "anpasst" und daraufhin richtig Kompiliert. Wenn ich irgendetwas gesagt habe dass falsch sein soll usw. bitte korrigiert mich! Ich bin auch nur n fortgeschrittener Anfänger :)

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von mammonmachine, 29
Nein

Vielleicht gibt es da draußen solche Projekte, allerdings hat ein Plattformübergreifender Assembler, wie du es nennst, keinen Sinn.

Ein Assembler ist eine menschenlesbare Abbildung des Maschinencodes. Es gibt sehr viele unterschiedliche Prozessoren und dementsprechend unterschiedliche Codes. In vielen Anweisungen ähneln sie sich, beispielsweise hat jeder Prozessor eine Additionsfunktion add. Nicht jeder Prozessor kann allerdings Multiplizieren mult. Dann braucht es eine Funktion die aufgerufen wird und die besteht dann aus mehreren add und Schleifen.

Was Prozessoren aber besonders macht sind sehr seltene Funktionen, die von einem Compiler eingesetzt werden können. Diese können für das was sie tun enorm effizient sein und sind eventuell bei keinem anderen Prozessor vorhanden. Beispiel sind Fließkommaoperationen oder Funktionen auf Matrizen und Vektoren.

Es wäre also sinnlos einen Assembler für unterschiedliche Prozessoren zu entwickeln, wenn manche Funktionen wie mult nicht von deinem Prozessor unterstützt werden und andere sehr spezielle Funktionen nicht aufgenommen werden können.

Man bräuchte also wieder einen Compiler, der aus deinem abstrakten Assembler wieder einen echten Assembler macht. Wenn man soweit ist, dann kann man auch gleich in einer Hochsprache programmieren. Das macht einem auch das Leben leichter und das Programmieren schneller.

Wenn du es aus eigenem Interesse das Assemblerschreiben lernen willst, dann empfehle ich dir den Mips Assembler. Da gibt es das Simulationsprogramm QtSpim und viele Tutorials.
http://www.inf.fu-berlin.de/lehre/SS00/19502-V/spimdoku.pdf

Funfact: Von den speziellen Funktionen werden auch in echt von den typischen Compilern nur ein winziger Teil benutzt. Das liegt daran, dass die Prozessorentwickler und die Compilerentwickler nicht oft Hand in Hand arbeiten und so spezielle Funktionen von den Compilerentwicklern gar nicht als besonders effizient wahrgenommen werden. Zudem ist das erkennen von komplizierten Strukturen in einem Quelltext, wie Vektoren extrem schwer im Compiler zu entwickeln. Für einen nicht-Eingeweihten ist das nahezu unmöglich.

Kommentar von ZeroclawX ,

Vielen Dank für die ausführliche Antwort! Ich werde mal einen Blick auf den Mips Assembler werfen. Jedoch habe ich noch eine weitere Frage die mich schon seit langem beschäftigt. Jemand aus meinem Freundeskreis hat einmal gemeint dass die einzelnen Assemblydialekte auch als Programmiersprache gelten, da der Programmierer mithilfe von den mnemonics ein Programm aufbaut.

Stimmt es, dass Assembly als Programmiersprache bezeichnet werden kann, oder ist der Begriff "Programmiersprache" auf kompilierte und interpretierte Sprachen festgelegt?

Kommentar von Tschoo ,

Assembler ist natürlich eine Programmiersprache (eigentlich DIE Programmiersprache)

Kommentar von mammonmachine ,

Der Assembler ist eigentlich der Compiler, der die Assemblersprache (ASM) in den Maschinencode aus 1en und 0en übersetzt.
Die Assemblersprache ist menschenlesbar und dementsprechend auch "menschenschreibbar" also auch eine Programmiersprache.

Interessant ist die Frage, wie wurde der erste Assembler programmiert? Im Maschinencode? Höchstwarscheinlich. Da kann man mittlerweile Geschichtsbücher wälzen. Auf jedenfall war die Assemblersprache vor der ersten Hochsprache da und der erste Compiler wurde sicherlich in ASM geschrieben.

Es gibt viele Compiler, die, wenn du höhere Sprachen programmierst, den Code erstmal in Assemblersprache übersetzen, welche dann noch von einem Assembler in Maschinencode übersetzt werden. So macht man den Compiler plattformunabhängig.

Tatsächlich ist es ungewöhnlich in ASM zu programmieren aber kann vorkommen. Beim Reverseengineering wird das lesen von Code (zB. Schadsoftware, also Viren oä.) meist auf Assemblerbasis durchgeführt um die eingefügten schädlichen Codeschnippsel zu finden und zu verstehen.

Kommentar von wolfgang1956 ,

… Funktionen auf Matrizen und Vektoren.

Was doch mehr als stark anzuzweifeln ist. Auch wenn die MISD- und MIMD-Befehle der Intel-Prozessoren beworben werden, damit sich die Chips verkaufen, heißt das nicht, dass sie in der Praxis genutzt werden. Schließlich muss man die Daten zuvor erst einmal so im Speicher anordnen und/oder erzeugen, dass sich Matrizen und Vektoren auch berechnen lassen.

Schon die allerersten Intel-Chips hatten BCD-Befehle, die praktisch nie verwendet werden, weil auch diese Befehle Anpassungen der Daten im Speicher bzw. Akkumulator benötigen, die von „normalen“ Integer-Befehlen viel schneller erledigt werden, die inzwischen 64 Bit oder 8 Bytes auf einen „Schlag“ berechnen.

Natürlich bieten die Betriebssysteme alle „ihre“ Libraries und Frameworks, aber das meiste (95 %) beschränkt sich doch eher auf Standard-Integer- und Fließkomma-Berechnungen.

Kommentar von mammonmachine ,

Hast du meinen Kommentar überhaupt gelesen?

Antwort
von wolfgang1956, 6
Nein

Es gibt derzeit m.W. nur noch drei wirklich wichtige Prozessor-Hersteller:

Intel und AMD, die recht ähnliche CISC-CPUs herstellen und ARM, die Risc-CPUs für beispielsweise iDevices herstellen. Alle anderen CPU-Hersteller stellen eher Nischenprodukte her.

Je nach Betriebssystem (CPM, Windows, OS X oder Linux) spricht man bei Computern von unterschiedlichen „Plattformen“, weil deren Programmformate unterschiedlich sind, d.h. Programme für Macs kennen keine „*.DLL-Dateien“, die unter Windows die Festplatte vollmüllen. Die Zusammenstellung eines Programms auf dem Mac erfolgt nach einem anderen Schema, was jetzt hier nicht näher ausgeführt wird!

Entsprechend kann ein Assemblierprogramm immer nur für bestimmte Betriebssysteme funktionieren und ist damit „plattformabhängig“! Auf Assembler-Ebene wird jede CPU zu dem Ergebnis kommen, 2 + 2 sei 4. Aber jedes Betriebssystem verwendet die Register einer CPU und den Speicher anders. Bei größeren Programmprojekten verwendet jedes Programm zahlreiche Unterprogramme, die extensiv den Stapelzeiger und den Rahmenzeiger (Framepointer) verwenden. Ohne jetzt auf Details eingehen zu wollen, werden wohl die wenigsten Programmierer befähigt sein, die Unterprogramme eines C-Programms in passende Stackframes und Assembler-Code umzusetzen.

Allerdings kann man dies bei den Compiler-Herstellern lernen. Man wird dort auch staunen, inwieweit die neuesten SIMD-, MISD- und MIMD-Befehle der Intel-Prozessoren tatsächlich genutzt werden; zumal die Daten im Speicher vorbereitet werden müssen! Wenn man sich die Quellcode-Beispiele in den unterschiedlichsten Lehrbüchern ansieht, kommen Programme zu 99 % mit den „normalen“ Integer- und Fließkomma-Befehlen einer CPU aus. Es werden praktisch nicht einmal mehr „BCD-Zahlen“ von den Compilern verwendet, weil diese „möglichen“ Maschinenbefehle nochmals „Umrechnungen“ von Binär nach BCD erforderlich machen.

Antwort
von guteantwortxDx, 12
Nein

Assembler ist Low-Level eben weil man dort direkt Maschinenbefehle (also direkte Befehle an den Prozessor wie zum Beispiel addieren, multiplizieren,...) schreibt. Da aber Prozessoren unterschiedliche Anweisungen entgegen nehmen können und passiert, dass Befehle auf einer anderen Architektur anderst funktionieren oder nicht existieren, gibt es da nichts Plattform-Unabhängiges.

Wenn du also ziemlich Low-level bleiben willst und für verschiedene Architekturen schreibst, landest du am Schluss wieder bei Hochsprachen wie C :D

Keine passende Antwort gefunden?

Fragen Sie die Community