Assembleur 80x86 | ADD |
---|---|
INTEL 8088+, x86-64 | arithmetic ADDition |
Syntaxe
ADD Opérande Cible, Opérande Source |
Paramètres
Nom | Description |
---|---|
Opérande Cible | Ce paramètre permet d'indiquer l'opérande recevant le résultat |
Opérande Source | Ce paramètre permet d'indiquer l'opérande à ajouter au résultat |
Description
Cette instruction permet d'additionner 2 quantités numérique sur 8, 16, 32 ou 64 bits. La somme pourra être placé soit en mémoire ou encore dans un registre. Ainsi, il ajoute le premier opérande (Opérande Cible) et le deuxième opérande (Opérande Source) et entrepose le résultat dans l'Opérande Cible. L'opérande de destination peut être un registre ou un emplacement de mémoire; l'opérande source peut être une valeur immédiate, un registre ou un emplacement de mémoire (toutefois, deux opérandes de mémoire ne peuvent pas être utilisés dans une même instruction.
Remarques
- Lorsqu'une valeur immédiate est utilisée comme opérande, elle est étendue à la longueur du format de l'opérande cible.
- Il n'est pas possible de mélanger des tailles différentes (8, 16, 32, 64 bits) de registres de cellule mémoire avec cette instruction. Si vos besoins sont de ce type, vous devrez soit les transférées dans un autre registre à l'aide d'une instruction MOVSX ou MOVZX, effectuer votre addition par tranche (ADC) et on tronquer votre valeur.
- L'instruction ADD effectue uniquement une addition d'entier. Il évalue le résultat des opérandes entiers signés (nombre entier) et non signés (nombre naturel) et définit les drapeaux OF et CF pour indiquer un débordement dans le résultat signé ou non signé, respectivement. Le drapeau SF indique le signe du résultat signé.
- L'instruction ADD peut être utilisée avec un préfixe LOCK pour permettre l'exécution de l'instruction de manière atomique.
- Mode Long : En mode 64 bits, la taille de fonctionnement par défaut de l'instruction est de 32 bits. L'utilisation d'un préfixe REX sous la forme REX.R permet d'accéder à des registres supplémentaires (R8 à R15). L'utilisation d'un préfixe REX sous la forme de REX.W favorise le fonctionnement en 64 bits.
- Les seuls types d'ajout non autorisés sont la mémoire en mémoire et le registre de segment.
Algorithme
MODULE ADD(Opérande Cible,Opérande Source) Opérande Cible ← Opérande Cible + Quantité Source drapeau CF ← retenue |
Mnémonique
Instruction | Opcode | Description |
---|---|---|
ADD AL, imm8 | 04h ib | Ajout immédiate de 8 bits à AL |
ADD AX, imm16 | 05h iw | Ajout immédiate de 16 bits à AX |
ADD EAX, imm32 | 05h id | Ajout immédiate de 32 bits à EAX |
ADD RAX, imm32 | 05h id | Ajout d'un entier immédiate de 32 bits à RAX |
ADD reg/mem8, imm8 | 80h /0 ib | Ajout immédiate de 8 bits à registre/mémoire 8 bits |
ADD reg/mem16, imm16 | 81h /0 iw | Ajout immédiate de 16 bits à registre/mémoire 16 bits |
ADD reg/mem32, imm32 | 81h /0 id | Ajout immédiate de 32 bits à registre/mémoire 32 bits |
ADD reg/mem64, imm32 | 81h /0 id | Ajout entier immédiate de 32 bits à registre/mémoire 64 bits |
ADD reg/mem16, imm8 | 83h /0 ib | Ajout entier immédiate de 8 bits à registre/mémoire 16 bits |
ADD reg/mem32, imm8 | 83h /0 ib | Ajout entier immédiate de 8 bits à registre/mémoire 32 bits |
ADD reg/mem64, imm8 | 83h /0 ib | Ajout entier immédiate de 8 bits à registre/mémoire 64 bits |
ADD reg/mem8, reg8 | 00h /r | Ajout registre de 8 bits à registre/mémoire 8 bits |
ADD reg/mem16, reg16 | 01h /r | Ajout registre de 16 bits à registre/mémoire 16 bits |
ADD reg/mem32, reg32 | 01h /r | Ajout registre de 32 bits à registre/mémoire 32 bits |
ADD reg/mem64, reg64 | 01h /r | Ajout registre de 64 bits à registre/mémoire 64 bits |
ADD reg8, reg/mem8 | 02h /r | Ajout registre de 8 bits à registre/mémoire 8 bits |
ADD reg16, reg/mem16 | 03h /r | Ajout registre de 16 bits à registre/mémoire 16 bits |
ADD reg32, reg/mem32 | 03h /r | Ajout registre de 32 bits à registre/mémoire 32 bits |
ADD reg64, reg/mem64 | 03h /r | Ajout registre de 64 bits à registre/mémoire 64 bits |
Cycles d'horloge
Opérande | Cycle d'horloge | Taille en octets | |||
---|---|---|---|---|---|
8086 | 80286 | 80386 | 80486 | ||
reg,reg | 3 | 2 | 2 | 1 | 2 |
mem,reg | 16+EA | 7 | 6 | 3 | 2 à 4 |
reg,mem | 9+EA | 7 | 7 | 2 | 2 à 4 |
mem,immed | 17+EA | 7 | 7 | 3 | 3 à 4 |
reg,immed | 4 | 3 | 2 | 1 | 3 à 6 |
accum,immed | 4 | 3 | 2 | 1 | 2 à 3 |
Affectations des registres de drapeaux
Cette instruction affectera les bits du registre de drapeaux de la façon suivante :
Drapeau | Description |
---|---|
AF | Ce bit vaut 1 si un ajustement est provoquée par le résultat de cette opération autrement il vaudra 0. |
CF | Ce bit vaut 1 si une retenue décimale est provoquée par le résultat de cette opération autrement il vaudra 0. | OF | Ce bit vaut 1 si un débordement est provoquée par le résultat de cette opération autrement il vaudra 0. | PF | Ce bit vaut 1 si une parité est provoquée par le résultat de cette opération autrement il vaudra 0. | SF | Ce bit vaut 1 si un signe est provoquée par le résultat de cette opération autrement il vaudra 0. | ZF | Ce bit vaut 1 si une valeur zéro est obtenu par le résultat de cette opération autrement il vaudra 0. |
Exceptions
Message | Mode réel | Virtuel 8086 | Mode protégé | Description |
---|---|---|---|---|
#SS(Pile non-canonique) | X | X | X | Une adresse mémoire dépasse la limite du segment de pile ou n'est pas canonique |
#GP(Protection général) | X | X | X | Une adresse mémoire dépasse la limite du segment de données ou n'est pas canonique |
X | L'opérande de destination n'est pas dans un segment non écrivable | |||
X | Un segment de données nulle est utilisé comme référence mémoire | |||
#PF(Faute de page) | X | X | Une faute de page résultat de l'exécution de l'instruction | |
#AC(Vérifie l'alignement) | X | X | Un désalignement de la référence mémoire est effectué quand une vérification d'alignement est activé |
Bonnes pratiques
Si vous vous retrouvez dans une situation où vous devez faire une addition immédiate d'un simple chiffre 1 sur un registre de microprocesseur, comme ceci :
- ; Mauvaise pratique
- ADD AX,1
Vous devrez plutôt utiliser l'instruction «INC» car elle occupe beaucoup moins d'espace qu'une addition :
- ; Bonne pratique
- INC AX
Et vous aurez le même résultat.
Exemples
Cet exemple permet d'ajouter la valeur 7 au registre AX :
Ce programme retournera donc la valeur 000Fh dans le registre AX. L'exemple suivant permet d'ajouter la valeur du registre BL au registre AL (AL = AL + BL) :
- ADD AL,BL
L'exemple suivant permet d'ajouter la valeur hexadécimal 74 au registre CL (CL = CL + 74) :
- ADD CL,74h
L'exemple suivant permet d'ajouter le registre AL au contenu d'un octet de l'emplacement mémoire du segment de données adressé par BX avec la somme entreposée dans le même emplacement mémoire :
- ADD [BX],AL
L'exemple suivant permet d'ajouter le contenu des mots de l'emplacement mémoire du segment de données adressé par SI+2 au registre BX avec la somme entreposée dans le registre BX :
- ADD BX,[SI+2]
L'exemple suivant permet d'ajouter le contenu du mot de l'emplacement mémoire du segment de données adressé par TEMP + DI au registre BX avec la somme entreposée dans BX :
- ADD BX,Temp[DI]
L'exemple suivant permet d'ajouter la valeur 3 au contenu d'un octet de l'emplacement de mémoire du segment de données adressé par DI avec la somme entreposée au même emplacement :
- ADD Byte Ptr[DI],3
L'exemple suivant permet d'ajouter la valeur 7 au registre AL :
- ADD AL,7
L'exemple suivant permet d'ajouter la valeur 74 au registre AX :
- ADD AX,74
L'exemple suivant permet d'ajouter la valeur 7 au registre EAX :
- ADD EAX,7
L'exemple suivant permet d'ajouter la valeur -2 au registre RAX :
- ADD RAX,-2
L'exemple suivant permet d'ajouter la valeur hexadécimal 7A à l'emplacement mémoire EAX :
- ADD [EAX],07Ah
L'exemple suivant permet d'ajouter la valeur du registre RSI à l'emplacement mémoire RAX :
- ADD [RAX],RSI
L'exemple suivant permet d'ajouter la valeur de l'emplacement mémoire RAX au registre RAX :
- ADD RAX,[RAX]
L'exemple suivant permet d'ajouter la valeur de l'emplacement mémoire RAX au registre EAX :
- ADD EAX,[RAX]
L'exemple suivant permet d'ajouter la valeur 74 au symbole UnSymbole :
- ADD [UnSymbole],74
L'exemple suivant permet d'ajouter la valeur du registre EAX au symbole UnSymbole :
- ADD [UnSymbole],EAX
Voici un exemple en Turbo Pascal 7 montrant une utilisation de cette instruction :
- Program AsmAdd;
-
- Var a,b,c,c_:Integer;
-
- Function Add(X,Y:Integer):Integer;Assembler;ASM
- MOV AX,X
- ADD AX,Y
- END;
-
- BEGIN
- a := 1;
- b := 2;
- c := 3;
- c_ := -3;
- WriteLn('0 + 0 : ',Add(0,0));
- WriteLn('0 + 1 : ',Add(0,1));
- WriteLn('1 + 1 : ',Add(1,1));
- WriteLn('1 + 2 : ',Add(1,2));
- WriteLn('a + b : ',Add(a,b));
- WriteLn('a + b + c : ',Add(Add(a,b),c));
- WriteLn('a + b + c_ : ',Add(Add(a,b),c_));
- WriteLn('c + c_ : ',Add(c,c_));
- WriteLn('a + b + 20 : ',Add(Add(a,b),20));
- END.
on obtiendra le résultat suivant :
0 + 0 : 00 + 1 : 1
1 + 1 : 2
1 + 2 : 3
a + b : 3
a + b + c : 6
a + b + c_ : 0
c + c_ : 0
a + b + 20 : 23
Voir également
Instruction assembleur 80x86 - Instruction ADC
Instruction assembleur 80x86 - Instruction SBB
Instruction assembleur 80x86 - Instruction SUB
Références
Le livre d'Or PC, Martin Althaus, 1992, ISBN: 2-7361-0934-1, page 803
Assembleur Facile, Philippe Mercier, 1990, ISBN: 2-501-01176-7, page 401
AMD64 Architecture Programmer's Manual Volume 3: General-Purpose and System Instructions, Edition Advanced Micro Devices, Revision 3.14, September 2007, Publication No. 24594, page 59 à 60.
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A: Instruction Set Reference, A-M, Edition Intel, Mars 2010, Publication No. 253666-034US, page 79 à 81.