Revenir au plan du site
Des boucles optimisées et lisibles
Les boucles sont indispensables au fonctionnement d'un programme, pour que le programme fonctionne, vous devez exécuter le même code encore et encore.
Les boucles infinies sont triviales mais qu'en est-il des boucles avec compteur?
C'est là que la programmation naïve fait mal :
ld a,(compteur) ; 4
dec a ; 1
ld (compteur),a ; 4
jr nz,laBoucle
; boucle terminée, on réinitialise le compteur
ld a,nouveauCompteur ; 2
ld (compteur),a ; 4
|
Il n'est pas question que de lenteur. Ce code est un piège pour plusieurs raisons. D'abord il est faussement lisible. Il vous oblige à créer une variable quelque part, lui trouver un nom. Ensuite il occupe de la place car on va lire la valeur à l'adresse, puis la réécrire. Enfin c'est lent.
Alors on peut déjà commencer par optimiser, tant au rebouclage qu'à la réinitialisation
ld hl,compteur ; 3
dec (hl) ; 3
jr nz,laBoucle
; boucle terminée, on réinitialise le compteur
ld a,nouveauCompteur ; 2
ld (hl),a ; 2
|
C'est plus rapide, plus élégant et plus li-si-ble!
Il existe d'autres techniques pour reboucler quelques fois et qui ne nécessitent ni comptage, ni réinitialisation.
Brutalement, si on a besoin d'appeler 3 fois une routine, on l'appelle 3 fois. On peut même se faire une fonction routineAppeleeTroisFois pour ça.
routineAppeleeTroisFois
call routine
call routine
jp routine ; ainsi le RET de routine sera aussi le RET de routineAppeleeTroisFois
|
Mieux, si la routine suit, on enlève le JP, puisqu'on tombera dedans! C'est un grand classique de routines de calcul. Commentez toujours ce que vous faites!
routineAppeleeTroisFois
call routine
call routine
routine
; blablabla du code
ret
|
Donnez des noms clairs à vos routines, sans qu'ils soient trop longs
Vous avez besoin d'un compteur 16 bits? Utilisez BC et CPI. Ajustez HL au besoin. Enfin, COMMENTEZ le CPI!
cpi ; INC HL + DEC BC
jp pe,laBoucle ; reboucle tant que BC!=0
|
Quand vous aurez digéré ces compteurs, vous pourrez peut-être jeter un oeil à
[l'usage optimisé de la pile] ;)