Programmieren mit ARM64 Assembler: Unterschied zwischen den Versionen
K →Inhalt |
|||
| (115 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
<!-- /satyria.de/source/assem/ARM64Assembler --> | |||
== Grundlagen == | |||
Der ARM-Prozessor ist ein sogenannter RISC-Computer (Reduced Instruction Set Computer). Das Designprinzip von RISC-Prozessoren führt zu einem kleineren und übersichtlicheren Befehlssatz, was das Erlernen von Assembler theoretisch einfacher macht. In dieser Einführung werden wir die grundlegenden Konzepte der ARM64-Bit Assembler Programmierung verständlich und praxisorientiert erklären, sodass sie auch für Anfänger zugänglich ist. | |||
== Was ist Assembler? == | |||
Assembler ist eine Programmiersprache, die es ermöglicht, den Computer auf sehr niedriger Ebene direkt zu steuern. Anders als Hochsprachen wie C oder Python kommuniziert Assembler direkt mit der Hardware, was eine präzise Kontrolle über den Prozessor und den Speicher ermöglicht. Diese direkte Steuerungsmöglichkeit macht Assembler zu einer mächtigen Sprache für ressourcenintensive oder sehr spezifische Aufgaben. | |||
== Aufbau dieses Tutorials == | |||
Dieses Tutorial ist so strukturiert, dass es sich von einem Kapitel zum nächsten Schritt für Schritt selbst erklärt. Zur Demonstration der Beispiele verwende ich einen Raspberry Pi 5, aber die Beispiele sollten ebenso auf den Modellen Raspberry Pi 3 und Raspberry Pi 4 funktionieren, sofern diese mit einem 64-Bit-Linux-System betrieben werden. Zu Beginn werden wir uns ansehen, wie man überhaupt Assemblerprogramme schreibt und diese auf einem ARM64-System ausführt. | |||
- | |||
* | == Inhalt == | ||
* [[Programmierumgebung unter Linux erstellen und testen]] | |||
** [[Programmierumgebung unter Linux erstellen und testen#Einrichtung der Entwicklungsumgebung|Einrichtung der Entwicklungsumgebung]] | |||
* | ** [[Programmierumgebung unter Linux erstellen und testen#Installation der notwendigen Tools wie Assembler, Compiler und Debugger|Installation der notwendigen Tools wie Assembler, Compiler und Debugger]] | ||
** [[Programmierumgebung unter Linux erstellen und testen#Erste Schritte mit einem einfachen "Hello, World!"-Programm in Assembler|Erste Schritte mit einem einfachen "Hello, World!"-Programm in Assembler]] | |||
** [[Programmierumgebung unter Linux erstellen und testen#Testen der Umgebung durch Kompilieren und Ausführen von Assemblerprogrammen|Testen der Umgebung durch Kompilieren und Ausführen von Assemblerprogrammen]] | |||
* [[Tools, die zur Programmierung benötigt werden]] | |||
* | ** [[Tools, die zur Programmierung benötigt werden#Assembler (as)|Allgemeine Einführung in gängige Tools: Assembler (as), Linker (ld), Compiler (gcc) und make]] | ||
** [[Tools, die zur Programmierung benötigt werden#Debugging-Tool (gdb)|Verwendung von Debugging-Tools wie gdb]] | |||
** [[Tools, die zur Programmierung benötigt werden#IDEs und Texteditoren, die Assembler unterstützen|IDEs und Texteditoren, die Assembler unterstützen]] | |||
* [[Allgemeines zu Zahlen (Dezimal, Binär, Hexadezimal)]] | |||
* [[Das erste Programm "Hello World"]] | |||
* [[Register und Speicher]] | |||
* [[Laden und Speichern von Werten]] | |||
** [[Laden und Speichern von Werten#Laden von konstanten Werten in Register|Laden von konstanten und variablen Werten in Register]] | |||
** [[Laden und Speichern von Werten#Speichern von Registerwerten im Speicher|Speichern von Registerwerten im Speicher]] | |||
** [[Laden und Speichern von Werten#Laden und Speichern: Die Befehle ldr und str|Verwendung der Befehle ldr und str]] | |||
* [[Addieren und Subtrahieren]] | |||
** [[Addieren und Subtrahieren#Einfache arithmetische Operationen: add und sub|Einfache arithmetische Operationen: add, sub]] | |||
** [[Addieren und Subtrahieren#Umgang mit Überlauf und Unterlauf|Umgang mit Überlauf und Unterlauf]] | |||
** [[Addieren und Subtrahieren#Arbeiten mit mehreren Registern und direkten Werten|Arbeiten mit mehreren Registern und direkten Werten]] | |||
** [[Addieren und Subtrahieren#Umgang mit Überlauf und Unterlauf bei 128-Bit-Arithmetik in ARM64-Assembler|Umgang mit Überlauf und Unterlauf bei 128-Bit-Arithmetik in ARM64-Assembler]] | |||
* [[Multiplizieren, Dividieren und Akkumulation]] | |||
* | ** [[Multiplizieren, Dividieren und Akkumulation|Multiplizieren und Dividieren von Werten: mul, div]] | ||
** [[Multiplizieren, Dividieren und Akkumulation#Akkumulation|Erweitere Operationen wie akkumuliertes Multiplizieren: mla, mls]] | |||
* [[Shiften und Rotation]] | |||
* [[Logische Operatoren]] | |||
* [[Sprungadressen (Labels)]] | |||
* [[Programmablauf steuern]] | |||
** [[Programmablauf steuern|Bedingte und unbedingte Sprungbefehle: b, bl, cbz, cbnz]] | |||
* | ** [[Programmablauf steuern#Schleifen|Schleifen und Verzweigungen]] | ||
** [[Programmablauf steuern#Bedingter Sprung|Vergleichsoperationen und bedingte Ausführung]] | |||
* [[Funktionen und Stack]] | |||
** [[Funktionen und Stack#Funktion aufrufen und Rückkehr|Funktion aufrufen und Rückkehr]] | |||
** [[Funktionen und Stack#Funktionsparameter und Rückgabewerte|Funktionsparameter und Rückgabewerte]] | |||
* | ** [[Funktionen und Stack#Verwendung des Stacks für lokale Variablen und Funktionsaufrufe|Verwendung des Stacks für lokale Variablen und Funktionsaufrufe]] | ||
** [[Funktionen und Stack#Regeln für das Aufrufen von Funktionen (AAPCS)|Regeln für das Aufrufen von Funktionen (AAPCS)]] | |||
* [[Systemaufrufe]] | |||
** [[Systemaufrufe#Einführung in Linux-Systemaufrufe|Einführung in Linux-Systemaufrufe]] | |||
* | ** [[Systemaufrufe#Grundlegende Systemaufrufe|Ausführung von grundlegenden Systemaufrufen wie exit, read, write, open, close]] | ||
* | ** [[Systemaufrufe#Übergabe von Parametern und Entgegennahme von Rückgabewerten|Übergabe von Parametern und Entgegennahme von Rückgabewerten]] | ||
** [[Systemaufrufe#Verweis auf alle verfügbaren Linux-Systemaufrufe|Übersicht der Linux ARM64 Systemaufrufen]] | |||
<!--* [[GPIO Programmierung]] | |||
** [[GPIO Programmierung#Grundlagen der GPIO-Programmierung|Grundlagen der GPIO-Programmierung]] | |||
** [[GPIO Programmierung#Direkte Steuerung der GPIO-Pins|Direkte Steuerung der GPIO-Pins]] | |||
** [[GPIO Programmierung#Besondere Register und Konfiguration|Besondere Register und Konfiguration]]--> | |||
* [[Interaktion mit C]] | |||
** [[Interaktion mit C#C-Funktionen aus Assembler aufrufen|C-Funktionen aus Assembler aufrufen]] | |||
** [[Interaktion mit C#Assemblerfunktionen in C aufrufen|Assemblerfunktion in C aufrufen]] | |||
* | ** [[Interaktion mit C#Inline-Assembler in C|Inline-Assembler in C]] | ||
** [[Interaktion mit C#Bibliotheken verwenden|Bibliotheken verwenden]] | |||
* [[Gleitkommaoperationen]] | |||
** [[Gleitkommaoperationen#FPU-Register: Überblick|FPU-Register]] | |||
* | *** [[Gleitkommaoperationen#Registerüberblick|Überblick über FPU (Floating Point Unit) und ihre Register]] | ||
** [[Gleitkommaoperationen#Verwendung der FPU-Register in Funktionen|Verwendung der Register in Funktionen]] | |||
** [[Gleitkommaoperationen#Hinweise zur Verwendung von FPU-Registern|Arbeiten mit FPU-Registern]] | |||
*** [[Gleitkommaoperationen#Beispiele für die Verwendung|Ausführung von Gleitkommaoperationen: fadd, fsub, fmul, fdiv]] | |||
** [[Gleitkommaoperationen#Konvertierung von Gleitkommazahlen|Konvertierung von Gleitkommazahlen]] | |||
*** [[Gleitkommaoperationen#Konvertierung von Gleitkommazahlen|Umwandlung zwischen Ganzzahlen und Gleitkommazahlen]] | |||
* Laden von | ** [[Gleitkommaoperationen#Vergleich von Gleitkommazahlen und bedingte Sprungbefehle|Vergleichen]] | ||
*** [[Gleitkommaoperationen#Vergleich von Gleitkommazahlen und bedingte Sprungbefehle|Vergleich von Gleitkommazahlen und bedingte Sprungbefehle]] | |||
* [[NEON Coprozessor]] | |||
* | ** [[NEON Coprozessor#Verwendung des NEON-Coprozessors im Raspberry Pi|Verwendung des NEON-Coprozessors im Raspberry Pi]] | ||
** [[NEON Coprozessor#LANE-Prinzip: Überblick|LANE-Prinzip]] | |||
** [[NEON Coprozessor#Anwendung und Kontext im Raspberry Pi|Anwendung und Kontext im Raspberry Pi]] | |||
<br> | |||
* Anhang | |||
** [[Diassemblieren]] | |||
* | ** [[Big vs. Little Endian]] | ||
** [[Aliase]] | |||
** [[Direktiven|Assembler Direktiven (as/gcc)]] | |||
*** [[Direktiven#4. Daten ausrichten: .align|Daten ausrichten]] | |||
** [[Makros in Assembler]] | |||
** [[Übersicht der Linux ARM64 Systemaufrufen]] | |||
*** [[Übersicht der Fehlercodes|Übersicht der Fehlercodes von Systemaufrufen]] | |||
- | |||
- | |||
* | |||
* | |||
* | |||
* | |||
* | |||
* | |||
* | |||
* | |||
* | |||
** | |||
** | |||
** | |||
* | |||
* | |||
* | |||
- | |||
- | |||
- | |||
-> | |||
- | |||
* | |||
* | |||
* | |||
* | |||
* | |||
- | |||
* | |||
* | |||
* | |||
* | |||
* | |||
* | |||
* | |||
* | |||
Aktuelle Version vom 11. April 2025, 10:39 Uhr
Grundlagen
Der ARM-Prozessor ist ein sogenannter RISC-Computer (Reduced Instruction Set Computer). Das Designprinzip von RISC-Prozessoren führt zu einem kleineren und übersichtlicheren Befehlssatz, was das Erlernen von Assembler theoretisch einfacher macht. In dieser Einführung werden wir die grundlegenden Konzepte der ARM64-Bit Assembler Programmierung verständlich und praxisorientiert erklären, sodass sie auch für Anfänger zugänglich ist.
Was ist Assembler?
Assembler ist eine Programmiersprache, die es ermöglicht, den Computer auf sehr niedriger Ebene direkt zu steuern. Anders als Hochsprachen wie C oder Python kommuniziert Assembler direkt mit der Hardware, was eine präzise Kontrolle über den Prozessor und den Speicher ermöglicht. Diese direkte Steuerungsmöglichkeit macht Assembler zu einer mächtigen Sprache für ressourcenintensive oder sehr spezifische Aufgaben.
Aufbau dieses Tutorials
Dieses Tutorial ist so strukturiert, dass es sich von einem Kapitel zum nächsten Schritt für Schritt selbst erklärt. Zur Demonstration der Beispiele verwende ich einen Raspberry Pi 5, aber die Beispiele sollten ebenso auf den Modellen Raspberry Pi 3 und Raspberry Pi 4 funktionieren, sofern diese mit einem 64-Bit-Linux-System betrieben werden. Zu Beginn werden wir uns ansehen, wie man überhaupt Assemblerprogramme schreibt und diese auf einem ARM64-System ausführt.
Inhalt
- Programmierumgebung unter Linux erstellen und testen
- Tools, die zur Programmierung benötigt werden
- Allgemeines zu Zahlen (Dezimal, Binär, Hexadezimal)
- Das erste Programm "Hello World"
- Register und Speicher
- Laden und Speichern von Werten
- Addieren und Subtrahieren
- Multiplizieren, Dividieren und Akkumulation
- Shiften und Rotation
- Logische Operatoren
- Sprungadressen (Labels)
- Programmablauf steuern
- Funktionen und Stack
- Systemaufrufe
- Interaktion mit C
- Gleitkommaoperationen
- NEON Coprozessor