Section courante

A propos

Section administrative du site

Assembleur 80x86

JMP

INTEL 8086+, x86-64 Jump

Syntaxe

JMP destination

Paramètres

Nom Description
destination Ce paramètre permet d'indiquer l'emplacement ou doit être poursuivi l'exécution.

Description

Cette instruction permet d'effectuer un branchement à un emplacement mémoire spécifié. Par conséquent, l'instruction JMP transfère le contrôle du programme à un point différent du flux d'instructions sans enregistrer les informations de retour. L'opérande de destination (cible) spécifie l'adresse de l'instruction à laquelle on veut sauter. Cet opérande peut être une valeur immédiate, un registre à usage général ou un emplacement de mémoire. Cette instruction peut être utilisée pour exécuter 4 types de sauts différents :

Remarques

Algorithme

MODULE JMP(destination)
   SI near jump ALORS
      SI saut relatif court ALORS
         tempEIP ← EIP + destination
      SINON
         tempEIP ← destination
      FIN SI
      SI tempEIP est en dehors des limites du code segment ALORS
         EXCEPTION #GP(0)
      FIN SI
      SI taille de l'opérande = 32 bits ALORS
         EIP ← tempEIP
      SINON
         EIP ← tempEIP ∩ 0000FFFFh
      FIN SI
   FIN SI
   SI saut long ET (PE = 0 OU (PE = 1 ET VM = 1)) ALORS * Adresse réel ou mode virtuel 8086
      tempEIP ← destination(offset)
      SI tempEIP est en dehors des limites du code de segment ALORS
         EXCEPTION #GP(0)
      FIN SI
      CS ← destination(Sélecteur de segment)
      SI taille de l'opérande = 32 bits ALORS
         EIP ← tempEIP
      SINON
         EIP ← tempEIP ∩ 0000FFFFh
      FIN SI
   FIN SI
   SI far jump ET (PE = 1 ET VM = 0) ALORS * Mode protégé, pas mode virtuel 8086
      SI l'adresse effective dans les segments CS, DS, ES, FS, GS ou SS est illégale OU sélecteur de segment dans une destination d'opérande nulle ALORS
         EXCEPTION #GP(0)
      FIN SI
      SI index de sélecteur de segment n'est pas dans la limite de descripteur de table ALORS
         EXCEPTION #GP(nouveau sélecteur)
      FIN SI
      Lecture du type et de l'accès correct du descripteur de segment
      SI type de segment n'est pas conforme OU code de segment non conforme, appel le pont, tâche du pont, ou TSS ALORS
         EXCEPTION #GP(sélecteur de segment)
      FIN SI
      Type de dépendance et accès correct
      ALLER A CONFORMING-CODE-SEGMENT
      ALLER A NONCONFORMING-CODE-SEGMENT
      ALLER A CALL-GATE
      ALLER A TASK-GATE
      ALLER A TASK-STATE-SEGMENT
   SINON
      EXCEPTION #GP(Sélecteur de segment)
   FIN SI
   
   CONFORMING-CODE-SEGMENT:
      SI DPL > CPL ALORS
         EXCEPTION #GP(Sélecteur de segment)
      FIN SI
      SI segment pas présent ALORS
         EXCEPTION #NP(Sélecteur de segment)
      FIN SI
         tempEIP ← destination(Offset)
      SI Taille de l'opérande = 16 bits ALORS
         tempEIP ← tempEIP ∩ 0000FFFFh
      FIN SI
      SI tempEIP n'est pas dans la limite du code segment ALORS
         EXCEPTION #GP(0)
      FIN SI
      CS ← destination(Sélecteur de segment)
      CS(RPL) ← CPL
      EIP ← tempEIP
      FIN
   
   NONCONFORMING-CODE-SEGMENT:
      SI (RPL > CPL) OU (DPL = CPL) ALORS
         EXCEPTION #GP(Sélecteur de code segment)
      FIN SI
      SI segment n'est pas présent ALORS
         EXCEPTION #NP(Sélecteur de segment)
      FIN SI
      SI pointeur d'instruction est en dehors des limites du segment ALORS
         EXCEPTION #GP(0)
      FIN SI
      tempEIP ← destination(offset)
      SI taille de l'opérande = 16 bits ALORS
         tempEIP ← tempEIP ∩ 0000FFFFh
      FIN SI
      SI tempEIP n'est pas dans les limites du code segment ALORS
         EXCEPTION #GP(0)
      FIN SI
      CS ← destination(Sélecteur de segment)
      CS(RPL) ← CPL
      EIP ← tempEIP
      FIN
   
   CALL-GATE:
      SI appel de pont DPL < CPL OU appel de pont DPL < appel de pont de sélecteur de segment RPL ALORS
         EXCEPTION #GP(sélecteur d'appel de pont)
      FIN SI
      SI appel d'un pont non présent ALORS
         EXCEPTION #NP(Sélecteur d'appel de pont)
      FIN SI
      SI appel d'un pont du sélecteur de code segment est nulle ALORS
         EXCEPTION #GP(0)
      FIN SI
      SI appel d'un pont d'index de sélecteur de code de segment est en dehors des limites du descripteur de table ALORS
         EXCEPTION #GP(sélecteur de code segment)
      FIN SI
      Lecture du descripteur de code segment
      SI descripteur de code segment n'est pas indiquer dans le code segment OU descripteur de code segment est conforme et DPL > CPL OU decripteur de segment de code n'est pas conforme ET DPL = CPL ALORS
         EXCEPTION #GP(Sélecteur de code segment)
      FIN SI
      SI code segment n'est pas présent ALORS
         EXCEPTION #NP(sélecteur de code segment)
      FIN SI
      SI pointeur d'instruction n'est pas dans les limites du code segment ALORS
         EXCEPTION #GP(0)
      FIN SI
      tempEIP ← destination(offset)
      SI Taille du pont = 16 bits ALORS
         tempEIP ← tempEIP ∩ 0000FFFFh
      FIN SI
      SI tempEIP n'est pas dans les limites du code segment ALORS
         EXCEPTION #GP(0)
      FIN SI
      CS ← destination(Sélecteur de segment)
      CS(RPL) ← CPL
      EIP ← tempEIP
      FIN
   
   TASK-GATE:
      SI tâche du pont DPL < CPL OU tâche du pont DPL < sélecteur de segment du pont de tâche RPL ALORS
         EXCEPTION #GP(Sélecteur de tâche du pont)
      FIN SI
   SI pont de tâche n'est pas présent ALORS
         EXCEPTION #NP(Sélecteur de pont)
      FIN SI
      Lecteur du sélecteur de segment TSS dans le descripteur de pont de tâche
      SI bit de sélecteur de segment TSS local/global est fixer à local OU index n'est dans les limites du GDT OU que le descripteur TSS specifié est occupé ALORS
         EXCEPTION #GP(Sélecteur TSS)
      FIN SI
      SI TSS n'est pas présent ALORS
         EXCEPTION #NP(Sélecteur TSS)
      FIN SI
      SWITCH-TASKS à TSS
      SI EIP n'est dans les limites de code de segment ALORS
         EXCEPTION #GP(0)
      FIN SI
      FIN
   
   TASK-STATE-SEGMENT:
      SI TSS DPL < CPL OU TSS DPL < sélecteur de segment TSS RPL OU descripteur TSS indique que le TSS n'est pas disponible ALORS
         EXCEPTION #GP(Sélecteur TSS)
      FIN SI
      SI TSS n'est pas présent ALORS
         EXCEPTION #NP(Sélecteur TSS)
      FIN SI
      SWITCH-TASKS à TSS
      SI EIP n'est pas dans les limites de code segment ALORS
         EXCEPTION #GP(0)
      FIN SI
      FIN

