Programmation en assembleur Gnu sur des microprocesseurs de la gamme Intel

Extrait du cours programmation en assembleur Gnu sur des microprocesseurs de la gamme Intel

……..
– Indirect mémoire programme, avec adresse directe du relai : On le note *adIci , si adIci est une étiquette définie dans la mémoire données, repérant un élément de la mémoire programme.
– Indirect avec déplacement de la mémoire d’instructions : *D(%R) où R est le nom de l’un des registres 32 bits permis et D la valeur du déplacement. Si le déplacement est nul on peut écrire *(%R).
– Indirect avec déplacement et index de la mémoire de données : D(%R1,%R2) où R1 et R2 sont les noms de registres permis et D la valeur du déplacement.
– Indirect avec index typé de la mémoire de données : D(%R1,%R2, F) où R1 et R2 sont les noms de registres permis, D le déplacement et F est le facteur multiplicatif à appliquer au contenu de R2. Les seules valeurs permises pour F sont 1, 2, 4 ou 8.
Les déplacements ou les valeurs immédiates peuvent être des expressions arithmétiques simples faisant intervenir les opérateurs arithmétiques : *, /, %,+, -, cités dans leur ordre de priorité décroissante. Le caractère / désigne la division entière et le caractère % le reste dans la division entière. L’expression ne doit pas utiliser de parenthèse. L’expression ne doit pas faire intervenir de symbole non défini dans l’unité de compilation courante.
Un déplacement peut être le résultat du calcul de la différence de deux adresses symboliques (etiqu1 – etiqu2) est une valeur entière signée qui ne dépend ni de l’adresse d’implantation du code, ni de celle des données et qui peut, donc, être calculée à l’assemblage. En revanche, toute expression du type : etiq + n où n est une constante, dépend de l’adresse d’implantation du segment de code ou de données qui contient l’étiquette etiq elle représente donc une adresse.
1.7. Les directives d’assemblages
Les directives d’assemblage ou plus simplement les directives sont des ordres donnés à l’assembleur et ne sont donc pas des instructions machines. Une directive est toujours précédée d’un caractère « . » (point). Nous décrivons les principale directives disponibles dans la section suivante.
5. Les Principales directives d’assemblage
Il y a trois familles de directives : les directives de sectionnement du programme, les directives de définition de données ou de constantes et les autres directives. Après avoir décrit ces trois familles nous donnons l’exemple d’un programme complet calculant le PGCD de deux nombres écrit en assembleur.
1.8. Les directives de sectionnement
Nous avons vu que les microprocesseurs auxquels nous nous intéressons adressent deux mémoires  séparées : la mémoire données et la mémoire programme. Nous verrons, quand nous traiterons la définition des données, que l’on peut encore distinguer deux types de données : celles qui ont une valeur initiale définie statiquement par le programmeur et celles pour lesquelles la valeur ne sera définie qu’à l’exécution.
1.8.1. .text [sous-section]
Cette directive dit à l’assembleur d’assembler les instructions qui suivent à la suite des instructions de la sous section d’instructions numérotée sous-section. Si le numéro sous-section est omis il est par défaut égal à zéro.
Logiciel de base : assembleur GNU pour les microprocesseurs Intel du 80386 au Pentium Pro
1.8.2. .data [sous_section]
Cette directive indique à l’assembleur d’assembler les unités de programme suivante derrière les données de la sous-section de données numérotée sous-section. Si le numéro de sous-section est omis alors le nombre 0 est pris par défaut.
1.8.3. .section .rodata
Cette directive indique à l’assembleur d’assembler les données suivantes qui seront placées dans une sous section spéciale qui à l’exécution sera en lecture seule (read only memory) et non exécutable.
1.8.4. .bss
La section bss est une section particulière qui n’est effectivement créée que lors du chargement en mémoire du programme, et n’est donc pas incluse dans le fichier objet généré par le compilateur. Elle ne peut donc contenir aucune donnée initialisée, et sera remplie avec des 0 avant exécution du programme. On s’attend donc à trouver dans cette section uniquement des instructions de type .skip
(voir plus bas) et des définitions de symboles.
1.9. Les directives de définition de données
On distingue deux type de données, les données initialisées des données non initialisées. La raison de ceci est que les données non initialisées, placées dans la section .bss, ne seront générées que lors
du chargement du programme en mémoire, et ne sont pas stoquées dans les fichiers objets. Cela réduit donc la taille des fichiers générés par l’assembleur.
1.9.1. Déclaration des données non initialisées :
– [étiquette] .skip taille (,valeur) : La directive .skip permet de réserver un nombre d’octets égal à taille à l’adresse étiquette. La zone est réservée dans la section courante, à l’emplacement de la directive. On utilisera essentiellement la directive .skip dans une section .bss pour définir des données non initialisées, mais il est cependant possible de le faire dans n’importe quelle autre section, auquel cas la place réservée sera effectivement incluse dans le fichier objet.
– .lcomm nom, taille (,nombre) : La directive lcomm permet de réserver un nombre d’octets égal à taille ; l’octet 0 est à l’adresse nom. La syntaxe de nom est celle permise pour les noms d’étiquettes (cf. la section précédente). .lcomm peut apparaître n’importe où dans le code, mais l’emplacement réservé est automatiquement placé dans une section bss, quelque soit la section courante. Le paramètre nombre, facultatif, permet de réserver nombre zones mémoire de taille taille.
1.9.2. Déclaration de données initialisées
L’assembleur permet de déclarer divers types de données initialisées : des octets, des mots (16 bits), des doubles mots (32 bits), des quadruples mots (64 bits), voire des octuples mots (128 bits) et des chaînes de caractères. On rappelle qu’il toujours plus efficace d’aligner les données sur des frontières au moins multiples de leur taille.
……..

