Section courante

A propos

Section administrative du site

Assembleur 80x86

JMP

INTEL 8086+ 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é.

Algorithme

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