2.4. Les structures de contrôle

On peut bien sûr produire en assembleur le même genre de boucle que dans un langage de haut niveau. Nous verrons à cette occasion l'utilité des registres eflags et ecx.

2.4.1. Boucle WHILE

Le test est fait en début de boucle.

En C, nous ferions:


	    compteur = 0;
	    while ( compteur < 10)
	    ++compteur;
	  

En assembleur, nous faisons:


		xor ax,ax
	debut:
		cmp ax,10
		jae fin
		inc ax
		jmp debut
	fin:
	  

L'instruction jae nous permet ici de tester si le terme gauche de la comparaison faite avec cmp est supérieur ou égal au terme de droite. Dès que ax est supérieur ou égale à 10 alors on saute au label fin, sinon, on incrémente ax et on saute impérativement au label debut. jae vérifie la valeur du flag CF. Si CF=0, alors la condition est remplie.

2.4.2. Boucle DO..WHILE

Le test est fait en fin de boucle.

En C, nous ferions:


		compteur = 0;
		do
			++compteur;
		while (compteur < 10);
	  

En assembleur, nous faisons:


		xor ax,ax
	debut:
		inc ax
		cmp ax,10
		jb debut
	  

L'instruction jb nous permet ici de tester si le terme gauche de la comparaison faite avec cmp est inférieur au terme de droite. Tant que ax est inférieur à 10 alors on saute au label debut. jb vérifie la valeur du flag CF. Si CF=1, alors la condition est remplie.

2.4.3. Boucle FOR

Aucun test n'est fait. On effectue un nombre determiné d'itérations.

En C, nous ferions:


		int compteur;
		for (compteur = 0; compteur < 10; compteur++) 
			;
	  

En assembleur, nous faisons:


		mov ecx,10
	debut:
		nop
		loop debut
	  

La boucle for n'étant en fin de compte qu'une variante de while il existe bien sûr plusieurs façons de faire. Ici, nous nous servons du registre compteur ecx. Nous avons un bel exemple d'instruction loop qui s'attend à trouver dans ecx le nombre d'itérations à accomplir et qui décrémente automatiquement ce registre.