; ; nasm -f elf tests2.asm ; gcc -o test2 testc2.c tests2.o ; BITS 32 ; Modèle standard 32 bits GLOBAL dadd_one ; Exporté EXTERN dtabx,dtaby,dun,ddeux,dsave,nb_iters ; Variables globales venant du C SECTION .text dadd_one: push ebp push ecx mov ebp,esp ; mov ecx,256 ; 256 itérations max mov ecx,[nb_iters] ; nb_iters movapd xmm0,[dtabx] ; xmm0 = zx0 movapd xmm1,[dtaby] ; xmm1 = zy0 xorpd xmm7,xmm7 ; xmm7 = 0 .suite movapd xmm2,xmm0 ; xmm2 = zx mulpd xmm2,xmm2 ; xmm2 = zx * zx movapd xmm3,xmm1 ; xmm3 = zy mulpd xmm3,xmm3 ; xmm3 = zy * zy mulpd xmm1, xmm0 ; xmm1 = zy * zx addpd xmm1,xmm1 ; xmm1 = 2 * zy * zx addpd xmm1,[dtaby] ; xmm1 = 2 * zy * zx + zy0 movapd xmm0,xmm2 ; xmm0 = zx * zx subpd xmm0,xmm3 ; xmm0 = zx*zx-zy*zy addpd xmm0,[dtabx] ; xmm0 = zx*zx-zy*zy + zx0 addpd xmm2,xmm3 ; xmm2 = zx*zx + zy*zy cmpltpd xmm2,[ddeux] ; xmm2 = ((zx2+zy2) < 4.) movmskpd eax,xmm2 ; eax = 4 bits des 4 comparaisons de xmm2 andpd xmm2,[dun] ; xmm2 = xmm2 && (un) addpd xmm7,xmm2 ; incremente de 1 si inférieur à 4.0 cmp eax,0 ; eax = 0 <=> toutes les normes sont > 4. loopne .suite,ecx ; boucle tant que ecx<>0 et eax <>0 .fin movapd [dsave],xmm7 ; on sauve le résultat mov eax,ecx ; on retourne (nb_iters-nb_boucles) mov esp,ebp pop ecx pop ebp ret SECTION .data SECTION .bss