Mnémonique

Instruction Opcode Description
JMP rel8off EBh cb Saut court à la destination spécifié par un déplacement signé de 8 bits
JMP rel16off E9h cw Saut court à la destination spécifié par un déplacement signé de 16 bits
JMP rel32off E9h cd Saut court à la destination spécifié par un déplacement signé de 32 bits
JMP reg/mem16 FFh /4 Saut court à la destination spécifié par un le registre/mémoire 16 bits
JMP reg/mem32 FFh /4 Saut court à la destination spécifié par un le registre/mémoire 32 bits
JMP reg/mem64 FFh /4 Saut court à la destination spécifié par un le registre/mémoire 64 bits
JMP FAR pntr16:16 EAh cd Saut long direct avec la destination spécifié par un long pointeur contenu dans l'instruction. Cette instruction est invalide en mode 64 bits.
JMP FAR pntr16:32 EAh cp Saut long direct avec la destination spécifié par un long pointeur contenu dans l'instruction. Cette instruction est invalide en mode 64 bits.
JMP FAR mem16:16 FFh /5 Saut long indirect avec la destination spécifié par un long pointeur contenu en mémoire. Cette instruction est invalide en mode 64 bits.
JMP FAR mem16:32 FFh /5 Saut long indirect avec la destination spécifié par un long pointeur contenu en mémoire. Cette instruction est invalide en mode 64 bits.

Exceptions

Message Mode réel Virtuel 8086 Mode protégé Description
#UD(Opcode invalide) X X X Cette instruction est exécuté en mode 64-bits avec un code un opcode indirect JMP (FFh /5) dans un opérande de registre.
    X Cette instruction est exécuté en mode 64-bits avec un code un opcode direct JMP (EAh)
