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.
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.
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.
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.
Précédent | Sommaire | Suivant |
Le registre des drapeaux | Niveau supérieur | Copie de chaîne |