PGCD DE DEUX VALEURS ENTIÈRES.

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 28 févr. 2008 à 19:13
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 28 févr. 2008 à 19:13
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/45879-pgcd-de-deux-valeurs-entieres

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 févr. 2008 à 19:13
Je n'en prends qu'un petit morceau, tout le reste étant du même tonneau.

pgcd PROC
push bx ; UTILISER CX EVITERA PUSH POP DE BX
push dx ;// POUR QUOI FAIRE ???
or ax, ax ;// INUTILE, COPIER COLLER D'ON NE SAIT OU
etiq1:
mov dx, 0 ;// XOR DX, DX
div bx ; A BANNIR, VOIR LA RAISON PLUS BAS
cmp dx, 0 ;// TEST DX, DX
je etiq2
mov ax,bx
mov bx, dx
jmp etiq1
etiq2:
mov ax,bx
pop dx ;// INUTILE, VU PLUS HAUT
pop bx
ret 0
pGCD ENDP

"div bx" alors que bx non testé si vaut 0, impensable une fonction de ce genre.

On va utiliser Euclide qui nous a débarrassé de la division (quasi 40 cycles !!!) il y a des lustres.
; EN ENTREE: ECX x, EDX y
; RETOURNE 0 SI x OU y VAUT 0
pgcd PROC
mov eax, edx ;// ECX x, EAX EDX = y
test ecx, ecx
je short euclZERO
test eax, eax
je short euclERR
euclNEXT:
mov edx, ecx
cmp ecx, eax
cmovb ecx, eax
cmovb eax, edx
sub ecx, eax
jnz short euclNEXT
ret 0
euclZERO:
xor eax, eax
euclERR:
ret 0
pgcd ENDP

POUR CONCLURE: Il convient de garder ses exercices persos sur son disque dur en attendant de les effacer mais en aucun cas il ne faut les publier, ils ne serviraient qu'à habituer les débutants à de très mauvais algos. Je suppose que c'est ce qui t'est arrivé en voyant cette source, il fallait demander ce qu'on pensait de ta fonction pgcd() sur le forum, c'est fait pour cela.

Sera enlevé en fin de semaine.
Rejoignez-nous