Introduction à la programmation en assembleur (processeurs 64 bits de la famille 80x86)
5.1 Comparaisons et autres branchements conditionnels

Nous avons vu ci-dessus comment réaliser une comparaison arithmétique en utilisant la soustraction. Pour des raisons de lisibilité et d'efficacité, il est en fait préférable d'utiliser une instruction prévue spécialement pour ça : la mnémonique cmp.

Définition

« cmp opérande1, opérande2 » est une sorte de soustraction virtuelle. Plus précisément, les contenus des deux opérandes restent inchangés, mais le registre RFLAGS est modifié exactement comme lors de la soustraction opérande2-opérande1. Les drapeaux OF, CF, ZF, SF et PF donnent les caractéristiques du résultat.

Après une instruction de comparaison, nous pouvons bien sûr faire un branchement conditionnel en fonction des valeurs de RFLAGS. Pour plus de lisibilité chaque mnémonique de branchement conditionnel possède plusieurs synonymes.

Syntaxe

Par exemple :

  • Saut si CF = 1 : jc (jump* if carry*), jb (jump if below*), jnae (jump if not above* or equal*)

  • Saut si CF = 0 : jnc (jump if no carry), jae (jump if above or equal), jnb (jump if not below)

  • Saut si ZF = 1 : jz (jump if zero), je (jump if equal)

  • Saut si ZF = 0 : jnz (jump if not zero), jne (jump if not equal)

  • Saut si CF=0 et ZF=0 : ja ( jump if above), jnbe (jump if not below or equal).

  • Saut si CF=1 ou ZF=1: jbe (jump if below or equal), jna (jump if not above)

Syntaxe

Bien entendu, jb, jnae, jae, jnb, ja, jnbe, jbe et jna n'ont de sens que si l'instruction précédente est une comparaison d'entiers non-signés (naturels). Si l'on veut comparer des entiers relatif (signés) ont utilisera :

  • Saut si ((SF oux* OF) ou ZF) = 0 : jg (jump if greater*), jnle (jump if not less* or equal)

  • Saut si ((SF oux OF) ou ZF) =1 : jle (jump if less or equal), jng (jump if not greater)

  • Saut si (SF oux OF) =0 : jge (jump if greater or equal), jnl (jump if not less)

  • Saut si (SF oux OF) = 1 : jl (jump if less), jnge (jump if not greater or equal)

  • Saut si OF = 0 : jno (jump if not overflow)

  • Saut si OF = 1 : jo (jump if overflow)

  • Saut si SF = 0 : js (jump if sign : saut si résultat négatif)

  • Saut si SF = 0 : jns (jump if not sign : saut si résultat positif).

Syntaxe

Enfin, 4 instructions de saut conditionnel un peu particulières :

  • Saut si PF =0 : jnp, jpo (not parity ou parity odd : le résultat est impair)

  • Saut si PF =1 : jp, jpe (parity ou parity even : le résultat est pair).

Syntaxe

Et comme le registre rcx est souvent utilisé comme compteur de boucle :

  • Saut si %cx = 0 : jcxz (le registre cx contient 0)

  • Saut si %ecx =0 : jecxz (le registre ecx contient 0)

  • Saut si %ecx =0 : jrcxz (le registre rcx contient 0)

Exemple

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 32 bits, peut maintenant s'écrire :