TUTORIAL ASSEMBLEUR - chapitre 4
--------------------------------

Les flags - Les sauts conditionnels - CMP
-----------------------------------------


Poursuivons notre parcours dans le monde de la programmation en assembleur par les notions 
qui suivent.

Les flags - Les indicateurs
---------------------------

Les flags, "indicateurs", sont des bits qui donnent certaines informations. Ils sont regroups 
dans le registre de flag. Ces flags sont modifis en fonction de l'excution des diffrentes 
instructions. Celles-ci changent la valeur des flags selon le rsultat obtenu. Voici une 
liste des diffrents flags et leur utilit. Les bits marqus du 1 ou du 0 ne sont pas 
utiliss.

Bit 1 : CF
Bit 2 : 1
Bit 3 : PF
Bit 4 : 0
Bit 5 : AF
Bit 6 : 0
Bit 7 : ZF
Bit 8 : SF
Bit 9 : TF
Bit 10 : IF
Bit 11 : DF
Bit 12 : OF
Bit 13 : IOPL
Bit 14 : NT
Bit 15 : 0
Bit 16 : RF
Bit 17 : VM

Nous n'tudierons que les 12 premiers, ce sont les plus importants. 


------------------------------------------------------------------------------------------------
CF

Nous avons tout d'abord CF (Carry Flag). C'est le flag dit de retenue. 
Dans les oprations mathmatiques, il arrive que le rsultat de l'opration soit cod sur 
un nombre suprieur de bits. Le bit en trop est plac dans CF. De nombreuses instructions
modifient aussi CF. Par exemple, les instructions CLC et CMC, la premire mettant 
 zro CF et la deuxime qui inverse la valeur de CF. STC (set carry) met le flag  1.
------------------------------------------------------------------------------------------------


------------------------------------------------------------------------------------------------
PF

Le deuxime flag ne se modifiant pas, nous passons au troisime qui est PF. Il s'agit du 
Parity Flag. La valeur de ce flag est 1 si le nombre de bits d'une oprande 
(paramtre d'une instruction) est pair. 
------------------------------------------------------------------------------------------------


------------------------------------------------------------------------------------------------
AF

AF est l'auxiliary carry qui ressemble  CF. 
------------------------------------------------------------------------------------------------


------------------------------------------------------------------------------------------------
ZF

Il s'agit du Zero Flag qui est mis un lorsque un rsultat est gal  0. Souvent utilis pour 
les diverses oprations, il est utile pour viter des problmes de divisions 
(je vous rappelle que diviser par zro est impossible).
------------------------------------------------------------------------------------------------


------------------------------------------------------------------------------------------------
SF

SF signifie Signe Flag. Simplement, sa valeur passe  1 si nous avons un rsultat 
sign (ngatif ou positif).
------------------------------------------------------------------------------------------------


------------------------------------------------------------------------------------------------
IF

IF pour Interrupt Flag, enlve la possibilit au processeur de contrler les interruptions. 
Si IF=0, le processeur ne commande pas et si IF=1 alors c'est le contraire.
L'instruction STI provoque IF=1 et CLI met IF=0. 
------------------------------------------------------------------------------------------------


------------------------------------------------------------------------------------------------
DF

Le flag DF est le Direction Flag. C'est ce Flag qui donne l'indication sur la manire 
de dplacer les pointeurs (rfrences) lors des instructions de chanes (soit positiviment,
soit ngativement). 
Deux instructions lui sont associes, il s'agit de CLD et STD. 
------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------
OF

OF est l'Overflow Flag (indicateur de dpassement). Il permet de trouver et de corriger 
certaines erreurs produites par des instructions mathmatiques. Trs utile pour viter les 
plantages. Si OF=1 alors nous avons affaire  un Overflow. Il existe une
instruction qui s'occupe de ce Flag, c'est INTO qui dclenche l'execution du code qui 
se trouve  l'adresse 0000:0010 (interruption 4). 
------------------------------------------------------------------------------------------------

C'en est tout pour les flags, vous comprendrez leur utilit au fur et  mesure de votre 
progression mais passons aux instructions conditionnelles qui leur sont directement
associes.

Les instructions conditionnelles
--------------------------------

Nous abordons une partie qui est ncessaire lors de la cration d'un programme. Souvent, 
le programme doit faire une action selon la valeur d'un rsultat. Les instructions 
conditionnelles comme leur nom l'indique, sont des instructions qui font une action
selon un rsultat. Elles se basent sur les flags pour faire leur choix. 
Vous vous souvenez de l'instruction JMP, il s'agissait d'un simple saut vers une 
autre partie du programme. D'autres instructions comme JMP font des sauts mais selon 
certains critres, on les appelle des sauts conditionnels. Voici la liste des ces
instructions avec la valeur de l'indicateur ncessaire  l'excution.

------------------------------------------------------------------------------------------------
JB - JNAE - JC 
Below - Not Above or Equal - Carry
CF = 1

JAE - JNB - JNC
Above or Equal - Not Below - Not Carry
CF=0

JE - JZ
Equal - Zero
ZF=1

JNE - JNZ
Not Equal - Not Zero
ZF=0

JO - JNO
Overflow - Not Overflow
OF=1 - OF=0

JP - JPE
Parity - Parity Even
PF=1

JNP - JPO
No Parity - Parity Odd
PF=0

JS - JNS
Signed - Not Signed
SF=1 - SF=0

JA - JNBE
Above - Not Below or Equal
CF=0 et ZF=0

JBE - JNA
Below or Equal - Not Above
CF=1 ou ZF=1

JG - JNLE
Greater - Not Less or Equal
ZF=0 et SF=OF

JGE - JNL
Greater or Equal - Not Less
SF=OF

JL - JNGE
Less - Not Greater or Equal
SF (sign)=OF

JLE - JNG
Less or Equal - Not Greater
ZF=1 ou SF (sign)=OF
------------------------------------------------------------------------------------------------
Pour tester tout cela, nous avons besoin d'une instruction, c'est CMP qui nous aidera 
 le faire.

L'instruction CMP
-----------------

Cette instruction va nous servir  tester diffrentes valeurs et modifier les flags en 
fonction du rsultat. CMP est un SUB qui ne change ni la source ni la destination, seulement 
les flags. Un CMP BX,CX sera comme un SUB BX,CX  l'excption prs que BX ne sera pas modifi. 
Si BX=CX alors BX-CX=0 donc le flag ZF sera gal  1. Si nous voulons faire un saut 
avec "gal " (JNE ou JZ qui demande ZF=1), nous avons ZF=1 et comme 
JZ demande que ZF=1 pour faire le saut, nous avons donc le saut. Souvenez-vous simplement
que la plupart du temps, il s'agit de comparaisons du genre :

effectue le saut :
plus grand que (nombres non-signs) ---> JA 
plus petit que (nombres non-signs) ---> JB 
plus grand que (nombres signs) -------> JG
plus petit que (nombres signs) -------> JL
gal  (sign et non-sign) -----------> JE ou parfois JZ

il suffit de rajouter un 'n' aprs le 'j' pour avoir la mme instruction mais exprime
de facon ngative 

ne saute pas si :

plus grand que (nombres non-signs) ---> JNA (jump if _not above_)
...et ainsi de suite.

### Chapitre 4 - dake / c a l o d o x ###
### http://www.space.ch/scene/calodox ###
   
