Assembler Programmierung

Assembler ist gewissermaßen die Sprache der Mikroprozessoren selbst. Programme, die in anderen sog. Hochsprachen wie C oder Python entwickelt werden, werden von sog. Compilern und Interpretern in Maschinencode umgeeandelt, der vom Prozessor direkt ausgeführt werden kann. Assembler ist die für Menschen lesbare und von ihnen schreibbare Version dieses Maschinencodes.

Wozu Assembler?

Assembler ist eher nichts für Einsteiger, aber es lehrt einen wie ein Prozessor arbeitet und wie ein Computerprogramm auf der untersten denkbaren Ebene funktioniert. Was in höheren Programmiersprachen in wenigen Zeilen Quellcode ausgedrückt werden kann, kann in Assembler ein sehr langes und komplexes Programm sein.

Dennoch ist die Fähigkeit in Assembler programmieren zu können gefragt, u.a. für folgende Anwendungsfälle:

  • Compiler- / Interpreterbau
    Um eine Programmiersprache möglichst schnell zu bekommen müssen die Entwickler der Compiler / Interpreter die zugrunde liegende Hardware gut kennen und möglichst effizient nutzen.
  • Betriebssystem-Entwicklung
    Betriebssysteme sind aus Entwicklersicht eine Zwischenschicht zwischen Anwendung und Hardware. Das Betriebssystem stellt Funktionen zum Zugriff auf Hardware zur Verfügung und muss dazu selbst auf diese zugreifen und entsprechend für die jeweilige Hardwarearchitektur angepasst werden. In Kernbereichen ist daher die Nutzung von Assembler-Routinen unumgänglich, um kritische Systemteile umzusetzen und zu optimieren, z.B. in der Speicherverwaltung.
  • Performance-Optimierung
    Nicht nur wissenschaftliche Anwendungen und (Grafik-)Treiber, sondern auch Grafikprogramme, Soundprogramme und Spiele können mit gezieltem Einsatz von Assembler manche Funktionen um teils mehrere hundert Prozent im Vergleich zu dem von einem Compiler erzeugten Code beschleunigen.
  • Geringer Speicherplatzbedarf
    Speicherplatzschonender als in Assembler kann in keiner höheren Programmiersprache entwickelt werden.

Wer ARM-Prozessoren in Assembler programmieren kann hat zudem ein sehr weites Einsatzfeld vor sich, wenn man mal so schaut in was für Geräten ARM-Prozessoren verbaut werden:

  • Eingebettete Systeme (embedded Systems)
    Diese Geräteklasse hat, anders als unsere gewöhnlichen Personal Computer, einen spezifischen Einsatzzweck, etwa die Erfassung von Sensordaten, deren Verarbeitung und Steuerung anderer Komponenten. Der Begriff wird meist im Zusammenhang mit Industrieanwendungen, z.B. der Fahrzeugsteuerung, verwendet.
  • Mobiltelefone / Smartphones / Tablets
    Die ARM-Prozessorarchitektur ist besonders stromsparend und liefert pro Watt eingesetzter Energie besonders viel Rechenleistung. Praktisch alle heute verkauften leistungsfähigen Handys / Smartphones und Tables basieren daher auf ARM-Prozessoren, von Apples iPod Touch, iPhones, iPads und Apple TVs bis zu den vielen verschiedenen Android-Handys und -Tablets.
  • Navigationssysteme
    Kauft man sich heute ein Navigationssystem für den PKW oder ist dieser mit einem ausgestattet, schlägt in ihm aller Wahrscheinlicheit nach ein ARM-Herz.
  • NAS-Systeme und Router
    Diverse Internet-Router, z.B. Netgears RangeMax basieren auf ARM-CPUs, ebenso wie NAS-Systeme von z.B. Asus und Synology.
  • Spielkonsolen
    Die Nintendo DS-Serie / 3DS, Nintendo Gameboy Advance und die Sony Playstation Vita basieren auf ARM-Prozessoren.
  • Supercomputer
    Beim Super-Computing, sowohl an Bildungs- und Forschungseinrichtungen wie auch im kommerziellen Umfeld, werden Betriebskosten vor allem durch den Stromverbrauch erzeugt und bilden erforderliche Kühlmaßnahmen und erreichbare Leistungsdichten große Faktoren bei den Baukosten. Verschiedentlich werden aktuell Supercomputer unter Verwendung von ARM-Prozessoren geplant und gebaut (siehe: Supercomputer mit ARM-Technik), in der Regel in Verbindung mit leistungsfähigen Grafikprozessoren (GPUs). Derartige Systeme dürften schon bald in der Liste der 500 "grünsten" Supercomputer, der Green500, auftauchen.

