Bonjour,
J'aimerais mettre la racine carré de 37 dans un registre avec l'instruction mov. Mais comme ce n'est pas un entier, je ne vois pas vraiment.
Merci d'avance.
Bonjour,
J'aimerais mettre la racine carré de 37 dans un registre avec l'instruction mov. Mais comme ce n'est pas un entier, je ne vois pas vraiment.
Merci d'avance.
Bonjour,
Pour calculer la racine carrée d'un nombre tu es obligé de passer par le FPU (coprocesseur mathématique).
Plus précisément il n'existe pas d'instruction calculant la racine carrée avec les registres généraux. Tu peux toujours tenter une approximation sur le CPU via quelques formules connues ([ame]http://en.wikipedia.org/wiki/Methods_of_computing_square_roots[/ame]).
Pour le FPU, ça ressemble à ça (syntaxe MASM):
Code Asm : 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
17
18
19
20
21
22
23
24
25
26
27
28
29 .686 .xmm .mmx .model flat, stdcall ;32 bit memory model option casemap :none ;case sensitive assume fs:nothing .data Num WORD 37 .code start: finit ; init du coprocesseur fild word ptr[Num] ; charge 37 sur le FPU ( ST(0) ) fsqrt ; calcule la racine carrée sub esp, 8 ; réserve 8 octets sur la pile fstp qword ptr[esp] ; met la racine carrée sur la pile ; passe la racine carrée dans les registres généraux. mov eax, dword ptr[esp] mov ecx, dword ptr[esp+4] ; stack cleanup add esp, 8 ret end start
Il ne faut pas oublier que la racine carrée, puisqu'elle sort du FPU, est codée au format [ame="http://en.wikipedia.org/wiki/IEEE_754"]IEEE 754[/ame]. Ceci dit tu peux toujours tester les particularités du nombre flottant dans EAX et ECX (pour notre exemple), mais l'intérêt est vraiment très limité.
tu peux obtenir la valeur entière de la racine carrée via le code suivant, qui se résumé à ceci:
eax = 6 = round(sqrt(37))
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 start: finit ; init du coprocesseur fild word ptr[Num] ; charge 37 sur le FPU ( ST(0) ) fsqrt ; calcule la racine carrée frndint ; arrondi sub esp, 4 ; réserve un DWORD fistp dword ptr [esp] ; extrait l'entier du FPU vers la pile mov eax, dword ptr [esp]; récupère l'entier depuis la pile add esp, 4 ; stack cleanup ret end start
Partager