Vous êtes sur la page 1sur 11

Branchement par flags (registre d'état)

Les branchements conditionnels par flags sont des branchements


qui dépendent de positionnement des valeurs (0 ou 1) de un ou
plusieurs flags (drapeaux) du registre d'état du microprocesseur.
La plupart des instructions assembleur modifient l'état des
registres d'état:
• ADD, SUB, AND, OR...
• Pour "CMP a, b", le processeur effectue la soustraction a –
b pour positionner les flags.

65
Les flags

Les indicateurs qui nous intéressent ici sont :

• Zero Flag, ZF= 1 si le résultat est nul, sinon ZF = 0.

• Carry Flag, CF =1 s'il y a une retenue générée, sinon CF = 0.

• Sign Flag, SF=1 si le résultat est négatif, sinon SF = 0,

• Overflow Flag, OF =1 s'il y a débordement de capacité, sinon


OF = 0.
66
Remarque

L'ALU du microprocesseur ne fait pas différence entre


mathématiques signées ou non signées (Ex: sur 4 bits, 1001+0111).

C'est au programmeur de savoir quel indicateur vérifier après


chaque calcul effectué.

Les opérandes utilisés définissent le nombre de bits prisent en


compte(8 bits ou 16 bits).

67
SF (Sign Flag) et ZF (Zero Flag)
Exemples (sur 4 bits):

1111 + 0001 = 0000 (ZF=1, résultat nul)

1110 + 1001 = 0111 (SF=0, résultat positif, ZF=0)

0110 + 1001 = 1111 (SF=1, résultat négatif, ZF=0)

68
CF (carry flag)
Le positionnement de ce flag est significatif seulement lors du
traitement des nombres non signés.

En fixant un nombre de bits, l'ALU utilise deux règles pour


positionner CF:

CF=1 si l'addition de deux nombres provoque un retenu des


bits les plus significatifs (les plus à gauche).

• 1111 + 0001 = 1 0000 (CF=1, il y'a retenu)

69 • 0111 + 0001 = 1000 (CF=0, il n'y a pas de retenu)


CF (carry flag)
CF=1 si la soustraction de deux nombres nécessite un emprunt
dans les bits les plus significatifs (les plus à gauche).

• 0000 - 0001 = 1 1111 (CF=1, il y'a retenu)

• 1000 - 0001 = 0111 (CF=0, il n'y a pas de retenu)

70
OF (Overflow flag)

Le positionnement de ce flag est significatif seulement lors du


traitement des nombres signés.

La soustraction est équivalente à l'addition (a-b=a+(-b)) via le


complément à deux CA2(b)=-b.

71
OF (Overflow flag)
En fixant un nombre de bits, l'ALU utilise les deux règles
suivantes pour positionner OF:
OF=1 si:
• Positif + Positif = Négatif
• Négatif + Négatif = Positif
Exemples:
• 0111 + 0101 = 1100 (OF=1, Positif+Positif=Négatif)
• 1011 + 1100 = 0111 (OF=1, N + N=P)
• 1100 + 1100 = 1000 (OF=0 , N + N=N )
72 • 1000 + 0001 = 1001 (OF=0 , P + N=N)
Exemple:
On considère les opérations ci-dessous sur 8 bits (P: positif, N: négatif):

Retenu
Opération En décimal
F(P,N) SF ZF OF CF
(hexa) Non Signé Signé

F0 + E0 = D0 1 N+N=N 240 + 224 =208 -16+ (-32)=-48 1 0 0 1

20 + 30 = 50 Non P+P= P 32 + 48 = 80 32 + 48 = 80 0 0 0 0

A0 + 90 = 30 1 N+N=P 160 + 144 = 48 -96 + (-112) = 48 0 0 1 1

40 + 50 = 90 Non P+P= N 64 + 80 = 144 64 + 80 = -112 1 0 1 0

20 - 40 = E0 1 P-P= N 32 - 64 = 224 32 - 64 = -32 1 0 0 1

B0 - 70 = 40 Non N-P= P 176 - 112 = 64 -80 - 112 = 64 0 0 1 0

30 - 90 = A0 1 P-N= N 48 - 144 = 160 48 - (- 112) = -96 1 0 1 1

A0 - F0 = B0 1 N-N= N 160 - 240 = 176 -96 - (-16) = -80 1 0 0 1

73
Instructions de branchement
Le tableau ci-dessous récapitule les différents branchements en fonction
de positionnement des flags du registre d'état:
Instruction Description Flags
JO Jump if overflow OF = 1
JNO Jump if not overflow OF = 0
JS Jump if sign SF = 1
JNS Jump if not sign SF = 0
JZ Jump if zero
ZF = 1
JE Jump if equal
JNZ Jump if not zero
ZF = 0
JNE Jump if not equal
JC Jump if carry
JB Jump if below CF = 1
JNAE Jump if not above or equal
74
Instructions de branchement
Instruction Description Flags
JNB Jump if not below
JAE Jump if above or equal CF = 0
JNC Jump if not carry
JBE Jump if below or equal
CF = 1 or ZF = 1
JNA Jump if not above
JA Jump if above
CF = 0 and ZF = 0
JNBE Jump if not below or equal
JL Jump if less
SF <> OF
JNGE Jump if not greater or equal
JGE Jump if greater or equal
SF = OF
JNL Jump if not less
JLE Jump if less or equal
ZF = 1 or SF <> OF
JNG Jump if not greater
JG Jump if greater
ZF = 0 and SF = OF
75 JNLE Jump if not less or equal

Vous aimerez peut-être aussi