Ce manuel fournit une introduction douce à la programmation en langage assembleur. Ce qui rend cette introduction « douce », c'est qu'elle suppose que le lecteur est déjà à l'aise avec le codage C ou C++. Nous utilisons ces connaissances supposées pour revenir en arrière vers l'ISA (Instruction Set Architecture) de bas niveau.
Nous insistons sur un point très pointu :
Le langage assembleur n’a rien à craindre !Comme mentionné, si vous êtes déjà familier avec le C (ou les langages issus du C comme le C++), ce livre commence par ce que vous savez déjà.
Les chapitres suivants plongent plus profondément dans les coins et les recoins de l'ARM V8 ISA et conviennent à ceux qui souhaitent maîtriser le riche jeu d'instructions des processeurs ARM 64 bits.
Oui, absolument.
La programmation en langage assembleur dépend assez étroitement de l’architecture matérielle sous-jacente. L’environnement d’exploitation hôte joue un rôle majeur dans la détermination de la manière dont les programmes en langage assembleur sont construits. Une « convention d'appel » fait référence à la manière dont les fonctions sont appelées et à la manière dont les paramètres sont transmis.
À l'origine, ce livre enseignait uniquement les conventions ARM LINUX. Cependant, au fil du temps, nous avons développé une suite de macros qui facilitent grandement l'écriture de code à utiliser soit sur MacOS, soit sur LINUX.
Ce lien mènera à une copie actuelle de ceux-ci ainsi qu'à la documentation. Des macros qui facilitent un peu la programmation sont également incluses.
Ce chapitre fournit des informations supplémentaires sur la programmation en langage assembleur Apple Silicon.
Vous remarquerez que nous utilisons directement le runtime C plutôt que d'effectuer des appels système du système d'exploitation. Ainsi, par exemple, si nous voulons appeler write()
, nous appelons write
depuis le langage assembleur.
Cette version de l' write
d'appel système est une fonction wrapper intégrée au runtime C (CRT) qui gère les détails de niveau inférieur de l'exécution d'un appel système. Voir ici ce qui se passe réellement dans ces fonctions wrapper.
L'avantage de l'utilisation des wrappers CRT est qu'il existe des différences entre les distributions et les architectures qui sont masquées par l'utilisation des wrappers CRT. Par conséquent, lorsque vous utilisez les wrappers plutôt que la méthode directe pour effectuer des appels système, votre code sera plus portable.
Aussi louables que soient les conceptions ARM, les conventions de dénomination d'ARM pour leurs propriétés intellectuelles sont horribles. Dans ce livre, AARCH64 et ARM V8 sont considérés comme des synonymes de l'architecture de jeu d'instructions ARM (ISA) 64 bits.
Il est très difficile de trouver de la documentation sur le site ARM car ils ont tellement de versions , tellement de noms pour la même chose et tellement de documentation en général. Cela peut vraiment être exaspérant.
Dans le texte, nous fournirons des liens pertinents, le cas échéant.
Voici un lien vers "une" page de jeu d'instructions principale.
Obtenir les outils pour le développement du langage assembleur est assez simple – peut-être les avez-vous déjà. En utilisant apt
depuis le terminal Linux, dites :
sudo apt update
sudo apt install build-essential gdb
Sur Macintosh, tapez :
xcode-select --install
dans un terminal et suivez les instructions. Notez que gdb
est remplacé par lldb
avec juste assez de différences pour vous faire pleurer.
Ensuite, vous aurez besoin de votre éditeur préféré. Nous utilisons nous-mêmes vi
pour des modifications rapides et Visual Studio Code pour tout travail lourd.
Nous utilisons gcc
, le "compilateur" C. g++
pourrait également être utilisé. Sur Mac, clang
peut également être utilisé.
Quel sens cela a-t-il... d'utiliser le « compilateur » pour « compiler » le langage assembleur ?
Eh bien, pour répondre à cette question, il faut comprendre que le mot « compilateur » fait référence à une seule étape dans une séquence de construction. Ce que nous appelons le « compilateur » est en fait un ensemble qui comprend :
Un préprocesseur qui agit sur n'importe quelle commande de #
préprocesseur comme #include
. Ces commandes ne font pas partie du C ou du C++. Ce sont plutôt des commandes adressées au préprocesseur.
Notez que gcc
invoquera le préprocesseur C si votre fichier en langage assembleur se termine par .S
- S majuscule. Il peut ou non être invoqué si votre fichier se termine par un s minuscule ou toute autre extension de fichier en fonction de votre système.
Le compilateur actuel , dont le travail consiste à transformer des langages de haut niveau tels que C et C++ en langage assembleur.
L'assembleur, qui transforme le langage assembleur en code machine qui n'est pas tout à fait prêt à être exécuté.
Et enfin, l'éditeur de liens, qui combine potentiellement de nombreux fichiers de code machine intermédiaires (appelés fichiers objets), potentiellement de nombreux fichiers de bibliothèque (fichiers .dll liés statiquement sous Windows et fichiers .a sous Linux). Le lieur est la dernière étape de cette chaîne.
Voici une vidéo expliquant ce processus.
Nous utilisons directement gcc et g++ car, étant des parapluies, ils automatisent les étapes ci-dessus et se lient automatiquement avec le CRT.
Supposons que vous ayez implémenté main()
dans un fichier C (main.c) et que vous souhaitiez utiliser un fichier en langage assembleur que vous avez écrit (asm.S). Cela peut être fait de plusieurs manières.
gcc main.c asm.S
C'est tout ce dont vous avez besoin pour une construction minimale. Le programme résultant sera écrit dans a.out
. Tous les fichiers intermédiaires générés seront supprimés.
gcc -c main.c
gcc -c asm.S
gcc main.o asm.o
Utilisés de cette manière, les fichiers .o
restent sur le disque. En utilisant la méthode précédente, les fichiers .o
sont supprimés sans que vous les voyiez.
Supposons que main()
soit implémenté en langage assembleur et que main.s
soit autonome, alors simplement :
gcc main.S
Souvent, vous souhaiterez activer le débogueur gdb
ou lldb
. Faites ceci :
gcc -g main.S
Sans l'option de ligne de commande -g
, votre débogueur risque de ne pas fonctionner correctement.
Pour répéter, si vous souhaitez que gcc
exécute votre code via le préprocesseur C (pour gérer #include
par exemple), nommez vos fichiers de code source en langage assembleur avec un S majuscule. Ainsi, sous Linux :
gcc main.s
Ne passera pas par le préprocesseur C mais
gcc main.S
volonté.
Pour bien comprendre que le "compilateur" est un parapluie, l'utilisation de gcc pour "compiler" un programme entraîne l'appel des éléments suivants sur Ubuntu exécuté sur ARM :
/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
est le préprocesseur C - c'est un outil général qui peut également être utilisé par d'autres langages (C++, par exemple).
cc1
est le véritable compilateur.
as
l'assembleur.
ld
est l'éditeur de liens.
Vous pouvez voir pourquoi nous utilisons par défaut la commande parapluie dans ce livre.
Nous commençons par fournir ce que nous appelons un « pontage » entre C et C++ et le langage assembleur. Nous utilisons les connaissances que vous possédez déjà pour acquérir de nouvelles connaissances - comme c'est cool !
Chapitre | Réduction | |
---|---|---|
0 | Démarrage | Lien |
1 | Bonjour le monde | Lien |
2 | Si les déclarations | Lien |
3 | Boucles | |
3a | Boucles while | Lien |
3b | Pour les boucles | Lien |
3c | Mise en œuvre Continuer | Lien |
3D | Implémentation de la pause | Lien |
4 | Interludes | |
4a | Registres | Lien |
4b | Charger et stocker | Lien |
4c | En savoir plus sur ldr | Lien |
4j | Tailles d'enregistrement | Lien |
4e | Hexadécimal | Lien |
5 | switch | Lien |
6 | Fonctions | |
6a | Appeler et revenir | Lien |
6b | Paramètres de transmission | Lien |
6c | Exemple d'appel de certaines fonctions d'exécution C courantes | Lien |
7 | FizzBuzz - un programme complet | Lien |
8 | Structures | |
8a | Alignement | Lien |
8b | Définir | Lien |
8c | En utilisant | Lien |
8j | Qu'est-ce que c'est" | Lien |
9 | const | Lien |
Les opérations à virgule flottante utilisent leurs propres instructions et leur propre ensemble de registres. Par conséquent, les opérations en virgule flottante sont couvertes dans leur propre section :
Chapitre | Réduction | |
---|---|---|
0 | Aperçu du chapitre | Lien |
1 | Que sont les nombres à virgule flottante ? | Lien |
2 | Registres | Lien |
3 | Troncature et arrondi | Lien |
4 | Littéraux | Lien |
5 | fmov | Lien |
6 | Flotteurs demi-précision | Lien |
7 | NEON SIMD Pas encore écrit | Lien |
Que serait un livre sur le langage assembleur sans dénigrer ?
Chapitre | Réduction | |
---|---|---|
1 | Champs de bits | |
1a | Sans champs de bits | Lien |
1b | Avec des champs de bits | Lien |
1c | Examen des instructions nouvellement décrites | Lien |
2 | Endianité | Lien |
Dans cette section, nous présentons divers documents, notamment notre « conférence de renommée mondiale » sur le débogage. Cette conférence a été invitée dans plusieurs collèges et universités. Il est destiné à un public travaillant avec des langages tels que C, C++ et le langage assembleur, mais certaines des leçons qu'il contient sont applicables à tous les langages.
Chapitre | Réduction | |
---|---|---|
1 | Pomme Silicium | Lien |
2 | Convergence Apple/Linux | Lien |
3 | Fonctions variadiques | Lien |
4 | Sous le capot : appels système | Lien |
5 | Détermination des longueurs littérales de chaîne pour les fonctions C | Lien |
6 | Appel du langage d'assemblage à partir de Python | Lien |
7 | Opérations atomiques | Lien |
8 | Tables de saut | Lien |
9 | argv | CODE ASM |
10 | verrous rotatifs | Lien |
- | Conférence de débogage | PPTX |
Comme indiqué immédiatement ci-dessus, la suite de macros peut être trouvée ici.
Voici quelques spécifications de projet pour proposer un défi à votre maîtrise grandissante. Voici de très brèves descriptions présentées par ordre alphabétique.
Peut-être qu'avant de vous y attaquer, consultez d'abord le programme FIZZBUZZ entièrement décrit.
Alors essayez ceci comme votre tout premier projet. Avec quelques lignes vides et des commentaires, il pèse 35 lignes.
Le projet DIRENT montre comment une struct
complexe peut être utilisée en langage assembleur.
Le projet PI démontre des instructions à virgule flottante. Le programme « lancera des fléchettes sur une cible », calculant une approximation de PI en suivant le nombre de fléchettes « atteignant la cible » par rapport au nombre total de fléchettes « lancées ».
Le projet SINE met l'accent sur les mathématiques et les fonctions en virgule flottante.
Le projet SNOW utilise la technologie des années 1970 pour animer un système de particules simple. Ce projet démontre un processus de conception raisonnable consistant à décomposer des problèmes complexes en parties plus simples.
Les WALKIES présentent une jolie petite animation démontrant le bouclage avec un déréférencement de pointeur.
La carrière de Perry Kivolowitz en informatique s'étend sur un peu moins de cinq décennies. Il a lancé plus de 5 sociétés, principalement liées au matériel informatique, au traitement d'images et aux effets visuels (pour le cinéma et la télévision). Perry a reçu une reconnaissance Emmy pour son travail sur The Gathering, l'épisode pilote de Babylon 5. Plus tard, il a reçu un Emmy Award pour l'ingénierie avec ses collègues de SilhouetteFX, LLC. SilhouetteFX est utilisé dans presque tous les films importants pour la rotoscopie, la peinture, le suivi, la reconstruction 2D vers 3D, le compositing et bien plus encore.
En 1996, Perry a reçu un Oscar pour ses réalisations scientifiques et techniques pour son invention du Shape Driven Warping and Morphing. C'est la technique responsable de nombreux effets célèbres de Forrest Gump, Titanic et Stargate.
Vingt-vingt-trois ans marquent la 19e année d'enseignement de l'informatique au niveau collégial par Perry, dix ans à l'UW Madison et maintenant 8 ans et plus au Carthage College.
Le langage assembleur est une passion pour Perry ayant travaillé dans les ISA suivantes (par ordre chronologique) :
Univac 1100
Société d'équipement numérique PDP-11
Société d'équipement numérique VAX-11
Motorola68000
ARM commençant par AARCH64
Ce travail est dédié à ma femme Sara et à mes fils Ian et Evan.
Perry a créé une bibliothèque d'environ 200 projets de programmation adaptés aux cours CS 1, CS 2, Structures de données, Réseaux, Systèmes d'exploitation et Organisation informatique. Si un éditeur de manuels CS (ou d'autres contenus liés à CS) serait intéressé par l'achat de la bibliothèque, veuillez nous contacter.
Consultez également Get Off My L@wn, un roman Zombie pour les codeurs.
Vous avez bien lu... le programmeur d'élite Doug Handsman prend sa retraite dans le nord du Wisconsin, pays natal de sa femme Ruth Ann. Et puis, eh bien, l’apocalypse arrive. Déception.
Noté 4,3 sur 5 avec plus de 70 avis, c'est une lecture amusante et ne coûte presque rien.