Section courante

A propos

Section administrative du site

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

Algorithme

MODULE SUB(opérandecible,opérandesource)
   opérandecibleopé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 :

  1. SUB AL,7

L'exemple suivant permet d'effectuer l'opération «CL = CL - 44h» :

  1. SUB CL,44h

L'exemple suivant permet d'effectuer l'opération «AL = AL - BL» :

  1. 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 :

  1. 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 :

  1. SUB BX,[SI+2]

L'exemple suivant permet de soustraire 7 de la valeur du registre AX :

  1. 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 :

  1. ADD BX,TEMP[DI]

L'exemple suivant permet de soustraire 7 de la valeur du registre EAX :

  1. SUB EAX,7

L'exemple suivant permet de soustraire -2 de la valeur du registre RAX :

  1. SUB RAX,-2

L'exemple suivant permet de soustraire la valeur 9 en hexadécimal de l'emplacement mémoire EAX :

  1. SUB [EAX],09h

L'exemple suivant permet de soustraire la valeur 2 de l'emplacement mémoire RAX :

  1. SUB [RAX],2

L'exemple suivant permet de soustraire la valeur du registre RSI de l'emplacement mémoire RAX :

  1. SUB [RAX],RSI

L'exemple suivant permet de soustraire la valeur de l'emplacement mémoire RAX du registre EBX :

  1. SUB EBX,[RAX]

L'exemple suivant permet de soustraire la valeur de l'emplacement mémoire RAX du registre RBX :

  1. SUB RBX,[RAX]

L'exemple suivant permet de soustraire la valeur 7 de l'emplacement mémoire d'un symbole :

  1. SUB [UnSymbole],7

L'exemple suivant permet de soustraire la valeur du registre EAX de l'emplacement mémoire d'un symbole :

  1. SUB [UnSymbole],EAX

Voici un exemple en Turbo Pascal montrant une utilisation de cet instruction :

  1. Program AsmSub;
  2.  
  3. Var a,b,c,c_:Integer;
  4.  
  5. Function Sub(X,Y:Integer):Integer;Assembler;ASM
  6.  MOV AX,X
  7.  SUB AX,Y
  8. END;
  9.  
  10. BEGIN
  11.  a := 1;
  12.  b := 2;
  13.  c := 3;
  14.  c_ := -3;
  15.  WriteLn('0 - 0 : ',Sub(0,0));
  16.  WriteLn('0 - 1 : ',Sub(0,1));
  17.  WriteLn('1 - 1 : ',Sub(1,1));
  18.  WriteLn('1 - 2 : ',Sub(1,2));
  19.  WriteLn('a - b : ',Sub(a,b));
  20.  WriteLn('a - b - c : ',Sub(Sub(a,b),c));
  21.  WriteLn('a - b - c_ : ',Sub(Sub(a,b),c_));
  22.  WriteLn('c - c_ : ',Sub(c,c_));
  23.  WriteLn('a - b - 20 : ',Sub(Sub(a,b),20)); 
  24. END.

on obtiendra le résultat suivant :

0 - 0 : 0
0 - 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.

Dernière mise à jour : Lundi, le 1 septembre 2014