Assembleur 80x86 | SUB |
---|---|
INTEL 8088+, x86-64 | Arithmetic Substraction Unsigned |
Syntaxe
SUB opérandecible,opérandesource |
Paramètres
Nom | Description |
---|---|
opérandecible | Ce paramètre permet d'indiquer l'opérande de base sur lequel l'opération sera effectué. |
opérandesource | Ce paramètre permet d'indiquer la quantité à soustraire |
Description
Cette instruction permet de soustraire une valeur à une opérande. Ainsi, il soustrait le deuxième opérande (opérande source) du premier opérande (opérande cible) et entrepose le résultat dans l'opérande cible. L'opérande cible peut être un registre ou un emplacement de mémoire; l'opérande source peut être un emplacement immédiat, de registre ou de mémoire (toutefois, deux opérandes de mémoire ne peuvent pas être utilisés dans une même instruction). Lorsqu'une valeur immédiate est utilisée comme opérande, elle est étendue à la longueur du format de l'opérande de destination.
Remarques
- L'instruction SUB effectue une soustraction d'entiers. 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é.
- Les drapeaux OF, SF, ZF, AF, PF et CF sont définis en fonction du résultat de l'instruction SUB.
- L'instruction SUB peut être utilisée avec un préfixe LOCK pour permettre l'exécution de l'instruction de manière 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 SUB(opérandecible,opérandesource) opérandecible ← opérandecible - opérandesource |
Mnémonique
Instruction | Opcode | Description |
---|---|---|
SUB AL, imm8 | 2Ch ib | Soustrait une valeur immédiate de 8 bits du registre AL et entrepose le résultat dans le registre AL. |
SUB AX, imm16 | 2Dh iw | Soustrait une valeur immédiate de 16 bits du registre AX et entrepose le résultat dans le registre AX. |
SUB EAX, imm32 | 2Dh id | Soustrait une valeur immédiate de 32 bits du registre EAX et entrepose le résultat dans le registre EAX. |
SUB RAX, imm32 | 2Dh id | Soustrait une valeur entière immédiate de 32 bits du registre RAX et entrepose le résultat dans le registre RAX. |
SUB reg/mem8, imm8 | 80h /5 ib | Soustrait une valeur entière immédiate de 8 bits de l'emplacement registre ou mémoire de 8 bits. |
SUB reg/mem16, imm16 | 81h /5 iw | Soustrait une valeur entière immédiate de 16 bits de l'emplacement registre ou mémoire de 16 bits. |
SUB reg/mem32, imm32 | 81h /5 id | Soustrait une valeur entière immédiate de 32 bits de l'emplacement registre ou mémoire de 32 bits. |
SUB reg/mem64, imm32 | 81h /5 id | Soustrait une valeur entière immédiate de 64 bits de l'emplacement registre ou mémoire de 32 bits. |
SUB reg/mem16, imm8 | 83h /5 ib | Soustrait une valeur entière immédiate de 16 bits de l'emplacement registre ou mémoire de 8 bits. |
SUB reg/mem32, imm8 | 83h /5 ib | Soustrait une valeur entière immédiate de 32 bits de l'emplacement registre ou mémoire de 8 bits. |
SUB reg/mem64, imm8 | 83h /5 ib | Soustrait une valeur entière immédiate de 64 bits de l'emplacement registre ou mémoire de 8 bits. |
SUB reg/mem8, reg8 | 28h /r | Soustrait un registre de 8 bits de l'emplacement registre ou mémoire de 8 bits. |
SUB reg/mem16, reg16 | 29h /r | Soustrait un registre de 16 bits de l'emplacement registre ou mémoire de 16 bits. |
SUB reg/mem32, reg32 | 29h /r | Soustrait un registre de 32 bits de l'emplacement registre ou mémoire de 32 bits. |
SUB reg/mem64, reg64 | 29h /r | Soustrait un registre de 64 bits de l'emplacement registre ou mémoire de 64 bits. |
SUB reg8, reg/mem8 | 2Ah /r | Soustrait de l'opérande d'emplacement registre ou mémoire de 8 bits d'un registre de 8 bits. |
SUB reg16, reg/mem16 | 2Bh /r | Soustrait de l'opérande d'emplacement registre ou mémoire de 16 bits d'un registre de 16 bits. |
SUB reg32, reg/mem32 | 2Bh /r | Soustrait de l'opérande d'emplacement registre ou mémoire de 32 bits d'un registre de 32 bits. |
SUB reg64, reg/mem64 | 2Bh /r | Soustrait de l'opérande d'emplacement registre ou mémoire de 64 bits d'un registre de 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 à 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) | 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 de soustraire 7 de la valeur du registre AL :
- SUB AL,7
L'exemple suivant permet d'effectuer l'opération «CL = CL - 44h» :
- SUB CL,44h
L'exemple suivant permet d'effectuer l'opération «AL = AL - BL» :
- SUB AL,BL
L'exemple suivant permet de soustraire de AL le contenu en octets de l'emplacement de mémoire du segment de données spécifié par le registre BX avec la différence entreposée dans le même emplacement de mémoire :
- SUB [BX],AL
Le contenu des mots de l'emplacement de mémoire du segment de données spécifié par SI+2 est soustrait de BX avec la différence entreposée dans BX :
- SUB BX,[SI+2]
L'exemple suivant permet de soustraire 7 de la valeur du registre AX :
- SUB AX,7
Le contenu des mots de l'emplacement de mémoire du segment de données spécifié par TEMP+DI est soustrait de BX avec la différence entreposée dans BX :
- ADD BX,TEMP[DI]
L'exemple suivant permet de soustraire 7 de la valeur du registre EAX :
- SUB EAX,7
L'exemple suivant permet de soustraire -2 de la valeur du registre RAX :
- SUB RAX,-2
L'exemple suivant permet de soustraire la valeur 9 en hexadécimal de l'emplacement mémoire EAX :
- SUB [EAX],09h
L'exemple suivant permet de soustraire la valeur 2 de l'emplacement mémoire RAX :
- SUB [RAX],2
L'exemple suivant permet de soustraire la valeur du registre RSI de l'emplacement mémoire RAX :
- SUB [RAX],RSI
L'exemple suivant permet de soustraire la valeur de l'emplacement mémoire RAX du registre EBX :
- SUB EBX,[RAX]
L'exemple suivant permet de soustraire la valeur de l'emplacement mémoire RAX du registre RBX :
- SUB RBX,[RAX]
L'exemple suivant permet de soustraire la valeur 7 de l'emplacement mémoire d'un symbole :
- SUB [UnSymbole],7
L'exemple suivant permet de soustraire la valeur du registre EAX de l'emplacement mémoire d'un symbole :
- SUB [UnSymbole],EAX
Voici un exemple en Turbo Pascal montrant une utilisation de cet instruction :
- Program AsmSub;
-
- Var a,b,c,c_:Integer;
-
- Function Sub(X,Y:Integer):Integer;Assembler;ASM
- MOV AX,X
- SUB AX,Y
- END;
-
- BEGIN
- a := 1;
- b := 2;
- c := 3;
- c_ := -3;
- WriteLn('0 - 0 : ',Sub(0,0));
- WriteLn('0 - 1 : ',Sub(0,1));
- WriteLn('1 - 1 : ',Sub(1,1));
- WriteLn('1 - 2 : ',Sub(1,2));
- WriteLn('a - b : ',Sub(a,b));
- WriteLn('a - b - c : ',Sub(Sub(a,b),c));
- WriteLn('a - b - c_ : ',Sub(Sub(a,b),c_));
- WriteLn('c - c_ : ',Sub(c,c_));
- WriteLn('a - b - 20 : ',Sub(Sub(a,b),20));
- END.
on obtiendra le résultat suivant :
0 - 0 : 00 - 1 : -1
1 - 1 : 0
1 - 2 : -1
a - b : -1
a - b - c : -4
a - b - c_ : 2
c - c_ : 6
a - b - 20 : -21
Voir également
Instruction assembleur 80x86 - Instruction ADC
Instruction assembleur 80x86 - Instruction ADD
Instruction assembleur 80x86 - Instruction SBB
Références
Le livre d'Or PC, Martin Althaus, 1992, ISBN: 2-7361-0934-1, page 838
Assembleur Facile, Philippe Mercier, 1990, ISBN: 2-501-01176-7, page 418
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 239.
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2B: Instruction Set Reference, N-Z, Edition Intel, Mars 2010, Publication No. 253667-034US, page 476 à 478.