Von den heute tätigen Entwicklern hat vermutlich nur ein sehr geringer Teil jemals produktiv Assembler eingesetzt. Mit der noch immer zunehmenden Verbreitung der ARM-Architektur werden aber auch zunehmend Entwickler mit ARM-Assembler-Kentnissen gesucht. Microsoft hat bestätigt, dass Windows 8 auch auf ARM laufen wird. Der Nachfolger der XBox 360 soll Gerüchten zufolge auf ARM basieren und Apple arbeitet gerüchtehalber an einem MacBook Air mit ARM-Prozessor.

Um gezielt Anwendungen zu beschleunigen führt am Einsatz von Assembler kein Weg vorbei. Setzen wir Produkte in Stückzahlen von zehntausenden, hunderttausenden oder gar Millionen ab, ist es viel lohnender die Entwickler ihre Anwendungeun optimieren zu lassen, als jede verkaufte Einheit durch den Einsatz einer leistungsfähigeren CPU zu verteuern.

Der ARM-Prozessorkern des Raspberry Pi

Sprechen wir im Zusammenhang mit dem Raspberry Pi von Assembler-Programmierung, so meinen wir Assembler für den ARM-Hauptprozessor. Dieser ist Bestandteil des auf dem Pi eingesetzten Broadcom BCM 2835 SoC (System On a Chip), der neben dem ARM-Kern auch einen Grafikprozessor (GPU), Hauptsoeicher und Hardware zur Anbindung von Peripherie (z.B. USB) enthält.

In der Herstellerinfo zum BCM 2835 finden wir, dass er einen ARM1176JZ-F Prozessorkern besitzt. Die Prozessorkerne der ARM11-Serie basieren auf Version 6 der ARM-Architektur. Das mag am Anfang etwas verwirren und hat damit zu tun, dass ARM selbst seit langer Zeit keine Prozessoren mehr selbst herstellt, sie designen lediglich die Architektur verschiedener Bestandteile und Referenzimplementierungen und vergeben zum Bau entsprechender Prozessoren Lizenzen. Während ARM11 bzw. ARM1176JZ-F uns etwas über Hardwarefeatures des Kerns mitteilt, sagt uns die Info, dass er auf der v6-Architektur basiert, u.a. welche grundlegenden Befehle er versteht.

Auf der Suche nach Dokumentationen und Tutorials halten wir also nach ARM-Assembler für die Archtitektur v6 Ausschau. Natürlich funktionieren auch Quellcodes für ältere Architekturen. Vom ARM1176 lernen wir so,

  • dass er die Jazelle-Technologie zur Ausführung von Java Bytecode enthält. Diese ist von uns nicht nutzbar, da man für Detailinformationen ein teures Lizenzabkommen abschließen muss.
  • dass der Kern den Thumb 1 Befehlssatz versteht. Dies ist ein eingeschränkter Sonderbefehlssatz, in dem Befehle nur 16 anstatt der sonst für den ARM-Befehlssatz benutzten 32 Bit Speicherplatz pro Befehl belegt.
  • dass der Kern einen Vector Floating-Point Einheit (VFP) enthält, also einen mathematischen Koprozessor, der direkt mit Fließkommazahlen rechnen kann. Dieser verfügt über 32 eigene Register für Operationen mit einfacher Genauigkeit und versteht den ARM VFPv2 Befehlssatz. Die Register können auch in 16 Register für Berechnungen mit doppelter Genauigkeit (64 Bit) genutzt werden.
  • der Kern besitzt 33 allgemeine und 7 Spezialregister von 32 Bit Größe. Für die Programmierung sind hiervon stets nur 16 allgemeine Register (GPR - General Purpose Registers) sichtbar.
  • der Prozessor verfügt über spezielle DSP (Digital Signal Prozessing - digitale Signalverarbeitung) Kommandos für 8, 16 und 32 Bit Daten inkl. der hier häufig benötigten MAC- und einiger SIMD-Befehle.

Online-Informationsquellen

Bücher zur ARM-Assembler-Programmierung

* Affiliate-Link

Tags: