Bit Masking et Optimisations

Nous avons vu dans le tut5 que l'on pouvait utiliser les bases binaires, héxa ou décimal dans les programmes.

Mais il y a encore du travail pour maîtriser tout cela.

Les conversions :

    binaire --- décimal

1101 = 1*2^0+0*2^1+1*2^2+1*2^3 = 1+0+4+8 : 1101b=13d

On prend le nombre chiffre par chiffre, on multiplie chaque chiffre par 2^n avec n la position du chiffre dans le nombre, on additionne.

    décimal --- binaire

5--5/2=2+1--2/2=1+0 : 5d =101b, on rajoute ensuite 1 si le reste final =0 ou 0 si le reste final=1.

On divise le nombre par deux avec un reste, on reprend ensuite le résultat (entier) jusqu'à arriver à un reste =0 ou =1

    hexa --- décimal

4CF = 15*1+12*16+4*256 :4CFh=1231d

On prend le nombre chiffre par chiffre, on multiplie chaque chiffre par 16^n avec n la position du chiffre dans le nombre, on additionne.

    décimal --- hexa

320 -- 320/16=20+0 --20/16=1+4 : 320d=140h

On divise le nombre par deux avec un reste, on prend ensuite le résultat (entier) jusqu'à ce qu'il soit égal à 0 ou à 1, c'est alors le dernier chiffre du nombre.

    hex ---binaire

63 -- 3=3d=0011b, 6=6d=0110b : 63h=1100011b

On prend le nombre chiffre par chiffre en décimal on convertit en binaire sur 4 chiffre et on rassemble les nombres obtenues.

    binaire --- héxa

00010111 --- 0001b=1d=1h, 0111b=7d=7h : 00010111b=17h

La même méthode que pour hex --- binaire mais inversement.

Vous n'avez pas la calculatrice windows sous la main. Je vous ai concocté des programmes basic qui effectue les conversions (car ça ne demande pas beaucoup de puissance et je suis trop feignant pour les faire en asm)

Les opérateurs bit à bit :

Si vous connaissez d'autre langage informatique vous devez déjà savoir utiliser les opérateurs and, or, xor, not

Ces opérateurs s'utilisent avec la base binaire.

exemples :

and   0    1                or    0    1                xor    0    1                not    0    1

0      0    0                0      0    1                0       0    1                         1    0

1      0    1                1      1    0                1       1    0

xor, si vous ne le comprenez pas est un ou exclusif.

Applications :

1) l'opérateur or est utilisé pour changer le contraste.

exemple : ld a,44d - or 0C0h

44d            00101100
or 0C0h     11000000
                  11101100 = 236d

2) au lieu d'utiliser cp 0 dans un programme, utilisez or a c'est plus rapide

3) and met à jour le flag (Z, NZ) si le nombre qui suit l'opérateur est égale à a

exemple :

ld a,%010                    ld a;%010                    ld a,%010011
and %010                    and %111                    and %011
jp z,lbl1                        jp z,lbl1                       jp z,lbl1

Seul dans le deuxième exemple le saut ne sera pas effectué.

4) au lieu d'utilisez ld a,0, il faut utiliser xor a

les opérateurs de décalage :

les opérateurs de décalage sont sla, sra, rlc et rrc, il agissent au niveau binaire. Sla et Rlc correspondent à un décalage vers la gauche, Sra à un décalage vers la droite.

exemple :

        00000001b = 1
sla
        00000010b = 2
sla
        00000100b = 4
sra
        00000010b = 2

Nous pouvons donc en conclure que sla équivaut à une multiplication par 2 et sra à une div par 2. Attention toutefois aux pertes de bit.

exemple :  sra 0001b = 0

Application : Ces opérateurs sont très rapides en tout cas beaucoup plus qu'une multiplication ou une division normale donc utilisez les dans vos programmes pour gagner en vitesse et en place.

différences sla -rlc et sra -rrc :
 
    10101                    10101
sla                    rlc
    01010                    01011
sla                    rlc
    10100                    10110

Avec un opérateurs comme rlc, le dernier chiffre du nombre est mis en premier chiffre, tous le autres chifres ont été décalés vers la gauche et inversement pour rrc.

Vous voulez encore plus d'optimisation, voyez-ici