Les instructions de saut conditionnel testent un ou plusieurs drapeaux du registre d'état et en fonction de leur valeur, effectuent le branchement ou passent à l'instruction suivante.
La syntaxe de ces instructions est la même que pour la mnémonique jmp : il y a une seule opérande ; c'est l'adresse ou a lieu le branchement si la condition du branchement est remplie. Par exemple avec les drapeaux ZF , CF et OF que nous avons vus, nous pouvons utiliser les instructions suivantes :
-
jz : « jump if zero », c'est à dire « saut si résultat nul». Le branchement est effectué si ZF =1.
-
jnz : « jump not zero », c'est à dire « saut si résultat non nul ». Le branchement est effectué si ZF =0.
-
jc : « jump if carry », c'est à dire « saut si retenue ». Le branchement est effectué si CF =1.
-
jnc : « jump if not carry », c'est à dire « saut si pas de retenue ». Le branchement est effectué si CF =0.
-
jo : « jump if overflow », c'est à dire « saut si débordement ». Le branchement est effectué si OF =1.
-
jno : « jump if not overflow », c'est à dire « saut si pas de débordement ». Le branchement est effectué si OF =0.
Il est aisé de voir que ces 4 dernières instructions seront très utiles pour diriger le programme vers un traitement particulier lorsqu'un calcul rend un résultat invalide dans les entiers naturels ou relatifs.
Par exemple :
Ce programme est une boucle qui va incrémenter le registre cx de 1 à chaque itération. On sortira de la boucle lorsque CF sera égal à 1, c'est à dire lorsque l'incrémentation de cx provoquera une retenue d'entier non-signé.
Notons que toutes les structures de contrôle des langages évolués (if-then-else, while, for, repeat-until, do, case, etc.) peuvent être réalisées avec les seules instructions que vous avez vues jusqu'à maintenant.
Par exemple, l'instruction pascal « if a>b then c:=a else c:=b; », a, b et c étant des variables globales entières non signées 64 bits, pourrait s'écrire :