Langage Assembleur PC
Langage Assembleur PC support de formation complet
...
1.1.3 Hexadecimal
Les nombres hexadécimaux utilisent la base 16. L'hexadécimal (ou hexa en abrégé) peut être utilisé comme notation pour les nombres binaires. L'hexa a 16 chiffres possibles. Cela pose un problème car il n'y a pas de symbole à utiliser pour les chiffres supplémentaires après 9. Par convention, on utilise des lettres pour les représenter. Les 16 chiffres de l'hexa sont 0-9 puis A, B, C, D, E et F. Le chiffre A équivaut 10 en décimal, B à 11, etc. Chaque chiffre d'un nombre en hexa est associé à une puissance de 16. Par exemple :
2BD16 = 2 × 162 + 11 × 161 + 13 × 160
= 512 + 176 + 13 = 701
Pour convertir depuis le décimal vers l'hexa, utilisez la même idée que celle utilisée pour la conversion binaire en divisant par 16. Voyez la Figure 1.3 pour un exemple.
Laraisonpourlaquellel'hexaestutileestquelaconversionentrel'hexaet le binaire est très simple. Les nombres binaires deviennent grands et incompréhensibles rapidement. L'hexa fournit une façon beaucoup plus compacte pour représenter le binaire.
Pour convertir un nombre hexaenbinaire, convertissez simplement chaque chiffre hexa en un nombre binaire de 4 bits. Par exemple, 24D16 est converti en 0010 0100 11012. Notez que les 0 de tête des 4 bits sont importants! Si le 0 de tête pour le chiffre du milieu de 24D16 n'est pas utilisé, le résultat est faux. Le conversion du binaire vers l'hexa est aussi simple. On effectue la même chose, dans l'autre sens. Convertissez chaque segment de 4 bits du binaire vers l'hexa. Commencez à droite, pas à gauche, du nombre binaire. Cela permet de s'assurer que le procédé utilise les segments de 4 bits corrects 2. Exemple :
110 0000 0101 1010 0111 11102
6 0 5 A 7 E16
Un nombre de 4 bits est appelé quadruplet (nibble). Donc, chaque chiffre hexa correspond à un quadruplet. Deux quadruplets forment un octet et donc un octet peut être représenté par un nombre hexa à deux chiffres. La valeur d'un bit va de 0 à 11111111 en binaire, 0 à FF en hexa et 0 à 255 en décimal.
1.2 Organisation de l'Ordinateur 1.2.1 Mémoire
L'unité mémoire de base est l'octet. Un ordinateur avec 32 mega octets de mémoire peut stocker jusqu'à environ 32 millions d'octets d'informations. Chaque octet en mémoire est étiqueté par un nombre unique appelé son adresse comme le montre la Figure 1.4.
FiG. 1.4 Adresses Mémoire
Souvent, la mémoire est utilisée par bouts plus grand que des octets isolées. Sur l'architecture PC, on a donné des noms à ces portions de mémoire plus grandes, comme le montre le Tableau 1.2.
mot 2 octets
double mot 4 octets
quadruple mot 8 octets
paragraphe 16 octets
TAS. 1.2 Unités Mémoire
Toutes les données en mémoire sont numériques. Les caractères sont sto¬ckés en utilisant un code caractère qui fait correspondre des nombres aux caractères. Un des codes caractère les plus connus est appelé ASCII (Ameri¬can Standard Code for Information Interchange, Code Américain Standard pour l'Echange d'Informations). Un nouveau code, plus complet, qui sup¬plante l'ASCII est l'Unicode. Une des différences clés entre les deux codes estquel'ASCIIutiliseunoctetpourencoderuncaractèrealorsquel'Unicode en utilise deux (ou un mot). Par exemple, l'ASCII fait correspondre l'octet 4116 (6510) au caractère majuscule A; l'Unicode y fait correspondre le mot 004116. Comme l'ASCII n'utilise qu'un octet, il est limité à 256 caractères diffrérents au maximum3. L'Unicode étend les valeurs ASCII à des mots et permet de représenter beaucoup plus de caractères. C'est important afin de représenter les caractères de tous les langages du monde.
1.2.2 Le CPU (processeur)
Le processeur (CPU, Central Processing Unit) est le dispositif physique quiexécutelesinstructions.Lesinstructionsquelesprocesseurspeuventexé-cutersontgénéralementtrèssimples.Ellespeuventnécessiterquelesdonnées sur lesquelles elles agissent soient présentes dans des emplacements de sto¬ckagespécifiquesdansleprocesseurlui-mêmeappelésregistres.Leprocesseur peut accéder aux données dans les registres plus rapidement qu'aux données en mémoire. Cependant, le nombre de registres d'un processeur est limité, donc le programmeur doit faire attention à n'y conserver que les données actuellement utilisées.
Les instructions que peut exécuter un type de processeur constituent le langage machine. Les programmes machine ont une structure beaucoup plus basique que les langages de plus haut niveau. Les instructions du lan-gage machine sont encodées en nombres bruts, pas en format texte lisible. Un processeur doit être capable de décoder les instructions très rapidement pour fonctionner efficacement. Le langage machine est conçu avec ce but en tête, pas pour être facilement déchiffrable par les humains. Les programmes écrits dans d'autres langages doivent être convertis dans le langage machine natif du processeur pour s'exécuter sur l'ordinateur. Un compilateur est un programme qui traduit les programmes écrits dans un langage de program-mation en langage machine d'une architecture d'ordinateur particulière. En général, chaque type de processeur a son propre langage machine unique. C'est une des raisons pour lesquelles un programme écrit pour Mac ne peut pas être exécuté sur un PC.
Les ordinateurs utilisent une horloge pour synchroniser l'exécution des instructions. L'horloge tourne à une fréquence fixée (appelée vitesse d'hor-loge). Lorsque vous achetez un ordinateur à 1,5GHz, 1,5GHz est la fréquence de cette horloge. L'horloge ne décompte pas les minutes et les secondes. Elle bat simplement à un rythme constant. Les composants électroniques du pro¬cesseur utilisent les pulsations pour effectuer leurs opérations correctement, commelebattementd'unmétronomeaideàjouerdelamusiqueàunrythme correct. Le nombre de battements (ou, comme on les appelle couramment cycles) que recquiert une instruction dépend du modèle et de la génération du processeur. Le nombre de cycles dépend de l'instruction.
1.2.3 La famille des processeurs 80x86
Les PC contiennent un processeur de la famille des Intel 80x86 (ou un clone). Les processeurs de cette famille ont tous des fonctionnalités en com¬mun, y compris un langage machine de base. Cependant, les membre les plus récents améliorent grandement les fonctionnalités.
8088,8086: Ces processeurs, du point de vue de la programmation sont identiques. Ils étaient les processeurs utilisés dans les tous premiers PC. Il offrent plusieurs registres 16 bits : AX, BX, CX, DX, SI, DI, BP, SP, CS, DS, SS, ES, IP, FLAGS. Ils ne supportent que jusqu'à 1Mo de mémoire et n'opèrent qu'en mode réel. Dans ce mode, un pro-gramme peut accéder à n'importe quelle adresse mémoire, même la mémoire des autres programmes! Cela rend le débogage et la sécurité très difficiles! De plus, la mémoire du programme doit être divisée en segments. Chaque segment ne peut pas dépasser les 64Ko.
80286: Ce processeur était utilisé dans les PC de type AT. Il apporte quelquesnouvellesinstructionsaulangagemachinedebasedes8088/86. Cependant, sa principale nouvelle fonctionnalité est le mode protégé 16 bits. Dans ce mode, il peut accéder jusqu'à 16Mo de mémoire et em¬pêcher les programmes d'accéder à la mémoire des uns et des autres. Cependant, les programmes sont toujours divisés en segments qui ne peuvent pas dépasser les 64Ko.
80386: Ce processeur a grandement amélioré le 80286. Tout d'abord, il étend la plupart des registres à 32 bits (EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP) et ajoute deux nouveaux registres 16 bits : FS
AX
AH AL
FiG. 1.5 Le registre AX
et GS. Il ajoute également un nouveau mode protégé 32 bits. Dans ce mode, il peut accéder jusqu'à 4Go de mémoire. Les programmes sont encore divisés en segments mais maintenant, chaque segment peut éga¬lement faire jusqu'à 4Go!
80486/Pentium/Pentium Pro: Cesmembresdelafamille80x86apportent trèspeudenouvellesfonctionnalités.Ilaccélèrentprincipalementl'exé¬cution des instructions.
Pentium MMX: Ce processeur ajoute les instructions MMX (MultiMedia eXentions) au Pentium. Ces instructions peuvent accélérer des opéra¬tions graphiques courantes.
Pentium II: C'est un processeur Pentium Pro avec les instructions MMX (Le Pentium III est grossièrement un Pentium II plus rapide).
1.2.4 Regitres 16 bits du 8086
Le processeur 8086 original fournissait quatre registres généraux de 16 bits : AX, BX, CX et DX. Chacun de ces registres peut être décomposé en deux registres de 8 bits. Par exemple, le registre AX pouvait être décomposé en AH et AL comme le montre la Figure 1.5. Le registre AH contient les 8 bits de poids fort de AX et AL contient les 8 bits de poids faivble. Souvent, AH et AL sont utilisés comme des registres d'un octet indépendants; ce¬pendant, il est important de réaliser qu'ils ne sont pas indépendants de AX. Changer la valeur de AX changera les valeurs de AL et BL et vice versa. Les registres généraux sont utilisés dans beaucoup de déplacements de données et instructions arithmétiques.
Il y a deux registres d'index de 16 bits : SI et DI. Ils sont souvent uti-lisés comme des pointeurs, mais peuvent être utilisés pour la plupart des mêmes choses que les registres généraux. Cependant, ils ne peuvent pas être décomposés en registres de 8 bits.
Les registres 16 bits BP et SP sont utilisés pour pointer sur des données dans la pile du langage machine et sont appelés le pointeur de base et le ponteur de pile, respectivement. Nous en reparlerons plus tard.
Les registres 16 bits CS, DS, SS et ES sont des registres de segment. Ils indiquent quelle Zone de la mémoire est utilisée pour les différentes parties d'un programme. CS signifie Code Segment, DS Data Segment, SS Stack Segment (segment de pile) et ES Extra Segment. ES est utilisé en tant que registre de segment temporaire. Des détails sur ces registres se trouvent dans les Sections 1.2.6 et 1.2.7.
Le registre de pointeur d'instruction (IP) est utilisé avec le registre CS pour mémoriser l'adresse de la prochaine instruction à exécuter par le pro-cesseur.Normalement,lorsqu'uneinstructionestexécutée,IPestincrémenté pour pointer vers la prochaine instruction en mémoire.
Le registre FLAGS stocke des informations importantes sur les résultats d'une instruction précédente. Ces résultats sont stockés comme des bits indi¬viduels dans le registre. Par exemple, le bit Z est positionné à 1 si le résultat de l'instruction précédente était 0 ou à 0 sinon. Toutes les instructions ne modifient pas les bits dans FLAGS, consultez le tableau dans l'appendice pour voir comment chaque instruction affecte le registre FLAGS.
1.2.5 Registres 32 bits du 80386
Les processeurs 80386 et plus récents ont des registres étendus. Par exemple le registre AX 16 bits est étendu à 32 bits. Pour la compatibilité ascendante, AX fait toujours référence au registre 16 bits et on utilise EAX pour faire référence au registre 32 bits. AX représente les 16 bits de poids faible de EAX tout comme AL représente les 8 bits de poids faible de AX (et de EAX). Il n'y a pas de moyen d'accéder aux 16 bits de poids fort de EAX directement. Les autres registres étendus sont EBX, ECX, EDX, ESI et EDI.
Laplupartdesautresregistressontégalementétendus.BPdevientEBP; SP devient ESP; FLAGS devient EFLAGS et IP devient EIP. Cependant, contrairement aux registres généraux et d'index, en mode protégé 32 bits (dont nous parlons plus loin) seules les versions étendues de ces registres sont utilisées.
Les registres de segment sont toujours sur 16 bits dans le 80386. Il y a égalementdeuxregistresdesegmentsupplémentaires:FSetGS.Leursnoms n'ont pas de signification particulière. Ce sont des segments temporaires supplémentaires (comme ES).
Une des définitions du terme mot se réfère à la taille des registres de données du processeur. Pour la famille du 80x86, le terme est désormais un peu confus. Dans le Tableau 1.2, on voit que le terme mot est défini comme faisant 2 octets (ou 16 bits). Cette signification lui a été attribuée lorsque le premier 8086 est apparu. Lorsque le 80386 a été développé, il a été décidé de laisser la définition de mot inchangée, même si la taille des registres avait changé.
1.2.6 Mode Réel
En mode réel, la mémoire est limitée à seulement un méga octet (220 octet). Les adresses valides vont de 00000 à FFFFF (en hexa). Ces adresses nécessitent un nombre sur 20 bits. Cependant, un nombre de 20 bits ne tiendrait dans aucun des registres 16 bits du 8086. Intel a résolu le problème, enutilisantdeuxvaleursde16bitspourdétermineruneadresse.Lapremière valeur de 16 bits est appelée le sé❧❡❝t❡✉r. Les valeurs du sélecteur doivent être stockées dans des registres de segment. La seconde valeur de 16 bits est appelée le ❞é♣❧❛❝❡♠❡♥t (offset). L'adresse physique identifiée par un couple sé❧❡❝t❡✉r:❞é♣❧❛❝❡♠❡♥t 32 bits est calculée par la formule
16 ∗ sélecteur + déplacement
Multiplier par 16 en hexa est facile, il suffit d'ajouter un 0 à la droite du nombre. Par exemple, l'adresse physique référencée par 047C:0048 est obte¬nue de la façon suivante :
047C0
+0048
04808
Defait,lavaleurdusélecterestunnumérodeparagraphe(voirTableau1.2). Les adresses réelles segmentées ont des inconvénients :
~ Une seule valeur de sélecteur peut seulement référencer 64Ko de mé¬moire (la limite supérieure d'un déplacement de 16 bits). Que se passe-t-il si un programme a plus de 64Ko de code? Une seule valeur de CS ne peut pas être utilisée pour toute l'exécution du programme. Le pro¬gramme doit être divisé en sections (appelées s❡❣♠❡♥ts) de moins de 64Ko. Lorsque l'exécution passe d'un segment à l'autre, la valeur de CS doit être changée. Des problèmes similaires surviennent avec de grandes quantités de données et le registre DS. Cela peut être très gênant!
~ Chaqueoctetenmémoiren'apasuneadressesegmentéeunique.L'adresse physique04808peutêtreréférencéepar047C:0048,047D:0038,047E:0028 ou 047B:0058. Cela complique la comparaison d'adresses segmentées.
1.2.7 Mode Protégé 16 bits
Dans le mode protégé 16 bits du 80286, les valeurs du sélecteur sont interprétées de façon totalement différente par rapport au mode réel. En mode réel, la valeur d'un sélecteur est un numéro de paragraphe en mémoire. En mode protégé, un sélecteur est un ✐♥❞✐❝❡ dans un t❛❜❧❡❛✉ ❞❡ ❞❡s❝r✐♣t❡✉rs. Danslesdeuxmodes,lesprogrammessontdivisésensegments.Enmoderéel, ces segments sont à des positions fixes en mémoire et le sélecteur indique le numéro de paragraphe auquel commence le segment. En mode protégé, les segments ne sont pas à des positions fixes en mémoire physique. De fait, il n'ont même pas besoin d'être en mémoire du tout!
Le mode protégé utilise une technique appelée mémoire. virtue.lle.. L'idée debased'unsystèmedemémoirevirtuelleestdenegarderenmémoirequeles programmes et les données actuellement utilisés. Le reste des données et du codesontstockéstemporairementsurledisquejusqu'àcequ'onaieànouveau besoin d'eux. Dans le mode protégé 16 bits, les segments sont déplacés entre la mémoire et le disque selon les besoins. Lorsqu'un segment est rechargé en mémoire depuis le disque, il est très probable qu'il sera à un endroit en mémoire différent de celui où il était avant d'être placé sur le disque. Tout ceci est effectué de façon transparente par le système d'exploitation. Le programme n'a pas a être écrit différemment pour que la mémoire virtuelle fonctionne.
En mode protégé, chaque segment est assigné à une entrée dans un ta-bleau de descripteurs. Cette entrée contient toutes les informations dont le système a besoin à propos du segment. Ces informations indiquent : s'il est actuellement en mémoire; s'il est en mémoire, où il se trouve; les droits d'accès (p.e.., lecture seule). L'indice de l'entrée du segment est la valeur du sélecteur stockée dans les registres de segment.
Un gros inconvénient du mode protégé 16 bits est que les déplacements sont toujours des quantités sur 16 bits. En conséquence, Les tailles de seg-ment sont toujours limitées au plus à 64Ko. Cela rend l'utilisation de grands tableaux problématique.
1.2.8 Mode Protégé 32 bits
Le 80386 a introduit le mode protégé 32 bits. Il y a deux différences majeures entre les modes protégés 32 bits du 386 et 16 bits du 286 :
- Lesdéplacementssontétendusà32bits.Celapermetàundéplacement d'aller jusqu'à 4 milliards. Ainsi, les segments peuvent avoir des tailles jusqu'à 4Go.
- Les segments peuvent être divisés en unités plus petites de 4Ko ap-pelées page.s. Le système de mémoire virtuelle fonctionne maintenant avec des pages plutôt qu'avec des segments. Cela implique que seules certaines parties d'un segment peuvent être présentes en mémoire à un instant donné. En mode 16 bits du 286, soit le segment en entier est en mémoire, soit rien n'y est. Ce qui n'aurait pas été pratique avec les segments plus grands que permet le mode 32 bits.
Windows 9X, Windows NT/2000/XP, OS/2 et Linux fonctionnent tous en mode protégé 32 bits paginé.
1.2.9 Interruptions
Quelquesfois,leflotordinaired'unprogrammedoitêtreinterrompupour traiter des évènements qui requièrent une réponse rapide. Le matériel d'un ordinateur offre un mécanisme appelé ✐♥t❡rr✉♣t✐•♥s pour gérer ces évène¬ments. Par exemple, lorsqu'une souris est déplacée, la souris interrompt le programme en cours pour gérer le déplacement de la souris (pour déplacer le curseur ❡t❝✳). Les interruptions provoquent le passage du contrôle à un ❣❡s✲ t✐•♥♥❛✐r❡ ❞✬✐♥t❡rr✉♣t✐•♥s. Les gestionnaires d'interruptions sont des routines qui traitent une interruption. Chaque type d'interruption est assignée à un nombre entier. Au début de la mémoire physique, réside un tableau de ✈❡❝✲ t❡✉rs ❞✬✐♥t❡r✉♣t✐•♥s qui contient les adresses segmentées des gestionnaires d'interruption. Le numéro d'une interruption est essentiellement un indice dans ce tableau.
Les interruptions externes proviennent de l'extérieur du processeur (la souris est un exemple de ce type). Beaucoup de périphériques d'E/S sou-lèvent des interruptions (♣✳❡✳, le clavier, le timer, les lecteurs de disque, le CD-ROM et les cartes son). Les interruptions internes sont soulevées de¬puis le processeur, à cause d'une erreur ou d'une instruction d'interruption. Les interruptions erreur sont également appelées tr❛♣s. Les interruptions générées par l'instruction d'interruption sont également appelées ✐♥t❡rr✉♣✲ t✐•♥s ❧•❣✐❝✐❡❧❧❡s. Le DOS utilise ce type d'interruption pour implémenter son API(Application Programming Interface). Les systèmes d'exploitation plus récents (comme Windows et Unix) utilisent une interface basée sur C4.
Beaucoup de gestionnaires d'interruptions redonnent le contrôle au pro¬gramme interrompu lorsqu'ils se terminent. Ils restaurent tous les registres aux valeurs qu'ils avaient avant l'interruption. Ainsi, le programme inter¬rompu s'exécute comme si rien n'était arrivé (excepté qu'il perd quelques cycles processeur). Les traps ne reviennent généralement jamais. Souvent, elles arrêtent le programme.
1.3 Langage Assembleur 1.3.1 Langage Machine
Chaque type de processeur comprend son propre langage machine. Les instructions dans le langage machine sont des nombres stockés sous forme d'octets en mémoire. Chaque instruction a son propre code numérique unique appelé code d'opération ou op code (operationcode) en raccourci. Les instructions des processeurs 80x86 varient en taille. L'opcode est toujours au début del'instruction.Beaucoupd'instructionscomprennentégalementlesdonnées (p.e. des constantes ou des adresses) utilisées par l'instruction.
Le langage machine est très difficile à programmer directement. Déchif¬frer la signification d'instructions codées numériquement est fatigant pour des humains. Par exemple, l'instruction qui dit d'ajouter les registres EAX et EBX et de stocker le résultat dans EAX est encodée par les codes hexa¬décimaux suivants :
03 C3
C'est très peu clair. Heureusement, un programme appelé un assembleur peut faire ce travail laborieux à la place du programmeur.
1.3.2 Langage d'Assembleur
Un programme en langage d'assembleur est stocké sous forme de texte (comme un programme dans un langage de plus haut niveau). Chaque ins-truction assembleur représente exactement une instruction machine. Par exemple, l'instruction d'addition décrite ci-dessus serait représentée en lan¬gage assembleur comme suit :
add eax, ebx
Ici, la signification de l'instruction est beaucoup plus claire qu'en code ma-chine.Lemotaddestunmnémonique pourl'instructiond'addition.Laforme générale d'une instruction assembleur est :
mnémonique opérande(s)
Un assembleur est unprogramme quilit unfichiertexte avecdes instruc-tionsassembleuretconvertitl'assembleurencodemachine.Lescompilateurs sont des programmes qui font des conversions similaires pour les langages de programmation de haut niveau. Un assembleur est beaucoup plus simple qu'un compilateur. Chaque instruction du langage d'assembleur représente directement une instruction machine. Les instructions d'un langage de plus haut niveau sont beaucoup plus complexes et peuvent requérir beaucoup d'instructions machine.
Une autre différence importante entre l'assembleur et les langages de haut niveau est que comme chaque type de processeur a son propre langage machine, il a également son propre langage d'assemblage. Porter des pro-grammesassembleurentredifférentesarchitecturesd'ordinateurestbeaucoup plus difficile qu'avec un langage de haut niveau.
Les exemples de ce livre utilisent le Netwide Assembler ou NASM en raccourci. Il est disponible gratuitement sur Internet (voyez la préface pour l'URL).Desassembleurspluscourantssontl'AssembleurdeMicrosoft(MASM) ou l'Assembleur de Borland (TASM). Il y a quelques différences de syntaxe entre MASM/TASM et NASM.
1.3.3 Opérandes d'Instruction
Les instructions en code machine ont un nombre et un type variables d'opérandes; cependant, en général, chaque instruction a un nombre fixé d'opérandes (0 à 3). Les opérandes peuvent avoir les types suivants :
registre : Cesopérandesfontdirectementréférenceaucontenudesregistres du processeur.
mémoire : Ils font référence aux données en mémoire. L'adresse de la don¬née peut être une constante codée en dur dans l'instruction ou calculée en utilisant les valeurs des registres. Les adresses sont toujours des déplacements relatifs au début d'un segment.
immédiat : Ce sont des valeurs fixes qui sont listées dans l'instruction elle-même. Elles sont stockées dans l'instruction (dans le segment de code), pas dans le segment de données.
implicite : Ces opérandes ne sont pas entrés explicitement. Par exemple, l'instruction d'incrémentation ajoute un à un registre ou à la mémoire. Le un est implicite.
1.3.4 Instructions de base
L'instructionlaplusbasiqueestl'instructionMOV.Elledéplacelesdonnées d'un endroit à un autre (comme l'opérateur d'assignement dans un langage de haut niveau). Elle prend deux opérandes :
mov lest, src
La donnée spécifiée par src est copiée vers dest. Une restriction est que les deux opérandes ne peuvent pas être tous deux des opérandes mémoire. Cela nous montre un autre caprice de l'assembleur. Il y a souvent des règles quelque peu arbitraires sur la façon dont les différentes instructions sont utilisées. Les opérandes doivent également avoir la même taille. La valeur de AX ne peut pas être stockée dans BL.
Voici un exemple (les points-virgules marquent un commentaire) :
mov eax, 3 stocke 3 dans le registre EAX (3 est un operande immediat)
mov bx, ax stocke la valeur de AX dans le registre BX
L'instruction ADD est utilisée pour additionner des entiers.
add eax, 4 eax = eax + 4
add al, ah al = al + ah
L'instruction SUB soustrait des entiers.
sub bx, 10 bx = bx - 10
sub ebx, edi ebx = ebx - edi
Les instructions INC et DEC incrémentent ou décrémentent les valeurs de 1. Comme le un est un opérande implicite, le code machine pour INC et DEC est plus petit que celui des instructions ADD et SUB équivalentes.
inc ecx ecx++
dec dl dl--
1.3.5 Directives
Une directive est destinée à l'assembleur, pas au processeur. Elles sont généralement utilisées pour indiquer à l'assembleur de faire quelque chose ou pour l'informer de quelque chose. Elles ne sont pas traduites en code machine. Les utilisations courantes des directives sont :
- la définition de constantes
- la définition de mémoire pour stocker des données
- grouper la mémoire en segment
- inclure des codes sources de façon conditionnelle
- inclure d'autres fichiers
Le code NASM est analysé par un préprocesseur, exactement comme en C. Il y a beaucoup de commandes identiques à celles du préprocesseur C. Cependant, les directives du préprocesseur NASM commencent par un % au lieu d'un # comme en C.
La directive equ
La directive equ peut être utilisée pour définir un symbole. Les symboles sont des constantes nommées qui peuvent être utilisées dans le programme assembleur. Le format est le suivant :
symbole equ valeur
Les valeurs des symboles ne peuvent pas être redéfinies plus tard.
La directive %define
Cette directive est semblable à la directive #define du C. Elle est le plus souvent utilisée pour définir des macros, exactement comme en C.
%define SIZE 100
mov eax, SIZE