Dieses Lehrbuch bietet eine sanfte Einführung in die Assembler-Programmierung. Was diese Einführung „sanft“ macht, ist, dass sie davon ausgeht, dass der Leser bereits mit C- oder C++-Codierung vertraut ist. Wir nutzen dieses angenommene Wissen, um eine Brücke zurück zur Low-Level-ISA (Instruction Set Architecture) zu schlagen.
Wir bringen einen sehr scharfen Punkt nach Hause:
Assemblersprache ist kein Grund zur Angst!Wie bereits erwähnt: Wenn Sie bereits mit C (oder von C abgeleiteten Sprachen wie C++) vertraut sind, beginnt dieses Buch mit dem, was Sie bereits wissen.
Spätere Kapitel tauchen tiefer in die Ecken und Nischen des ARM V8 ISA ein und eignen sich für diejenigen, die den umfangreichen Befehlssatz der 64-Bit-ARM-Prozessoren beherrschen möchten.
Ja, absolut.
Die Assembler-Programmierung hängt sehr stark von der zugrunde liegenden Hardware-Architektur ab. Die Host-Betriebsumgebung spielt eine große Rolle dabei, wie Assemblerprogramme erstellt werden. Eine „Aufrufkonvention“ bezieht sich darauf, wie Funktionen aufgerufen und Parameter übergeben werden.
Ursprünglich wurden in diesem Buch nur die ARM-LINUX-Konventionen gelehrt. Im Laufe der Zeit haben wir jedoch eine Reihe von Makros entwickelt, die es viel einfacher machen, Code für die Verwendung unter MacOS oder LINUX zu schreiben.
Dieser Link führt zu einer aktuellen Kopie davon sowie zur Dokumentation. Außerdem sind Makros enthalten, die das Programmieren etwas erleichtern.
Dieses Kapitel enthält einige zusätzliche Informationen zur Assembler-Programmierung von Apple Silicon.
Sie werden feststellen, dass wir die C-Laufzeit direkt nutzen, anstatt Betriebssystem-Systemaufrufe durchzuführen. Wenn wir beispielsweise write()
aufrufen möchten, rufen wir write
aus der Assemblersprache auf.
Bei dieser Version des Systemaufruf- write
handelt es sich um eine in die C-Laufzeit (CRT) integrierte Wrapper-Funktion, die die untergeordneten Details der Ausführung eines Systemaufrufs verarbeitet. Sehen Sie hier, was tatsächlich in diesen Wrapper-Funktionen passiert.
Der Vorteil der Verwendung der CRT-Wrapper besteht darin, dass es Unterschiede zwischen den Distributionen und Architekturen gibt, die durch die Verwendung der CRT-Wrapper maskiert werden. Wenn Sie daher die Wrapper anstelle der direkten Methode zum Durchführen von Systemaufrufen verwenden, ist Ihr Code portabler.
So lobenswert die ARM-Designs auch sind, die Namenskonventionen von ARM für ihre geistigen Eigenschaften sind schrecklich. In diesem Buch werden AARCH64 und ARM V8 als Synonyme für die 64-Bit-ARM-Befehlssatzarchitektur (ISA) angesehen.
Es ist sehr schwierig, Dokumentation auf der ARM-Site zu finden, da es dort so viele Versionen , so viele Namen für dasselbe und so viel Dokumentation im Allgemeinen gibt. Es kann wirklich wahnsinnig sein.
Im Text stellen wir gegebenenfalls entsprechende Links zur Verfügung.
Hier ist ein Link zu „einer“ Hauptseite mit Befehlssätzen.
Es ist ziemlich einfach, die Tools für die Assemblersprachenentwicklung zu bekommen – vielleicht haben Sie sie bereits. Sagen Sie mit apt
vom Linux-Terminal aus:
sudo apt update
sudo apt install build-essential gdb
Geben Sie auf dem Macintosh Folgendes ein:
xcode-select --install
Betreten Sie ein Terminal und folgen Sie den Anweisungen. Beachten Sie, dass gdb
durch lldb
ersetzt wird, mit gerade genug Unterschieden, die Sie zum Weinen bringen.
Dann brauchen Sie Ihren Lieblingseditor. Wir selbst verwenden vi
für schnelle Bearbeitungen und Visual Studio Code für schwere Arbeiten.
Wir verwenden gcc
, den C-„Compiler“. g++
könnte ebenfalls verwendet werden. Auf dem Mac kann auch clang
verwendet werden.
Welchen Sinn hat das, den „Compiler“ zum „Kompilieren“ der Assemblersprache zu verwenden?
Um das zu beantworten, muss man verstehen, dass sich das Wort „Compiler“ nur auf einen Schritt in einer Build-Sequenz bezieht. Was wir als „Compiler“ bezeichnen, ist eigentlich ein Dach, das Folgendes umfasst:
Ein Präprozessor, der auf jeden #
Präprozessorbefehl wie #include
reagiert. Diese Befehle sind nicht Teil von C oder C++. Es handelt sich vielmehr um Befehle an den Präprozessor.
Beachten Sie, dass gcc
den C-Präprozessor aufruft, wenn Ihre Assembler-Datei mit .S
endet (Großbuchstabe S). Abhängig von Ihrem System kann er aufgerufen werden, muss aber nicht, wenn Ihre Datei mit einem kleinen s oder einer anderen Dateierweiterung endet.
Der eigentliche Compiler, dessen Aufgabe es ist, Hochsprachen wie C und C++ in Assemblersprache umzuwandeln.
Der Assembler, der die Assemblersprache in Maschinencode umwandelt, der noch nicht ganz zur Ausführung bereit ist.
Und schließlich der Linker, der möglicherweise viele zwischengeschaltete Maschinencodedateien (sogenannte Objektdateien) und möglicherweise viele Bibliotheksdateien (statisch verknüpfte DLLs unter Windows und A-Dateien unter Linux) kombiniert. Der Linker ist der letzte Schritt in dieser Kette.
Hier ist ein Video, das diesen Vorgang erklärt.
Wir verwenden gcc und g++ direkt, da sie als Umbrellas die oben genannten Schritte automatisieren und sich automatisch mit dem CRT verknüpfen.
Angenommen, Sie haben main()
in einer C-Datei (main.c) implementiert und möchten eine von Ihnen geschriebene Assembler-Datei (asm.S) verwenden. Dies kann auf verschiedene Arten erfolgen.
gcc main.c asm.S
Das ist alles, was Sie für einen Minimalaufbau benötigen. Das resultierende Programm wird in a.out
geschrieben. Alle generierten Zwischendateien werden entfernt.
gcc -c main.c
gcc -c asm.S
gcc main.o asm.o
Bei dieser Verwendung bleiben .o
Dateien auf der Festplatte. Mit der vorherigen Methode werden die .o
Dateien entfernt, ohne dass Sie sie sehen.
Angenommen, main()
ist in Assemblersprache implementiert und main.s
ist eigenständig, dann gilt einfach:
gcc main.S
Häufig möchten Sie den Debugger gdb
oder lldb
aktivieren. Gehen Sie folgendermaßen vor:
gcc -g main.S
Ohne die Befehlszeilenoption -g
funktioniert Ihr Debugger möglicherweise nicht ordnungsgemäß.
Um es noch einmal zu wiederholen: Wenn Sie möchten, dass gcc
Ihren Code über den C-Präprozessor laufen lässt (zum Beispiel für die Übergabe #include
), benennen Sie Ihre Assembler-Quellcodedateien mit einem großen S. Also unter Linux:
gcc main.s
Wird den C-Präprozessor aber nicht durchlaufen
gcc main.S
Wille.
Um deutlich zu machen, dass der „Compiler“ ein Schirm ist, führt die Verwendung von gcc zum „Kompilieren“ eines Programms dazu, dass auf Ubuntu, das auf ARM läuft, Folgendes aufgerufen wird:
/usr/bin/cpp
/usr/lib/gcc/aarch64-linux-gnu/11/cc1
/usr/bin/as
/usr/lib/gcc/aarch64-linux-gnu/11/collect2 which is...
/usr/bin/ld
cpp
ist der C-Präprozessor – es ist ein allgemeines Tool, das auch von anderen Sprachen (z. B. C++) verwendet werden kann.
cc1
ist der eigentliche Compiler.
as
der Assembler.
ld
ist der Linker.
In diesem Buch können Sie sehen, warum wir standardmäßig den Befehl „Umbrella“ verwenden.
Wir beginnen mit der Bereitstellung dessen, was wir „Brücke“ von C und C++ zur Assemblersprache nennen. Wir nutzen das Wissen, das Sie bereits haben, um neues Wissen zu erlernen – wie cool ist das!
Kapitel | Abschlag | |
---|---|---|
0 | Kickstart | Link |
1 | Hallo Welt | Link |
2 | If-Anweisungen | Link |
3 | Schleifen | |
3a | While-Schleifen | Link |
3b | For-Schleifen | Link |
3c | Umsetzung fortsetzen | Link |
3d | Pause umsetzen | Link |
4 | Zwischenspiele | |
4a | Registriert | Link |
4b | Laden und speichern | Link |
4c | Mehr über ldr | Link |
4d | Registergrößen | Link |
4e | Hexadezimal | Link |
5 | switch | Link |
6 | Funktionen | |
6a | Anrufen und Zurückkommen | Link |
6b | Übergabe von Parametern | Link |
6c | Beispiel für den Aufruf einiger gängiger C-Laufzeitfunktionen | Link |
7 | FizzBuzz – ein komplettes Programm | Link |
8 | Strukturen | |
8a | Ausrichtung | Link |
8b | Definieren | Link |
8c | Benutzen | Link |
8d | Was ist das" | Link |
9 | const | Link |
Gleitkommaoperationen verwenden ihre eigenen Anweisungen und ihren eigenen Registersatz. Daher werden Gleitkommaoperationen in einem eigenen Abschnitt behandelt:
Kapitel | Abschlag | |
---|---|---|
0 | Kapitelübersicht | Link |
1 | Was sind Gleitkommazahlen? | Link |
2 | Registriert | Link |
3 | Kürzung und Rundung | Link |
4 | Literale | Link |
5 | fmov | Link |
6 | Halbpräzisionsschwimmer | Link |
7 | NEON SIMD noch nicht geschrieben | Link |
Was wäre ein Buch über Assemblersprache ohne Bit-Bashing?
Kapitel | Abschlag | |
---|---|---|
1 | Bitfelder | |
1a | Ohne Bitfelder | Link |
1b | Mit Bitfeldern | Link |
1c | Überprüfung der neu beschriebenen Anweisungen | Link |
2 | Endianness | Link |
In diesem Abschnitt präsentieren wir verschiedenes Material, einschließlich unseres „weltberühmten Vortrags“ zum Thema Debuggen. Dieser Vortrag wurde an mehreren Hochschulen und Universitäten eingeladen. Es richtet sich an Zielgruppen, die mit Sprachen wie C, C++ und Assembler arbeiten, einige der darin enthaltenen Lektionen sind jedoch auf alle Sprachen anwendbar.
Kapitel | Abschlag | |
---|---|---|
1 | Apple Silicon | Link |
2 | Apple/Linux-Konvergenz | Link |
3 | Variadische Funktionen | Link |
4 | Unter der Haube: Systemaufrufe | Link |
5 | Bestimmen der Länge von String-Literalen für C-Funktionen | Link |
6 | Assemblersprache aus Python aufrufen | Link |
7 | Atomare Operationen | Link |
8 | Sprungtabellen | Link |
9 | argv | ASM-CODE |
10 | Spin-Locks | Link |
- | Debugging-Vorlesung | PPTX |
Wie bereits oben erwähnt, finden Sie die Makro-Suite hier.
Hier sind einige Projektspezifikationen, die Ihre wachsende Meisterschaft herausfordern sollen. Hier finden Sie sehr kurze Beschreibungen in alphabetischer Reihenfolge.
Bevor Sie sich damit befassen, schauen Sie sich vielleicht zuerst das vollständig beschriebene FIZZBUZZ-Programm an.
Dann probieren Sie dies als Ihr allererstes Projekt aus. Mit einigen Leerzeilen und Kommentaren wiegt es 35 Zeilen.
Das DIRENT-Projekt demonstriert, wie eine komplexe struct
in Assemblersprache verwendet werden kann.
Das PI-Projekt demonstriert Gleitkommaanweisungen. Das Programm „wirft Pfeile auf ein Ziel“ und berechnet einen Näherungswert des PI, indem es verfolgt, wie viele Pfeile „das Ziel treffen“ im Vergleich zur Gesamtzahl der „geworfenen“ Pfeile.
Das SINE-Projekt legt Wert auf Gleitkomma-Mathematik und -Funktionen.
Das SNOW-Projekt nutzt Technologien aus den 1970er Jahren, um ein einfaches Partikelsystem zu animieren. Dieses Projekt demonstriert einen sinnvollen Entwurfsprozess zur Zerlegung komplexer Probleme in einfachere Teile.
Die WALKIES präsentieren eine niedliche kleine Animation, die das Schleifen mit etwas Zeigerdereferenzierung demonstriert.
Perry Kivolowitz‘ Karriere in der Informatik erstreckt sich über knapp fünf Jahrzehnte. Er gründete mehr als fünf Unternehmen, hauptsächlich im Bereich Hardware, Bildverarbeitung und visuelle Effekte (für Kinofilme und Fernsehen). Perry erhielt eine Emmy-Auszeichnung für seine Arbeit an „The Gathering“, der Pilotfolge von Babylon 5. Später erhielt er zusammen mit seinen Kollegen von SilhouetteFX, LLC einen Emmy Award für Ingenieurskunst. SilhouetteFX wird in fast allen wichtigen Filmen zum Rotoskopieren, Malen, Tracking, 2D-zu-3D-Rekonstruktion, Compositing und mehr verwendet.
1996 erhielt Perry für seine Erfindung des Shape Driven Warping und Morphing einen Oscar für wissenschaftliche und technische Leistungen. Dies ist die Technik, die für viele der berühmten Effekte in Forrest Gump, Titanic und Stargate verantwortlich ist.
Mit 23 Jahren unterrichtet Perry seit 19 Jahren Informatik auf College-Ebene, zehn Jahre an der UW Madison und jetzt 8+ am Carthage College.
Assemblersprache ist eine Leidenschaft von Perry, der in den folgenden ISAs gearbeitet hat (in chronologischer Reihenfolge):
Univac 1100
Digital Equipment Corporation PDP-11
Digital Equipment Corporation VAX-11
Motorola 68000
ARM beginnend mit AARCH64
Dieses Werk ist meiner Frau Sara und meinen Söhnen Ian und Evan gewidmet.
Perry hat eine Bibliothek mit etwa 200 Programmierprojekten erstellt, die für die Kurse CS 1, CS 2, Datenstrukturen, Netzwerke, Betriebssysteme und Computerorganisation geeignet sind. Wenn ein Herausgeber von CS-Lehrbüchern (oder anderen CS-bezogenen Inhalten) am Kauf der Bibliothek interessiert wäre, wenden Sie sich bitte an uns.
Schauen Sie sich auch Get Off My L@wn an, einen Zombie-Roman für Programmierer.
Sie haben richtig gelesen ... Der Elite-Programmierer Doug Handsman zieht sich in die Heimat seiner Frau Ruth Ann im Norden Wisconsins zurück. Und dann passiert die Apokalypse. Schade.
Mit 4,3 von 5 Punkten und mehr als 70 Rezensionen bewertet, ist es eine unterhaltsame Lektüre und kostet so gut wie nichts.