Lire aussi  Cours sur le protocole FTP anonyme (File Transfer Protocol)

Sommaire: Programmation en assembleur Gnu sur des microprocesseurs de la gamme Intel

1. Introduction
2. L’architecture des microprocesseurs Intel après le 80386
1.1. Le modèle de programmation fourni
1.2. Les registres
3. Traduction en assembleur des principales structures de contrôle C
1.3. Conditionnelles
1.3.1. Simple : if (expression) instruction
1.3.2. Complète : if (expression) instruction1 else instruction2
1.4. Itérations
1.4.1. Boucle : for ( expression1 ; expression2 ; expression3 ) instruction
1.4.2. Tant que faire : while (expression) instruction
1.4.3. Faire tant que : do instruction while (expression)
4. Syntaxe de l’assembleur
1.5. Les commentaires
1.6. Les instructions machines
1.6.1. Le champ étiquette
1.6.2. Le champ opération
1.7. Les directives d’assemblages
5. Les Principales directives d’assemblage
1.8. Les directives de sectionnement
1.8.1. .text [sous-section]
1.8.2. .data [sous_section]
1.8.3. .section .rodata
1.8.4. .bss
1.9. Les directives de définition de données
1.9.1. Déclaration des données non initialisées :
1.9.2. Déclaration de données initialisées
1.10. Diverses autres directives
1.10.1. Définition de constantes
1.10.2. Alignement de données
1.10.3. Exportation de variables
1.10.4. Compteur d’assemblage
1.11. Un exemple simple : le pgcd
6. Les modes d’adressages
1.12. Les modes d’adressage de la mémoire (de) données
1.12.1. Adressage registre direct
1.12.2. Adressage immédiat
1.12.3. Adressage direct
1.12.4. Adressage indirect registre
1.12.5. Adressage indirect avec base et déplacement
1.12.6. Adressage indirect avec base, déplacement et index
1.12.7. Adressage avec base, déplacement et index typé
1.13. Les modes d’adressage de la mémoire programme.
1.13.1. Adressage direct
1.13.2. Adressage relatif au registre EIP
1.13.3. Adressage indirect
7. Représentation des entiers sur n bits
1.14. Entiers naturels
1.15. Entiers relatifs
1.16. Remarques
1.17. Représentation des entiers en mémoire
1.17.1. Entier sur un octet
1.17.2. Entier sur un mot
1.17.3. Entier sur un double mot
1.18. Représentation des entiers dans les registres
1.19. Comparaison d’entiers
8. Conventions de liaison entre programmes et sous-programme
1.20. Gestion de la pile, les instruction push, pop, pusha, popa
1.21. Les instructions d’appel et de retour de sous-programme
1.21.1. L’instruction call d’appel de sous-programme
1.21.2. L’instruction ret de retour de sous-programme
1.22. Passage de paramètres, gestion des variables locales et utilisation des registres
1.22.1. Passage des paramètres
1.22.2. Allocation des variables locales
1.22.3. Adressage par la procédure appelée des variables locales et des paramètres
1.22.4. Paramètres, variables locales et sauvegarde pour une procédure P
1.22.5. Appel d’une fonction ou d’un sous-programme
1.22.6. Utilisation des registres
9. Les entrées sorties à l’aide des fonctions C printf et scanf
1.23. Exemples simples en langage C
1.24. Appel de printf
1.25. Appel de scanf
10. Traduction des principaux type de données
1.26. Type énuméré, booléen
1.27. Article d’enregistrement
1.28. Tableaux

Lire aussi  Support de cours les pages interactives (les programmes CGI)

………

Si le lien ne fonctionne pas correctement, veuillez nous contacter (mentionner le lien dans votre message)
Programmation en assembleur Gnu sur des microprocesseurs de la gamme Intel (552 KO) (Cours PDF)

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *