Assembleur 80x86 | AND |
---|---|
INTEL 8088+, x86-64 | AND binary |
Syntaxe
AND 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 effectuant le masque binaire sur le résultat |
Description
L'instruction AND effectue un ET BINAIRE sur les 2 opérandes spécifiés, le calcul est placé dans la première opérande, c'est-à-dire l'Opérande Cible. Rappelons qu'un ET BINAIRE donne le résultat 1 si les 2 opérandes sont 1 et donne 0 dans les autres cas et cela sur chacun des bits de l'opérande.
Remarques
- Si vous souhaitez effectuer cette opération sur des nombres réels, il peut être préférable d'utiliser l'instruction «ANDPD» laquelle a été développé dans cette optique.
- De façon concrète, on utilise cette instruction entre autre, afin d'isolé un bit dans un mot afin d'en déterminer sa valeur ou afin de déterminé si un nombre est impaire ou non (AND @Result,1). Voir Langage de programmation - C - Mathématique - Odd (Impaire ou paire)
- Optimisation : On devrait utiliser l'instruction «AND» plutôt qu'un modulo à partir d'un DIV lorsque le nombre est une puissance 2, car il utilise beaucoup moins de cycle d'horloge qu'un DIV; ainsi, il faudra alors appliquer AND avec comme première opérande le numérateur et comme deuxième opérande le dénominateur - 1.
- L'instruction AND peut être utilisée avec un préfixe LOCK pour permettre son exécution atomique.
- 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.
Algorithme
MODULE AND(Opérande Cible,Opérande Source) Opérande Cible ← Opérande Cible ∩ Opérande Source drapeau CF ← 0 drapeau OF ← 0 |
Mnémonique
Instruction | Opcode | Description |
---|---|---|
AND AL, imm8 | 24h ib | Et binaire sur le contenu du registre AL avec une valeur immédiate 8 bits et met le résultat dans AL |
AND AX, imm16 | 25h iw | Et binaire sur le contenu du registre AX avec une valeur immédiate 16 bits et met le résultat dans AX |
AND EAX, imm32 | 25h iw | Et binaire sur le contenu du registre EAX avec une valeur immédiate 32 bits et met le résultat dans EAX |
AND RAX, imm32 | 25h id | Et binaire sur le contenu du registre RAX avec une valeur entière immédiate 32 bits et met le résultat dans RAX |
AND reg/mem8, imm8 | 80h /4 ib | Et binaire sur le contenu du registre/mémoire 8 bits avec une valeur immédiate 8 bits |
AND reg/mem16, imm16 | 81h /4 iw | Et binaire sur le contenu du registre/mémoire 16 bits avec une valeur immédiate 16 bits |
AND reg/mem32, imm32 | 81h /4 id | Et binaire sur le contenu du registre/mémoire 32 bits avec une valeur immédiate 32 bits |
AND reg/mem64, imm32 | 81h /4 id | Et binaire sur le contenu du registre/mémoire 64 bits avec une valeur entière immédiate 32 bits |
AND reg/mem16, imm8 | 83h /4 ib | Et binaire sur le contenu du registre/mémoire 16 bits avec une valeur entière immédiate 8 bits |
AND reg/mem32, imm8 | 83h /4 ib | Et binaire sur le contenu du registre/mémoire 32 bits avec une valeur entière immédiate 8 bits |
AND reg/mem64, imm8 | 83h /4 ib | Et binaire sur le contenu du registre/mémoire 64 bits avec une valeur entière immédiate 8 bits |
AND reg/mem8, reg8 | 20h /r | Et binaire sur le contenu du registre/mémoire 8 bits avec un registre 8 bits |
AND reg/mem16, reg16 | 21h /r | Et binaire sur le contenu du registre/mémoire 16 bits avec un registre 16 bits |
AND reg/mem32, reg32 | 21h /r | Et binaire sur le contenu du registre/mémoire 32 bits avec un registre 32 bits |
AND reg/mem64, reg64 | 21h /r | Et binaire sur le contenu du registre/mémoire 64 bits avec un registre 64 bits |
AND reg8, reg/mem8 | 22h /r | Et binaire sur le contenu du registre 8 bits avec un registre/mémoire 8 bits |
AND reg16, reg/mem16 | 23h /r | Et binaire sur le contenu du registre 16 bits avec un registre/mémoire 16 bits |
AND reg32, reg/mem32 | 23h /r | Et binaire sur le contenu du registre 32 bits avec un registre/mémoire 32 bits |
AND reg64, reg/mem64 | 23h /r | Et binaire sur le contenu du registre 64 bits avec un 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 | 7 | 3 | 2 à 4 |
reg,mem | 9+EA | 7 | 6 | 1 | 2 à 4 |
mem,immed | 17+EA | 7 | 7 | 3 | 3 à 6 |
reg,immed | 4 | 3 | 2 | 1 | 3 à 4 |
accum,immed | 4 | 3 | 2 | 1 | 2 à 3 |
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 un «Et binaire» de 1 sur le registre AL :
- AND AL,1
L'exemple suivant permet d'effectuer un «Et binaire» de 1 sur le registre AX :
- AND AX,1
L'exemple suivant permet d'effectuer l'opération «DI = DI ∩ 3333h» :
- AND DI,3333h
Le contenu des mots de l'emplacement mémoire spécifié par le registre DI est un «ET» avec le registre AX :
- AND AX,[DI]
Le contenu en octets de l'emplacement mémoire adressé par TABLEAU plus SI est «Et binaire» avec le registre AL :
- AND TABLEAU[SI],AL
L'exemple suivant permet d'effectuer un «Et binaire» de 1 sur le registre EAX :
- AND EAX,1
L'exemple suivant permet d'effectuer un «Et binaire» de 1 sur le registre RAX :
- AND RAX,1
L'exemple suivant permet d'effectuer un «Et binaire» de BL sur le registre AL :
- AND AL,BL
L'exemple suivant permet d'effectuer un «Et binaire» de BX sur le registre AX :
- AND AX,BX
L'exemple suivant permet d'effectuer un «Et binaire» de EBX sur le registre EAX :
- AND EAX,EBX
Le registre CL effectue un «Et binaire» avec le contenu en octets de l'emplacement mémoire spécifié par EAX :
- AND [EAX],CL
L'exemple suivant permet d'effectuer un «Et binaire» de RBX sur le registre RAX :
- AND RAX,RBX
L'exemple suivant permet d'effectuer un «Et binaire» de EBX à l'emplacement mémoire EAX :
- AND [EAX],EBX
L'exemple suivant permet d'effectuer un «Et binaire» de RBX à l'emplacement mémoire RAX :
- AND [RAX],RBX
L'exemple suivant permet d'effectuer un «Et binaire» de RAX à l'emplacement mémoire absolue 01234ABC :
- AND [01234ABC],EAX
L'exemple suivant permet d'effectuer un «Et binaire» de RAX à l'emplacement mémoire du symbole :
- AND [UnSymbole],RAX
Cet exemple permet de vérifier si un nombre est impaire :
Voir également
Instruction assembleur 80x86 - Instruction OR
Instruction assembleur 80x86 - Instruction NOT
Instruction assembleur 80x86 - Instruction NEG
Instruction assembleur 80x86 - Instruction TEST
Instruction assembleur 80x86 - Instruction XOR
Mathématique - Algèbre de Boole - Table de vérité
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 61 à 62.
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 119 à 121.