Welchen Assembler würdet ihr mir empfehlen?
Ich interessiere mich sehr für Hardwarenahe Programmierung, also zwischen Software und Hardware (sowie die Umsetzung von Firmware). Mit C und C++ bin ich bereits einigermaßen vertraut (bin noch am lernen).
Nun möchte ich mit Assembly anfangen (zumindest für einen Einblick, da heutzutage ja mehr auch hochsprachen gesetzt wird), aber sehe dass es verschieden Variationen gibt? NASM, Gnu Assembler, MASM/TASM...
Welchen würdet ihr mir empfehlen? Insebesondere in Richtung Firmware, allgemeine Geräte (z.B. embedded Systems), modernere Programmierung. Welcher ist am beliebtesten?
4 Antworten
Die Assemblersprache hängt sehr stark vom Prozessor ab. Man sollte sich an dessen Vorgaben halten, der liefert in der Regel einen passenden Assembler.
Die ISA ist natürlich CPU-spezifisch.
GAS hat natürlich den Vorteil, daß er zum einen GCC Backend ist, zum anderen für verschiedene Platformen und nen ganzen A.. voll ISAs verfügbar ist.
Wie das nun bei MASM, YASM und Konsorten so aussieht vermag ich nicht zu beurteilen.
Man kann auch in C Hardwarenah programmieren. Für die üblichen Mikrocontroller gibt es speziell angepasste Compiler die den Zugriff auf sämtliche Register der Hardware unterstützen. Diese Compiler gibt es häufig kostenlos vom Hersteller der MCUs.
Hardwarenah auf einem aktuellen PC wird meist daran scheitern daß man keine Dokumentation bekommt.
In früheren Zeiten habe ich das aber auch gemacht, Turbo Pascal erlaubte das auch, und bot sogar einen inline Assembler.
Naja, ich denke mal dass es schwer sein wird mit einem gcc für x86 ein hardwarenahes Programm zu erstellen für z.B. Renesas Mikrocontroller der RX230 Familie oder einen Infineon LX. Nicht mal richtig erstellen lässt sich das, schon aufgrund der fehlenden Registerdefinitionen.
Wenn es einen für alles gäbe hätte ich in den über 30 Jahren in denen ich täglich damit arbeite nicht so oft umlernen müssen.
Mikrocontroller haben üblicherweise kein OS und die eventuell vorhandenen Schutzfunktionen, z.B. gegen ein Auslesen vom Code, muss der Programmierer selber aktivieren.
Naja, ich denke mal dass es schwer sein wird mit einem gcc für x86 ein hardwarenahes Programm zu erstellen
Dann dürfte es Linux nicht geben. Das wird mit dem gcc kompiliert und ist durchaus hardwarenahe.
Nicht mal richtig erstellen lässt sich das, schon aufgrund der fehlenden Registerdefinitionen.
Die hat nichts mit dem Compiler zu tun sondern die stehen in Support Headerfiles die der Hersteller anbietet oder du liest sie aus dem Datenblatt. Die sind maximal Teil der Toolchain für die jeweilige Anwendung.
Diese Dinge sind auch für x86 Prozessoren bekannt sonst könnte niemand ein OS dafür schreiben.
Wenn es einen für alles gäbe hätte ich in den über 30 Jahren in denen ich täglich damit arbeite nicht so oft umlernen müssen.
Also ich arbeite seit 15 Jahren mit dem gcc sowohl für x86 als auch ARM und der Compiler bleibt immer gleich auch wenn er natürlich anderen Machinecode erzeugt. Lediglich die Vendorlibraries und Prozessoren sind anders.
Mikrocontroller haben üblicherweise kein OS und die eventuell vorhandenen Schutzfunktionen, z.B. gegen ein Auslesen vom Code, muss der Programmierer selber aktivieren.
Ist auch klar, aber du kannst x86 Prozessoren genau so Baremetal Programmieren wie andere Prozessoren auch.
Für einge Prozessoren zB dem alten Z80 ist das sogar extrem einfach. Und auch bei x86 ist es gar nicht mal so schwer irgendwelche Basic Dinge ohne OS zu machen. Gibt auch genug Bücher und Webseiten wo das beschrieben wird
Natürlich gibts aber unterschiede zwischen einzelnen Toolchains. Also die Kombination Compiler + Libraries + Linker ist anders. Eine Windows Toolchain wird natürlich nicht geeignet sein um ein Baremetal programm zu kompilieren.
Assembler ist keine eigene Sprache sondern das direkte schreiben von Maschinencode.
Das was du ansprichst sind sogenannte Macroassembler die den Aufruf von Bibliotheken usw vereinfachen aber auch hier hängen die Befehle vom jeweiligen Prozessor ab.
Also Assembler auf Arm ist gänzlich anders als auf der x86 Architektur und auch zwischen verschiedenen Arm Varianten wie Cortex-M und Cortex-A zB gibts unterschiede.
Prinzipiell kannst du aber mit C und C++ alles machen was du auch mit Assembler kannst nur dass du dich eben nicht um die Architektur kümmern musst solange du keinek Inline Assembler verwendest.
Das hat nichts mit dem Compiler zu tun. Das unterstützt der normale gcc für x86 und Desktopprozessoren ja auch.
Das was dir hier einen Strich durch die Rechnung macht ist das OS und die jeweilige Protection davon, das hat aber nichts mit dem Compiler zu tun.