Etienne Tremblay
Ordinateurs, Structure et Applications
GIF-1001
Cours 11, Directives d’assembleur
Directives d’assembleur
• Dans tout langage de programmation, il y a des mots réservés
utilisés afin de commander l’assembleur, le compilateur ou d’éditeur de liens. C’est mots sont des commandes ou des directives.
• Les directives permettent de dicter les emplacement du code en mémoire, d’écrire plus aisément le code, de modifier le code avant compilation, créer des variables (DB, DW), gérer les programmes sur plusieurs fichiers (voire en plusieurs langages), et plus.
• Les directives se retrouvent à l’intérieur même des fichiers textes constituant le code. Elles complètent les fichiers de commandes pour l’assembleur, le compilateur et l’éditeur de line (makefile).
• Les directives ne produisent pas de code machine, contrairement aux instructions. Il s’agit uniquement d’informations entrées par le programmeur afin de contrôler la création des fichiers objets et de l’exécutable.
• Vous ne pouvez pas nommer une variable, une procédure, une
macro, un constante ou un label avec le même nom qu’une directive.
Directives pour variables et fonctions
• Plusieurs directives d’assembleur sont utilisées pour déclarer et définir des variables ou des fonctions.
– Déclarer une variable ou une fonction signifie identifier le type d’une variable ou la nature d’une fonction (exemple: le texte déclare que la variable MaVar est une variable sur 8 bits, non signée).
– Définir une variable ou une fonction signifie réserver un espace mémoire pour cette variable ou pour cette fonction (associer une séquence d’instructions à la fonction).
• Les directives DB et DW servent à définir une variable.
• Les directives PROC et ENDP ainsi que les instructions entre les deux servent à définir une fonction.
• L’assembleur doit connaître la nature d’une variable ou d’une fonction afin de compiler celle-ci convenablement. Toutes les variables et fonctions d’un fichier doivent être déclarées au minimum pour que l’assembleur ou le
compilateur génère le fichier objet.
• L’éditeur de lien doit associer toutes les déclarations de variable à une définition pour pouvoir générer l’exécutable.
Directives pour placer les segments
• Lors du chargement d’un programme, l’entête du programme dit au
système d’exploitation comment charger le programme en mémoire. Pour le 8086, l’entête du programme dit quelle valeur doit avoir CS:IP. Les autres segments doivent êtres initialisés par le programme (exemple: MOV
AX,MonSegmentDonnées suivi de MOV DS,AX).
• Les directives segment… ends permettent de nommer des segments.
– segname segment [paramètres]
• Code ou variables dans le segment – Ends
• La directive assume aide l’assembleur. Elle fait le lien entre les segments déclarés et les registres CS,DS, ES et SS.
– assume DS:segname
• Exemple:
– MonSegmentData segment
• MaVar DB 7
– ends – …
– mov DS,AX ;AX contient MonSegmentData
– assume DS:MonSegmentData ;Directive pour dire à l’assembleur où est MaVar – MOV AX, MaVar
• Heureusement, MASM et EMU8086 ont une disposition de segments par
Directives de pré-compilation
• Les directives if, else, endif et autres du même genre (ife, ifdef, etc.).
Permettent d’assembler/compiler du code si et seulement si certaines conditions sont rencontrées. Par exemple:
Processor = 80386 ;Set to 8086 for 8086-only code . . .
if Processor eq 80386 shl ax, 4
else ;Must be 8086 processor.
mov cl, 4 shl ax, cl endif
– NOTE: Il est utile de rendre une partie de code optionnelle si l’environnement logiciel ou matériel du code peut changer. Par exemple, si on veut utiliser le même code sur deux microprocesseurs différents ou avec deux systèmes d’exploitation différents.
• Les directives MACRO, EQU permettent de changer le code avant qu’il ne
Directives pour programmer sur plusieurs fichiers
• La directive include Filename.ext inclut tout le contenu du fichier Filename dans le fichier où la directive est placée, à l’emplacement du include.
• La directive public rend une variable ou une procédure disponible à un autre fichier (la directive extern doit être utilisée). Exemple: public MaVar DB 0, public PROC Mafonc
• La directive extern déclare une variable ou une fonction. Cette variable ou fonction doit être définie dans un autre fichier (et déclarée publique) pour que l’éditeur de liens relier la déclaration à la définition…
• Habituellement, toutes les variables et toutes les fonctions sont déclarées dans un fichier avec l’extension “.h”, un fichier d’entête (header). Les
variables et les fonctions sont définies dans les fichiers contenant le code (.asm ou .c). Vous retrouverez donc souvent des fichiers .h contenant
plusieurs fois le mot extern qui seront inclus dans des fichiers .c ou .asm, contenant eux-mêmes plusieurs variables ou fonctions “public”
Directives pour les programmes en assembleur et en d’autres langages
• De manière générale, les procédures et les variables provenant d’autres langages sont déclarées/fournies à l’aide des directives public et extern.
• Il faut respecter une syntaxe très précise pour les paramètres des fonctions ou les types de variables. Cette syntaxe dépend de l’assembleur et du
langage utilisé en conjonction avec l’assembleur…
Directive d’éditeur de liens (ORG, #MAKE_XYZ #, …)
• #MAKE_COM# , #MAKE_BIN# , #MAKE_BOOT# et #MAKE_EXE#
sont des directives propres à EMU8086 qui spécifient le type de
programme à produire (cela détermine les valeurs de CS, DS, ES et SS par exemple).
• La directive ORG spécifie la première adresse de mémoire utilisée, soit l’origine du programme.
• Plusieurs directives d’assembleur existent afin de gérer les emplacements des données et du code. Voici un exemple:
CSEG segment
mov ax, bx ret
CSEG ends
DSEG segment
Item1 byte 0 Item2 word 0 DSEG ends
Références et exercices
• Références
– http://www.briceg.com/linux/aoa/toc.html
• Exercices
– Qu’est-ce qu’une directive d’assembleur?
– Qu’elle est la différence entre une macro et une procédure? Qu’elle est la différence entre une constante et une variable?
– Dans quelles circonstances est-il recommandé d’utiliser des if, ifdef ou else? Autrement dit, qu’elle est l’utilité de ces directives? Donnez des exemples.