Einführung
- Willkommen zum Assembly-Sprachkurs von FFmpeg. Dieser Kurs vermittelt die Grundlagen dazu, wie Assembly-Sprache in FFmpeg geschrieben wird.
Erforderliche Kenntnisse
- Kenntnisse der Programmiersprache C sind erforderlich, insbesondere zu Zeigern.
- Mathematikkenntnisse auf Oberstufenniveau sind erforderlich (Skalare und Vektoren, Addition, Multiplikation usw.).
Was ist Assembly-Sprache?
- Assembly-Sprache ist eine Programmiersprache, mit der Code geschrieben wird, der direkt den vom CPU verarbeiteten Befehlen entspricht.
- Der Großteil des Assembly-Codes in FFmpeg ist SIMD (Single Instruction Multiple Data), was auch als Vektorprogrammierung bezeichnet wird.
- SIMD eignet sich gut für die Verarbeitung großer Datenmengen, die sequenziell im Speicher abgelegt sind, etwa Bilder, Videos und Audio.
Warum in Assembly schreiben?
- Um die Geschwindigkeit der Multimedia-Verarbeitung zu erhöhen. Mit Assembly-Code lässt sich eine Beschleunigung um mehr als das Zehnfache erzielen.
- In FFmpeg wird Assembly-Code direkt geschrieben, ohne Intrinsics zu verwenden. Intrinsics sind normalerweise 10–15 % langsamer als handgeschriebener Assembly-Code.
Arten von Assembly-Sprache
- Dieser Kurs konzentriert sich auf x86-64-Assembly-Sprache. Diese ist auch als amd64 bekannt und läuft ebenso auf Intel-CPUs.
- Bei der x86-Assembly-Syntax gibt es zwei Varianten, AT&T und Intel, und hier wird die Intel-Syntax verwendet.
Begleitmaterial
- Die Assembly-Programmierung in FFmpeg konzentriert sich auf performante Bildverarbeitung und verfolgt dabei einen eigenen Ansatz.
- Die Diagramme aus dem Buch "The Art of 64-bit assembly" können hilfreich sein.
Register
- Register sind Bereiche in der CPU, in denen Daten verarbeitet werden. Die CPU manipuliert den Speicher nicht direkt, sondern lädt Daten in Register, verarbeitet sie dort und schreibt sie anschließend zurück in den Speicher.
Allzweckregister
- Allzweckregister (GPR) können Daten oder Speicheradressen enthalten. Im Assembly-Code von FFmpeg dienen GPRs hauptsächlich als Ausgangspunkt.
Vektorregister
- Vektor-(SIMD-)Register enthalten mehrere Datenelemente. Es gibt verschiedene Arten von Vektorregistern.
- Die meisten Berechnungen bei der Video-Kompression und -Dekompression basieren auf Ganzzahlen.
Einbinden von x86inc.asm
- x86inc.asm ist eine leichtgewichtige Abstraktionsschicht, die in FFmpeg, x264 und dav1d verwendet wird, um die Arbeit von Assembly-Programmierern zu erleichtern.
Einfacher skalarer Assembly-Code
- Anhand von Beispielcode wird erklärt, wie skalarer Assembly-Code funktioniert.
Grundlegende Vektorfunktionen verstehen
- Am ersten Beispiel einer SIMD-Funktion wird die Bedeutung jeder Zeile erklärt.
- Mit Befehlen wie
movu und paddb werden Vektoroperationen ausgeführt.
- Die Funktion verändert die Daten ihrer Argumente und gibt keinen Wert zurück.
1 Kommentare
Hacker-News-Kommentar
Es gibt weiteres Material zum selben Thema, etwa die Beispiele von FFmpeg und dav1d
Ich halte die Verwendung von Intrinsics für wertvoller als das Schreiben von Assembler, aber das Lesen war sehr nützlich
Ich finde diesen Leitfaden sehr gut
Ich frage mich, ob das Lernen oder Implementieren von Assembler irgendeinen „Spaßfaktor“ hat
Das Suffix "q" gibt die Pointer-Größe an, auf 64-Bit-Systemen also 8
Lob für den K&R-Verweis
Ein Nachteil von Assembler ist, dass der Code architekturabhängig ist
Die Ablehnung von Inline-Assembler ist verwirrend
Dieses Material ist perfekt
Ich frage mich, ob es noch stimmt, dass Assembler 10-mal schneller ist als C