Accueil de Gladir.com Notes légal de Gladir.com Flux RSS des nouvelles du site Gladir.com - Assembleur et Pascal - Instruction assembleur 80x86 - Instruction SUB Section du logiciel DOS «MonsterBook» Inventaire de la bibliothèque de Gladir.com Entrée administrateur


Assembleur 80x86 SUB
INTEL 8088+ Arithmetic Substraction Unsigned


Syntaxe

SUB opérandecible,opérandesource


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 28 décembre 2009