Page d'accueil R&T
IUT de Villetaneuse
Université Paris 13
Département
Equipe      Cours
Intranet
Formation Initiale
Formation Continue
Apprentissage
Architecture des ordinateurs
  • Présentation
  • Cours
  • TDs
  • Contrôles
  •  
    Contact matière
    email
     
      

    2.3  Branchements

    Normalement, le processeur exécute une instruction puis passe à celle qui suit en mémoire, et ainsi de suite séquentiellement. Il arrive fréquemment que l'on veuille faire répéter au processeur une certaine suite d'instructions, comme dans le programme :

       Repeter 3 fois:
          ajouter 5 au registre BX
    
    

    En d'autres occasions, il est utile de déclencher une action qui dépend du résultat d'un test :

     
       Si x < 0:
          y = - x
       sinon
          y = x
    
    

    Dans ces situations, on doit utiliser une instruction de branchement, ou saut, qui indique au processeur l'adresse de la prochaine instruction à exécuter.

    Rappelons que le registre IP du processeur conserve l'adresse de la prochaine instruction à exécuter. Lors d'un déroulement normal, le processeur effectue les actions suivantes pour chaque instruction :

    1. lire et décoder l'instruction à l'adresse IP;
    2. IP ¬ IP + taille de l'instruction;
    3. exécuter l'instruction.

    Pour modifier le déroulement normal d'un programme, il suffit que l'exécution de l'instruction modifie la valeur de IP. C'est ce que font les instructions de branchement.

    On distingue deux catégories de branchements, selon que le saut est toujours effectué (sauts inconditionnels) ou qu'il est effectué seulement si une condition est vérifiée (sauts conditionnels).

    2.3.1  Saut inconditionnel

    La principale instruction de saut inconditionnel est JMP. En adressage relatif, l'opérande de JMP est un déplacement, c'est à dire une valeur qui va être ajoutée à IP.

    L'action effectuée par JMP est :

    IP = IP + déplacement

    Le déplacement est un entier relatif sur codée 8 bits. La valeur du déplacement à utiliser pour atteindre une certaine instruction est :

    déplacement = adr. instruction visée - adr. instruction suivante

    Exemple : le programme suivant écrit indéfiniment la valeur 0 à l'adresse 0140H. La première instruction est implantée à l'adresse 100H.

    Adresse  Contenu MP   Langage Symbolique   Explication en francais
     
    0100     B8 00 00     MOV AX, 0            met AX a zero
    0103     A3 01 40     MOV [140], AX        ecrit a l'adresse 140
    0106     EB FC        JMP 0103             branche en 103
    0107                  xxx -> instruction jamais executee  
    
    
    Le déplacement est ici égal à FCH, c'est à dire -4 (=103H-107H).

    2.3.2  Indicateurs

    Les instructions de branchement conditionnels utilisent les indicateurs, qui sont des bits spéciaux positionnés par l'UAL après certaines opérations. Les indicateurs sont regroupés dans le registre d'état du processeur. Ce registre n'est pas accessible globalement par des instructions; chaque indicateur est manipulé individuellement par des instructions spécifiques.

    Nous étudierons ici les indicateurs nommés ZF, CF, SF et OF.

    ZF
    Zero Flag
    Cet indicateur est mis à 1 lorsque le résultat de la dernière opération est zéro. Lorsque l'on vient d'effectuer une soustraction (ou une comparaison), ZF=1 indique que les deux opérandes étaient égaux. Sinon, ZF est positionné à 0.
    CF
    Carry Flag
    C'est l'indicateur de report (retenue), qui intervient dans les opérations d'addition et de soustractions sur des entiers naturels. Il est positionné en particulier par les instructions ADD, SUB et CMP.

    CF = 1 s'il y a une retenue après l'addition ou la soustraction du bit de poids fort des opérandes. Exemples (sur 4 bits pour simplifier) :

          0 1 0 0             1 1 0 0             1 1 1 1
        + 0 1 1 0           + 0 1 1 0           + 0 0 0 1
        ---------           ---------           ---------
    CF=0  1 0 1 0       CF=1  0 0 1 0       CF=1  0 0 0 0
    
    
    SF
    Sign Flag
    SF est positionné à 1 si le bit de poids fort du résultat d'une addition ou soustraction est 1; sinon SF=0. SF est utile lorsque l'on manipule des entiers relatifs, car le bit de poids fort donne alors le signe du résultat. Exemples (sur 4 bits) :
          0 1 0 0             1 1 0 0             1 1 1 1
        + 0 1 1 0           + 0 1 1 0           + 0 0 0 1
        ---------           ---------           --------- 
    SF=1  1 0 1 0       SF=0  0 0 1 0       SF=0  0 0 0 0
    
    
    OF
    Overflow Flag
    Indicateur de débordement5 OF=1 si le résultat d'une addition ou soustraction donne un nombre qui n'est pas codable en relatif dans l'accumulateur (par exemple si l'addition de 2 nombres positifs donne un codage négatif).
          0 1 0 0             1 1 0 0             1 1 1 1
        + 0 1 1 0           + 0 1 1 0           + 0 0 0 1
        ---------           ---------           --------- 
    OF=1  1 0 1 0       OF=0  0 0 1 0       OF=1  0 0 0 0
    
    

    Lorsque l'UAL effectue une addition, une soustraction ou une comparaison, les quatre indicateurs sont positionnés. Certaines autres instructions que nous étudierons plus loin peuvent modifier les indicateurs.

    Instruction CMP

    Il est souvent utile de tester la valeur du registre AX sans modifier celui-ci. L'instruction CMP effectue exactement les même opération que SUB, mais ne stocke pas le résultat de la soustraction. Son seul effet est donc de positionner les indicateurs.

    Exemple : après l'instruction

        CMP AX, 5
    
    
    on aura ZF = 1 si AX contient la valeur 5, et ZF = 0 si AX est différent de 5.

    Instructions STC et CLC

    Ces deux instructions permettent de modifier la valeur de l'indicateur CF.
    Symbole
    STC CF ¬ 1 (SeT Carry)
    CLC CF ¬ 0 (CLear Carry)

    2.3.3  Sauts conditionnels

    Les instructions de branchements conditionnels effectuent un saut (comme JMP) si une certaine condition est vérifiée. Si ce n'est pas le cas, le processeur passe à l'instruction suivante (l'instruction ne fait rien).

    Les conditions s'expriment en fonction des valeurs des indicateurs. Les instructions de branchement conditionnel s'utilisent en général immédiatement après une instruction de comparaison CMP.

    Voici la liste des instructions de branchement les plus utiles :

    JE
    Jump if Equal
    saut si ZF = 1;
    JNE
    Jump if Not Equal
    saut si ZF = 0;
    JG
    Jump if Greater
    saut si ZF = 0 et SF = OF;
    JLE
    Jump if Lower or Equal
    saut si ZF=1 ou SF ¹ OF;
    JA
    Jump if Above
    saut si CF=0 et ZF=0;
    JBE
    Jump if Below or Equal
    saut si CF=1 ou ZF=1.
    JB
    Jump if Below
    saut si CF=1.

    Note : les instructions JE et JNE sont parfois écrites JZ et JNZ (même code opération).

    © E. Viennet 1995-2001. Traduit du source LaTeX par tth.