#SS(Pile non-canonique) X X X Une adresse mémoire dépasse la limite du segment de pile ou n'est pas canonique
#NP(Sélecteur)     X L'accès au segment de code, au pont d'appel, un pont de tâche, ou a un TSS non présent.
#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
#GP(Sélecteur)     X La destination de sélecteur de segment de code est un sélecteur nulle.
    X Un code, un pont d'appel, une tâche de pont, ou un descripteur TSS dépasse la limite de descripteur de table.
    X Un sélecteur de segment de bit TI est fixé, mais le sélecteur LDT est un sélecteur nulle.
    X Le descripteur de segment spécifié par l'instruction n'est pas un segment de code, une tâche de pont, un pont d'appel, ou un TSS disponible dans le mode «legacy», ou n'est pas un segment de code 64 bits ou un appel 64 bits long d'un pont dans le mode «long».
    X Le RPL d'un sélecteur de segment de code non-conforme spécifié par l'instruction est supérieur au CPL, ou le DPL n'est pas égale au CPL.
    X Le DPL du descripteur de segment de code spécifié est conforme quand l'instruction est supérieur au CPL.
    X Le DPL est un pont d'appel, une tâche de pont, un descripteur TSS spécifié quand l'instruction est inférieur au CPL ou au RPL.
    X Le sélecteur de segment spécifié par le pont d'appel ou le pont de tâche est un sélecteur nulle.
    X Le descripteur de segment spécifié par l'appel de pont n'est pas un segment de code en mode «legacy» ou segment de code 64 bits dans un mode «long».
    X Le DPL du descripteur de segment spécifié par le pont d'appel est supérieur au CPL et dans un segment conforme.
    X Le DPL du descripteur de segment spécifié par le pont d'appel n'est pas égale au CPL et il n'est pas dans un segment conforme.
    X L'attribut étendue du pont d'appel 64 bits n'est pas à 0.
    X Le descripteur TSS n'est pas un LDT.
#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

Cet exemple permet d'effectuer un saut à partir d'un tableau d'adresse :

  1. .MODEL small
  2.    .STACK 100h
  3.    .DATA
  4.    .CODE
  5. CheckVideoCard PROC NEAR
  6.  MOV AX,1A00h
  7.  INT 10h
  8.  CMP AL,1Ah
  9.  JNE @@Default
  10. @@RePass:
  11.  AND BX,000Fh
  12.  SHL BX,1
  13.  JMP Word Ptr CS:[Offset @PS2Jmp+BX]
  14. @PS2Jmp:
  15.  DW Offset @@NoEGAExist       ; 0h
  16.  DW Offset @@Default          ; 1h
  17.  DW Offset @@Default          ; 2h
  18.  DW Offset @@Default          ; 3h
  19.  DW Offset @@EgaDefault       ; 4h
  20.  DW Offset @@EgaDefault       ; 5h
  21.  DW Offset @@PGA              ; 6h
  22.  DW Offset @@VGAPS2           ; 7h
  23.  DW Offset @@VGAPS2           ; 8h
  24.  DW Offset @@Default          ; 9h
  25.  DW Offset @@MCGADigitalColor ; Ah
  26.  DW Offset @@MCGAAnalogMono   ; Bh
  27.  DW Offset @@MCGAPS2          ; Ch
  28.  DW Offset @@Default          ; Dh
  29.  DW Offset @@Default          ; Eh
  30.  DW Offset @@Default          ; Fh
  31. @@Default:
  32.    ; ...
  33.  JMP @@SetCardNExit
  34. @@NoPCJunior:
  35.   ; ...
  36.  JMP @@SetCardNExit
  37. @@EgaDefault:
  38.   ; ...
  39.  JMP @@SetCardNExit
  40. @@PGA:
  41.   ; ...
  42.  JMP @@SetCardNExit
  43. @@VGAPS2:
  44.   ; ...
  45.  JMP @@SetCardNExit
  46. @@NoEGAExist:
  47.   ; ...
  48.  JMP @@SetCardNExit
  49. @@MCGADigitalColor:
  50.  ; ...
  51.  JMP @@SetCardNExit
  52. @@MCGAAnalogMono:
  53.  ; ...
  54.  JMP @@SetCardNExit
  55. @@MCGAPS2:
  56.  ; ...
  57. @@SetCardNExit:
  58.  RET
  59. ENDP
  60.  
  61.     .startup   
  62.      ; ...
  63.     INT  21h
  64.     MOV  AX,4C00h                 
  65.     INT  21h                    
  66.     END

Voici un exemple, en Turbo Pascal 7, permettant d'afficher un message en utilisant le segment de code pour entreposer les données et sauter la partie du code étant en faite des données :

  1. Program AsmJmp;
  2.  
  3. BEGIN
  4.  ASM
  5.   JMP @End
  6. @MessageBonjour:
  7.   DB  'Mon message...$'
  8. @End:
  9.    PUSH DS
  10.     PUSH CS
  11.     POP DS
  12.     MOV AH,9                   
  13.     MOV DX,OFFSET @MessageBonjour
  14.     INT 21h                    
  15.    POP DS
  16.  END;
  17. END.

Voir également

Langage de programmation - Instruction assembleur 80x86 - Instruction Jump if (JA, JB, JC, JCX, JE,...)
Langage de programmation - Assembleur 8080 et 8085 - Référence des instructions 8080 et 8085 - JMP
Langage de programmation - SAS/JMP

Références

Le livre d'Or PC, Martin Althaus, 1992, ISBN: 2-7361-0934-1, page 816
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 135.
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 619 à 629.

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