| ★ CODING ★ LES ROTATIONS et DIVISIONS ★ |
| Assembleur ACPC n°28 - Les rotations & divisions |
Je trouve qu'on s'est bien amusés les mois précédents et qu'il serait sage et judicieux de passer à des choses moins drôles mais tout aussi passionnantes. J'avais vendu la mèche le mois dernier, nous allons voir ensemble quelques routines mathématiques indispensables dans les programmes assembleur. Pour ceux qui se posaient plein de questions concernant les rotations et décalages d'octets, un rayon de soleil va illuminer les coins sombres de leur savoir. Avant d'entrer dans de longues explications et pour une meilleure compréhension, je vous donne les différents types de rotations et décalages qui sont applicables à tous les registres 8 bits "A, B, C, D, E, H, L", ainsi qu'aux contenus des registres HL, IX et IY "(HL), (IX+n), (IY+n)". LES ROTATIONS RL, RLC, RR, RRC, et RLA, RLCA, RRA, RRCA Les quatre premières rotations sont valables pour tous les registres, comme dit plus haut. Par contre, les quatre suivantes sont des exclusivités du père accumulateur.
Les quatre rotations RLA, RLCA RRA, RRCA sont les mêmes que celles précédemment vues, sauf qu'elles ne tiennent que sur un octet au lieu de deux, et ne concernent que l'accu. Il existe deux autres rotations que, pour l'instant, on laisse de côté, à savoir RLCA et RRCA LES DECALAGES C'est encore plus simple que tout à l'heure. Il n'yen a que trois: SLA, SRA et SRL.
00000001 en binaire représente 1. 00000010 dans le même langage représente 2. La différence? On a glissé les bits vers la gauche et mis. un 0 dans le bit 0. Si on refait la même opération. on trouve 00000100 qui représente 4. Alors, on commence à se comprendre. La mnémonique SLA fait exactement la même chose, à savoir une multiplication par 2. Le résultat, toutefois, n'est représenté que sur 8 bits, donc en dessous de 255. Reportez-vous au premier petit programme et vous verrez que les deux instructions ADD M et SLA A sont similaires, elles multiplient par 2 et par 2 (donc par 4) l'accumulateur. On doit, bien sûr, corser les choses si la valeur par laquelle doit être multiplié l'accumulateur n'est pas une puissance de 2. Pour cela, on ruse. On note les puissances de 2 et on regarde si par chance, la somme de 2 ou de 3 de ces puissances ne ferait pas l'affaire. C'est le deuxième programme qui fait une multiplication par 10. Eh oui, 8 et 2 font bien 10. On multiplie l'accu par 2 et on le place dans le registre B, on continue par 4 et par 8 et on additionne B pour obtenir le résultat demandé. Il ne vous est bien entendu pas interdit d'utiliser les soustractions ou les additions pour venir à vos fins. PLUS SERIEUX ENCORE Tout marche à merveille, avec deux petits inconvénients cependant. Parfois, c'est long et fastidieux et cela ne marche que pour un type de multiplication, et n'étant pas universel, cela ne peut être appelé par un CALL. De plus. le résultat est sur 8 bits et je vois votre tête pour une multiplication du genre 23*107. Voici donc la routine universelle qui marche partout. Le troisième programme multiplie l'accumulateur avec le double registre DE et met le résultat dans HL. Bien sûr, si vous travaillez 8 bits sur 8 bits, il ne faudra pas oublier de mettre le registre D à 0. Exemple: LD A, 7 et LD E,102 et LD D,0 ou LD A,7 et LD DE,102, mais attention, dans le deuxième cas, aux débordements (le résultat doit être inférieur à &FFFF). Voyons cela de plus près avec la valeur NB multipliée par 5. Cela revient à additionner NB*1 et NB*4. Idem pour NB*203, on pourrait faire 128*NB + 64*NB + 8*NB + 2*NB + 1 *NB. Comme vous le constatez, ces chiffres sont tous des puissances de 2. Et c'est là que les décalages et rotations vont nous venir en aide. ***************************Pour tester les bits de l'accumulateur, on utilise la mnémonique RRA qui décale à droite les bits de l'accu ét place dans la carry le bit 0. De ce fait, on peut tester la carry pour savoir si l'on doit ou pas additionner à HL la valeur de DE. Dans les deux cas de figure, on multiplie par 2 le registre DE. Pour cela, un petit SLA E multiplie par 2 le registre E et place le bit 7 dans la carry. On décale le registre D de la même façon, en lui plaçant dans le bit 0 la fameuse carry qui pourrait déborder. Et voilà une multiplication. qui ne mange pas de pain, très rapide et qui peut être placée dans votre programme et appelée par un CALL. Sympa, non? |
| Page précédente : Assembleur ACPC n°26 |
|