Section courante

A propos

Section administrative du site

Assembleur 80x86

SUB

INTEL 8088+ 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.

Algorithme

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.

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é

Exemple

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