bjone Insert booze to continue | BJOne a écrit :
la version optimisée:
mov ax,n sub ax,p ; n-p
cmp ax,1 ; si n-p = 0, 0 étant inférieur à 1, la retenue sera mise sinon, la retenue sera à 0
sbb ax,ax ; ax => 0 si n==p, -1 (0xffff) si n!=p
and ax,p ; ax => 0 si p est nul, quelque chose si p n'est pas nul
jz Code1 ; valà on si p est nul OU que n==p
; Code2
jmp fin
Code1:
fin:
|
porké j'appelles ça une verion "optimisée", passke y'a qu'un seul saut, les deux comparaisons sont "cumulée".
il faut considérer les branchement comme "très" lents (cassent le flux du pipeline)
donc la philosophie:
1) on soustrait n à p ou p à n on s'en fous
2) si ils sont égaux la soustraction est nulle (0)
3) donc si ils sont égaux le cmp ax,1 mettre la ratenue (because 0 < 1)
4) par le sbb ax,ax ; on mets AX à 0, puis si y'a retenue (n==p donc), on retire la retenue ce qui donne -1 (0xffff ou 0ffffh)
5) on a donc si n==p, ax = 0ffffh, sinon 0
6) on fait un AND avec p, ce qui fait que si p est nul, on obtiens 0, si p est non on obtiens quelque chose.
7) le AND mettant à jour la flag Zero, on peut brancher en conséquence. |