Assembleur 80x86 | ADC |
---|---|
INTEL 8088+, x86-64 | arithmetic Add with Carry |
Syntaxe
ADC 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, des plus indispensable, additionne 2 quantités numériques sur 8, 16, 32 ou 64 bits et ajoute ensuite la valeur de l'indicateur de retenue, lequel est contenu dans le drapeau CF (CARRY FLAG), à la somme obtenu. Le résultat pourra naturellement être placé en mémoire ou dans un registre. Cette opération tient donc compte de la retenue éventuelle ainsi que de l'addition des 8, 16, 32 ou 64 bits de poids faible pour continuer l'addition des 8, 16, 32 ou 64 bits de poids fort.
Remarques
- L'état du drapeau CF représente une retenue d'une addition précédente.
- Lorsqu'une valeur immédiate est utilisée en tant qu'opérande, elle est étendue à la longueur du format de l'Opérande Cible.
- L'instruction ADC n'autorise pas l'utilisation de deux opérandes de mémoire dans une même instruction, il faut donc utiliser un registre comme intermédiaire ou et une instruction MOV par exemple.
- L'instruction ADC ne fait pas la distinction entre les opérandes signés (nombre entier) et non signés (nombre naturel). Au lieu de cela, le microprocesseur évalue le résultat pour les deux types de données et définit les drapeaux OF et CF pour indiquer un report dans le résultat signé ou non signé, respectivement. Le drapeau SF indique le signe du résultat signé.
- L'instruction ADC est généralement exécutée dans le cadre d'une addition multi-octets, multi-mots ou multi-double-mots dans laquelle une instruction ADD est suivie d'une instruction ADC.
- 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 à 64 bits.
- Les seuls types d'ajout non autorisés sont la mémoire en mémoire et le registre de segment.
Algorithme
MODULE ADC(Opérande Cible,Opérande Source) Opérande Cible ← Opérande Cible + Quantité Source + drapeau CF |
Mnémonique
Instruction | Opcode | Description |
---|---|---|
ADC AL, imm8 | 14h ib | Ajout immédiate de 8 bits à AL + CF |
ADC AX, imm16 | 15h iw | Ajout immédiate de 16 bits à AX + CF |
ADC EAX, imm32 | 15h id | Ajout immédiate de 32 bits à EAX + CF |
ADC RAX, imm32 | 15h id | Ajout immédiate de 32 bits à RAX + CF |
ADC reg/mem8, imm8 | 80h /2 ib | Ajout immédiate de 8 bits à registre/mémoire + CF |
ADC reg/mem16, imm16 | 81h /2 iw | Ajout immédiate de 16 bits à registre/mémoire 16 bits + CF |
ADC reg/mem32, imm32 | 81h /2 id | Ajout immédiate de 32 bits à registre/mémoire 32 bits + CF |
ADC reg/mem64, imm32 | 81h /2 id | Ajout immédiate de 32 bits entier à registre/mémoire 64 bits + CF |
ADC reg/mem16, imm8 | 83h /2 ib | Ajout immédiate de 8 bits entier à registre/mémoire 16 bits + CF |
ADC reg/mem32, imm8 | 83h /2 ib | Ajout immédiate de 8 bits entier à registre/mémoire 16 bits + CF |
ADC reg/mem64, imm8 | 83h /2 ib | Ajout immédiate de 8 bits entier à registre/mémoire 64 bits + CF |
ADC reg/mem8, reg8 | 10h /r | Ajout registre de 8 bits à registre/mémoire 8 bits + CF |
ADC reg/mem16, reg16 | 11h /r | Ajout registre de 16 bits à registre/mémoire 16 bits + CF |
ADC reg/mem32, reg32 | 11h /r | Ajout registre de 32 bits à registre/mémoire 32 bits + CF |
ADC reg/mem64, reg64 | 11h /r | Ajout registre de 64 bits à registre/mémoire 64 bits + CF |
ADC reg8, reg/mem8 | 12h /r | Ajout registre de 8 bits à registre/mémoire 8 bits + CF |
ADC reg16, reg/mem16 | 13h /r | Ajout registre de 16 bits à registre/mémoire 16 bits + CF |
ADC reg32, reg/mem32 | 13h /r | Ajout registre de 32 bits à registre/mémoire 32 bits + CF |
ADC reg64, reg/mem64 | 13h /r | Ajout registre de 64 bits à registre/mémoire 64 bits + CF |
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é |
Exemples
L'exemple suivant permet d'effectuer l'opération «AL = AL + BL + Retenue» :
- ADC AL,BL
L'exemple suivant permet d'effectuer l'opération «CL = CL + 44h + Retenue» :
- ADC CL,44h
L'exemple suivant permet d'ajouter l'octet de AL au contenu de l'emplacement de mémoire du segment de données spécifiées par BX avec la somme entreposée dans le même emplacement de mémoire. Le drapeau de retenue est également ajouté à la destination si CF est fixé :
- ADC [BX],AL
Le contenu des mots de l'emplacement de mémoire du segment de données spécifiées par SI + 2 s'ajoute à BX avec la somme entreposée dans BX. La retenue (CF) est également ajouté à la destination si CF est fixé :
- ADC BX,[SI+2]
Le contenu des mots de l'emplacement de mémoire du segment de données spécifiées par TEMP + DI s'ajoute à BX avec la somme entreposée dans BX. La retenue (CF) est également ajouté à la destination si CF est fixé.
- ADC BX,TEMP[DI]
Cet exemple permet d'effectuer l'addition de la retenue d'une addition du registre AL sur le registre AH :
Ce programme retournera donc la valeur 0100h dans le registre AX.
Voir également
Instruction assembleur 80x86 - Instruction ADD
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 802
Assembleur Facile, Philippe Mercier, 1990, ISBN: 2-501-01176-7, page 126, 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 57 à 58.
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 75 à 78.