Bonjour
Contexte : utilisation d’un programme en assembleur au sein d’un programme en C++.
Syntaxe AT&T (gcc),
Le programme suivant calcule le résidu modulo n du produit x*y
Il fonctionne bien pour des valeurs vérifiant x*y / n < 2^64
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 // output : (x*y)%n uint64_t mulmod64(uint64_t x, uint64_t y, uint64_t n) { uint64_t z; __asm__ __volatile__( " mul %[y] ;" " div %[n] ;" : "=d" (z) : [x] "a" (x), [y] "r" (y), [n] "r" (n) : "cc" ); return(z); }
Dans le cas contraire, je m’attendais à un problème mais pas à ça !
Mon espoir était une valeur correcte du résidu et une valeur tronquée du quotient mais un résultat complètement faux ne m’aurait pas choqué.
En fait le programme PLANTE sans gestion d’erreur : il semble complètement perdu au milieu d’une boucle infinie …
J’aimerais savoir si ce problème est reproductible en syntaxe AT&T aussi bien qu’en syntaxe Intel.
Je suis loin d'être un expert en programmation et il est possible que je sois passé a côté d’un truc important.
Merci d’avance pour une réponse.
Partager